diff --git a/executable_names/AUTHORS b/executable_names/AUTHORS new file mode 100644 index 0000000000000000000000000000000000000000..e0a5f4cad70c4fc11bd308d75a03332ea47b07df --- /dev/null +++ b/executable_names/AUTHORS @@ -0,0 +1,27 @@ +Ernest Artiaga +Danny Auble +Susanne Balle +Hongjia Cao +Chuck Clouston +Daniel Christians +Chris Dunlap +Joey Ekstrom +Jim Garlick +Mark Grondona +Christopher Holmes +Takao Hatazaki +Nathan Huff +David Jackson +Greg Johnson +Morris Jette +Jason King +Donna Mecozzi +Chris Morrone +Bryan O'Sullivan +Gennaro Oliva +Daniel Palermo +Dan Phung +Andy Riebs +Jeff Squyres +Keven Tew +Jay Windley diff --git a/executable_names/BUILD.NOTES b/executable_names/BUILD.NOTES new file mode 100644 index 0000000000000000000000000000000000000000..bbd6e4b918eff1d04ff6978579431d32992aeee9 --- /dev/null +++ b/executable_names/BUILD.NOTES @@ -0,0 +1,169 @@ +Simple build/install on Linux: + ./autogen.sh + ./configure --enable-debug \ + --prefix= --sysconfdir= + make + make install + +If you make changes to Makefile.am files, then on _MCR_, run + ./autogen.sh +then check-in the new Makefile.am and Makefile.in files + +Here is a step-by-step HOWTO for creating a new release of SLURM on a +Linux cluster (See BlueGene and AIX specific notes below for some differences). +0. svn co https://eris.llnl.gov/svn/slurm/trunk slurm + svn co https://eris.llnl.gov/svn/chaos/private/buildfarm/trunk buildfarm + put the buildfarm directory in your search path +1. Update NEWS and META files for the new release. In the META file, + the API, Major, Minor, Micro, Version, and Release fields must all + by up-to-date. **** DON'T UPDATE META UNTIL RIGHT BEFORE THE TAG **** + The Release field should always be 1 unless one of + the following is true + - Changes were made to the spec file, documentation, or example + files, but not to code. + - this is a prerelease (Release = 0.preX) +2. Tag the repository with the appropriate name for the new version. + svn copy https://eris.llnl.gov/svn/slurm/trunk \ + https://eris.llnl.gov/svn/slurm/tags/slurm-1-2-0-0-pre3 \ + -m "description" +3. Use the rpm make target to create the new RPMs. This requires a .rpmmacros + (.rpmrc for newer versions of rpmbuild) file containing: + %_slurm_sysconfdir /etc/slurm + %_enable_debug "--enable-debug" + I usually build with using the following syntax: + build -s https://eris.llnl.gov/svn/slurm/tags/slurm-1-2-0-0-pre3 + NOTE: For v1.0 and earlier add: --pre-exec='./autogen.sh' +4. Move the RPMs to + /usr/local/admin/rpms/llnl/RPMS-RHEL4/x86_64 (odevi, or gauss) + /usr/local/admin/rpms/llnl/RPMS-RHEL4/i386/ (mdevi) + /usr/local/admin/rpms/llnl/RPMS-RHEL4/ia64/ (tdevi) + send an announcement email (with the latest entry from the NEWS + file) out to linux-admin@lists.llnl.gov. +5. Copy tagged bzip file (e.g. slurm-0.6.0-0.pre3.bz2) to FTP server + for external SLURM users. +6. Copy bzip file and rpms (including src.rpm) to sourceforge.net: + ncftp upload.sf.net + cd upload + put filename + Use SourceForge admin tool to add new release, including changelog. + +BlueGene build notes: +3. Use the rpm make target to create the new RPMs. This requires a .rpmmacros + (.rpmrc for newer versions of rpmbuild) file containing: + %_slurm_sysconfdir /etc/slurm + %_enable_debug "--enable-debug" + %with_cflags CFLAGS=-m64 + Build on Service Node with using the following syntax + build -s https://eris.llnl.gov/svn/slurm/tags/slurm-1-2-0-0-pre3 + 4. Copy RPMs to /usr/admin/sles/llnl/RPMS-SLES9 + Do _not_ copy the switch-elan, authd-authd, + aix-federation or auth-none RPMs + +To build and run on AIX: +0. svn co https://eris.llnl.gov/svn/slurm/trunk slurm + svn co https://eris.llnl.gov/svn/buildfarm/trunk buildfarm + put the buildfarm directory in your search path + Also, you will need two commands to appear FIRST in your PATH: + + /usr/local/tools/gnu/aix_5_64_fed/bin/install + /usr/local/gnu/bin/tar + + I do this by making symlinks to those commands in the buildfarm directory, + then making the buildfarm directory the first one in my PATH. + Also, make certain that the "proctrack" rpm is installed. +1. export OBJECT_MODE=32 +2. Build with: + ./configure --enable-debug --prefix=/opt/freeware \ + --sysconfdir=/opt/freeware/etc/slurm + --with-ssl=/opt/freeware --with-munge=/opt/freeware + make + make uninstall # remove old shared libraries, aix caches them + make install +3. To build RPMs (NOTE: Many GNU tools are required): + Create a file specifying system specific files: + # + # RPM Macros for use with SLURM on AIX + # The system-wide macros for RPM are in /usr/lib/rpm/macros + # and this overrides a few of them + # + %_prefix /opt/freeware + %_slurm_sysconfdir %{_prefix}/etc/slurm + %_defaultdocdir %{_prefix}/doc + + %_enable_debug "--enable-debug" + %with_ssl "--with-ssl=/opt/freeware" + %with_munge "--with-munge=/opt/freeware" + build -s https://eris.llnl.gov/svn/slurm/tags/slurm-1-2-0-0-pre3 +4. export MP_RMLIB=./slurm_ll_api.so + export CHECKPOINT=yes +5. poe hostname -rmpool debug +6. To debug, set SLURM_LL_API_DEBUG=3 before running poe - will create a file + /tmp/slurm.* + It can also be helpful to use poe options "-ilevel 6 -pmdlog yes" + There will be a log file create named /tmp/mplog.. +7. If you update proctrack, be sure to run "slibclean" to clear cached + version. +8. Install the rpms slurm-*.ppc.rpm, slurm-aix-federation-*.ppc.rpm, + slurm-auth-munge-*.ppc.rpm, slurm-devel-*.ppc.rpm, and + slurm-sched-wiki-*.ppc.rpm in /usr/admin/inst.image/slurm/aix5.3 on an + OCF AIX machine (pdev is a good choice). + +AIX/Federation switch window problems +To clean switch windows: ntblclean =w 8 -a sni0 +To get switch window status: ntblstatus + +BlueGene bglblock boot problem diagnosis + - Logon to the Service Node (bglsn, ubglsn) + - Execute /admin/bglscripts/fatalras + This will produce a list of failures including Rack and Midplane number + R M + - Translate the Rack and Midplane to SLURM node id: smap -R r + - Drain only the bad SLURM node, return others to service using scontrol + +Configuration file update procedures: + - cd /usr/bgl/dist/slurm (on bgli) + - co -l + - vi + - ci -u + - make install + - then run "dist_local slurm" on SN and FENs to update /etc/slurm + +Some RPM commands: + - rpm -querry --all | grep slurm + - rpm --erase package_name + - rpm --install --ignoresize file_name +For main SLURM plugin installation on BGL service node: + - rpm --install --force --nodeps --ignoresize slurm-#.rpm + + +To clear a wedged job: + /bgl/startMMCSconsole + > delete bgljob #### + > free RMP### + +Starting and stopping daemons on Linux: + /etc/init.d/slurm stop + /etc/init.d/slurm start + +Patches: + - cd to the top level src directory + - Run the patch command with epilog_complete.patch as stdin: + patch -p[path_level_to_filter] [--dry-run] < epilog_complete.patch + +CVS and gnats: +Include "gnats: e.g. "(gnats:123)" as part of cvs commit to +automatically record that update in gnats database. NOTE: Does +not change gnats bug state, but records source files associated +with the bug. + +For memory leaks (for AIX use zerofault, zf; for linux use valgrind) + valgrind --tool=memcheck --leak-check=yes --num-callers=6 --leak-resolution=med ./slurmctld + +Before new major release: + - Test on ia64, i386, BGL, AIX, OSX, XCPU + - Test for memory leaks in slurmctld and slurmd + - Change API version number + - Review and release web pages + - Review and release code + - Run "make check" + diff --git a/executable_names/COPYING b/executable_names/COPYING new file mode 100644 index 0000000000000000000000000000000000000000..4938ad93383257ed594cf5d953e7e31bf5cfdafc --- /dev/null +++ b/executable_names/COPYING @@ -0,0 +1,382 @@ +All SLURM code and documentation is available under the GNU General Public +License. + +In addition, as a special exception, the copyright holders give permission +to link the code of portions of this program with the OpenSSL library under +certain conditions as described in each individual source file, and distribute +linked combinations including the two. You must obey the GNU General Public +License in all respects for all of the code used other than OpenSSL. If you +modify file(s) with this exception, you may extend this exception to your +version of the file(s), but you are not obligated to do so. If you do not +wish to do so, delete this exception statement from your version. If you +delete this exception statement from all source files in the program, then +also delete it here. + +============================================================================= + +OUR NOTICE AND TERMS OF AND CONDITIONS OF THE GNU GENERAL PUBLIC LICENSE + +Our Preamble Notice + +A. This notice is required to be provided under our contract with the U.S. +Department of Energy (DOE). This work was produced at the University +of California, Lawrence Livermore National Laboratory under Contract +No. W-7405-ENG-48 with the DOE. + +B. Neither the United States Government nor the University of California +nor any of their employees, makes any warranty, express or implied, or +assumes any liability or responsibility for the accuracy, completeness, or +usefulness of any information, apparatus, product, or process disclosed, or +represents that its use would not infringe privately-owned rights. + +C. Also, reference herein to any specific commercial products, process, or +services by trade names, trademark, manufacturer or otherwise does not +necessarily constitute or imply its endorsement, recommendation, or +favoring by the United States Government or the University of California. +The views and opinions of authors expressed herein do not necessarily +state or reflect those of the United States Government or the University of +California, and shall not be used for advertising or product endorsement +purposes. + +============================================================================= + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) year 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. diff --git a/executable_names/ChangeLog b/executable_names/ChangeLog new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/executable_names/DISCLAIMER b/executable_names/DISCLAIMER new file mode 100644 index 0000000000000000000000000000000000000000..47cf0c61a2ec535a07702eec796ce54c17e7f4f5 --- /dev/null +++ b/executable_names/DISCLAIMER @@ -0,0 +1,75 @@ +Copyright (C) 2002-2006 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory, Hewlett-Packard, +Linux NetworX, and other sites. + +Written by: +Ernest Artiaga +Danny Auble +Susanne Balle +Daniel Christians +Chris Dunlap +Joey Ekstrom +Jim Garlick +Mark Grondona +Christopher Holmes +Takae Hatazaki +Nathan Huff +David Jackson +Greg Johnson +Morris Jette +Jason King +Chris Morrone +Brian O'Sullivan +Daniel Palermo +Dan Phung +Andy Riebs +Jeff Squyres +Keven Tew +Jay Windley + +UCRL-CODE-217948. + +This file is part of SLURM, a resource management program. +For details, see . + +SLURM 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. + +SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +OUR NOTICE AND TERMS OF AND CONDITIONS OF THE GNU GENERAL PUBLIC LICENSE + +Our Preamble Notice + +A. This notice is required to be provided under our contract with the U.S. +Department of Energy (DOE). This work was produced at the University +of California, Lawrence Livermore National Laboratory under Contract +No. W-7405-ENG-48 with the DOE. + +B. Neither the United States Government nor the University of California +nor any of their employees, makes any warranty, express or implied, or +assumes any liability or responsibility for the accuracy, completeness, or +usefulness of any information, apparatus, product, or process disclosed, or +represents that its use would not infringe privately-owned rights. + +C. Also, reference herein to any specific commercial products, process, or +services by trade names, trademark, manufacturer or otherwise does not +necessarily constitute or imply its endorsement, recommendation, or +favoring by the United States Government or the University of California. +The views and opinions of authors expressed herein do not necessarily +state or reflect those of the United States Government or the University of +California, and shall not be used for advertising or product endorsement +purposes. + +The precise terms and conditions for copying, distribution and modification +is provided in the file named "COPYING" in this directory. diff --git a/executable_names/INSTALL b/executable_names/INSTALL new file mode 100644 index 0000000000000000000000000000000000000000..ce83b00cf57eb5a00164d57d05f013663976b282 --- /dev/null +++ b/executable_names/INSTALL @@ -0,0 +1,228 @@ +Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for variables by setting +them in the environment. You can do that on the command line like this: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/executable_names/LICENSE.OpenSSL b/executable_names/LICENSE.OpenSSL new file mode 100644 index 0000000000000000000000000000000000000000..1c9a88bb8d511078afb4f5855dcf17f77d362fbf --- /dev/null +++ b/executable_names/LICENSE.OpenSSL @@ -0,0 +1,169 @@ +/* + * (c) 2002, 2003, 2004 by Jason McLaughlin and Riadh Elloumi + * + * 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 + * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and + * NON-INFRINGEMENT. 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., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of portions of this program with the + * OpenSSL library under certain conditions as described in each + * individual source file, and distribute linked combinations + * including the two. + * You must obey the GNU General Public License in all respects + * for all of the code used other than OpenSSL. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you + * do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source + * files in the program, then also delete it here. + */ + +Certain source files in this program permit linking with the OpenSSL +library (http://www.openssl.org), which otherwise wouldn't be allowed +under the GPL. For purposes of identifying OpenSSL, most source files +giving this permission limit it to versions of OpenSSL having a license +identical to that listed in this file (LICENSE.OpenSSL). It is not +necessary for the copyright years to match between this file and the +OpenSSL version in question. However, note that because this file is +an extension of the license statements of these source files, this file +may not be changed except with permission from all copyright holders +of source files in this program which reference this file. + + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ diff --git a/executable_names/META b/executable_names/META new file mode 100644 index 0000000000000000000000000000000000000000..211c855d720184e39f20c7f910e8f111d2631eb0 --- /dev/null +++ b/executable_names/META @@ -0,0 +1,17 @@ +## +# $Id$ +## +# Metadata for RPM/TAR makefile targets +## +# See src/api/Makefile.am for guidance on setting API_ values +## + Meta: 1 + Name: slurm + Major: 1 + Minor: 2 + Micro: 0 + Version: 1.2.0 + Release: 0.pre5 + API_CURRENT: 10 + API_AGE: 0 + API_REVISION: 0 diff --git a/executable_names/Makefile.am b/executable_names/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..630d606a24bf1b17079eed167280f9bac782ad81 --- /dev/null +++ b/executable_names/Makefile.am @@ -0,0 +1,51 @@ + +AUTOMAKE_OPTIONS = foreign +ACLOCAL_AMFLAGS = -I auxdir +SUBDIRS = auxdir src testsuite doc + +EXTRA_DIST = \ + etc/bluegene.conf.example \ + etc/federation.conf.example \ + etc/slurm.conf.example \ + etc/slurm.epilog.clean \ + etc/init.d.slurm \ + etc/ptrace.patch \ + autogen.sh \ + slurm.spec \ + README \ + RELEASE_NOTES \ + DISCLAIMER \ + COPYING \ + AUTHORS \ + INSTALL \ + LICENSE.OpenSSL \ + NEWS \ + ChangeLog \ + META \ + config.xml + +pkginclude_HEADERS = \ + slurm/pmi.h \ + slurm/slurm.h \ + slurm/slurm_errno.h \ + slurm/spank.h + +MAINTAINERCLEANFILES = \ + aclocal.m4 config.guess config.xml \ + config.h.in config.sub configure install-sh \ + ltconfig ltmain.sh missing mkinstalldirs \ + slurm/slurm.h \ + stamp-h.in + +distclean-local: + -(cd $(top_srcdir) && rm -rf autom4te*.cache autoscan.*) + -(cd $(top_srcdir) && rm -rf $(PACKAGE)-*) + +mrproper: distclean-local clean + -(cd $(top_srcdir) && rm -rf autom4te.cache config.h config.log) + -(cd $(top_srcdir) && rm -rf config.status libtool stamp-h1) + -(cd $(top_srcdir)/auxdir && rm -rf mkinstalldirs) + -(cd $(top_srcdir)/slurm && rm -rf stamp-h2 slurm.h) + -find $(top_srcdir)/src -name "Makefile" -exec rm {} \; + -find $(top_srcdir) -depth -name ".deps" -exec rm -rf {} \; + diff --git a/executable_names/Makefile.in b/executable_names/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..a0970a16df83e7de959e3c654c62b6878c4b66c8 --- /dev/null +++ b/executable_names/Makefile.in @@ -0,0 +1,790 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = . +DIST_COMMON = README $(am__configure_deps) $(pkginclude_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/config.h.in $(srcdir)/config.xml.in \ + $(top_srcdir)/configure $(top_srcdir)/slurm/slurm.h.in AUTHORS \ + COPYING ChangeLog INSTALL NEWS +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno configure.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = config.xml +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkgincludedir)" +pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(pkginclude_HEADERS) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +ACLOCAL_AMFLAGS = -I auxdir +SUBDIRS = auxdir src testsuite doc +EXTRA_DIST = \ + etc/bluegene.conf.example \ + etc/federation.conf.example \ + etc/slurm.conf.example \ + etc/slurm.epilog.clean \ + etc/init.d.slurm \ + etc/ptrace.patch \ + autogen.sh \ + slurm.spec \ + README \ + RELEASE_NOTES \ + DISCLAIMER \ + COPYING \ + AUTHORS \ + INSTALL \ + LICENSE.OpenSSL \ + NEWS \ + ChangeLog \ + META \ + config.xml + +pkginclude_HEADERS = \ + slurm/pmi.h \ + slurm/slurm.h \ + slurm/slurm_errno.h \ + slurm/spank.h + +MAINTAINERCLEANFILES = \ + aclocal.m4 config.guess config.xml \ + config.h.in config.sub configure install-sh \ + ltconfig ltmain.sh missing mkinstalldirs \ + slurm/slurm.h \ + stamp-h.in + +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ + cd $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h1 + touch $@ + +slurm/slurm.h: slurm/stamp-h2 + @if test ! -f $@; then \ + rm -f slurm/stamp-h2; \ + $(MAKE) slurm/stamp-h2; \ + else :; fi + +slurm/stamp-h2: $(top_srcdir)/slurm/slurm.h.in $(top_builddir)/config.status + @rm -f slurm/stamp-h2 + cd $(top_builddir) && $(SHELL) ./config.status slurm/slurm.h + +distclean-hdr: + -rm -f config.h stamp-h1 slurm/slurm.h slurm/stamp-h2 +config.xml: $(top_builddir)/config.status $(srcdir)/config.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-pkgincludeHEADERS: $(pkginclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)" + @list='$(pkginclude_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \ + $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \ + done + +uninstall-pkgincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pkginclude_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + mkdir $(distdir) + $(mkdir_p) $(distdir)/. $(distdir)/auxdir $(distdir)/doc/html $(distdir)/etc $(distdir)/slurm + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(HEADERS) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(pkgincludedir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-local distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-pkgincludeHEADERS + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ + check-am clean clean-generic clean-libtool clean-recursive \ + ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ + dist-shar dist-tarZ dist-zip distcheck distclean \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-local distclean-recursive distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-pkgincludeHEADERS \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am uninstall-info-am \ + uninstall-pkgincludeHEADERS + + +distclean-local: + -(cd $(top_srcdir) && rm -rf autom4te*.cache autoscan.*) + -(cd $(top_srcdir) && rm -rf $(PACKAGE)-*) + +mrproper: distclean-local clean + -(cd $(top_srcdir) && rm -rf autom4te.cache config.h config.log) + -(cd $(top_srcdir) && rm -rf config.status libtool stamp-h1) + -(cd $(top_srcdir)/auxdir && rm -rf mkinstalldirs) + -(cd $(top_srcdir)/slurm && rm -rf stamp-h2 slurm.h) + -find $(top_srcdir)/src -name "Makefile" -exec rm {} \; + -find $(top_srcdir) -depth -name ".deps" -exec rm -rf {} \; +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/NEWS b/executable_names/NEWS new file mode 100644 index 0000000000000000000000000000000000000000..f53fb4809b58df171615db368a9659f478951761 --- /dev/null +++ b/executable_names/NEWS @@ -0,0 +1,2026 @@ +This file describes changes in recent versions of SLURM. It primarily +documents those changes that are of interest to users and admins. + +* Changes in SLURM 1.2.0-pre6 +============================= + -- Maintain actually job step run time with suspend/resume use. + -- Allow slurm.conf options to appear multiple times. SLURM will use the + last instance of any particular option. + -- Add version number to node state save file. Will not recover node + state information on restart from older version. + +* Changes in SLURM 1.2.0-pre5 +============================= + -- Patch from HP patch.1.2.0.pre4.061017.crcore_hints, supports cores as + consumable resource. + +* Changes in SLURM 1.2.0-pre4 +============================= + -- Added node_inx to job_step_info_t to get the node indecies for mapping out + steps in a job by nodes. + -- sview grid added + -- BLUEGENE node_inx added to blocks for reference. + -- Automatic CPU_MASK generation for task launch, new srun option -B. + -- Automatic logical to physical processor identification and mapping. + -- Added new srun options to --cpu_bind: sockets, cores, and threads + -- Updated select/cons_res to operate as socket granularity. + -- New srun task distribution options to -m: plane + -- Multi-core support in sinfo, squeue, and scontrol. + -- Memory can be treated as a consumable resource. + -- New srun options --ntasks-per-[node|socket|core]. + +* Changes in SLURM 1.2.0-pre3 +============================= + -- Remove configuration parameter ShedulerAuth (defunct). + -- Add NextJobId to "scontrol show config" output. + -- Add new slurm.conf parameter MailProg. + -- New forwarding logic. New recieve_msg functions depending on what you + are expecting to get back. No srun_node_id anymore passed around in + a slurm_msg_t + -- Remove sched/wiki plugin (use sched/wiki2 for now) + -- Disable pthread_create() for PMI_send when TotalView is running for + better performance. + -- Fixed certain tests in test suite to not run with bluegene or front-end + systems + -- Removed addresses from slurm_step_layout_t + -- Added new job field, "comment". Set by srun, salloc and sbatch. See + with "scontrol show job". Used in sched/wiki2. + -- Report a job's exit status in "scontrol show job". + -- In sched/wiki2: add support for JOBREQUEUE command. + +* Changes in SLURM 1.2.0-pre2 +============================= + -- Added function slurm_init_slurm_msg to be used to init any slurm_msg_t + you no longer need do any other type of initialization to the type. + +* Changes in SLURM 1.2.0-pre2 +============================= + -- Fixed task dist to work with hostfile and warn about asking for more tasks + than you have nodes for in arbitray mode. + -- Added "account" field to job and step accounting information and sacct output. + -- Moved task layout to slurmctld instead of srun. Job step create returns + step_layout structure with hostnames and addresses that corrisponds + to those nodes. + -- Changed api slurm_lookup_allocation params, + resource_allocation_response_msg_t changed to job_alloc_info_response_msg_t + this structure is being renamed so contents are the same. + -- alter resource_allocation_response_msg_t see slurm.h.in + -- remove old_job_alloc_msg_t and function slurm_confirm_alloc + -- Slurm configuration files now support an "Include" directive to + include other files inline. + -- BLUEGENE New --enable-bluegene-emulation configure parameter to allow + running system in bluegene emulation mode. Only + really useful for developers. + -- New added new tool sview GUI for displaying slurm info. + -- fixed bug in step layout to lay out tasks correctly + +* Changes in SLURM 1.2.0-pre1 +============================= + -- Fix bug that could run a job's prolog more than once + -- Permit batch jobs to be requeued, scontrol requeue + -- Send overcommit flag from srun in RPCs and have slurmd set SLURM_OVERCOMMIT + flag at batch job launch time. + -- Added new configuration parameter MessageTimeout (replaces #define in + the code) + -- Added support for OSX build. + +* Changes in SLURM 1.1.18 +========================= + - In sched/wiki2, add support for EHost and EHostBackup configuration + parameters in wiki.conf file + - In sched/wiki2, fix memory management bug for JOBWILLRUN command. + - In sched/wiki2, consider job Busy while in Completing state for + KillWait+10 seconds (used to be 30 seconds). + - BLUEGENE - Fixes to allow full block creation on the system and not to add + passthrough nodes to the allocation when creating a block. + - BLUEGENE - Fix deadlock issue with starting and failing jobs at the same + time + - Make connect() non-blocking and poll() with timeout to avoid huge + waits under some conditions. + - Set "ENVIRONMENT=BATCH" environment variable for "srun --batch" jobs only. + +* Changes in SLURM 1.1.17 +========================= + - BLUEGENE - fix to make dynamic partitioning not go create block where + there are nodes that are down or draining. + - Fix srun's default node count with an existing allocation when neither + SLURM_NNODES nor -N are set. + - Stop srun from setting SLURM_DISTRIBUTION under job steps when a + specific was not explicitly requested by the user. + +* Changes in SLURM 1.1.16 +========================= + - BLUEGENE - fix to make prolog run 5 minutes longer to make sure we have + enough time to free the overlapping blocks when starting a new job on a + block. + - BLUEGENE - edit to the libsched_if.so to read env and look at + MPIRUN_PARTITION to see if we are in slurm or running mpirun natively. + - Plugins are now dlopened RTLD_LAZY instead of RTLD_NOW. + +* Changes in SLURM 1.1.15 +========================= + - BLUEGENE - fix to be able to create static partitions + - Fixed fanout timeout logic. + - Fix for slurmctld timeout on outgoing message (Hongjia Cao, NUDT.edu.cn). + +* Changes in SLURM 1.1.14 +========================= + - In sched/wiki2: report job/node id and state only if no changes since + time specified in request. + - In sched/wiki2: include a job's exit code in job state information. + - In sched/wiki2: add event notification logic on job submit and completion. + - In sched/wiki2: add support for JOBWILLRUN command type. + - In sched/wiki2: for job info, include required HOSTLIST if applicable. + - In sched/wiki2: for job info, replace PARTITIONMASK with RCLASS (report + partition name associated with a job, but no task count) + - In sched/wiki2: for job and node info, report all data if TS==0, + volitile data if TS<=update_time, state only if TS>update_time + - In sched/wiki2: add support for CMD=JOBSIGNAL ARG=jobid SIGNAL=name or # + - In sched/wiki2: add support for CMD=JOBMODIFY ARG=jobid [BANK=name] + [TIMELIMIT=minutes] [PARTITION=name] + - In sched/wiki2: add support for CMD=INITIALIZE ARG=[USEHOSTEXP=T|F] + [EPORT=#]; RESPONSE=EPORT=# USEHOSTEXP=T + - In sched/wiki2: fix memory leak. + - Fix sinfo node state filtering when asking for idle nodes that are also + draining. + - Add Fortran extension to slurm_get_rem_time() API. + - Fix bug when changing the time limit of a running job that has previously + been suspended (formerly failed to account for suspend time in setting + termination time). + - fix for step allocation to be able to specify only a few nodes in a + step and ask for more that specified. + - patch from Hongjia Cao for forwarding logic + - BLUEGENE - able to allocate specific nodes without locking up. + - BLUEGENE - better tracking of blocks that are created dynamically, + less hitting the db2. + +* Changes in SLURM 1.1.13 +========================= + - Fix hang in sched/wiki2 if Moab stops responding responding when + response is outgoing. + - BLUEGENE - fix to make sure the block is good to go when picking it + - BLUEGENE - add libsched_if.so so mpirun doesn't try to create a block + by itself. + - Enable specification of srun --jobid=# option with --batch (for user root). + - Verify that job actually starts when requested by sched/wiki2. + - Add new wiki.conf parameters: EPort and JobAggregationTime for event + notification logic (see wiki.conf man page for details) + +* Changes in SLURM 1.1.12 +========================= + - Sched/wiki2 to report a job's account as COMMENT response to GETJOBS + request. + - Add srun option "--comment" (maps to job account until slurm v1.2, + needed for Moab scheduler functionality). + - fixed some timeout issues in the controller hopefully stopping all the + issues with excessive timeouts. + - unit conversion (i.e. 1024 => 1k) only happens on bgl systems for node + count. + - Sched/wiki2 to report a job's COMPETETIME and SUSPENDTIME in GETJOBS + response. + - Added support for Mellanox's version of mvapich-0.9.7. + +* Changes in SLURM 1.1.11 +========================= + - Update file headers adding permission to link with OpenSSL. + - Enable sched/wiki2 message authentication. + - Fix libpmi compilation issue. + - Remove "gcc-c++ python" from slurm.spec BuildRequires. It breaks + the AIX build, so we'll have to find another way to deal with that. + +* Changes in SLURM 1.1.10 +========================= + -- task distribution fix for steps that are smaller than job allocation. + -- BLUEGENE - fix to only send a success when block was created when trying + to allocate the block. + -- fix so if slurm_send_recv_node_msg fails on the send the auth_cred returned + by the resp is NULL. + -- Fix switch/federation plugin so backup controller can assume control + repeatedly without leaking or corrupting memory. + -- Add new error code (for Maui/Moab scheduler): ESLURM_JOB_HELD + -- Tweak slurmctld's node ping logic to better handle failed nodes with + hierarchical communications fail-over logic. + -- Add support for sched/wiki specific configuration file "wiki.conf". + -- Added sched/wiki2 plugin (new experimental wiki plugin). + +* Changes in SLURM 1.1.9 +======================== + -- BLUEGENE - fix to handle a NO_VAL sent in as num procs in the job + description. + -- Fix bug in slurmstepd code for parsing --multi-prog command script. + Parser was failing for commands with no arguments. + -- Fix bug to check unsigned ints correctly in bitstring.c + -- Alter node count covert to kilo to only convert number divisible by + 1024 or 512 + +* Changes in SLURM 1.1.8 +======================== + -- Added bug fixes (fault-tolerance and memory leaks) from Hongjia Cao + + -- Gixed some potential BLUEGENE issues with the bridge log file not having + a mutex around the fclose and fopen. + -- BLUEGENE - srun -n procs now regristers correctly + -- Fixed problem with reattach double allocating step_layout->tids + -- BLUEGENE - fix race condition where job is finished before it starts. + +* Changes in SLURM 1.1.7 +======================== + -- BLUEGENE - fixed issue with doing an allocation for nodes since asking + for 32,128, or 512 all mean 1 to the controller. + -- Add "Include" directive to slurm.conf files. If "Include" is found + at the beginning of a line followed by whitespace and then + the full path to a file, that file is included inline with the current + slurm.conf file. + +* Changes in SLURM 1.1.6 +======================== + -- Improved task layout for relative positions + -- Fixed heterogeous cpu overcommit issue + -- Fix bug where srun would hang if it ran on one node and that + node's slurmd died + -- Fix bug where srun task layout would be bad when min-max node range is + specified (e.g. "srun -N1-4 ...") + -- Made slurmctld_conf.node_prefix only be set on Bluegene systems. + -- Fixed a race condition in the controller to make it so a plugin thread + wouldn't be able to access the slurmctld_conf structure before it was + filled. + +* Changes in SLURM 1.1.5 +======================== + -- Ignore partition's MaxNodes for SlurmUser and root. + -- Fix possible memory corruption with use of PMI_KVS_Create call. + -- Fix race condition when multiple PMI_KVS_Barrier calls. + -- Fix logic in which slurmctld outgoing RPC requests could get delayed. + -- Fix logic for laying out steps without a hostlist. + +* Changes in SLURM 1.1.4 +======================== + -- Improve error handling in hierarchical communications logic. + +* Changes in SLURM 1.1.3 +======================== + -- Fix big-endian bug in the bitstring code which plagued AIX. + -- Fix bug in handling srun's --multi-prog option, could go off end of buffer. + -- Added support for job step completion (and switch window release) on + subset of allocated nodes. + -- BLUEGENE - removed configure option --with-bg-link bridge is linked with + dlopen now no longer needing fake database so files on frontend node. + -- BLUEGENE - implemented use of rm_get_partition_info instead of + ...partitions_info which has made a much better design improving stability. + -- Streamline PMI communications and increase timeouts for highly parallel + jobs. Improves scalability of PMI. + +* Changes in SLURM 1.1.2 +======================== + -- Fix bug in jobcomp/filetxt plugin to report proper NodeCnt when a job + fails due to a node failure. + -- Fix Bluegene configure to work with the new 64bit libs. + -- Fix bug in controller that causes it to segfault when hit with a malformed + message. + -- For "srun --attach=X" to other users job, report an error and exit (it + previously just hung). + -- BLUEGENE - fix for doing correct small block logic on user error. + -- BLUEGENE - Added support in slurmd to create a fake libdb2.so if it + doesn't exist so smap won't seg fault + -- BLUEGENE - "scontrol show job" reports "MaxProcs=None" and "Start=None" + if values are not specified at job submit time + -- Add retry logic for PMI communications, may be needed for highly parallel + jobs. + -- Fix bug in slurmd where variable is used in logging message after freed + (slurmstepd rank info). + -- Fix bug in scontrol show daemons if NodeName=localhost will work now to + display slurmd as place where it is running. + -- Patch from HP for init nodes before init_bitmaps + -- ctrl-c killed sruns will result in job state as cancelled instead of + completed. + -- BLUEGENE - added configure option --with-bg-link to choose dynamic linking + or static linking with the bridgeapi. + +* Changes in SLURM 1.1.1 +======================== + -- Fix bug in packing job suspend/resume RPC. + -- If a user breaks out of srun before the allocation takes place, mark the + job as CANCELLED rather than COMPLETED and change its start and end time + to that time. + -- Fix bug in PMI support that prevented use of second PMI_Barrier call. + This fix is needed for MVAPICH2 use. + -- Add "-V" options to slurmctld and slurmd to print version number and exit. + -- Fix scalability bug in sbcast. + -- Fix bug in cons_res allocation strategy. + -- Fix bug in forwarding with mpi + -- Fix bug sacct forwarding with stat option + -- Added nodeid to sacct stat information + -- cleaned up way slurm_send_recv_node_msg works no more clearing errno + -- Fix error handling bug in the networking code that causes the slurmd to + xassert if the server is not running when the slurmd tries to register. + +* Changes in SLURM 1.1.0 +======================== + -- Fix bug that could temporarily make nodes DOWN when they are really + responding. + -- Fix bug preventing backup slurmctld from responding to PING RPCs. + -- Set "CFLAGS=-DISO8601" before configuration to get ISO8601 format + times for all SLURM commands. NOTE: This may break Moab, Maui, and/or + LSF schedulers. + -- Fix for srun -n and -O options when paired with -b. + -- Added logic for fanout to failover to forward list if main node is + unreachable + -- sacct also now keeps track of submitted, started and ending times of jobs + -- reinit config file mutex at beginning of slurmstepd to avoid fork issues + +* Changes in SLURM 1.1.0-pre8 +============================= + -- Fix bug in enforcement of partition's MaxNodes limit. + -- BLUEGENE - added support for srun -w option also fixed the geometry option + for srun. + +* Changes in SLURM 1.1.0-pre7 +============================= + -- Accounting works for aix systems, use jobacct/aix + -- Support large (over 2GB) files on 32-bit linux systems + -- changed all writes to safe_write in srun + -- added $float to globals.example in the testsuite + -- Set job's num_proc correctly for jobs that do not have exclusive use + of it's allocated nodes. + -- Change in support for test suite: 'testsuite/expect/globals.example' + is now 'testsuite/expect/globals' and you can override variable + settings with a new file 'testsuite/expect/globals.local'. + -- Job suspend now sends SIGTSTP, sleep(1), sends SIGSTOP for better + MPI support. + -- Plug a bunch of memory leaks in various places. + -- Bluegene - before assigning a job to a block the plugin will check the bps + to make sure they aren't in error state. + -- Change time format in job completion logging (JobCompType=jobcomp/filetxt) + from "MM/DD HH:MM:SS" to "YYYY-MM-DDTHH:MM:SS", conforming with the ISO8601 + standard format. + +* Changes in SLURM 1.1.0-pre6 +============================= + -- Added logic to "stat" a running job with sacct option -S use -j to specify + job.step + -- removed jobacct/bluegene (no real need for this) meaning, I don't think + there is a way to gather the data yet. + -- Added support for mapping "%h" in configured SlurmdLog to the hostname. + -- Add PropagatePrioProcess to control propagation of a user's nice value + to spawned tasks (based upon work by Daniel Christians, HP). + +* Changes in SLURM 1.1.0-pre5 +============================= + -- Added step completion RPC logic + -- Vastly changed sacct and the jobacct plugin. Read documentation for full + details. + -- Added jobacct plugin for AIX and BlueGene, they currently don't work, + but infrastructure is in place. + -- Add support for srun option --ctrl-comm-ifhn to set PMI communications + address (Hongjia Cao, National University of Defense Technology). + -- Moved safe_read/write to slurm_protocol_defs.h removing multiple copies. + -- Remove vestigial functions slurm_allocate_resources_and_run() and + slurm_free_resource_allocation_and_run_response_msg(). + -- Added support for different executable files and arguments by task based + upon a configuration file. See srun's --multi-prog option (based upon + work by Hongjia Cao, National University of Defense Technology). + -- moved the way forward logic waited for fanout logic mostly eliminating + problems with scalability issues. + -- changed -l option in sacct to display different params see sacct/sacct.h + for details. + +* Changes in SLURM 1.1.0-pre4 +============================= + -- Bluegene specific - Added support to set bluegene block state to + free/error via scontrol update BlockName + -- Add needed symbol to select/bluegene in order to load plugin. + +* Changes in SLURM 1.1.0-pre3 +============================= + -- Added framework for XCPU job launch support. + -- New general configuration file parser and slurm.conf handling code. + Allows long lines to be continued on the next line by ending with a "\". + Whitespace is allowed between the key and "=", and between the "=" and + value. + WARNING: A NodeName may now occur only once in a slurm.conf file. + If you want to temporarily make nodes DOWN in the slurm.conf, + use the new DownNodes keyword (see "man slurm.conf"). + -- Gracefully handle request to submit batch job from within an existing + batch job. + -- Warn user attempting to create a job allocation from within an existing job + allocation. + -- Add web page description for proctrack plugin. + -- Add new function slurm_get_rem_time() for job's time limit. + -- JobAcct plugin renamed from "log" to "linux" in preparation for support of + new system types. + WARNING: "JobAcctType=jobacct/log" is no longer supported. + -- Removed vestigal 'bg' names from bluegene plugin and smap + -- InactiveLimit parameter is not enforced for RootOnly partitions. + -- Update select/cons_res web page (Susanne Balle, HP, + cons_res_doc_patch_3_29_06). + -- Build a "slurmd.test" along with slurmd. slurmd.test has the path to + slurmstepd set allowing it to run unmodified out of the builddir for + testing (Mark Grondona). + +* Changes in SLURM 1.1.0-pre2 +============================= + -- Added "bcast" command to transmit copies of a file to compute nodes + with message fanout. + -- Bluegene specific - Added support for overlapping partitions and + dynamic partitioning. + -- Bluegene specific - Added support for nodecard sized blocks. + -- Added logic to accept 1k for 1024 and so on for --nodes option of srun. + This logic is through display tools such as smap, sinfo, scontrol, and + squeue. + -- Added bluegene.conf man page. + -- Added support for memory affinity, see srun --mem_bind option. + +* Changes in SLURM 1.1.0-pre1 +============================= + -- New --enable-multiple-slurmd configure parameter to allow running + more than one copy of slurmd on a node at the same time. Only + really useful for developers. + -- New communication is now branched on all processes to slurmd's from + slurmctld and srun launch command. This is done with a tree type + algorithm. Spawn and batch mode work the same as before. New slurm.conf + variable TreeWidth=50 is default. This is the number of threads per + stop on the tree. + -- Configuration parameter HeartBeatInterval is depracated. Now used half + of SlurmdTimeout and SlurmctldTimeout for communications to slurmd and + slurmctld daemons repsectively. + -- Add hash tables for select/cons_res plugin (Susanne Balle, HP, + patch_02222006). + -- Remove some use of cr_enabled flag in slurmctld job record, use + new flag "test_only" in select_g_job_test() instead. + +* Changes in SLURM 1.0.16 +========================= + -- For "srun --attach=X" to other users job, report an error and exit (it + previously just hung). + -- Make sure that "scancel -s KILL" terminates the job just like "scancel" + including deletion of all job steps (Chris Holmes, HP, slurm,patch). + -- Recognize ISO-8859 input to srun as a script (for non-English scripts). + -- switch/elan: Fix bug in propagation of ELAN_STATKEY environment variable. + +* Changes in SLURM 1.0.15 +========================= + -- In srun, reset stdin to blocking mode (if it was originally blocking before + we set it to O_NONBLOCK) on exit to avoid trouble with things like running + srun under a bash shell in an emacs *shell* buffer. + -- Fix srun race condition that occasionally causes segfaults at shutdown + -- Fix obscure locking issues in log.c code. + -- Explicitly close IO related sockets. If an srun gets "stuck", possibly + because of unkillable tasks in its job step, it will not hold many TCP + sockets in the CLOSE_WAIT state. + -- Increase the SLURM protocol timeout from 5 seconds to 10 seconds. + (In 1.2 there will be a slurm.conf parameter for this, rather than having + it hardcoded.) + +* Changes in SLURM 1.0.14 +========================= + -- Fix for bad xfree() call in auth/munge which can raise an assert(). + -- Fix installed fork handlers for the conf mutex for slurmd and slurmstepd. + +* Changes in SLURM 1.0.13 +========================= + -- Fix for AllowGroups option to work when the /etc/group file doesn't + contain all users in group by adding the uids of the names in /etc/passwd + that have a gid of that which we are looking for. + -- Fix bug in InactiveLimit support that can potentially purge active jobs. + NOTE: This is highly unlikely except on very large AIX clusters. + -- Fix bug for reiniting the config_lock around the control_file in + slurm_protocol_api.c logic has changed in 1.1 so no need to merge + +* Changes in SLURM 1.0.12 +========================= + -- Report node state of DRAIN rather than DOWN if DOWN with DRAIN flag set. + -- Initialize job->mail_type to 0 (NONE) for job submission. + -- Fix for stalled task stdout/stderr when buffered I/O is used, and + a single line exceeds 4096 bytes. + -- Memory leak fixes for maui plugin (hjcao@nudt.edu.cn) + -- Fix for spinning srun when the terminal to which srun is talking + goes away. + -- Don't set avail_node_bitmap for DRAINED nodes on slurmctld reconfig + (can schedule a job on drained node after reconfig). + + +* Changes in SLURM 1.0.11 +========================= + -- Fix for slurmstepd hang when launching a task. (Needed to install + list library's atfork handlers). + -- Fix memory leak on AIX (and possibly other architectures) due to + missing pthread_attr_destroy() calls. + -- Fix rare task standard I/O setup bug. When the bug hit, stdin, stdout, + or stderr could be an invalid file descriptor. + -- General slurmstepd file descriptor cleanup. + -- Fix memory leak in job accounting logic (Andy Riebs, HP, memory_leak.patch). + +* Changes in SLURM 1.0.10 +========================= + -- Fix for job accounting logic submitted from Andy Riebs to handle issues + with suspending jobs and such. patch file named requeue.patch + -- Make select/cons_res interoperate with mpi/lam plugin for task counts. + -- Fix race condition where srun could seg-fault due to use of logging functions + within pthread after calling log_fini. + -- Code changes for clean build with gcc 2.96 (gcc_2_96.patch, Takao Hatazaki, HP). + -- Add CacheGroups configuration support in configurator.html (configurator.patch, + Takao Hatazaki, HP). + -- Fix bug preventing use of mpich-gm plugin (mpichgm.patch, Takao Hatazaki, HP). + +* Changes in SLURM 1.0.9 +======================== + -- Fix job accounting logic to open new log file on slurmctld reconfig. + (Andy Riebs, slurm.hp.logfile.patch). + -- Fix bug which allows a user to run a batch script on a node not allocated + by the slurmctld. + -- Fix poe MP_HOSTFILE handling bug on AIX. + +* Changes in SLURM 1.0.8 +======================== + -- Fix to communication between slurmd and slurmstepd to allow for partial + reads and writes on their communication pipes. + +* Changes in SLURM 1.0.7 +======================== + -- Change in how AuthType=auth/dummy is handled for security testing. + -- Fix for bluegene systems to allow full system partitions to stay booted + when other jobs are submitted to the queue. + +* Changes in SLURM 1.0.6 +======================== + -- Prevent slurmstepd from crashing when srun attaches to batch job. + +* Changes in SLURM 1.0.5 +======================== + -- Restructure logic for scheduling BlueGene small block jobs. Added + "test_only" flag to select_p_job_test() in select plugin. + -- Correct squeue "NODELIST" output for BlueGene small block jobs. + -- Fix possible deadlock situations on BlueGene plugin on errors. + +* Changes in SLURM 1.0.4 +======================== + -- Release job allocation if step creation fails (especially for BlueGene). + -- Fix bug select/bluegene warm start with changed bglblock layout. + -- Fix bug for queuing full-system BlueGene jobs. + +* Changes in SLURM 1.0.3 +======================== + -- Fix bug that could refuse to queue batch jobs for BlueGene system. + -- Add BlueGene plugin mutex lock for reconfig. + -- Ignore BlueGene bgljobs in ERROR state (don't try to kill). + -- Fix job accounting for batch jobs (Andy Riebs, HP, + slurm.hp.jobacct_divby0a.patch). + -- Added proctrack/linuxproc.so to the main RPM. + -- Added mutex around bridge api file to avoid locking up the api. + -- BlueGene mod: Terminate slurm_prolog and slurm_epilog immediately if + SLURM_JOBID environment variable is invalid. + -- Federation driver: allow selection of a sepecific switch interface + (sni0, sni1, etc.) with -euidevice/MP_EUIDEVICE. + -- Return an error for "scontrol reconfig" if there is already one in + progress + +* Changes in SLURM 1.0.2 +======================== + -- Correctly report DRAINED node state as type OTHER for "sinfo --summarize". + -- Fixes in sacct use of malloc (Andy Riebs, HP, sacct_malloc.patch). + -- Smap mods: eliminate screen flicker, fix window resize, report more clear + message if window too small (Dan Palermo, HP, patch.1.0.0.1.060126.smap). + -- Sacct mods for inconsistent records (race condition) and replace --debug + option with --verbose (Andy Riebs, HP, slurm.hp.sacct_exp_vvv.patch). + -- scancel of a job step will now send a job-step-completed message + to the controller after verifying that the step has completed on all nodes. + -- Fix task layout bug in srun. + -- Added times to node "Reason" field when set down for insufficient + resources or if not responding. + -- Validate operation with Elan switch and heterogeneous nodes. + +* Changes in SLURM 1.0.1 +======================== + -- Assorted updates and clarifications in documentation. + -- Detect which munge installation to use 32/64 bit. + +* Changes in SLURM 1.0.0 +======================== + -- Fix sinfo filtering bug, especially "sinfo -R" output. + -- Fix node state change bug, resuming down or drained nodes. + -- Fix "scontrol show config" to display JobCredentialPrivateKey instead + of JobCredPrivateKey and JobCredentialPublicCertificate instead of + JobCredPublicKey. They now match the options in the slurm.conf. + -- Fix bug in job accounting for very long node list records (Andy Riebs, + HP, sacct_buf.patch). + -- BLUEGENE SPECIFIC - added load function to smap to load an already + exsistant bluegene.conf file. + -- Fix bug in sacct: If user requests specific job or job step ID, + only the last one with that ID will be reported. If multiple + nodes fail, the job has its state recorded as "JOB_TERMINATED...nf" + (Andy Riebs, HP, slurm.hp.sacct_dup.patch). + -- Fix some inconsistencies in sacct's help message (Andy Riebs, HP, + slurm.hp.sacct_help.patch). + -- Validate input to sacct command and allows embedded spaces in + arguments (Andy Riebs, HP, slurm.hp.sacct_validate.patch). + +* Changes in SLURM 0.7.0-pre8 +============================= + -- BGL specific -- bug fix for smap configure function down configuration + -- Add support for job suspend/resume. + -- Add slurmd cache for group IDs (Takao Hatazaki, HP). + -- Fix bug in processing of "#SLURM" batch script option parsing. + +* Changes in SLURM 0.7.0-pre7 +============================= + -- Fix issue with NODE_STATE_COMPLETING, could start job on node before + epilog completed. + -- Added some infrastructure for job suspend/resume (scontrol, api, and + slurmctld stub). + -- Set job's num_procs to the actual processor count allocated to the job. + -- Fix bug in HAVE_FRONT_END support for cluster emulation. + +* Changes in SLURM 0.7.0-pre6 +============================= + -- Added support for task affinity for binding tasks to CPUs (Daniel + Palermo, HP). + -- Integrate task affinity support with configuration, add validation + test. + +* Changes in SLURM 0.7.0-pre5 +============================= + -- Enhanced performance and debugging for slurmctld reconfiguration. + -- Add "scontrol update Jobid=# Nice=#" support. + -- Basic slurmctld and tool functionality validated to 16k nodes. + -- squeue and smap now display correct info for jobs in bluegene enviornment. + -- Fix setting of SLURM_NODELIST for batch jobs. + -- Add SubmitTime to job information available for display. + -- API function slurm_confirm_allocation() has been marked OBSOLETE + and will go away in some future version of SLURM. Use + slurm_allocation_lookup() instead. + -- New API calls slurm_signal_job and slurm_signal_job_step to send + signals directly to the slurmds without triggering the shutdown sequence. + -- remove "uid" from old_job_alloc_msg_t, no longer needed. + -- Several bug fixes in maui scheduler plugin from Dave Jackon + (Cluster Resources). + +* Changes in SLURM 0.7.0-pre4 +============================= + -- Remove BNR libary functions and add those for PMI (KVS and basic + MPI-1 functions only for now) + -- Added Hostfile support for POE and srun. MP_HOSTFILE env var to set + location of hostfile. Tasks will run from list order in the file. + -- Removes the slurmd's use of SysV shared memory. Instead the slurmd + communicates with the slurmstepd processes through the slurmstepd's + new named unix domain socket. The "stepd_api" is used to talk to the + slurmstepd (src/slurmd/common/stepd_api.[ch]). + -- Bluegene specific - bluegene block allocator will find most any + partition size now. Added support to start at any point in smap + to request a partition instead of always starting at 000. + -- Bluegene specific - Support to smap to down or bring up nodes in + configure mode. Added commands include allup, alldown, + up [range], down [range] + -- Time format in sinfo/squeue/smap/sacct changed from D:HH:MM:SS to + D-HH:MM:SS per POSIX standards document. + -- Treat scontrol update request without any requested changes as an + error condition. + -- Bluegene plugin renamed with BG instead of BGL. partition_allocator moved + into bluegene plugin and renamed block_allocator. Format for bluegene.conf + file changed also. Read bluegene html page. Code is backwards compatable + smap will generate in new form + -- Add srun option --nice to give user some control over job priority. + +* Changes in SLURM 0.7.0-pre3 +============================= + -- Restructure node states: DRAINING and DRAINED states are replaced + with a DRAIN flag. COMPLETING state is changed to a COMPLETING flag. + -- Test suite moved into testsuite/expect from separate repository. + -- Added new document describing slurm APIs (doc/html/api.html). + -- Permit nodes to be in multiple partitions simultaneously. + +* Changes in SLURM 0.7.0-pre2 +============================= + -- New stdio protocol. Now srun has just a single TCP stream to each node + of a job-step. srun and slurmd comminicate over the TCP stream using a + simple messaging protocol. + -- Added task plugin and use task prolog/epilog(s). + -- New slurmd_step functionality added. Fork exec instead of using shared + memory. Not completely tested. + -- BGL small partition logic in place in plugin and smap. Scheduler needs + to be rewritten to handle multiple partitions on a single node. No + documentation written on process yet. + -- If running select/bluegene plugin without access to BGL DB2, then + full-system bglblock is of system size defined in bluegene.conf. + +* Changes in SLURM 0.7.0-pre1 +============================= + -- Support defered initiation of job (e.g. srun --begin=11:30 ...). + -- Add support for srun --cpus-per-task through task allocation in + slurmctld. + -- fixed partition_allocator to work without curses + -- made change to srun to start message thread before other threads + to make sure localtime doesn't interfere. + -- Added new RPCs for slurmctld REQUEST_TERMINATE_JOB or TASKS, + REQUEST_KILL_JOB/TASKS changed to REQUEST_SIGNAL_JOB/TASKS. + -- Add support for e-mail notification on job state changes. + -- Some infrastructure added for task launch controls (slurm.conf: + TaskProlog, TaskEpilog, TaskPlugin; srun --task-prolog, --task-epilog). + +* Changes in SLURM 0.6.11 +========================= + -- Fix bug in sinfo partition sorting order. + -- Fix bugs in srun use of #SLURM options in batch script. + -- Use full Elan credential space rather than re-using credentials as soon + as job step completes (helps with fault-tolerance). + +* Changes in SLURM 0.6.10 +========================= + -- Fix for slurmd job termination logic (could hang in COMPLETING state). + -- Sacct bug fixes: Report correct user name for job step, show "uid.gid" + as fifth field of job step record (Andy Riebs, slurm.hp.sacct_uid.patch). + -- Add job_id to maui scheduler plugin start job status message. + -- Fix for srun's handling of null characters in stdout or stderr. + -- Update job accounting for larger systems (Andy Riebs, uptodate.patch). + -- Fixes for proctrack/linuxproc and mpich-gm support (Takao Hatazaki, HP). + -- Fix bug in switch/elan for large task count job having irregular task + distribution across nodes. + +* Changes in SLURM 0.6.9 +======================== + -- Fix bug in mpi plugin to set the ID correctly + -- Accounting bug causing segv fixed (Andy Riebs, 14oct.jobacct.patch) + -- Fix for failed launch of a debugged job (e.g. bad executable name). + -- Wiki plugin fix for tracking allocated nodes (Ernest Artiaga, BSC). + -- Fix memory leaks in slurmctld and federation plugin. + -- Fix sefault in federation plugin function fed_libstate_clear(). + -- Align job accounting data (Andy Riebs, slurm.hp.unal_jobacct.patch) + -- Restore switch state in backup controller restarts + +* Changes in SLURM 0.6.8 +======================== + -- Invalid AllowGroup value in slurm.conf to not cause seg fault. + -- Fix bug that would cause slurmctld to seg-fault with select/cons_res + and batch job containing more than one step. + +* Changes in SLURM 0.6.7 +======================== + -- Make proctrack/linuxproc thread safe, could cause slurmd seg fault. + -- Propagate umask from srun to spawned tasks. + -- Fix problem in switch/elan error handling that could hang a slurmd + step manager process. + -- Build on AIX with -bmaxdata:0x70000000 for memory limit more than 256MB. + -- Restore srun's return code support. + +* Changes in SLURM 0.6.6 +======================== + -- Fix for bad socket close() in the spawn-io code. + +* Changes in SLURM 0.6.5 +======================== + -- Sacct to report on job steps that never actually started. + -- Added proctrack/rms to elan rpm. + -- Restructure slurmctld/agent.c logic to insure timely reaping of + terminating pthreads. + -- Srun not to hang if job fails before task launches not all completed. + -- Fix for consumable resources properly scheduling nodes that have more + nodes than configured (Susanne Balle, HP, cons_res_patch.10.14.2005) + +* Changes in SLURM 0.6.4 +======================== + -- Bluegene plugin drains an entire bglblock on repeated boot failures + only if it has not identified a specific node as being bad. + +* Changes in SLURM 0.6.3 +======================== + -- Fix slurmctld mem leaks (step name and hostlist struct). + -- Bluegene plugin sets end time for job terminated due to removed + bglblock. + +* Changes in SLURM 0.6.2 +======================== + -- Fix sinfo and squeue formatting to properly handle slurm nodes, + jobs, and other names containing "%". + +* Changes in SLURM 0.6.1 +======================== + -- Fixed smap -Db to display slurm partitions correctly (take 2). + -- Add srun fork() retry logic for very heavily loaded system. + -- Fix possible srun hang on task launch failure. + -- Add support for mvapich v0.9.4, 0.9.5 and gen2. + +* Changes in SLURM 0.6.0 +======================== + -- Add documentation for ProctrackType=proctrack/rms. + -- Make proctrack/rms be the default for switch/elan. + -- Do not preceed SIGKILL or SIGTERM to job step with (non-requested) SIGCONT. + -- Fixed smap -Db to display slurm partitions correctly. + -- Explicitly disallow ProctrackType=proctrack/linuxproc with + SwitchType=switch/elan. They will not work properly together. + +* Changes in SLURM 0.6.0-pre8 +============================= + -- Remove debugging xassert in switch/federation that were accidentally + committed + -- Make slurmd step manager retry slurm_container_destroy() indefinitely + instead of giving up after 30 seconds. If something prevents a job + step's processes from being killed, the job will be stuck in the + completing until the container destroy succeeds. + +* Changes in SLURM 0.6.0-pre7 +============================= + -- Disable localtime_r() calls from forked processes (semaphore set + in another pthread can deadlock calls to localtime_r made from + the forked process, this will be properly fixed in the next + major release of SLURM). + -- Added SLURM_LOCALID environment variable for spawned tasks + (Dan Palermo, HP). + -- Modify switch logic to restore state based exclusively upon + recovered job steps (not state save file). + -- Gracefully refuse job if there are too many job steps in slurmd. + -- Fix race condition in job completion that can leave nodes in + COMPLETING state after job is COMPLETED. + -- Added frees for BGL BrigeAPI strdups that were to this point unknown. + -- smap scrolls correctly for BGL systems. + -- slurm_pid2jobid() API call will now return the jobid for a step + manager slurmd process. + +* Changes in SLURM 0.6.0-pre6 +============================= + -- Added logic to return scheduled nodes to Maui scheduler (David + Jackson, Cluster Resources) + -- Fix bug in handling job request with maximum node count. + -- Fix node selection scheduling bug with heterogeneous nodes and + srun --cpus-per-task option + -- Generate error file to note prolog failures. + +* Changes in SLURM 0.6.0-pre5 +============================= + -- Modify sfree (BGL command) so that --all option no longer requires + an argument. + -- Modify smap so it shows all nodes and partitions by default (even + nodes that the user can't access, otherwise there are holes in + its maps). + -- Added module to parse time string (src/common/parse_time.c) for + future use. + -- Fix BlueGene hostlist processing for non-rectangular prisms and + add string length checking. + -- Modify orphan batch job time calculation for BGL to account for + slowness when booting many bglblocks at the same time. + +* Changes in SLURM 0.6.0-pre4 +============================= + -- Added etc/slurm.epilog.clean to kill processes initiated outside of + slurm when a user's last job on a node terminates. + -- Added config.xml and configurator.html files for use by OSCAR. + -- Increased maximum job step count from 64 to 130 for BGL systems only. + +* Changes in SLURM 0.6.0-pre3 +============================= + -- Add code so job request for shared nodes gets explicitly requested + nodes, but lightly loaded nodes otherwise. + -- Add job step name field. + -- Add job step network specification field. + -- Add proctrack/rms plugin + -- Change the proctrack API to send a slurmd_job_t pointer to both + slurm_container_create() and slurm_container_add(). One of those + functions MUST set job->cont_id. + -- Remove vestigial node_use (virtual or coprocessor) field from job + request RPC. + -- Fix mpich-gm bugs, thanks to Takao Hatazaki (HP). + -- Fix code for clean build with gcc 2.96, Takao Hatazaki (HP). + -- Add node update state of "RESUME" to return DRAINED, DRAINING, or + DOWN node to service (IDLE or ALLOCATED state). + -- smap keeps trying to connect to slurmctld in iterative mode rather + than just aborting on failure. + -- Add squeue option --node to filter by node name. + -- Modify squeue --user option to accept not only user names, but also + user IDs. + +* Changes in SLURM 0.6.0-pre2 +============================= + -- Removed "make rpm" target. + +* Changes in SLURM 0.6.0-pre1 +============================= + -- Added bgl/partition_allocator/smap changes from 0.5.7. + -- Added configurable resource limit propagation (Daniel Christians, HP). + -- Added mpi plugin specify at start of srun. + -- Changed SlurmUser ID from 16-bit to 32-bit. + -- Added MpiDefault slurm.conf parameter. + -- Remove KillTree configuration parameter (replace with + "ProctrackType=proctrack/linuxproc") + -- Remove MpichGmDirectSupport configuration parameter (replace with + "MpiDefault=mpich-gm") + -- Make default plugin be "none" for mpi. + -- Added mpi/none plugin and made it the default. + -- Replace extern program_invocation_short_name with program_invocation_name + due to short name being truncated to 16 bytes on some systems. + -- Added support for Elan clusters with different CPU counts on nodes + (Chris Holmes, HP). + -- Added Consumable Resources web page (Susanne Balle, HP). + -- "Session manager" slurmd process has been eliminated. + -- switch/federation fixes migrated from 0.5.* + -- srun pthreads really set detached, fixes scaling problem + -- srun spawns message handler process so it can now be stopped (via + Ctrl-Z or TotalView) without inducing failures. + +* Changes in SLURM 0.5.7 +======================== + -- added infrastructure for (eventual) support of AIX checkpointing + of slurm batch and interactive poe jobs + -- added wiring for BGL to do wiring for physical location first and then + logical. + -- only one thread used to query database before polling thread is there. + +* Changes in SLURM 0.5.6 +======================== + -- fix for BGL hostnames and full system partition finding + +* Changes in SLURM 0.5.5 +======================== + -- Increase SLURM_MESSAGE_TIMEOUT_MSEC_STATIC to 15000 + -- Fix for premature timeout in _slurm_send_timeout + -- Fix for federation overlapping calls to non-thread-safe _get_adapters + +* Changes in SLURM 0.5.4 +======================== + -- Added support for no reboot for VN to CO on BGL + -- Fix for if a job starts after it finishes on BGL + +* Changes in SLURM 0.5.3 +======================== + -- federation patch so the slurm controller has sane window status at + start-up regardless of the window status reported in the slurmd + registration. + -- federation driver exits with fatal() if the federation driver can not + find all of the adapters listed in the federation.conf + +* Changes in SLURM 0.5.2 +======================== + -- Extra federation driver sanity checks + +* Changes in SLURM 0.5.1 +======================== + -- Fix federation driver bad free(), other minor fed fixes + -- Allow slurm to parse very long lines in the slurm.conf + +* Changes in SLURM 0.5.0 +======================== + -- Fix race condition in job accouting plugin, could hang slurmd + -- Report SlurmUser id over 16 bits as an error (fix on v0.6) + +* Changes in SLURM 0.5.0-pre19 +============================== + -- Fix memory management bug in federation driver + +* Changes in SLURM 0.5.0-pre18 +============================== + -- elan switch plugin memory leak plugged + -- added g_slurmctld_jobacct_fini() to release all memory (useful + to confirm no memory leaks) + -- Fix slurmd bug introduced in pre17 + +* Changes in SLURM 0.5.0-pre17 +============================== + -- slurmd calls the proctrack destroy function at job step completion + -- federation driver tries harder to clean up switch windows + -- BGL wiring changes + +* Changes in SLURM 0.5.0-pre16 +============================== + -- Check slurm.conf values for under/overflows (some are 16 bit values). + -- Federation driver clears windows at job step completion + -- Modify code for clean build with gcc v4.0 + -- New SLURM_NETWORK environmant variable used by slurm_ll_api + +* Changes in SLURM 0.5.0-pre15 +============================== + -- Added "network" field to "scontrol show job" output. + -- Federation fix for unfreed windows when multiple adapters on + one node use the same LID + +* Changes in SLURM 0.5.0-pre14 +============================== + -- RDMA works on fed plugin. + +* Changes in SLURM 0.5.0-pre13 +============================== + -- Major mods to support checkpoint on AIX. + -- Job accounting documenation expanded, added tuning options, minor bug fixes + -- BGL wiring will now work on <= 4 node X-dim partitions and also 8 node + X-dim partitions. + -- ENV variables set for spawning jobs. + -- jobacct patch from HP to not erroneously lock a mutex in the + jobacct_log plugin. + -- switch/federation supports multiple adapters per task. sn_all behaviour + is now correct, and it also supports sn_single. + +* Changes in SLURM 0.5.0-pre12 +============================== + -- Minor build changes to support RPM creation on AIX + +* Changes in SLURM 0.5.0-pre11 +============================== + -- Slurmd tests for initialized session manager (user's) slurmd pid before + killing it to avoid killing system daemon (race condition). + -- srun --output or --error file names of "none" mapped to /dev/null for + batch jobs rather than a file actually named "none". + -- BGL: don't try to read bglblock state until they are all created to + avoid having BGL Bridge API seg fault. + +* Changes in SLURM 0.5.0-pre10 +============================== + -- Fix bug that was resetting BGL job geometry on unrelated field update. + -- squeue and sinfo print timestamp in interate mode by default. + -- added scrolling windows in smap + -- introduced new variable to start polling thread in the bluegene plugin. + -- Latest accounting patches from Riebs/HP, retry communications. + -- Added srun option --kill-on-bad-exit from Holmes/HP. + -- Support large (64-bit address) log files where possible. + -- Fix problem of signals being delivered twice to tasks. Note that as + part of the fix the slurmd session manger no longer calls setsid to + create a new session. + +* Changes in SLURM 0.5.0-pre9 +============================= + -- If a job and node are in COMPLETING state and slurmd stops responding for + SlurmdTimeout, then set the node DOWN and the job COMPLETED. + -- Add logic to switch/elan to track contexts allocated to active job steps + rather than just using a cyclic counter and hoping to avoid collisions. + -- Plug memory leak in freeing job info retrieved using API. + -- Bluegene Plugin handles long deallocating states from driver 202. + -- Fix bug in bitfmt2int() which can go off allocated memory. + +* Changes in SLURM 0.5.0-pre8 +============================= + -- BlueGene srun --geometry was not getting propogated properly. + -- Fix race condition with multiple simultaneous epilogs. + -- Modify slurmd to resend job completion RPC to slurmctld in the + case where slurmctld is not responding. + -- Updated sacct: handle cancelled jobs correctly, add user/group + output, add ntasks ans synonym for nprocs, display error field + by default, display ncpus instead of nprocs + -- Parallelization of queing jobs up to 32 at once. Variable + MAX_AGENT_COUNT used in bgl_job_run.c to specify. + -- bgl_job_run.c fixed threading issue with uid_to_string use. + +* Changes in SLURM 0.5.0-pre7 +============================= + -- Preserve next_job_id across restarts. + -- Add support for really long job names (256 bytes). + -- Add configuration parameter SchedulerRootFilter to control what + entity manages prioritization of jobs in RootOnly partition + (internal scheduler plugin or external entity). + -- Added support for job accounting. + -- Added support for consumable resource based node scheduling. + -- Permit batch job to be launched to re-existing allocation. + +* Changes in SLURM 0.5.0-pre6 +============================= + -- Load bluegene.conf and federation.conf based upon SLURM_CONF env + var (if set). + -- Fix slurmd shutdown signal synchronization bug (not consistently + terminating). + -- Add doc/html/ibm.html document. Update bluegene.html. + -- Add sfree to bluegene plugin. + -- Remove geometry[SYSTEM_DIMENSIONS] from opaque node_select data + type if SYSTEM_DIMENSIONS==0 (not ASCI-C compliant). + -- Modify smap to test for valid libdb2.so before issuing any BGL + Bridge API calls. + -- Modify spec file for optional inclusion of select_bluegene and + sched_wiki plugin libraries. + -- Initialize job->network in data structure, could cause job + submit/update to fail depending upon what is left on stack. + +* Changes in SLURM 0.5.0-pre5 +============================= + -- Expand buffer to hold node_select info in job termination log. + -- Modify slurmctld node hashing function to reduce collisions. + -- Treat bglblock vanishing as fatal error for job, prolog and epilog + exit immediately. + -- bug fix for following multiple X-dim partitions + +* Changes in SLURM 0.5.0-pre4 +============================= + -- Fix bug in slurmd that could double KillWait time on job timeout. + -- Fix bug in srun's error code reporting to slurmctld, could DOWN + a node if job run as root has non-zero error code. + -- Remove a node's partition info when removed from existing partition. + -- Use proctrack plugin to call all processes in a job step before + calling interconnect_postfini() to insure no processes escape from + job and prevent switch windows from being released. + -- Added mail.html web page telling how to get on slurm mailing lists. + -- Added another directory to search for DB2 files on BGL system. + -- Added overview man page slurm.1. + -- Added new configure option "--with-db2-dir=PATH" for BGL. + +* Changes in SLURM 0.5.0-pre3 +============================= + -- Merge of SLURM v0.4-branch into v0.5/HEAD. + +* Changes in SLURM 0.5.0-pre2 +============================= + -- Fix bug in srun to clean-up upon failure of an allocated node + (srun -A would generate a segmentation fault, Chris Holmes, HP). + -- If slurmd's node name is mapped to NULL (due to bad configuration) + terminate slurmd with a fatal error and don't crash slurmctld. + -- Add SLURMD_DEBUG env var for use with AIX/POE in spawn_task RPC. + -- Always pack job's "features" for access by prolog/epilog + +* Changes in SLURM 0.5.0-pre1 +============================= + -- Add network option to srun and job creation API for specification + of communication protocol over IBM Federation switch. + -- Add new slurm.conf parameter ProctrackType (process tracking) and + associated plugin in the slurmd module. + -- Send node's switch state with job epilog completion RPC and + node registration (only when slurmd starts, not on periodic + registrtions). + -- Add federation switch plugin. + -- Add new configuration keyword, SchedulerRootFilter, to control + external scheduler control of RoolOnly partition (Chris Holmes, HP). + -- Modify logic to set process group ID for spawned processes (last + patch from slurm v0.3.11). + -- "srun -A" modified to return exit code of last command executed + (Chris Holmes, HP). + -- Add support for different slurm.conf files controlled via SLURM_CONF + env var (Brian O'Sullivan, pathscale) + -- Fix bug if srun given --uid without --gid option (Chris Holmes, HP). + +* Changes in SLURM 0.4.24 +========================= + -- DRAIN nodes with switches on base partitions are in ERROR, MISSING, + or DOWN states. + +* Changes in SLURM 0.4.23 +========================= + -- Modified bluegene plugin to only sync bglblocks to jobs on initial + startup, not on reconfig. Fixes race condition. + -- Modified bluegene plugin to work with 141 driver. Enabling it to + only have to reboot when switching from coproc -> virtual and back. + -- added support for a full system partition to make sure every other + partition is free and vice-verse. + -- smap resizing issue fixed. + -- change prolog not to add time when a partition is in deallocating + state. + -- NOTE: This version of SLURM requires BGL driver 141/2005. + +* Changes in SLURM 0.4.22 +========================= + -- Modified bluegene plugin to not do anything if the bluegene.conf file + is altered. + -- added checking for lists before trying to create iterator on the list. + +* Changes in SLURM 0.4.21 +========================= + -- Fix in race condition with time in Status Thread of BGL + -- Fix no leading zeros in smap output. + +* Changes in SLURM 0.4.20 +========================= + -- Smap output is more user friendly with -c option + +* Changes in SLURM 0.4.19 +========================= + -- Added new RPCs for getting bglblock state info remotely and cache data + within the plugin (permits removal of DB2 access from BGL FEN and + dramatically increases smap responsivenss, also changed prolog/epilog + operation) + -- Move smap executable to main slurm RPM (from separate RPM). + -- smap uses RPC instead of DB2 to get info about bgl partitions. + -- Status function added to bluegene_agent thread. Keeps current state + of BGL partitions updating every second. will handle multiple attempts + at booting if booting a partition fails. + +* Changes in SLURM 0.4.18 +========================= + -- Added error checking of rm_remove_partition calls. + -- job_term() was terminating a job in real time rather than + queueing the request. This would result in slurmctld hanging + for many seconds when a job termination was required. + +* Changes in SLURM 0.4.17 +======================== + -- Bug fixes from testing .16. + +* Changes in SLURM 0.4.16 +======================== + -- Added error checking to a bunch of Bridge API calls and more + gracefully handle failure modes. + -- Made smap more robust for more jobs. + +* Changes in SLURM 0.4.15 +======================== + -- Added error checking to a bunch of Bridge API calls and more + gracefully handle failure modes. + +* Changes in SLURM 0.4.14 +======================== + -- job state is kept on warm start of slurm + +* Changes in SLURM 0.4.13 +======================== + -- epilog fix for bgl plugin + +* Changes in SLURM 0.4.12 +======================== + -- bug shot for new api calls. + -- added BridgeAPILogFile as an option for bluegene.conf file + +* Changes in SLURM 0.4.11 +======================== + -- changed as many rm_get_partition() to rm_get_partitions_info as we could + for time saving. + +* Changes in SLURM 0.4.10 +======================== + -- redesign for BGL external wiring. + -- smap display bug fix for smaller systems. + +* Changes in SLURM 0.4.9 +======================== + -- setpnum works now, have to include this in bluegene.conf + +* Changes in SLURM 0.4.8 +======================== + -- Changed the prolog and the epilog to use the env var MPIRUN_PARTITION + instead of BGL_PARTITION_ID + +* Changes in SLURM 0.4.7 +======================== + -- Remove some BGL specific headers that IBM now distributes, NOTE + BGL driver 080 or greater required. + -- Change autogen.sh to deal with problems running autoconf on one + system and configure on another with different software versions. + +* Changes in SLURM 0.4.6 +======================== + -- smap now works on non-BGL systems. + -- took tv.h out of partition_allocator so it would work withn driver 080 + from IBM. + -- updated slurmd signal handling to prevent possible user killing of daemon. + +* Changes in SLURM 0.4.5 +======================== + -- Change sinfo default time limit field to have 10 bytes (up from 9). + -- Fix bug in bluegene partition selection (sorting bug). + -- Don't display any completed jobs in smap. + -- Add NodeCnt to filetxt job completion plugin. + -- Minor restructuring of how MMCS is polled for DOWN nodes and switches. + -- Fix squeue output format for "%s" (node select data). + -- Queue job requesting more resources than exist in a partition if + that partition's state is DOWN (rather than just abort it). + -- Add prolog/epilog for bluegene to code base (moved from mpirun in CVS) + -- Add prolog, epilog and bluegene.conf.example to bluegene RPM + -- In smap, Admin can get the Rack/midplane id from an XYZ input and vice versa. + -- Add smap line-oriented output capability. + +* Changes in SLURM 0.4.4 +======================== + -- Fix race condition in slurmd seting pgid of spawned tasks for + process tracking. + -- Fix scontrol reconfig does nothing to running jobs nor crash the system + -- Fix sort of bgl_list only happens once in select_bluegene.c instead of every + time a new job is inserted. + +* Changes in SLURM 0.4.3 +======================== + -- Turn off some RPM build checks (bug in RPM, see slurm.spec.in) + -- starting slurmctrld will destroy all RMP*** partitions everytime. + +* Changes in SLURM 0.4.2 +======================== + -- Fix memory leak in BlueGene plugin. + -- Srun's --test-only option takes precedence over --batch option. + -- Add sleep(1) after setting bglblock owner due to apparent race condition + in the BGL API. + -- Slurm was timing out and killing batch jobs if the node registered when + a job prolog was still running. + +* Changes in SLURM 0.4.1 +======================== + -- BlueGene plugin kills jobs running in defunct bglblock on restart. + -- Smap displays pending jobs now, in addition to running and completing jobs. + -- Remove node "use=" from bluegene.conf file, create both coprocessor and + virtual bglblocks for now (later create just one and use API to change + it when such an API is available). + -- Add "ChangeNumpsets" parameter to bluegene.conf to use script to + update the numpsets parameter for newly created bglblocks (to be + removed once the API functions). + -- Add all patches from slurm v0.3.11 (through 2/7/2005) + - Added srun option --disable-status,-X to disable srun status feature + and instead forward SIGINT immediately to job upon receipt of Ctrl-C. + - Fix for bogus slurmd error message "Unable to put task N into pgrp..." + - Fix case where slurmd may erroneously detect shared memory entry + as "stale" and delete entry for unkillable or slow-to-exit job. + - (qsnet) Fix for running slurmd on node without and elan3 adapter. + - Fix for reported problem: slurm/538: user tasks block writing to stdio + +* Changes in SLURM 0.4.0 +======================== + -- Minor tweak to init.d/slurm for BlueGene systems. + -- Added smap RPM package (to install binary built on BlueGene + service node on front-end nodes). + -- Added wait between bglblock destroy and creation of new blocks + so that MMCS can complete the operation. + -- Fix bug in synchronizing bglblock owners on slurmctld restart. + +* Changes in SLURM 0.4.0-pre11 +============================== + -- Add new srun option "--test-only" for testing slurm_job_will_run API. + -- Fix bugs in slurm_job_will_run() processing. + -- Change slurm_job_will_run() to not return a message, just an error code. + -- Sync partition owners with running jobs on slurmctld restart. + +* Changes in SLURM 0.4.0-pre10 +============================== + -- Specify number of I/O nodes associated with BlueGene partition. + -- Do not launch a job's tasks if the job is cancelled while its + prolog is running (which can be slow on BlueGene). + -- Add new error code, ESLURM_BATCH_ONLY for attepts to launch + job steps on front-end system (e.g. Blue Gene). + -- Updates to html documents. + -- Assorted fixes in smap, partition creation mode. + -- Add proper support for "srun -n" option on BGL recognizing + processor count in both virual and coprocessor modes. + -- Make default node_use on Blue Gene be coprocessor, as documented. + -- Add SIGKILL to BlueGene jobs as part of cleanup. + +* Changes in SLURM 0.4.0-pre9 +============================= + -- Change in /etc/init.d/slurm for RedHat and Suze compatability + +* Changes in SLURM 0.4.0-pre8 +============================= + -- Add logic to create and destroy Bluegene Blocks automatically as needed. + -- Update smap man page to include Bluegene configuration commands. + +* Changes in SLURM 0.4.0-pre7 +============================= + -- Port all patches from slurm v0.3 up through v0.3.10: + - Remove calls in auth/munge plugin deprecated by munge-0.4. + - Allow single task id to be selected with --input, --output, and --error. + - Create shared memory segment for Elan statistics when using the + switch/elan plugin. + - More fixes necessary for TotalView. + +* Changes in SLURM 0.4.0-pre6 +============================= + -- Add new job reason value "JobHeld" for jobs with priority==0 + -- Move startup script from "/etc/rc.d/init.d/slurm" to "/etc/init.d/slurm" + -- Modify prolog/epilog logic in slurmd to accomodate very long run times, + on BGL these scripts wait for events that can take a very long time + (tens of seconds). + -- This code base was used for BGLb acceptance test with pre-defined + BGL blocks. + +* Changes in SLURM 0.4.0-pre5 +============================= + -- select/bluegene plugin confirms db.properties file in $sysconfdir + and copies it to StateSaveLocation (slurmctld's working directory) + -- select/bluegene plugin confirms environment variable required for + DB2 interaction are set (execute "db2profile" script before slurmctld) + -- slurmd to always give jobs KillWait time between SIGTERM and SIGKILL + at termination + -- set job's start_time and end_time = now rather than leaving zero if + they fail to execute + -- modify srun to forward SIGTERM + -- enable select/bluegene testing for DOWN nodes and switches + -- select/bluegene plugin to delete orphan jobs, free BGLblocks and + set owner as jobs terminate/start + +* Changes in SLURM 0.4.0-pre4 +============================= + -- Fixes for reported problems: + - slurm/512: Let job steps run on DRAINING nodes + - slurm/513: Gracefully deal with UIDs missing from passwd file + -- Add support for MPICH-GM (from takao.hatazaki@hp.com) + -- Add support for NodeHostname in node configuration + -- Make "scontrol show daemons" function properly on front-end system + (e.g. Blue Gene) + -- Fix srun bug when --input, --output and --error are all "none" + -- Don't schedule jobs for user root if partition is DOWN + -- Modify select/bluegene to honor job's required node list + -- Modify user name logic to explicitly set UID=0 to "root", + Suse Linux was not handling multiple users with UID=0 well. + +* Changes in SLURM 0.4.0-pre3 +============================= + -- Send SIGTERM to batch script before SIGKILL for mpirun cleanup on + Blue Gene/L + -- Create new allocation as needed for debugger in case old allocation + has been purged + -- Add Blue Gene User Guide to html documents + -- Fix srun bug that could cause seg fault with --no-shell option if not + running under a debugger + -- Propogate job's task count (if set) for batch job via SLURM_NPROCS. + -- Add new job parameters for Blue Gene: geometry, rotate, mode (virtual + or co-processor), communications type (mesh or torus), and partition ID. + -- Exercise a bunch of new switch plugin functions for Federation + switch support. + -- Fix bug in scheduling jobs when a processor count is specified + and FastSchedule=0 and the cluster is heterogeneous. + +* Changes in SLURM 0.4.0-pre2 +============================= + -- NOTE: "startclean" when transitioning from version 0.4.0-pre1, JOBS ARE LOST + -- Fixes for reported problems: + - slurm/477: Signal of batch job script (scancel -b) fixed + - slurm/481: Permit clearing of AllowGroups field for a partition + - slurm/482: Adjust Elan base context number to match RMS range + - slurm/489: Job completion logger was writing NULL to text file + -- Preserve job's requested processor count info after job is initiated + (for viewing by squeue and scontrol) + -- srun cancels created job if job step creation fails + -- Added a lots of Blue Gene/L support logic: slurmd executes on a single + node to front-end the 512-CPU base-partitions (Blue Gene/L's nodes) + -- Add node selection plugin infrastructure, relocate existing logic + to select/linear, add configuration parameter SelectType + -- Modify node hashing algorithm for better performance on Blue Gene/L + -- Add ability to specify node ranges for 3-D rectangular prism + +* Changes in SLURM 0.4.0-pre1 +============================= + -- NOTE: "startclean" when transitioning from version 0.3, JOBS ARE LOST + -- Added support for job account information (arbitrary string) + -- Added support for job dependencies (start job X after job Y completes) + -- Added support for configuration parameter CheckpointType + -- Added new job state "CANCELLED" + -- Don't strip binaries, breaks parallel debuggers + -- Fix bug in Munge authentication retry logic + -- Change srun handling of interupts to work properly with TotalView + -- Added "reason" field to job info showing why a job is waiting to run + +* Changes in SLURM 0.3.7 +======================== + -- Fixes required for TotalView operability under RHEL3.0 + (Reported by Dong Ahn ) + - Do not create detached threads when running under parallel debugger. + - Handle EINTR from sigwait(). + +* Changes in SLURM 0.3.6 +======================== + -- Fixes for reported problems: + - slurm/459: Properly support partition's "Shared=force" configuration. + -- Resync node state to DRAINED or DRAINING on restart in case job + and node state recovered are out of sync. + -- Added jobcomp/script plugin (execute script on job completion, + from Nathan Huff, North Dakota State University). + -- Added new error code ESLURM_FRAGMENTED for immediate resource + allocation requests which are refused due to completing job (formerly + returned ESLURM_NOT_TOP_PRIORITY) + -- Modified job completion logging plugin calling sequence. + -- Added much of the infrastructure required for system checkpoint + (APIs, RPCs, and NULL plugin) + +* Changes in SLURM 0.3.5 +======================== + -- Fix "SLURM_RLIMIT_* not found in environment" error message when + distributing large rlimit to jobs. + -- Add support for slurm_spawn() and associated APIs (needed for IBM + SP systems). + -- Fix bug in update of node state to DRAINING/DRAINED when update + request occurs prior to initial node registration. + -- Fix bug in purging of batch jobs (active batch jobs were being + improperly purged starting in version 0.3.0). + -- When updating a node state to DRAINING/DRAINED a Reason must be + provided. The user name and a timestamp will automatically be + appended to that Reason. + +* Changes in SLURM 0.3.4 +======================== + -- Fixes for reported problems: + - slurm/404: Explicitly set pthread stack size to 1MB for srun + -- Allow srun to respond to ctrl-c and kill queued job while waiting + for allocation from controller. + +* Changes in SLURM 0.3.3 +======================== + -- Fix slurmctld handling of heterogeneous processor count on elan + switch (was setting DRAINED nodes in state DRAINING). + -- Fix sinfo -R, --list-reasons to list all relevant node states. + -- Fix slurmctld to honor srun's node configuration specifications + with FastSchedule==0 configuration. + -- Added srun option --debugger-test to confirm that slurm's debugger + infrastructure is operational. + -- Removed debugging hacks for srun.wrapper.c. Temporarily use + RPM's debugedit utility if available for similar effect. + +* Changes in SLURM 0.3.2 +======================== + -- The srun command wakes immeditely upon resource allocation (via new RPC) + rather than polling. + -- SLURM daemons log current version number at startup. + -- If slurmd can't respond to ping (e.g. paging is keeping it from + responding in a timely fashion) then send a registration RPC + to slurmctld. + -- Fix slurmd -M option to call mlockall() after daemonizing. + -- Add "slurm_" prefix to slurm's hostlist_ function man pages. + -- More AIX support added. + -- Change get info calls from using show_all to more general show_flags + with #define for SHOW_ALL flag. + +* Changes in SLURM 0.3.1 +======================== + -- Set SLURM_TASKS_PER_NODE env var for batch jobs (and LAM/MPI). + -- Fix for slurmd spinning when stdin buffers full (gnats:434) + -- Change some slurmctld malloc sizes to reduce demand for realloc calls, + improves performance and eliminates realloc failure on RH EL3 under + extremely heavy workload apparently due to memory fragmentation. + -- Fix scheduling logic for heterogeneous processor count. + -- Modify security_2_2 test to function with release 0.3 + -- Fix broken rpm build when libslurm not already installed. + -- New slurmd option -M to mlock() slurmd process into memory. + -- New srun option --no-shell causes srun to exit instead of spawning + shell when using --allocate, -A. + -- Modify srun --uid=user and --gid=group options to maintain invoking + user's credentials until after nodes have been allocated to requested + user/group (allows root to run jobs and allocate nodes for other users + in a RootOnly partition). + -- Fix node processing if state change requested via scontrol prior to + initial node registration. + +* Changes in SLURM 0.3.0 +======================== + -- Support for AIX added (a few bugs do remain). + -- Fix memory leak in slurmctld, slurm_cred_create(). + -- On ELF systems, export BNR_* functions from SLURM API. + -- Add support for "hidden" partitions (applies to their + nodes, jobs, and job steps as well). APIs and commands + modified to optionally display hidden partitions. + -- Modify partition's group_allow test to be based upon the user + of the allocation rather than the user making the allocation + request (user root for LCRM batch jobs). + -- Restructure plugin directory structure. + -- New --core=type option in srun for lightweight corefile support. + (requires liblwcf). + -- Let user root and SlurmUser exceed any partition limits. + -- Srun treats "--time=0" as a request for an infinite time limit. + +* Changes in SLURM 0.3.0.0-pre10 +================================ + -- Fix bugs in support of slurmctld "-f" option (specify different + slurm.conf pathname). + -- Remove slurmd "-f" option. + -- Several documenation changes for slurm administrators. + -- On ELF systems, export only slurm_* functions from slurm API and + ensure plugins use only slurm_ prefixed functions (created aliases + where necessary). + -- New srun option -Q, --quiet to suppress informational messages. + -- Fix bug in slurmctld's building of nodelist for job (failed if + more than one numeric field in node name). + -- Change "scontrol completing" and "sinfo" to use job's node bitmap + to identify nodes associated with that particular job that are + still processing job completion. This will work properly for + shared nodes. + -- Set SLURM_DISTRIBUTION environment varible for user tasks. + -- Fix for file descriptor leak in slurmd. + -- Propagate stacksize limit to jobs along with other resource limits + that were previously ignored. + +* Changes in SLURM 0.3.0.0-pre9 +=============================== + -- Restructure how slurmctld state saves are performed for better + scalability. + -- New sinfo option "--list-reason" or "-R". Displays down or drained + nodes along with their REASON field. + +* Changes in SLURM 0.3.0.0-pre8 +=============================== + -- Queue outgoing message traffic rather than immediately spawning + pthreads (under heavy load this resulted in hundreds of pthreads + using more memory than was available). + -- Restructure slurmctld message agent for higher throughput. + -- Add new sinfo options --responding and --dead (i.e. non-responding) + for filtering node states. + -- Fix bug in sinfo to properly process specified state filter including + "*" suffix for non-responding nodes. + -- Create StateSaveLocation directory if changes via slurmctld reconfig + +* Changes in SLURM 0.3.0.0-pre7 +=============================== + -- Fixes for reported problems: + - slurm/381: Hold jobs requesting more resources than partition limit. + - slurm/387: Jobs lost and nodes DOWN on slurmctld restart. + -- Add support for getting node's real memory size on AIX. + -- Sinfo sort partitions in slurm.conf order, new sort option ("#P"). + -- Document how to gracefully change plugin values. + -- Slurmctld does not attempt to recover jobs when the switch plugin + value changes (decision reached when any job's switch state recovery + fails). + -- Node does not transition from COMPLETING to DOWN state due to + not responding. Wait for tasks to complete or admin to set DOWN. + -- Always chmod SlurmdSpoolDir to 755 (a umask of 007 was resulting + in batch jobs failing). + -- Return errors when trying to change configuration parameters + AuthType, SchedulerType, and SwitchType via "scontrol reconfig" + or SIGHUP. Document how to safely change these parameters. + -- Plugin-specific error number definitions and descriptive strings + moved from common into plugin modules. + -- Documentation for writing scheduler, switch, and job completion + logging plugins added. + -- Added job and node state descriptions to the squeue and sinfo man pages. + -- Backup slurmctld to generate core file on SIGABRT. + -- Backup slurmctld to re-read slurm.conf on SIGHUP. + -- Added -q,--quit-on-interrupt option to srun. + -- Elan switch plugin now starts neterr resolver thread on all Elan3 + systems (QsNet and QsNetII). + -- Added some missing read locks for references for slurmctld's + configuration data structure + -- Modify processing of queued slurmctld message traffic to get better + throughput (resulted in job inactivity limit being reached improperly + when hundreds of jobs running simultaneously) + +* Changes in SLURM 0.3.0.0-pre6 +=============================== + -- Fixes for reported problems: + - slurm/372: job state descriptions added to squeue man page + -- Switch plugin added. Add "SwitchType=switch/elan" to slurm.conf for + systems with Quadrics Elan3 or Elan4 switches. + -- Don't treat DOWN nodes with too few CPUs as a fatal error on Elan + -- Major re-write of html documents + -- Updates to node pinging for large numbers of unresponsive nodes + -- Explicitly set default action for SIGTERM (action on Thunder was + to ignore SIGTERM) + -- Sinfo "--exact" option only applies to fields actually displayed + -- Partition processor count not correctly computed for heterogeneous + clusters with FastSchedule=0 configuration + -- Only return DOWN nodes to service if the reason for them being in + that state is non-responsiveness and "ReturnToService=1" configuration + -- Partition processor count now correctly computed for heterogeneous + clusters with FastSchedule configured off + -- New macros and function to export SLURM version number + +* Changes in SLURM 0.3.0.0-pre5 +=============================== + -- Fixes for reported problems: + - slurm/346: Support multiple colon-separated PluginDir values + -- Fix node state transition: DOWN to DRAINED (instead of DRAINING) + -- Fix a couple of minor slurmctld memory leaks + +* Changes in SLURM 0.3.0.0-pre4 +=============================== + -- Fix bug where early launch failures (such as invalid UID/GID) resulted + in jobs not terminating properly. + -- Initial support for BNR committed (not yet functional). + -- QsNet: SLURM now uses /etc/elanhosts exclusively for converting + hostnames to ElanIDs. + +* Changes in SLURM 0.3.0.0-pre3 +=============================== + -- Fixes for reported problems: + - slurm/328: Slurmd was restarting with a new shared memory segment and + losing track of jobs + - slurm/329: Job processing may be left running when one task dies + - slurm/333: Slurmd fails to launch a job and deletes a step, due to + a race condition in shared memory management + - slurm/334: Slurmd was getting a segv due to a race condition in shared + memory management + - slurm/342: Properly handle nodes being removed from configuration + even when there are partitions, nodes, or job steps still associated + with them + -- Srun properly terminates jobs/steps upon node failure (used to hang + waiting for I/O completion) + -- Job time limits enforced even if InactiveLimit configured as zero + -- Support the sending of an arbitrary signal to a batch script (but not + the processses in its job steps) + -- Re-read slurm configuration file whenever changed, needed by users + of SLURM APIs + -- Scancel was generating a assert failure + -- Slurmctld sends a launch response message upon scheduling of a queued + job (for immediate srun response) + -- Maui scheduler plugin added + -- Backfill scheduler plugin added + -- Batch scripts can now have arguments that are propogated + -- MPICH support added (via patch, not in SLURM CVS) + -- New SLURM environment variables added SLMR_CPUS_ON_NODE and + SLURM_LAUNCH_NODE_IPADDR, these provide support needed for LAM/MPI + (version 7.0.4+) + -- The TMPDIR directory is created as needed before job launch + -- Do not create duplicate SLURM environment variables with the same name + -- Insure proper enforcement of node sharing by job + -- Treat lack of SpoolDir or StateSaveDir as a fatal error + -- Quickstart.html guide expanded + -- Increase maximum jobs steps per node from 16 to 64 + -- Delete correct shared memory segment on slurmd -c (clean start) + +* Changes in SLURM 0.3.0.0-pre2 +=============================== + -- Fixes for reported problems: + - slurm/326: Properly clean-up jobs terminating on non-responding nodes + -- Move all configuration data structure into common/read_config, scontrol + now always shows default values if not specified in slurm.conf file + -- Remove the unused "Prioritize" configuration parameter + +* Changes in SLURM 0.3.0.0-pre1 +=============================== + -- Fixes for reported problems: + - slurm/252: "jobs left orphaned when using TotalView:" SLURM controller + now pings srun and kills defunct jobs. + - slurm/253: "srun fails to accept new IO connection." + - slurm/317: "Lack of default partition in config file causes errors." + - slurm/319: Socket errors on multiple simultaneous job launches fixed + - slurm/321: slurmd shared memory synchronization error. + -- Removed slurm_tv_clean daemon which has been obsoleted by slurm/252 fix. + -- New scontrol command ``delete'' and RPC added to delete a partition + -- Squeue can now print and sort by group id/name + -- Scancel has new option -q,--quiet to not report an error if a job + is already complete + -- Add the excluded node list to job information reported. + -- RPC version mis-match now properly handled + -- New job completion plugin interface added for logging completed jobs. + -- Fixed lost digit in scontrol job priority specification. + -- Remove restriction in the number of consecutive node sets (no longer + needed after DPCS upgrade) + -- Incomplete state save write now properly handled. + -- Modified slurmd setrlimit error for greater clarity. + -- Slurmctld performs load-leveling across shared nodes. + -- New user function added slurm_get_end_time for user jobs. + -- Always compile srun with stabs debug section when TotalView support + is requested. + +* Changes in SLURM 0.2.21 +========================= + -- Fixes for reported problems: + - slurm/253: Try using different port if connect() fails (was rarely + failing when an existing defunct connection was in TIME_WAIT state) + - slurm/300: Possibly killing wrong job on slurmd restart + - slurm/312: Freeing non-allocated memory and killing slurmd + -- Assorted changes to support RedHat Enterprise Linux 3.0 and IA64 + -- Initial Elan4 and libelanctrl support (--with-elan). + -- Slurmctld was sometimes inappropriately setting a job's priority + to 1 when a node was down (even if up nodes could be used for the + job when a running job completes) + -- Convert all user commands from use of popt library to getopt_long() + -- If TotalView support is requested, srun exports "totalview_jobid" + variable for `%J' expansion in TV bulk launch string. + -- Fix several locking bugs in slurmd IO layer. + -- Throttle back repetitious error messages in slurmd to avoid filling + log files. + + +* Changes in SLURM 0.2.20 +========================= + -- Fixes for reported problems: + - slurm/298: Elan initialization error (Invalid vp 2147483674). + - slurm/299: srun fails to exit with multiple ^C's. + -- Temporarily prevent DPCS from allocating jobs with more than eight + sets of consecutive nodes. This was likely causing user applications + to fail with libelan errors. This will be removed after DPCS is updated. + -- Fix bug in popt use, was failing in some versions of Linux. + -- Resend KILL_JOB messages as needed to clear COMPLETING jobs. + -- Install dummy SIGCHLD handler in slurmd to fix problem on NPTL systems + where slurmd was not notified of terminated tasks. + +* Changes in SLURM 0.2.19 +========================= + -- Memory corruption bug fixed, it was causing slurmctld to seg-fault + +* Changes in SLURM 0.2.18 +========================= + -- Fixes for reported problems: + - slurm/287: slurm protocol timeouts when using TotalView. + - slurm/291: srun fails using ``-n 1'' under multi-node allocation. + - slurm/294: srun IO buffer reports ENOSPC. + -- Memory corruption bug fixed, it was causing slurmctld to seg-fault + -- Non-responding nodes now go from DRAINING to DRAINED state when + jobs complete + -- Do not schedule pending jobs while any job is actively COMPLETING + unless the submitted job specifically identifies its nodes (like DPCS) + -- Reset priority of jobs with priority==1 when a non-responding node + starts to respond again + -- Ignore jobs with priority==1 when establishing new baseline upon + slurmctld restart + -- Make slurmctld/message retry be timer based rather than queue based + for better scalability + -- Slurmctld logging is more concise, using hostlists more + -- srun --no-allocate used special job_id range to avoid conflicts + or premature job termination (purging by slurmctld) + -- New --jobid=id option in srun to initiate job step under an existing + allocation. + -- Support in srun for TotalView bulk launch. + +* Changes in SLURM 0.2.17 +========================= + -- Fixes for reported problems: + - slurm/279: Hold jobs that can't execute due to DOWN or DRAINED + nodes and release when nodes are returned to service. + - slurm/285: "srun killed due to SIGPIPE" + -- Support for running job steps on nodes relative to current + allocation via srun -r, --relative=n option. + -- SIGKILL no longer broadcasted to job via srun on task failure unless + --no-allocate option is used. + -- Re-enabled "chkconfig --add" in default RPMs. + -- Backup controller setting proper PID into slurmctld.pid file. + -- Backup controller restores QSW state each time it assumes control + -- Backup controller purges old job records before assuming control + to avoid resurrecting defunct jobs. + -- Kill jobs on non-responding DRAINING nodes and make their state + DRAINED. + -- Save state upon completion of a job's last EPILOG_COMPLETION to + reduce possibility of inconsistent job and node records when the + controller is transitioning between primary and backup. + -- Change logging level of detailed communication errors to not print + them unless detailed debugging is requested. + -- Increase number of concurrent controller server threads from 20 + to 50 and restructure code to handle backlogs more efficiently. + -- Partition state at controller startup is based upon slurm.conf + rather than previously saved state. Additional improvements to + avoid inconsistent job/node/partition states at restart. Job state + information is used to arbitrate conflicts. + -- Orphaned file descriptors eliminated. + +* Changes in SLURM 0.2.16 +========================= + -- Fixes for reported problems: + - slurm/265: Early termination of srun could cause job to remain in queue. + - slurm/268: Slurmctld could deadlock if there was a delay in the + termination of a large node-count job. An EPILOG_COMPLETE RPC was + added so that slurmd could notify slurmctld whenever the job + termination was completed. + - slurm/270: Segfault in sinfo if a configured node lacked a partition. + - slurm/278: Exit code in scontrol did not indicate failure. + -- Fixed bug in slurmd that caused the daemon to occaisionally kill itself. + -- Fixed bug in srun when running with --no-allocate and >1 process per node. + -- Small fixes and updates for srun manual. + +* Changes in SLURM 0.2.15 +========================= + -- Fixes for reported problems: + - slurm/265: Job was orphaned when allocation response message could + not be sent. Job is now killed on allocation response message transmit + failure and socket error details are logged. + - Fix for slurm/267: "Job epilog may run multiple times." + -- Squeue job TIMELIMIT format changed from "h:mm" to "d:h:mm:ss". + -- DPCS initiated jobs have steps execute properly without explicit + specification of node count. + +* Changes in SLURM 0.2.14 +========================= + -- Fixes for reported problems: + - slurm/194: "srun doesn't handle most options when run under an allocation." + - slurm/244: "REQ: squeue shows requested size of pending jobs." + -- SLURM_NODELIST environment variable now exported to all jobs, not + only batch jobs. + -- Nodelist displayed in squeue for completing jobs is now restricted to + completing nodes. + -- Node "reason" field properly displayed in sinfo even with filtering. + -- ``slurm_tv_clean'' daemon now supports a log file. + -- Batch jobs are now re-queued on launch failure. + -- Controller confirms job scripts for batch jobs are still running on + node zero at node registration. + -- Default RPMs no longer stop/start SLURM daemons on upgrade or install. + +* Changes in SLURM 0.2.13 +========================= + -- Fixes for reported problems: + - Fixed bug in slurmctld where "drained" nodes would go back into + the "idle" state under some conditions (slurm/228). + - Added possible fix for slurm/229: "slurmd occasionally fails + to reap all children." + -- Fixed memory leak in auth_munge plugin. + -- Added fix to slurmctld to allow arbitrarily large job specifications + to be saved and recovered in the state file. + -- Allow "updates" in the configuration file of previously defined + node state and reason. + -- On "forceful termination" of a running job step, srun now exits + unconditionally, instead of waiting for all I/O. + -- Slurmctld now uses pidfile to kill old daemon when a new one is started. + -- Addition of new daemon "slurm_tv_clean" used to clean up jobs orphaned + due to use of the TotalView parallel debugger. + +* Changes in SLURM 0.2.12 +========================= + -- Fixes for reported problems: + - Fix for "waitpid: No child processes" when using TotalView (slurm/217). + - Implemented temporary workaround for slurm/223: "Munge decode failed: + Munged communication error." + - Temporary fix for slurm/222: "elan3_create(0): Invalid argument." + -- Fixed memory leaks in slurmctld (mostly due to reconfigure). + -- More squeue/sinfo interface changes (see squeue(1), sinfo(1)). + -- Sinfo now accepts list of node states to -t,--state option. + -- Node "reason" field now available via sinfo command (see sinfo(1)). + -- Wrapper source for srun (srun.wrapper.c) now installed and available + for TotalView support. + -- Improved retry login in user commands for periods when slurmctld + primary is down and backup has not yet taken over. + +* Changes in SLURM 0.2.11 +========================= + -- Changes in srun: + - Fixed bug in signal handling that occaisonally resulted in orphaned + jobs when using Ctrl-C. + - Return non-zero exit code when remote tasks are killed by a signal. + - SIGALRM is now blocked by default. + -- Added ``reason'' string for down, drained, or draining nodes. + -- Added -V,--version option to squeue and sinfo. + -- Improved some error messages from user utilities. + +* Changes in SLURM 0.2.10 +========================= + -- New slurm.conf configuration parameters: + - WaitTime: Default for srun -w,--wait parameter. + - MaxJobCount: Maximum number of jobs SLURM can handle at one time. + - MinJobAge: Minimum time since completing before job is purged from + slurmctld memory. + -- Block user defined signals USR1 and USR2 in slurmd session manager. + -- More squeue cleanup. + -- Support for passing options to sinfo via environment variables. + -- Added option to scontrol to find intersection of completing jobs and nodes. + -- Added fix in auth_munge to prevent "Munged communication error" message. + +* Changes in SLURM 0.2.9 +======================== + -- Fixes for reported problems: + - Argument to srun `-n' option was taken as octal if preceeded with a `0'. + -- New format for Elan hosts config file (/etc/elanhosts. See README) + -- Various fixes for managing COMPLETING jobs. + -- Support for passing options to squeue via environment variables + (see squeue(1)) + +* Changes in SLURM 0.2.8 +========================= + -- Fix for bug in slurmd that could make debug messages appear in job output. + -- Fix for bug in slurmctld retry count computation. + -- Srun now times out slow launch threads. + -- "Time Used" output in squeue now includes seconds. + +* Changes in SLURM 0.2.7 +========================= + -- Fix for bug in Elan module that results in slurmd hang. + -- Added completing job state to default list of states to print with squeue. + +* Changes in SLURM 0.2.6 +========================= + -- More fixes for handling cleanup of slow terminating jobs. + -- Fixed bug in srun that might leave nodes allocated after a Ctrl-C. + +* Changes in SLURM 0.2.5 +========================= + -- Various fixes for cleanup of slow terminating or unkillable jobs. + -- Fixed some small memory leaks in communications code. + -- Added hack for synchronized exit of jobs on large node count. + -- Long lists of nodes are no longer truncated in sinfo. + -- Print more descriptive error message when tasks exit with nonzero status. + -- Fixed bug in srun where unsuccessful launch attempts weren't detected. + -- Elan network error resolver thread now runs from elan module in slurmd. + -- Slurmctld uses consecutive Elan context and program description numbers + instead of choosing them randomly. + +* Changes in SLURM 0.2.4 +========================== + -- Fix for file descriptor leak in slurmctld. + -- auth_munge plugin now prints credential info on decode failure. + -- Minor changes to scancel interface. + -- Filename format option "%J" now works again for srun --output and --error. + +* Changes in SLURM 0.2.3 +========================== + -- Fix bug in srun when using per-task files for stderr. + -- Better error reporting on failure to open per-task input/output files. + -- Update auth_munge plugin for munge 0.1. + -- Minor changes to squeue interface. + -- New srun option `--hold' to submit job in "held" state. + +* Changes in SLURM 0.2.2 +========================== + -- Fixes for reported problems: + - Execution of script allocate mode fails in some cases. (gnats:161) + - Errors using per-task input files with Elan support. (gnats:162) + - srun doesn't handle all environment variables properly. (gnats:164) + -- Parallel job is now terminated if a task is killed by a signal. + -- Exit status of srun is set based on exit codes of tasks. + -- Redesign of sinfo interface and options. + -- Shutdown of slurmctld no longer propagates shutdown to all nodes. + +* Changes in SLURM 0.2.1 +=========================== + -- Fix bug where reconfigure request to slurmctld killed the daemon. + +* Changes in SLURM 0.2.0 +============================ + + -- SlurmdTimeout of 0 means never set a non-responding node to DOWN. + -- New srun option, -u,--unbuffered, for unbuffered stdout. + -- Enhancements for sinfo + - Non-responding nodes show "*" character appended instead of "NoResp+". + - Node states show abbreviated variant by default + -- Enhancements for scontrol. + - Added "ping" command to show current state of SLURM controllers. + - Job dump in scontrol shows user name as well as UID. + - Node state of DRAIN is appropriately mapped to DRAINING or DRAINED. + -- Fix for bug where request for task count greater than partition limit + was queued anyway. + -- Fix for bugs in job end time handling. + -- Modifications for error free builds on 64 bit architectures. + -- Job cancel immediately deallocates nodes instead of waiting on srun. + -- Attempt to create slurmd spool if it does not exist. + -- Fixed signal handling bug in srun allocate mode. + -- Earlier error detection in slurmd startup. + -- "fatal: _shm_unlock: Numerical result out of range" bug fixed in slurmd. + -- Config file parsing is now case insensitive. + -- SLURM_NODELIST environment variable now set in allocate mode. + +* Changes in SLURM 0.2.0-pre2 +============================= + + -- Fix for reconfigure when public/private key path is changed. + -- Shared memory fixes in slurmd. + - fix for infinite semaphore incrementation bug. + -- Semaphore fixes in slurmctld. + -- Slurmctld now remembers which nodes have registered after recover. + -- Fixed reattach bug when tasks have exited. + -- Change directory to /tmp in slurmd if daemonizing. + -- Logfiles are reopened on reconfigure. + +$Id$ diff --git a/executable_names/README b/executable_names/README new file mode 100644 index 0000000000000000000000000000000000000000..4a0eebcff790d93479e016d1b597efba408a39fd --- /dev/null +++ b/executable_names/README @@ -0,0 +1,133 @@ +This is SLURM, the Simple Linux Utility for Resource Management. SLURM +is an open-source cluster resource management and job scheduling system +that strives to be simple, scalable, portable, fault-tolerant, and +interconnect agnostic. SLURM currently has been tested only under Linux. + +As a cluster resource manager, SLURM provides three key functions. First, +it allocates exclusive and/or non-exclusive access to resources +(compute nodes) to users for some duration of time so they can perform +work. Second, it provides a framework for starting, executing, and +monitoring work (normally a parallel job) on the set of allocated +nodes. Finally, it arbitrates conflicting requests for resources by +managing a queue of pending work. + +SLURM is provided "as is" and with no warranty. This software is +distributed under the GNU General Public License, please see the files +COPYING, DISCLAIMER, and LICENSE.OpenSSL for details. + +This README presents an introduction to compiling, installing, and +using SLURM. + + +SOURCE DISTRIBUTION HIERARCHY +----------------------------- + +The top-level distribution directory contains this README as well as +other high-level documentation files, and the scripts used to configure +and build SLURM (see INSTALL). Subdirectories contain the source-code +for SLURM as well as a DejaGNU test suite and further documentation. A +quick description of the subdirectories of the SLURM distribution follows: + + src/ [ SLURM source ] + SLURM source code is further organized into self explanatory + subdirectories such as src/api, src/slurmctld, etc. + + doc/ [ SLURM documentation ] + The documentation directory contains some latex, html, and ascii + text papers, READMEs, and guides. Manual pages for the SLURM + commands and configuration files are also under the doc/ directory. + + etc/ [ SLURM configuration ] + The etc/ directory contains a sample config file, as well as + some scripts useful for running SLURM. + + slurm/ [ SLURM include files ] + This directory contains installed include files, such as slurm.h + and slurm_errno.h, needed for compiling against the SLURM API. + + testsuite/ [ SLURM test suite ] + The testsuite directory contains the framework for a set of + DejaGNU and "make check" type tests for SLURM components. + There is also an extensive collection of Expect scripts. + + auxdir/ [ autotools directory ] + Directory for autotools scripts and files used to configure and + build SLURM + + +COMPILING AND INSTALLING THE DISTRIBUTION +----------------------------------------- + +Please the the INSTALL file for basic instructions. You will need a +working installation of OpenSSL. + +SLURM does not use reserved ports to authenticate communication +between components. You will need to have at least one "auth" +plugin. Currently, only three authentication plugins are available: +"auth/none," "auth/authd," and "auth/munge." The "auth/none" plugin is +built and used by default, but one of either Brent Chun's authd, or Chris +Dunlap's Munge should be installed in order to get properly authenticated +communications. The configure script in the top-level directory of this +distribution will determine which authentication plugins may be built. + + +OpenSSL: +http://www.openssl.org + +AUTHD: +http://www.theether.org/authd/ + +MUNGE: +http://www.llnl.gov/linux/munge/ + + +CONFIGURATION +------------- + +An annotated sample configuration file for SLURM is provided with this +distribution as etc/slurm.conf.example. Edit this config file to suit +your site and cluster, then copy it to `$sysconfdir/slurm.conf,' where +sysconfdir defaults to PREFIX/etc unless explicitly overwritten in the +`configure' or `make' steps. + +Once the config file is installed in the proper location, you'll need +to create the keys for SLURM job credential creation and verification. +The following openssl commands should be used: + + > openssl genrsa -out /path/to/private/key 1024 + > openssl rsa -in /path/to/private/key -pubout -out /path/to/public/key + +The private key and public key locations should be those specified by +JobCredentialPrivateKey and JobCredentialPublicCertificate in the SLURM +config file. + + +RUNNING SLURM +------------- + +Once a valid configuration has been set up and installed, the SLURM +controller, slurmctld, should be started on the primary and backup +control machines, and the SLURM compute node daemon, slurmd, should be +started on each compute server. + +The slurmd daemons need to run as root for production use, but may be +run as a user for testing purposes (obviously no jobs may be run as +any other user in that configuration). The SLURM controller, slurmctld, +need to be run as the configured SlurmUser (see your config file). + +Man pages are the best source of information about SLURM commands and +daemons. Please see: slurmctld(8), slurmd(8), scontrol(1), sinfo(1), +squeue(1), scancel(1), and srun(1). + +Also, take a look at the Quickstart Guide to get acquainted with +running and managing jobs with SLURM: doc/html/quickstart_admin.html +or PREFIX/share/doc/quickstart_admin.html. + + +PROBLEMS +-------- + +If you experience problems compiling, installing, or running SLURM +please send e-mail to either slurm-dev@lists.llnl.gov. + +$Id$ diff --git a/executable_names/RELEASE_NOTES b/executable_names/RELEASE_NOTES new file mode 100644 index 0000000000000000000000000000000000000000..570f601c584a47359a5f2ca5f1303d54f5ae224c --- /dev/null +++ b/executable_names/RELEASE_NOTES @@ -0,0 +1,78 @@ +RELEASE NOTES FOR SLURM VERSION 1.2 +3 October 2006 (through 1.2.0-pre3) + + +NEW COMMANDS + +* Several new commands have been added to perform individual srun functions. + The srun command will continue to exist, but these commands may offer + greater clarity and ease of use. The srun options --allocate, --attach, + and --batch will eventially cease being supported. The new commands are + salloc - Create a job allocation (functions like "srun --allocate") + sattach - Attach to an existing job step (functions like "srun --attach") + sbatch - Submit a batch job script (functions like "srun --batch") + slaunch - Launch tasks (requires a pre-existing job allocation) + See the indivual man pages for more information. + +* A new GUI is available for viewing and modifying state information, sview. + Note that sview will only be built on systems which have libglade-2.0 and + gtk+-2.0 installed. + + +CONFIGURATION FILE CHANGES + +* The slurm.conf configuration file now supports a "Include" directive to + include other files inline. + +* Added new configuration parameter MessageTimeout (replaces #define in the + code). + +* Added new configuration parameter MailProg (in case mail program is not + at "/bin/mail"). + +* Removed defunct configuration parameter, ShedulerAuth. It has been rendered + obsolute by the new wiki.conf file. + +* Several new configuration parameters can be used to specify architectural + details of the node: Sockets, CoresPerSocket, and ThreadsPerCore. + + +OTHER CHANGES + +* Several srun options are available to control layout of tasks across the + cores on a node: --extra-node-info, --ntasks-per-node, --sockets-per-node, + --cores-per-socket, --threads-per-core, --minsockets, --mincores, --minthreads, + --ntasks-per-socket, --ntasks-per-core, and --ntasks-per-node. + +* New scontrol, sinfo and squeue options can be used to view socket, core, + and task details by job and/or node. + +* Permit batch jobs to be requeued ("scontrol requeue " or + "srun --batch --no-requeue ..." to prevent). + +* View a job's exit code using "scontrol show job". + +* Added "account" field to job and step accounting information and sacct output. + +* Added new job field, "comment". Set by srun, salloc and sbatch. View + with "scontrol show job". Used by sched/wiki. + +* Added support for OS X operaing system. + +* There is a new version of the Wiki scheduler plugin to interface with + the Maui Scheduler and Moab. It can be accessed with the slurm.conf + parameter "SchedulerType=sched/wiki2" (it will replace "sched/wiki" + in SLURM version 1.2, but will co-exist in version 1.1.10+). If you + currently use sched/wiki, you will at least need to add a wiki.conf + file. Key differences include: + - Node and job data returned is correct (several errors in old plugin) + - Node data includes partition information (CCLASS field) + - Improved error handling + - Support added for configuration file ("wiki.conf" in same directory + as "slurm.conf" file, see "man wiki.conf" for details) + - Support added for job suspend/resume and requeue + - Authentication of communications now supported + - Notification of scheduler on events (job submitted or termination) + + +See the file NEWS for more details. diff --git a/executable_names/aclocal.m4 b/executable_names/aclocal.m4 new file mode 100644 index 0000000000000000000000000000000000000000..348e2d6f385136aee12c7c7fa0daa2c1db7b1dc3 --- /dev/null +++ b/executable_names/aclocal.m4 @@ -0,0 +1,7033 @@ +# generated automatically by aclocal 1.9 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + +# serial 47 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* ) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for *BSD + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDRT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) + +# -*- Autoconf -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Generated from amversion.in; do not edit by hand. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.9])]) + +# AM_AUX_DIR_EXPAND + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 6 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# serial 7 -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 11 + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.58])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# -*- Autoconf -*- +# Copyright (C) 2003 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. +# From Jim Meyering + +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +AC_DEFUN([AM_MAINTAINER_MODE], +[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + USE_MAINTAINER_MODE=$enableval, + USE_MAINTAINER_MODE=no) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST(MAINT)dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# -*- Autoconf -*- + + +# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_PROG_MKDIR_P +# --------------- +# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. + +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories +# created by `make install' are always world readable, even if the +# installer happens to have an overly restrictive umask (e.g. 077). +# This was a mistake. There are at least two reasons why we must not +# use `-m 0755': +# - it causes special bits like SGID to be ignored, +# - it may be too restrictive (some setups expect 775 directories). +# +# Do not use -m 0755 and let people choose whatever they expect by +# setting umask. +# +# We cannot accept any implementation of `mkdir' that recognizes `-p'. +# Some implementations (such as Solaris 8's) are not thread-safe: if a +# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' +# concurrently, both version can detect that a/ is missing, but only +# one can create it and the other will error out. Consequently we +# restrict ourselves to GNU make (using the --version option ensures +# this.) +AC_DEFUN([AM_PROG_MKDIR_P], +[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi +AC_SUBST([mkdir_p])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([auxdir/acx_pthread.m4]) +m4_include([auxdir/slurm.m4]) +m4_include([auxdir/x_ac__system_configuration.m4]) +m4_include([auxdir/x_ac_affinity.m4]) +m4_include([auxdir/x_ac_aix.m4]) +m4_include([auxdir/x_ac_bluegene.m4]) +m4_include([auxdir/x_ac_debug.m4]) +m4_include([auxdir/x_ac_elan.m4]) +m4_include([auxdir/x_ac_federation.m4]) +m4_include([auxdir/x_ac_gpl_licensed.m4]) +m4_include([auxdir/x_ac_gtk.m4]) +m4_include([auxdir/x_ac_munge.m4]) +m4_include([auxdir/x_ac_ncurses.m4]) +m4_include([auxdir/x_ac_pam.m4]) +m4_include([auxdir/x_ac_ptrace.m4]) +m4_include([auxdir/x_ac_readline.m4]) +m4_include([auxdir/x_ac_setpgrp.m4]) +m4_include([auxdir/x_ac_setproctitle.m4]) +m4_include([auxdir/x_ac_sgi_job.m4]) +m4_include([auxdir/x_ac_slurm_ssl.m4]) +m4_include([auxdir/x_ac_xcpu.m4]) diff --git a/executable_names/autogen.sh b/executable_names/autogen.sh new file mode 100755 index 0000000000000000000000000000000000000000..94255d600b33eb7c2ed9e8378a6e7fd5448aeeba --- /dev/null +++ b/executable_names/autogen.sh @@ -0,0 +1,114 @@ +#!/bin/sh +# +# $Id$ +# $Source$ +# +# Run this script to generate aclocal.m4, config.h.in, +# Makefile.in's, and ./configure... +# +# To specify extra flags to aclocal (include dirs for example), +# set ACLOCAL_FLAGS +# + +DIE=0 + +# minimum required versions of autoconf/automake/libtool: +ACMAJOR=2 +ACMINOR=59 + +AMMAJOR=1 +AMMINOR=9 +AMPATCH=0 + +LTMAJOR=1 +LTMINOR=5 +LTPATCH=8 + +(autoconf --version 2>&1 | \ + perl -n0e "(/(\d+)\.(\d+)/ && \$1>=$ACMAJOR && \$2>=$ACMINOR) || exit 1") || { + echo + echo "Error: You must have 'autoconf' version $ACMAJOR.$ACMINOR or greater" + echo "installed to run $0. Get the latest version from" + echo "ftp://ftp.gnu.org/pub/gnu/autoconf/" + echo + NO_AUTOCONF=yes + DIE=1 +} + +amtest=" + if (/(\d+)\.(\d+)((-p|\.)(\d+))*/) { + exit 1 if (\$1 < $AMMAJOR || \$2 < $AMMINOR); + exit 0 if (\$2 > $AMMINOR); + exit 1 if (\$5 < $AMPATCH); +}" + +(automake --version 2>&1 | perl -n0e "$amtest" ) || { + echo + echo "Error: You must have 'automake' version $AMMAJOR.$AMMINOR.$AMPATCH or greater" + echo "installed to run $0. Get the latest version from" + echo "ftp://ftp.gnu.org/pub/gnu/automake/" + echo + NO_AUTOCONF=yes + DIE=1 +} + +lttest=" + if (/(\d+)\.(\d+)((-p|\.)(\d+))*/) { + exit 1 if (\$1 < $LTMAJOR); + exit 1 if (\$1 == $LTMAJOR && \$2 < $LTMINOR); + exit 1 if (\$1 == $LTMAJOR && \$2 == $LTMINOR && \$5 < $LTPATCH); +}" + +(libtool --version 2>&1 | perl -n0e "$lttest" ) || { + echo + echo "Error: You must have 'libtool' version $LTMAJOR.$LTMINOR.$LTPATCH or greater" + echo "installed to run $0. Get the latest version from" + echo "ftp://ftp.gnu.org/pub/gnu/libtool/" + echo + DIE=1 +} + + +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "Error: \`aclocal' appears to be missing. The installed version of" + echo "\`automake' may be too old. Get the most recent version from" + echo "ftp://ftp.gnu.org/pub/gnu/automake/" + NO_ACLOCAL=yes + DIE=1 +} + +if test $DIE -eq 1; then + exit 1 +fi + +# make sure that auxdir exists +mkdir auxdir 2>/dev/null + +# Remove config.h.in to make sure it is rebuilt +rm -f config.h.in + +set -x +rm -fr autom4te*.cache +aclocal -I auxdir $ACLOCAL_FLAGS || exit 1 +libtoolize --automake --copy --force || exit 1 +autoheader || exit 1 +automake --add-missing --copy --force-missing || exit 1 +#autoconf --force --warnings=all || exit 1 +autoconf --force --warnings=no-obsolete || exit 1 +set +x + +if [ -e config.status ]; then + echo "removing stale config.status." + rm -f config.status +fi +if [ -e config.log ]; then + echo "removing old config.log." + rm -f config.log +fi + +echo "now run ./configure to configure slurm for your environment." +echo +echo "NOTE: This script has most likely just modified files that are under" +echo " version control. Make sure that you really want these changes" +echo " applied to the repository before you run \"svn commit\"." diff --git a/executable_names/auxdir/Makefile.am b/executable_names/auxdir/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..22a5719b46b9f626d2ff48d1ba2c06542123e024 --- /dev/null +++ b/executable_names/auxdir/Makefile.am @@ -0,0 +1,25 @@ +##**************************************************************************** +## $Id$ +##**************************************************************************** +## Process this file with automake to produce Makefile.in. +##**************************************************************************** + +EXTRA_DIST = \ + acx_pthread.m4 \ + slurm.m4 \ + type_socklen_t.m4 \ + x_ac__system_configuration.m4 \ + x_ac_affinity.m4 \ + x_ac_aix.m4 \ + x_ac_bluegene.m4 \ + x_ac_debug.m4 \ + x_ac_elan.m4 \ + x_ac_federation.m4 \ + x_ac_gpl_licensed.m4 \ + x_ac_pam.m4 \ + x_ac_munge.m4 \ + x_ac_ncurses.m4 \ + x_ac_ptrace.m4 \ + x_ac_readline.m4 \ + x_ac_setproctitle.m4 \ + x_ac_slurm_ssl.m4 diff --git a/executable_names/auxdir/Makefile.in b/executable_names/auxdir/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..af0532bba8ff67bb06b4a0a55f02a3a617ff6e73 --- /dev/null +++ b/executable_names/auxdir/Makefile.in @@ -0,0 +1,429 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = auxdir +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in compile \ + config.guess config.sub depcomp install-sh ltmain.sh missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +EXTRA_DIST = \ + acx_pthread.m4 \ + slurm.m4 \ + type_socklen_t.m4 \ + x_ac__system_configuration.m4 \ + x_ac_affinity.m4 \ + x_ac_aix.m4 \ + x_ac_bluegene.m4 \ + x_ac_debug.m4 \ + x_ac_elan.m4 \ + x_ac_federation.m4 \ + x_ac_gpl_licensed.m4 \ + x_ac_pam.m4 \ + x_ac_munge.m4 \ + x_ac_ncurses.m4 \ + x_ac_ptrace.m4 \ + x_ac_readline.m4 \ + x_ac_setproctitle.m4 \ + x_ac_slurm_ssl.m4 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu auxdir/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu auxdir/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/auxdir/acx_pthread.m4 b/executable_names/auxdir/acx_pthread.m4 new file mode 100644 index 0000000000000000000000000000000000000000..bed63d06e23d3e81c2e592cc1a6265ce39663073 --- /dev/null +++ b/executable_names/auxdir/acx_pthread.m4 @@ -0,0 +1,221 @@ +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl This macro figures out how to build C programs using POSIX +dnl threads. It sets the PTHREAD_LIBS output variable to the threads +dnl library and linker flags, and the PTHREAD_CFLAGS output variable +dnl to any special C compiler flags that are needed. (The user can also +dnl force certain compiler flags/libs to be tested by setting these +dnl environment variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl If you are only building threads programs, you may wish to +dnl use these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE +dnl to that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands +dnl to run it if it is not found. If ACTION-IF-FOUND is not specified, +dnl the default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, +dnl or if you have any other suggestions or comments. This macro was +dnl based on work by SGJ on autoconf scripts for FFTW (www.fftw.org) +dnl (with help from M. Frigo), as well as ac_pthread and hb_pthread +dnl macros posted by AFC to the autoconf macro repository. We are also +dnl grateful for the helpful feedback of numerous users. +dnl +dnl @version $Id$ +dnl @author Steven G. Johnson and Alejandro Forero Cuervo + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) + +AC_LANG_PUSH([C]) +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# pthread: Linux, etcetera +# --thread-safe: KAI C++ + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthread or + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ]])],[acx_pthread_ok=yes],[]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: threads are created detached by default + # and the JOINABLE attribute has a nonstandard name (UNDETACHED). + AC_MSG_CHECKING([for joinable pthread attribute]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int attr=PTHREAD_CREATE_JOINABLE;]])],[ok=PTHREAD_CREATE_JOINABLE],[ok=unknown]) + if test x"$ok" = xunknown; then + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int attr=PTHREAD_CREATE_UNDETACHED;]])],[ok=PTHREAD_CREATE_UNDETACHED],[ok=unknown]) + fi + if test x"$ok" != xPTHREAD_CREATE_JOINABLE; then + AC_DEFINE(PTHREAD_CREATE_JOINABLE, $ok, + [Define to the necessary symbol if this constant + uses a non-standard name on your system.]) + fi + AC_MSG_RESULT(${ok}) + if test x"$ok" = xunknown; then + AC_MSG_WARN([we do not know how to create joinable pthreads]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd*) flag="-D_THREAD_SAFE";; + *solaris* | alpha*-osf*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with cc_r + AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_POP([C]) +])dnl ACX_PTHREAD + diff --git a/executable_names/auxdir/config.guess b/executable_names/auxdir/config.guess new file mode 100755 index 0000000000000000000000000000000000000000..a6d8a945f68aae8f779ad1d9134c785385ede1f7 --- /dev/null +++ b/executable_names/auxdir/config.guess @@ -0,0 +1,1449 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +timestamp='2004-06-24' + +# This file 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + luna88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit 0 ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + case `uname -p` in + *86) UNAME_PROCESSOR=i686 ;; + powerpc) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms && exit 0 ;; + I*) echo ia64-dec-vms && exit 0 ;; + V*) echo vax-dec-vms && exit 0 ;; + esac +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/executable_names/auxdir/config.sub b/executable_names/auxdir/config.sub new file mode 100755 index 0000000000000000000000000000000000000000..ac6de9869c9a1b0a8145abac6ac35d9854fb11f9 --- /dev/null +++ b/executable_names/auxdir/config.sub @@ -0,0 +1,1552 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +timestamp='2004-06-24' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file 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., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/executable_names/auxdir/depcomp b/executable_names/auxdir/depcomp new file mode 100755 index 0000000000000000000000000000000000000000..11e2d3bfe1cffc0cfc75109ac2ab67c6fbb26feb --- /dev/null +++ b/executable_names/auxdir/depcomp @@ -0,0 +1,522 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2004-05-31.23 + +# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit 0 + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit 0 + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # Dependencies are output in .lo.d with libtool 1.4. + # With libtool 1.5 they are output both in $dir.libs/$base.o.d + # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the + # latter, because the former will be cleaned when $dir.libs is + # erased. + tmpdepfile1="$dir.libs/$base.lo.d" + tmpdepfile2="$dir$base.o.d" + tmpdepfile3="$dir.libs/$base.d" + "$@" -Wc,-MD + else + tmpdepfile1="$dir$base.o.d" + tmpdepfile2="$dir$base.d" + tmpdepfile3="$dir$base.d" + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + if test -f "$tmpdepfile1"; then + tmpdepfile="$tmpdepfile1" + elif test -f "$tmpdepfile2"; then + tmpdepfile="$tmpdepfile2" + else + tmpdepfile="$tmpdepfile3" + fi + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/executable_names/auxdir/install-sh b/executable_names/auxdir/install-sh new file mode 100755 index 0000000000000000000000000000000000000000..b777f1244cdff9ef72ec533e5d38448f01a3ddcc --- /dev/null +++ b/executable_names/auxdir/install-sh @@ -0,0 +1,322 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2004-07-05.00 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +chmodcmd="$chmodprog 0755" +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= +dstarg= +no_target_directory= + +usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: +-c (ignored) +-d create directories instead of installing files. +-g GROUP $chgrpprog installed files to GROUP. +-m MODE $chmodprog installed files to MODE. +-o USER $chownprog installed files to USER. +-s $stripprog installed files. +-t DIRECTORY install into DIRECTORY. +-T report an error if DSTFILE is a directory. +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test -n "$1"; do + case $1 in + -c) shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit 0;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t) dstarg=$2 + shift + shift + continue;; + + -T) no_target_directory=true + shift + continue;; + + --version) echo "$0 $scriptversion"; exit 0;; + + *) # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + test -n "$dir_arg$dstarg" && break + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done + break;; + esac +done + +if test -z "$1"; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + src= + + if test -d "$dst"; then + mkdircmd=: + chmodcmd= + else + mkdircmd=$mkdirprog + fi + else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dstarg: Is a directory" >&2 + exit 1 + fi + dst=$dst/`basename "$src"` + fi + fi + + # This sed command emulates the dirname command. + dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + + # Skip lots of stat calls in the usual case. + if test ! -d "$dstdir"; then + defaultIFS=' + ' + IFS="${IFS-$defaultIFS}" + + oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS=$oIFS + + pathcomp= + + while test $# -ne 0 ; do + pathcomp=$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" + # mkdir can fail with a `File exist' error in case several + # install-sh are creating the directory concurrently. This + # is OK. + test -d "$pathcomp" || exit + fi + pathcomp=$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $mkdircmd "$dst" \ + && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } + + else + dstfile=`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Copy the file name to the temp name. + $doit $cpprog "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dstdir/$dstfile"; then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } + fi || { (exit 1); exit; } +done + +# The final little trick to "correctly" pass the exit status to the exit trap. +{ + (exit 0); exit +} + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/executable_names/auxdir/ltmain.sh b/executable_names/auxdir/ltmain.sh new file mode 100644 index 0000000000000000000000000000000000000000..fb79d8c247af845bc84b6ab15cdcaf7e723d00e3 --- /dev/null +++ b/executable_names/auxdir/ltmain.sh @@ -0,0 +1,6402 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 +# Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.8 +TIMESTAMP=" (1.1220.2.117 2004/08/04 14:12:05)" + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes. +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () { + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` + if test "X$win32_nmres" = "Ximport" ; then + win32_libid_type="x86 archive import" + else + win32_libid_type="x86 archive static" + fi + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () { + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () { + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xdir="$my_gentop/$my_xlib" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$my_xdir"; then + exit $status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename $darwin_archive` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + # Remove the table of contents from the thin files. + $AR -d "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" __.SYMDEF 2>/dev/null || true + $AR -d "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" __.SYMDEF\ SORTED 2>/dev/null || true + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $AR -xo "${darwin_base_archive}" + rm "${darwin_base_archive}" + cd "$darwin_curdir" + done # $darwin_arches + ## Okay now we have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f | xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + rm -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + (cd $my_xdir && $AR x $my_xabs) || exit $? + fi # $darwin_arches + fi # $run + ;; + *) + # We will extract separately just the conflicting names and we will + # no longer touch any unique names. It is faster to leave these + # extract automatically by $AR in one run. + $show "(cd $my_xdir && $AR x $my_xabs)" + $run eval "(cd \$my_xdir && $AR x \$my_xabs)" || exit $? + if ($AR t "$my_xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$my_xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$my_xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $my_xdir && $AR xN $i $my_xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$my_xdir && $AR xN $i \$my_xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo + $echo "Copyright (C) 2003 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $EXIT_SUCCESS + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $EXIT_SUCCESS + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $EXIT_SUCCESS + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) prevopt="--tag" prev=tag ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + for arg + do + case "$arg_mode" in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + exit $EXIT_FAILURE + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-mingw* | *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # gcc -m* arguments should be passed to the linker via $compiler_flags + # in order to pass architecture information to the linker + # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo + # but this is not reliable with gcc because gcc may use -mfoo to + # select a different linker, different libraries, etc, while + # -Wl,-mfoo simply passes -mfoo to the linker. + -m*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + if test "$with_gcc" = "yes" ; then + compiler_flags="$compiler_flags $arg" + fi + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test "$status" -ne 0 && test ! -d "$output_objdir"; then + exit $status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5* ) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$deplibs $path" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + major=`expr $current - $age + 1` + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` + deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` + done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name="`expr $a_deplib : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$save_output-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$save_output-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$save_output-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadale object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + cwrappersource=`$echo ${objdir}/lt-${output}.c` + cwrapper=`$echo ${output}.exe` + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +#define DIR_SEPARATOR '/' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +#define HAVE_DOS_BASED_FILE_SYSTEM +#ifndef DIR_SEPARATOR_2 +#define DIR_SEPARATOR_2 '\\' +#endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +char * basename (const char *name); +char * fnqualify(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup ((char *) basename (argv[0])); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = fnqualify(argv[0]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +char * +basename (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha (name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return (char *) base; +} + +char * +fnqualify(const char *path) +{ + size_t size; + char *p; + char tmp[LT_PATHMAX + 1]; + + assert(path != NULL); + + /* Is it qualified already? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha (path[0]) && path[1] == ':') + return xstrdup (path); +#endif + if (IS_DIR_SEPARATOR (path[0])) + return xstrdup (path); + + /* prepend the current directory */ + /* doesn't handle '~' */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ + p = XMALLOC(char, size); + sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); + return p; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \$progdir/\$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + # GNU ar 2.10+ was changed to match POSIX; thus no paths are + # encoded into archives. This makes 'ar r' malfunction in + # this piecewise linking case whenever conflicting object + # names appear in distinct ar calls; check, warn and compensate. + if (for obj in $save_oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 + $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 + AR_FLAGS=cq + fi + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac + # If there is no directory component, then add one. + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac + # If there is no directory component, then add one. + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + save_umask=`umask` + umask 0077 + if $mkdir "$tmpdir"; then + umask $save_umask + else + umask $save_umask + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyways + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "----------------------------------------------------------------------" + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" + fi + if test -n "$runpath_var"; then + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "----------------------------------------------------------------------" + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + + if test "$mode" = uninstall; then + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + fi + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $EXIT_SUCCESS + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/executable_names/auxdir/missing b/executable_names/auxdir/missing new file mode 100755 index 0000000000000000000000000000000000000000..e7ef83a1c2512ce091a7c622ece4ade5bf4acf98 --- /dev/null +++ b/executable_names/auxdir/missing @@ -0,0 +1,360 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2003-09-02.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# 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, 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/executable_names/auxdir/slurm.m4 b/executable_names/auxdir/slurm.m4 new file mode 100644 index 0000000000000000000000000000000000000000..9d4a18bffd3786adf9a7fa395f57de9ef4c19af4 --- /dev/null +++ b/executable_names/auxdir/slurm.m4 @@ -0,0 +1,184 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Mark A. Grondona +# +# SYNOPSIS: +# Various X_AC_SLURM* macros for use in slurm +# +##***************************************************************************** + + +AC_DEFUN([X_AC_SLURM_PORTS], +[ + AC_MSG_CHECKING(for slurmctld default port) + + AC_ARG_WITH(slurmctld-port, + AS_HELP_STRING(--with-slurmctld-port=N,set slurmctld default port [[6817]]), + [ if test `expr match "$withval" '[[0-9]]*$'` -gt 0; then + slurmctldport="$withval" + fi + ] + ) + AC_MSG_RESULT(${slurmctldport=$1}) + + AC_DEFINE_UNQUOTED(SLURMCTLD_PORT, [$slurmctldport], + [Define the default port number for slurmctld]) + AC_SUBST(SLURMCTLD_PORT) + + AC_MSG_CHECKING(for slurmd default port) + AC_ARG_WITH(slurmd-port, + AS_HELP_STRING(--with-slurmd-port=N,set slurmd default port [[6818]]), + [ if test `expr match "$withval" '[[0-9]]*$'` -gt 0; then + slurmdport="$withval" + fi + ] + ) + AC_MSG_RESULT(${slurmdport=$2}) + + AC_DEFINE_UNQUOTED(SLURMD_PORT, [$slurmdport], + [Define the default port number for slurmd]) + + AC_SUBST(SLURMD_PORT) + +]) +dnl +dnl Check for program_invocation_name +dnl +AC_DEFUN([X_AC_SLURM_PROGRAM_INVOCATION_NAME], +[ + AC_MSG_CHECKING([for program_invocation_name]) + + AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern char *program_invocation_name;]], [[char *p; p = program_invocation_name; printf("%s\n", p);]])],[got_program_invocation_name=yes],[ + ]) + + AC_MSG_RESULT(${got_program_invocation_name=no}) + + if test "x$got_program_invocation_name" = "xyes"; then + AC_DEFINE(HAVE_PROGRAM_INVOCATION_NAME, 1, + [Define if libc sets program_invocation_name] + ) + fi +])dnl AC_PROG_INVOCATION_NAME + +dnl +dnl Check for Bigendian arch and set SLURM_BIGENDIAN acc'dngly +dnl +AC_DEFUN([X_AC_SLURM_BIGENDIAN], +[ + AC_C_BIGENDIAN + if test "x$ac_cv_c_bigendian" = "xyes"; then + AC_DEFINE(SLURM_BIGENDIAN,1, + [Define if your architecture's byteorder is big endian.]) + fi +])dnl AC_SLURM_BIGENDIAN + +dnl +dnl AC_SLURM_SEMAPHORE +dnl +AC_DEFUN([X_AC_SLURM_SEMAPHORE], +[ + SEMAPHORE_SOURCES="" + SEMAPHORE_LIBS="" + AC_CHECK_LIB( + posix4, + sem_open, + [SEMAPHORE_LIBS="-lposix4"; + AC_DEFINE(HAVE_POSIX_SEMS, 1, [Define if you have Posix semaphores.])], + [SEMAPHORE_SOURCES="semaphore.c"] + ) + AC_SUBST(SEMAPHORE_SOURCES) + AC_SUBST(SEMAPHORE_LIBS) +])dnl AC_SLURM_SEMAPHORE + +dnl +dnl +dnl +dnl Perform SLURM Project version setup +AC_DEFUN([X_AC_SLURM_VERSION], +[ +# +# Determine project/version from META file. +# These are substituted into the Makefile and config.h. +# +PROJECT="`perl -ne 'print,exit if s/^\s*NAME:\s*(\S*).*/\1/i' $srcdir/META`" +AC_DEFINE_UNQUOTED(PROJECT, "$PROJECT", [Define the project's name.]) +AC_SUBST(PROJECT) + +# Automake desires "PACKAGE" variable instead of PROJECT +PACKAGE=$PROJECT + +## Build the API version +## NOTE: We map API_MAJOR to be (API_CURRENT - API_AGE) to match the +## behavior of libtool in setting the library version number. For more +## information see src/api/Makefile.am +for name in CURRENT REVISION AGE; do + API=`perl -ne "print,exit if s/^\s*API_$name:\s*(\S*).*/\1/i" $srcdir/META` + eval SLURM_API_$name=$API +done +SLURM_API_VERSION="0x" +SLURM_API_MAJOR=`expr $SLURM_API_CURRENT - $SLURM_API_AGE` +API=`printf "%02x" $SLURM_API_MAJOR` +SLURM_API_VERSION="${SLURM_API_VERSION}$API" +API=`printf "%02x" $SLURM_API_AGE` +SLURM_API_VERSION="${SLURM_API_VERSION}$API" +API=`printf "%02x" $SLURM_API_REVISION` +SLURM_API_VERSION="${SLURM_API_VERSION}$API" +AC_DEFINE_UNQUOTED(SLURM_API_VERSION, $SLURM_API_VERSION, [Define the API's version]) +AC_DEFINE_UNQUOTED(SLURM_API_CURRENT, $SLURM_API_CURRENT, [API current version]) +AC_DEFINE_UNQUOTED(SLURM_API_MAJOR, $SLURM_API_MAJOR, [API current major]) +AC_DEFINE_UNQUOTED(SLURM_API_AGE, $SLURM_API_AGE, [API current age]) +AC_DEFINE_UNQUOTED(SLURM_API_REVISION, $SLURM_API_REVISION, [API current rev]) +AC_SUBST(SLURM_API_VERSION) +AC_SUBST(SLURM_API_CURRENT) +AC_SUBST(SLURM_API_MAJOR) +AC_SUBST(SLURM_API_AGE) +AC_SUBST(SLURM_API_REVISION) + +# rpm make target needs Version in META, not major and minor version numbers +VERSION="`perl -ne 'print,exit if s/^\s*VERSION:\s*(\S*).*/\1/i' $srcdir/META`" +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Define the project's version.]) +AC_SUBST(VERSION) + +SLURM_MAJOR="`perl -ne 'print,exit if s/^\s*MAJOR:\s*(\S*).*/\1/i' $srcdir/META`" +SLURM_MINOR="`perl -ne 'print,exit if s/^\s*MINOR:\s*(\S*).*/\1/i' $srcdir/META`" +SLURM_MICRO="`perl -ne 'print,exit if s/^\s*MICRO:\s*(\S*).*/\1/i' $srcdir/META`" +RELEASE="`perl -ne 'print,exit if s/^\s*RELEASE:\s*(\S*).*/\1/i' $srcdir/META`" + +if test "$SLURM_MAJOR.$SLURM_MINOR.$SLURM_MICRO" != "$VERSION"; then + AC_MSG_ERROR([META information is inconsistent: $VERSION != $SLURM_MAJOR.$SLURM_MINOR.$SLURM_MICRO!]) +fi + +# Check to see if we're on an unstable branch (no prereleases yet) +if echo "$RELEASE" | grep -e "pre0" -e "UNSTABLE"; then + if test "$RELEASE" = "UNSTABLE"; then + DATE=`date +"%Y%m%d%H%M"` + else + DATE=`echo $RELEASE | cut -d. -f3` + fi + SLURM_RELEASE="unstable cvs build $DATE" + SLURM_VERSION="$SLURM_MAJOR.$SLURM_MINOR ($SLURM_RELEASE)" +else + SLURM_RELEASE="`echo $RELEASE | sed 's/^.*\.//'`" + SLURM_VERSION="$SLURM_MAJOR.$SLURM_MINOR.$SLURM_MICRO" + test $RELEASE = "1" || SLURM_VERSION="$SLURM_VERSION-$SLURM_RELEASE" +fi +AC_DEFINE_UNQUOTED(SLURM_MAJOR, "$SLURM_MAJOR", + [Define the project's major version.]) +AC_DEFINE_UNQUOTED(SLURM_MINOR, "$SLURM_MINOR", + [Define the project's minor version.]) +AC_DEFINE_UNQUOTED(SLURM_MICRO, "$SLURM_MICRO", + [Define the project's micro version.]) +AC_DEFINE_UNQUOTED(RELEASE, "$RELEASE", [Define the project's release.]) +AC_DEFINE_UNQUOTED(SLURM_VERSION, "$SLURM_VERSION", + [Define the project's version string.]) +AC_SUBST(SLURM_MAJOR) +AC_SUBST(SLURM_MINOR) +AC_SUBST(SLURM_MICRO) +AC_SUBST(RELEASE) +AC_SUBST(SLURM_VERSION) + +]) dnl AC_SLURM_VERSION + + diff --git a/executable_names/auxdir/type_socklen_t.m4 b/executable_names/auxdir/type_socklen_t.m4 new file mode 100644 index 0000000000000000000000000000000000000000..e975ee945c4f6edaa242bf9a5e939da4788c069f --- /dev/null +++ b/executable_names/auxdir/type_socklen_t.m4 @@ -0,0 +1,32 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Lars Brinkhoff +# +# SYNOPSIS: +# TYPE_SOCKLEN_T +# +# DESCRIPTION: +# Check whether sys/socket.h defines type socklen_t. +# Please note that some systems require sys/types.h to be included +# before sys/socket.h can be compiled. +##***************************************************************************** + +AC_DEFUN([TYPE_SOCKLEN_T], +[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t, +[ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + #include ]], [[socklen_t len = 42; return 0;]])],[ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no]) +]) + +if test "$ac_cv_type_socklen_t" = "yes"; then + AC_DEFINE([HAVE_SOCKLEN_T], [1], [Define if you have the socklen_t type.]) +fi + +AH_VERBATIM([HAVE_SOCKLEN_T_], +[#ifndef HAVE_SOCKLEN_T +# define HAVE_SOCKLEN_T + typedef int socklen_t; +#endif]) +]) diff --git a/executable_names/auxdir/x_ac__system_configuration.m4 b/executable_names/auxdir/x_ac__system_configuration.m4 new file mode 100644 index 0000000000000000000000000000000000000000..e1810d1be27c6061e395f958588e77e883826335 --- /dev/null +++ b/executable_names/auxdir/x_ac__system_configuration.m4 @@ -0,0 +1,22 @@ +##***************************************************************************** +# $Id$ +##***************************************************************************** +# AUTHOR: +# Moe Jette +# +# SYNOPSIS: +# X_AC__SYSTEM_CONFIGURATION +# +# DESCRIPTION: +# Tests for existence of the _system_configuration structure. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** + +AC_DEFUN([X_AC__SYSTEM_CONFIGURATION], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[double x = _system_configuration.physmem;]])],[AC_DEFINE(HAVE__SYSTEM_CONFIGURATION, 1, + [Define to 1 if you have the external variable, + _system_configuration with a member named physmem.])],[]) +]) + diff --git a/executable_names/auxdir/x_ac_affinity.m4 b/executable_names/auxdir/x_ac_affinity.m4 new file mode 100644 index 0000000000000000000000000000000000000000..61dabb5d33f6abd2a5db917ec15587bcabba347c --- /dev/null +++ b/executable_names/auxdir/x_ac_affinity.m4 @@ -0,0 +1,53 @@ +##***************************************************************************** +# $Id$ +##***************************************************************************** +# AUTHOR: +# Morris Jette +# +# SYNOPSIS: +# X_AC_AFFINITY +# +# DESCRIPTION: +# Test for various task affinity functions and set the definitions. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** + +AC_DEFUN([X_AC_AFFINITY], [ + +# Test if sched_setaffinity function exists and argument count (it can vary) + AC_CHECK_FUNCS(sched_setaffinity, [have_sched_setaffinity=yes]) + AM_CONDITIONAL(HAVE_SCHED_SETAFFINITY, test "x$have_sched_setaffinity" = "xyes") + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#define _GNU_SOURCE + #include ]], [[cpu_set_t mask; + sched_getaffinity(0, sizeof(cpu_set_t), &mask);]])],[AC_DEFINE(SCHED_GETAFFINITY_THREE_ARGS, 1, + [Define to 1 if sched_getaffinity takes three arguments.])],[]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#define _GNU_SOURCE + #include ]], [[cpu_set_t mask; + sched_getaffinity(0, &mask);]])],[AC_DEFINE(SCHED_GETAFFINITY_TWO_ARGS, 1, + [Define to 1 if sched_getaffinity takes two arguments.])],[]) + +# +# Test for NUMA memory afffinity functions and set the definitions +# + AC_CHECK_LIB([numa], + [numa_available], + [ac_have_numa=yes; NUMA_LIBS="-lnuma"]) + + AC_SUBST(NUMA_LIBS) + AM_CONDITIONAL(HAVE_NUMA, test "x$ac_have_numa" = "xyes") + if test "x$ac_have_numa" = "xyes"; then + AC_DEFINE(HAVE_NUMA, 1, [define if you have the numa library]) + else + AC_MSG_WARN([Unable to locate NUMA memory affinity functions]) + fi + +# +# Test for other affinity functions as appropriate +# TBD + +]) + diff --git a/executable_names/auxdir/x_ac_aix.m4 b/executable_names/auxdir/x_ac_aix.m4 new file mode 100644 index 0000000000000000000000000000000000000000..6fd2bd221ac282a9b165a939d666ca10d1712479 --- /dev/null +++ b/executable_names/auxdir/x_ac_aix.m4 @@ -0,0 +1,71 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Morris Jette +# +# SYNOPSIS: +# X_AC_AIX +# +# DESCRIPTION: +# Check for AIX operating system and sets parameters accordingly, +# also define HAVE_AIX and HAVE_LARGEFILE if appropriate. +# NOTE: AC_SYS_LARGEFILE may fail on AIX due to inconstencies within +# installed gcc header files. +##***************************************************************************** + + +AC_DEFUN([X_AC_AIX], +[ + case "$host" in + *-*-aix*) LDFLAGS="$LDFLAGS -Wl,-brtl" # permit run time linking + LIB_LDFLAGS="$LDFLAGS -Wl,-G -Wl,-bnoentry -Wl,-bexpfull" + SO_LDFLAGS=" $LDFLAGS -Wl,-G -Wl,-bnoentry -Wl,-bexpfull" + if test "$OBJECT_MODE" = "64"; then + CFLAGS="-maix64 $CFLAGS" + CMD_LDFLAGS="$LDFLAGS -Wl,-bgcbypass:1000 -Wl,-bexpfull" # keep all common functions + else + CFLAGS="-maix32 $CFLAGS" + CMD_LDFLAGS="$LDFLAGS -Wl,-bgcbypass:1000 -Wl,-bexpfull -Wl,-bmaxdata:0x70000000" # keep all common functions + fi + ac_have_aix="yes" + ac_with_readline="no" + AC_DEFINE(HAVE_AIX, 1, [Define to 1 for AIX operating system]) + ;; + *) ac_have_aix="no" + ;; + esac + + AC_SUBST(CMD_LDFLAGS) + AC_SUBST(LIB_LDFLAGS) + AC_SUBST(SO_LDFLAGS) + AM_CONDITIONAL(HAVE_AIX, test "x$ac_have_aix" = "xyes") + AC_SUBST(HAVE_AIX, "$ac_have_aix") + + if test "x$ac_have_aix" = "xyes"; then + AC_ARG_WITH(proctrack, + AS_HELP_STRING(--with-proctrack=PATH,Specify path to proctrack sources), + [ PROCTRACKDIR="$withval" ] + ) + if test -f "$PROCTRACKDIR/lib/proctrackext.exp"; then + PROCTRACKDIR="$PROCTRACKDIR/lib" + AC_SUBST(PROCTRACKDIR) + CPPFLAGS="-I$PROCTRACKDIR/include $CPPFLAGS" + AC_CHECK_HEADERS(proctrack.h) + ac_have_aix_proctrack="yes" + elif test -f "$prefix/lib/proctrackext.exp"; then + PROCTRACKDIR="$prefix/lib" + AC_SUBST(PROCTRACKDIR) + CPPFLAGS="$CPPFLAGS -I$prefix/include" + AC_CHECK_HEADERS(proctrack.h) + ac_have_aix_proctrack="yes" + else + AC_MSG_WARN([proctrackext.exp is required for AIX proctrack support, specify location with --with-proctrack]) + ac_have_aix_proctrack="no" + fi + else + ac_have_aix_proctrack="no" + AC_SYS_LARGEFILE + fi + AM_CONDITIONAL(HAVE_AIX_PROCTRACK, test "x$ac_have_aix_proctrack" = "xyes") +]) diff --git a/executable_names/auxdir/x_ac_bluegene.m4 b/executable_names/auxdir/x_ac_bluegene.m4 new file mode 100644 index 0000000000000000000000000000000000000000..9aa287d10edb86902d27042e3b5868b0bac9ef83 --- /dev/null +++ b/executable_names/auxdir/x_ac_bluegene.m4 @@ -0,0 +1,91 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Morris Jette +# +# SYNOPSIS: +# X_AC_BG +# +# DESCRIPTION: +# Test for Blue Gene/L specific files. +# If found define HAVE_BG and HAVE_FRONT_END. +##***************************************************************************** + + +AC_DEFUN([X_AC_BLUEGENE], +[ + AC_ARG_WITH(db2, AS_HELP_STRING(--with-db2-dir=PATH,Specify path to DB2 library's parent directory), [ trydb2dir=$withval ]) + + # test for bluegene emulation mode + AC_ARG_ENABLE(bluegene-emulation, AS_HELP_STRING(--enable-bluegene-emulation,Run SLURM in bluegene mode on a non-bluegene system), + [ case "$enableval" in + yes) bluegene_emulation=yes ;; + no) bluegene_emulation=no ;; + *) AC_MSG_ERROR([bad value "$enableval" for --enable-bluegene-emulation]) ;; + esac ]) + + if test "x$bluegene_emulation" = "xyes"; then + AC_DEFINE(HAVE_BG, 1, [Define to 1 if emulating or running on Blue Gene system]) + AC_DEFINE(HAVE_FRONT_END, 1, [Define to 1 if running slurmd on front-end only]) + AC_MSG_NOTICE([Running in bluegene emulation mode]) + bg_default_dirs="" + else + bg_default_dirs="/bgl/BlueLight/ppcfloor/bglsys /opt/IBM/db2/V8.1 /u/bgdb2cli/sqllib /home/bgdb2cli/sqllib" + fi + + for bg_dir in $trydb2dir "" $bg_default_dirs; do + # Skip directories that don't exist + if test ! -z "$bg_dir" -a ! -d "$bg_dir" ; then + continue; + fi + + # Search for required BG API libraries in the directory + if test -z "$have_bg_ar" -a -f "$bg_dir/lib64/libbglbridge.so" ; then + have_bg_ar=yes + bg_bridge_so="$bg_dir/lib64/libbglbridge.so" + bg_ldflags="$bg_ldflags -L$bg_dir/lib64 -L/usr/lib64 -Wl,--unresolved-symbols=ignore-in-shared-libs -lbglbridge -lbgldb -ltableapi -lbglmachine -lexpat -lsaymessage" + fi + + # Search for required DB2 library in the directory + if test -z "$have_db2" -a -f "$bg_dir/lib64/libdb2.so" ; then + have_db2=yes + bg_db2_so="$bg_dir/lib64/libdb2.so" + bg_ldflags="$bg_ldflags -L$bg_dir/lib64 -ldb2" + fi + + # Search for headers in the directory + if test -z "$have_bg_hdr" -a -f "$bg_dir/include/rm_api.h" ; then + have_bg_hdr=yes + bg_includes="-I$bg_dir/include" + fi + done + + if test ! -z "$have_bg_ar" -a ! -z "$have_bg_hdr" -a ! -z "$have_db2" ; then + AC_DEFINE(HAVE_BG, 1, [Define to 1 if emulating or running on Blue Gene system]) + AC_DEFINE(HAVE_FRONT_END, 1, [Define to 1 if running slurmd on front-end only]) + # ac_with_readline="no" + # Test to make sure the api is good + have_bg_files=yes + saved_LDFLAGS="$LDFLAGS" + LDFLAGS="$saved_LDFLAGS $bg_ldflags" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ int rm_set_serial(char *); ]], [[ rm_set_serial(""); ]])],[have_bg_files=yes],[AC_MSG_ERROR(There is a problem linking to the bluegene api.)]) + LDFLAGS="$saved_LDFLAGS" + fi + + if test ! -z "$have_bg_files" ; then + BG_INCLUDES="$bg_includes" + AC_DEFINE(HAVE_BG_FILES, 1, [Define to 1 if have Blue Gene files]) + + AC_DEFINE_UNQUOTED(BG_BRIDGE_SO, "$bg_bridge_so", [Define the BG_BRIDGE_SO value]) + AC_DEFINE_UNQUOTED(BG_DB2_SO, "$bg_db2_so", [Define the BG_DB2_SO value]) + AC_MSG_CHECKING(for BG serial value) + bg_serial="BGL" + AC_ARG_WITH(bg-serial, + AS_HELP_STRING(--with-bg-serial=NAME,set BG_SERIAL value [[BGL]]), [bg_serial="$withval"]) + AC_MSG_RESULT($bg_serial) + AC_DEFINE_UNQUOTED(BG_SERIAL, "$bg_serial", [Define the BG_SERIAL value]) + fi + + AC_SUBST(BG_INCLUDES) +]) diff --git a/executable_names/auxdir/x_ac_debug.m4 b/executable_names/auxdir/x_ac_debug.m4 new file mode 100644 index 0000000000000000000000000000000000000000..7882349ccbf74e136030d4502f62d5087bf2fd7b --- /dev/null +++ b/executable_names/auxdir/x_ac_debug.m4 @@ -0,0 +1,60 @@ +##***************************************************************************** +# $Id$ +##***************************************************************************** +# AUTHOR: +# Chris Dunlap +# +# SYNOPSIS: +# X_AC_DEBUG +# +# DESCRIPTION: +# Add support for the "--enable-debug" and "--enable-memory-leak-debug" +# configure script options. +# If debugging is enabled, CFLAGS will be prepended with the debug flags. +# The NDEBUG macro (used by assert) will also be set accordingly. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** + +AC_DEFUN([X_AC_DEBUG], [ + AC_MSG_CHECKING([whether debugging is enabled]) + AC_ARG_ENABLE( + [debug], + AS_HELP_STRING(--enable-debug,enable debugging code for development), + [ case "$enableval" in + yes) x_ac_debug=yes ;; + no) x_ac_debug=no ;; + *) AC_MSG_RESULT([doh!]) + AC_MSG_ERROR([bad value "$enableval" for --enable-debug]) ;; + esac + ] + ) + if test "$x_ac_debug" = yes; then + test "$GCC" = yes && CFLAGS="$CFLAGS -Wall -fno-strict-aliasing" + else + AC_DEFINE([NDEBUG], [1], + [Define to 1 if you are building a production release.] + ) + fi + AC_MSG_RESULT([${x_ac_debug=no}]) + + AC_MSG_CHECKING([whether memory leak debugging is enabled]) + AC_ARG_ENABLE( + [memory-leak-debug], + AS_HELP_STRING(--enable-memory-leak-debug,enable memory leak debugging code for development), + [ case "$enableval" in + yes) x_ac_memory_debug=yes ;; + no) x_ac_memory_debug=no ;; + *) AC_MSG_RESULT([doh!]) + AC_MSG_ERROR([bad value "$enableval" for --enable-memory-leak-debug]) ;; + esac + ] + ) + if test "$x_ac_memory_debug" = yes; then + AC_DEFINE(MEMORY_LEAK_DEBUG, 1, [Define to 1 for memory leak debugging.]) + fi + AC_MSG_RESULT([${x_ac_memory_debug=no}]) + + ] +) diff --git a/executable_names/auxdir/x_ac_elan.m4 b/executable_names/auxdir/x_ac_elan.m4 new file mode 100644 index 0000000000000000000000000000000000000000..4889a7530df66f7daba7b2c9c3ed2e023e525ba6 --- /dev/null +++ b/executable_names/auxdir/x_ac_elan.m4 @@ -0,0 +1,64 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Mark A. Grondona +# +# SYNOPSIS: +# AC_ELAN +# +# DESCRIPTION: +# Checks for whether Elan MPI may be supported either via libelan3 +# or libelanctrl. ELAN_LIBS is set to the libraries needed for +# Elan modules. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** + + +AC_DEFUN([X_AC_ELAN], +[ + AC_CHECK_LIB([rmscall], + [rms_prgcreate], + [ac_elan_have_rmscall=yes; ELAN_LIBS="-lrmscall"]) + + if test "$ac_elan_have_rmscall" != "yes" ; then + AC_MSG_NOTICE([Cannot support QsNet without librmscall]) + fi + + AC_CHECK_LIB([elan3], [elan3_create], + [ac_elan_have_elan3=yes], + [ac_elan_noelan3=1]) + + AC_CHECK_LIB([elanctrl], [elanctrl_open], + [ac_elan_have_elanctrl=yes], + [ac_elan_noelanctrl=1]) + + if test "$ac_elan_have_elan3" = "yes"; then + AC_DEFINE(HAVE_LIBELAN3, 1, [define if you have libelan3.]) + ELAN_LIBS="$ELAN_LIBS -lelan3" + test "$ac_elan_have_rmscall" = "yes" && ac_have_elan="yes" + elif test "$ac_elan_have_elanctrl" = "yes"; then + AC_DEFINE(HAVE_LIBELANCTRL, 1, [define if you have libelanctrl.]) + ELAN_LIBS="$ELAN_LIBS -lelanctrl" + test "$ac_elan_have_rmscall" = "yes" && ac_have_elan="yes" + else + AC_MSG_NOTICE([Cannot support QsNet without libelan3 or libelanctrl!]) + fi + + if test "$ac_have_elan" = yes; then + AC_CHECK_LIB([elanhosts], [elanhost_config_create], + [ac_elan_have_elanhosts=yes], []) + + if test "$ac_elan_have_elanhosts" = "yes"; then + AC_DEFINE(HAVE_LIBELANHOSTS, 1, [define if you have libelanhosts.]) + ELAN_LIBS="$ELAN_LIBS -lelanhosts" + else + ac_have_elan="no" + AC_MSG_NOTICE([Cannot build QsNet modules without libelanhosts]) + fi + fi + + AC_SUBST(ELAN_LIBS) +]) diff --git a/executable_names/auxdir/x_ac_federation.m4 b/executable_names/auxdir/x_ac_federation.m4 new file mode 100644 index 0000000000000000000000000000000000000000..b377a9811c59954f40c38d0235dc31be3db5ce14 --- /dev/null +++ b/executable_names/auxdir/x_ac_federation.m4 @@ -0,0 +1,53 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Jason King +# +# SYNOPSIS: +# AC_FEDERATION +# +# DESCRIPTION: +# Checks for availability of the libraries necessary to support +# communication via User Space over the Federation switch. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** + + +AC_DEFUN([X_AC_FEDERATION], +[ + AC_MSG_CHECKING([whether to enable AIX Federation switch support]) + ntbl_default_dirs="/usr/lib" + for ntbl_dir in $ntbl_default_dirs; do + # skip dirs that don't exist + if test ! -z "$ntbl_dir" -a ! -d "$ntbl_dir" ; then + continue; + fi + + if test "$OBJECT_MODE" = "64"; then + libntbl="ntbl_64" + else + libntbl="ntbl" + fi + + # search for required NTBL API libraries + if test -f "$ntbl_dir/lib${libntbl}.so"; then + ac_have_federation="yes" + FEDERATION_LDFLAGS="-l$libntbl" + break; + fi + + done + + if test "x$ac_have_federation" != "xyes" ; then + AC_MSG_RESULT([no]) + AC_MSG_NOTICE([Cannot support Federation without libntbl]) + else + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_LIBNTBL, 1, [define if you have libntbl.]) + fi + + AC_SUBST(FEDERATION_LDFLAGS) +]) diff --git a/executable_names/auxdir/x_ac_gpl_licensed.m4 b/executable_names/auxdir/x_ac_gpl_licensed.m4 new file mode 100644 index 0000000000000000000000000000000000000000..f8e17cfa14a04f73217375a3374fddb2204e6dfb --- /dev/null +++ b/executable_names/auxdir/x_ac_gpl_licensed.m4 @@ -0,0 +1,19 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Chris Dunlap +# +# SYNOPSIS: +# AC_GPL_LICENSED +# +# DESCRIPTION: +# Acknowledge being licensed under terms of the GNU General Public License. +##***************************************************************************** + +AC_DEFUN([X_AC_GPL_LICENSED], +[ + AC_DEFINE([GPL_LICENSED], [1], + [Define to 1 if licensed under terms of the GNU General Public License.] + ) +]) diff --git a/executable_names/auxdir/x_ac_gtk.m4 b/executable_names/auxdir/x_ac_gtk.m4 new file mode 100644 index 0000000000000000000000000000000000000000..73b19f82d961af2e9a5dd1c1c166c150937497b8 --- /dev/null +++ b/executable_names/auxdir/x_ac_gtk.m4 @@ -0,0 +1,89 @@ +##***************************************************************************** +## $Id: x_ac_gtk.m4 5401 2005-09-22 01:56:49Z morrone $ +##***************************************************************************** +# AUTHOR: +# Danny Auble +# +# SYNOPSIS: +# X_AC_GTK +# +# DESCRIPTION: +# Test for GTK. If found define +##***************************************************************************** + + +AC_DEFUN([X_AC_GTK], +[ +### Set to "no" if any test fails + ac_have_gtk="yes" + +### Check for pkg-config program + AC_PATH_PROG(HAVEPKGCONFIG, pkg-config, $PATH) + if test -z "$HAVEPKGCONFIG"; then + AC_MSG_WARN([*** pkg-config not found. Cannot probe for libglade-2.0 or gtk+-2.0.]) + ac_have_gtk="no" + fi + +### Check for libglade package + if test "$ac_have_gtk" == "yes"; then + $HAVEPKGCONFIG --exists libglade-2.0 + if ! test $? -eq 0 ; then + AC_MSG_WARN([*** libbglade-2.0 is not available.]) + ac_have_gtk="no" + fi + fi + + +### Check for gtk2.6 package + if test "$ac_have_gtk" == "yes" ; then + $HAVEPKGCONFIG --exists gtk+-2.0 + if ! test $? -eq 0 ; then + AC_MSG_WARN([*** gtk+-2.0 is not available.]) + ac_have_gtk="no" + else + gtk_config_major_version=`$HAVEPKGCONFIG --modversion gtk+-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + gtk_config_minor_version=`$HAVEPKGCONFIG --modversion gtk+-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + gtk_config_micro_version=`$HAVEPKGCONFIG --modversion gtk+-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + + if test $gtk_config_major_version -lt 2 || test $gtk_config_minor_version -lt 6 ; then + AC_MSG_WARN([*** gtk+-$gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version available, we need >= gtk+-2.6.0 installed for sview.]) + ac_have_gtk="no" + fi + fi + fi + +### Run a test program + if test "$ac_have_gtk" == "yes" ; then + GTK2_CFLAGS=`$HAVEPKGCONFIG --cflags libglade-2.0 gtk+-2.0 gthread-2.0` + GTK2_LIBS=`$HAVEPKGCONFIG --libs libglade-2.0 gtk+-2.0 gthread-2.0` + if test ! -z "GLADE_STATIC" ; then + GTK2_LIBS=`echo $GTK2_LIBS | sed "s/-lglade-2.0/$GLADE_STATIC -lglade-2.0 $BDYNAMIC/g"` + fi + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + CFLAGS="$GTK2_CFLAGS $save_CFLAGS" + LIBS="$GTK2_LIBS $save_LIBS" + AC_TRY_LINK([ + #include + ],[ + int main() + { + (void) gtk_action_group_new ("MenuActions"); + (void) gtk_ui_manager_new (); + (void) gtk_cell_renderer_combo_new(); + } + ], , [ac_have_gtk="no"]) + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" + if test "$ac_have_gtk" == "yes"; then + AC_MSG_RESULT([GTK test program built properly.]) + AC_SUBST(GTK2_CFLAGS) + AC_SUBST(GTK2_LIBS) + else + AC_MSG_WARN([*** GTK test program execution failed.]) + fi + fi +]) diff --git a/executable_names/auxdir/x_ac_munge.m4 b/executable_names/auxdir/x_ac_munge.m4 new file mode 100644 index 0000000000000000000000000000000000000000..96e414fa4935830cc6728b1aeec720ec82eb98dc --- /dev/null +++ b/executable_names/auxdir/x_ac_munge.m4 @@ -0,0 +1,65 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Chris Dunlap (originally for OpenSSL) +# Modified for munge by Christopher Morrone +# +# SYNOPSIS: +# X_AC_MUNGE() +# +# DESCRIPTION: +# Check the usual suspects for an munge installation, +# updating CPPFLAGS and LDFLAGS as necessary. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC and before AC_PROG_LIBTOOL. +##***************************************************************************** + +AC_DEFUN([X_AC_MUNGE], [ + + _x_ac_munge_dirs="/usr /usr/local /opt/freeware /opt/munge" + _x_ac_munge_libs="lib64 lib" + + AC_ARG_WITH( + [munge], + AS_HELP_STRING(--with-munge=PATH,Specify path to munge installation), + [_x_ac_munge_dirs="$withval $_x_ac_munge_dirs"]) + + AC_CACHE_CHECK( + [for munge installation], + [x_ac_cv_munge_dir], + [ + for d in $_x_ac_munge_dirs; do + test -d "$d" || continue + test -d "$d/include" || continue + test -f "$d/include/munge.h" || continue + for bit in $_x_ac_munge_libs; do + test -d "$d/$bit" || continue + + _x_ac_munge_libs_save="$LIBS" + LIBS="-L$d/$bit -lmunge $LIBS" + AC_LINK_IFELSE( + AC_LANG_CALL([], munge_encode), + AS_VAR_SET(x_ac_cv_munge_dir, $d)) + LIBS="$_x_ac_munge_libs_save" + test -n "$x_ac_cv_munge_dir" && break + done + test -n "$x_ac_cv_munge_dir" && break + done + ]) + + if test -z "$x_ac_cv_munge_dir"; then + AC_MSG_WARN([unable to locate munge installation]) + else + MUNGE_LIBS="-lmunge" + MUNGE_CPPFLAGS="-I$x_ac_cv_munge_dir/include" + MUNGE_LDFLAGS="-L$x_ac_cv_munge_dir/$bit" + fi + + AC_SUBST(MUNGE_LIBS) + AC_SUBST(MUNGE_CPPFLAGS) + AC_SUBST(MUNGE_LDFLAGS) + + AM_CONDITIONAL(WITH_MUNGE, test -n "$x_ac_cv_munge_dir") +]) diff --git a/executable_names/auxdir/x_ac_ncurses.m4 b/executable_names/auxdir/x_ac_ncurses.m4 new file mode 100644 index 0000000000000000000000000000000000000000..00d12f4311374cb1b55c883c6bb3a52dc9d8abd7 --- /dev/null +++ b/executable_names/auxdir/x_ac_ncurses.m4 @@ -0,0 +1,35 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Morris Jette +# +# SYNOPSIS: +# X_AC_NCURSES +# +# DESCRIPTION: +# Test for NCURSES or CURSES. If found define NCURSES +##***************************************************************************** + + +AC_DEFUN([X_AC_NCURSES], +[ + AC_CHECK_LIB([ncurses], + [initscr], + [ac_have_ncurses=yes]) + AC_CHECK_LIB([curses], + [initscr], + [ac_have_curses=yes]) + + AC_SUBST(NCURSES) + if test "$ac_have_ncurses" = "yes"; then + NCURSES="-lncurses" + ac_have_some_curses="yes" + elif test "$ac_have_curses" = "yes"; then + NCURSES="-lcurses" + ac_have_some_curses="yes" + else + AC_MSG_WARN([Can not build smap without curses or ncurses library]) + ac_have_some_curses="no" + fi +]) diff --git a/executable_names/auxdir/x_ac_pam.m4 b/executable_names/auxdir/x_ac_pam.m4 new file mode 100644 index 0000000000000000000000000000000000000000..2d370dd236a0ed4cf7c9db55d0c6d9b7124eff71 --- /dev/null +++ b/executable_names/auxdir/x_ac_pam.m4 @@ -0,0 +1,56 @@ +##***************************************************************************** +# $Id$ +##***************************************************************************** +# AUTHOR: +# Morris Jette +# +# SYNOPSIS: +# X_AC_PAM +# +# DESCRIPTION: +# Test for PAM (Pluggable Authentication Module) support. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** + +AC_DEFUN([X_AC_PAM], [ + AC_MSG_CHECKING([whether to enable PAM support]) + AC_ARG_ENABLE( + [pam], + AS_HELP_STRING(--enable-pam,enable PAM (Pluggable Authentication Modules) support), + [ case "$enableval" in + yes) x_ac_pam=yes ;; + no) x_ac_pam=no ;; + *) AC_MSG_RESULT([doh!]) + AC_MSG_ERROR([bad value "$enableval" for --enable-pam]) ;; + esac + ], + [x_ac_pam=yes] + ) + + if test "$x_ac_pam" = yes; then + AC_MSG_RESULT([yes]) + AC_CHECK_LIB([pam], + [pam_get_user], + [ac_have_pam=yes; PAM_LIBS="-lpam"]) + + AC_CHECK_LIB([pam_misc], + [misc_conv], + [ac_have_pam_misc=yes; PAM_LIBS="$PAM_LIBS -lpam_misc"]) + + AC_SUBST(PAM_LIBS) + if test "x$ac_have_pam" = "xyes" -a "x$ac_have_pam_misc" = "xyes"; then + AC_DEFINE(HAVE_PAM,, [define if you have the PAM library]) + else + AC_MSG_WARN([Unable to locate PAM libraries]) + fi + else + AC_MSG_RESULT([no]) + fi + + AM_CONDITIONAL(HAVE_PAM, + test "x$x_ac_pam" = "xyes" -a "x$ac_have_pam" = "xyes" -a "x$ac_have_pam_misc" = "xyes") + +]) + diff --git a/executable_names/auxdir/x_ac_ptrace.m4 b/executable_names/auxdir/x_ac_ptrace.m4 new file mode 100644 index 0000000000000000000000000000000000000000..b2a3b74a99fbc91daf7bddf59441de9074e53cb0 --- /dev/null +++ b/executable_names/auxdir/x_ac_ptrace.m4 @@ -0,0 +1,25 @@ +##***************************************************************************** +# $Id$ +##***************************************************************************** +# AUTHOR: +# Morris Jette +# +# SYNOPSIS: +# X_AC_PTRACE +# +# DESCRIPTION: +# Test argument count of ptrace function. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** + +AC_DEFUN([X_AC_PTRACE], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + #include + #include ]], [[ptrace(PT_TRACE_ME,0,0,0,0);]])],[AC_DEFINE(PTRACE_FIVE_ARGS, 1, + [Define to 1 if ptrace takes five arguments.])],[]) + + AC_CHECK_FUNCS(ptrace64, [], []) +]) + diff --git a/executable_names/auxdir/x_ac_readline.m4 b/executable_names/auxdir/x_ac_readline.m4 new file mode 100644 index 0000000000000000000000000000000000000000..fc6b6389209bfb48aa0df07111909e7d6b0a5330 --- /dev/null +++ b/executable_names/auxdir/x_ac_readline.m4 @@ -0,0 +1,45 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Jim Garlick +# +# SYNOPSIS: +# AC_READLINE +# +# DESCRIPTION: +# Adds support for --without-readline. Exports READLINE_LIBS if found +# +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC and X_AC_CURSES. +##***************************************************************************** + +AC_DEFUN([X_AC_READLINE], +[ + AC_MSG_CHECKING([for whether to include readline suport]) + AC_ARG_WITH([readline], + AS_HELP_STRING(--without-readline,compile without readline support), + [ case "$withval" in + yes) ac_with_readline=yes ;; + no) ac_with_readline=no ;; + *) AC_MSG_RESULT([doh!]) + AC_MSG_ERROR([bad value "$withval" for --without-readline]) ;; + esac + ] + ) + + AC_MSG_RESULT([${ac_with_readline=yes}]) + if test "$ac_with_readline" = "yes"; then + saved_LIBS="$LIBS" + READLINE_LIBS="-lreadline -lhistory $NCURSES" + LIBS="$saved_LIBS $READLINE_LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include + #include + #include ]], [[ + char *line = readline("in:");]])],[AC_DEFINE([HAVE_READLINE], [1], + [Define if you are compiling with readline.])],[READLINE_LIBS=""]) + LIBS="$savedLIBS" + fi + AC_SUBST(READLINE_LIBS) +]) diff --git a/executable_names/auxdir/x_ac_setpgrp.m4 b/executable_names/auxdir/x_ac_setpgrp.m4 new file mode 100644 index 0000000000000000000000000000000000000000..bfe6c6441033c84212ba8628b5e67585bdaa9d4e --- /dev/null +++ b/executable_names/auxdir/x_ac_setpgrp.m4 @@ -0,0 +1,22 @@ +##***************************************************************************** +# $Id: x_ac_setpgrp.m4 8192 2006-05-25 00:15:05Z morrone $ +##***************************************************************************** +# AUTHOR: +# Morris Jette +# +# SYNOPSIS: +# X_AC_SETPGRP +# +# DESCRIPTION: +# Test argument count of setpgrp function. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** + +AC_DEFUN([X_AC_SETPGRP], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[setpgrp(0,0);]])],[AC_DEFINE(SETPGRP_TWO_ARGS, 1, + [Define to 1 if setpgrp takes two arguments.])],[]) +]) + diff --git a/executable_names/auxdir/x_ac_setproctitle.m4 b/executable_names/auxdir/x_ac_setproctitle.m4 new file mode 100644 index 0000000000000000000000000000000000000000..7b6f6e6204f047dd555700d749ec49b30eeafabc --- /dev/null +++ b/executable_names/auxdir/x_ac_setproctitle.m4 @@ -0,0 +1,50 @@ +##***************************************************************************** +# $Id$ +##***************************************************************************** +# AUTHOR: +# Mark Grondona +# +# SYNOPSIS: +# X_AC_SETPROCTITLE +# +# DESCRIPTION: +# Check for setproctitle() system call or emulation. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** +dnl +dnl Perform checks related to setproctitle() emulation +dnl +AC_DEFUN([X_AC_SETPROCTITLE], +[ +# +case "$host" in +*-*-aix*) + AC_DEFINE(SETPROCTITLE_STRATEGY,PS_USE_CLOBBER_ARGV) + AC_DEFINE(SETPROCTITLE_PS_PADDING, '\0') + ;; +*-*-hpux*) + AC_DEFINE(SETPROCTITLE_STRATEGY,PS_USE_PSTAT) + ;; +*-*-linux*) + AC_DEFINE(SETPROCTITLE_STRATEGY,PS_USE_CLOBBER_ARGV) + AC_DEFINE(SETPROCTITLE_PS_PADDING, '\0') + ;; +*) + AC_DEFINE(SETPROCTITLE_STRATEGY,PS_USE_NONE, + [Define to the setproctitle() emulation type]) + AC_DEFINE(SETPROCTITLE_PS_PADDING, '\0', + [Define if you need setproctitle padding]) + ;; +esac + +AC_MSG_CHECKING([for __progname]) +AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[extern char *__progname; puts(__progname);]])],[ac_have__progname=yes +],[]) +AC_MSG_RESULT(${ac_have__progname=no}) +if test "$ac_have__progname" = "yes"; then + AC_DEFINE([HAVE__PROGNAME], 1, [Define if you have __progname.]) +fi + +]) diff --git a/executable_names/auxdir/x_ac_sgi_job.m4 b/executable_names/auxdir/x_ac_sgi_job.m4 new file mode 100644 index 0000000000000000000000000000000000000000..6eb29bb206166f869fccf1be82ff243e1a212b8d --- /dev/null +++ b/executable_names/auxdir/x_ac_sgi_job.m4 @@ -0,0 +1,21 @@ +##***************************************************************************** +## $Id: x_ac_aix.m4 8192 2006-05-25 00:15:05Z morrone $ +##***************************************************************************** +# AUTHOR: +# Mark Grondona +# +# SYNOPSIS: +# AC_SGI_JOB +# +# DESCRIPTION: +# Check for presence of SGI job container support via libjob.so +##***************************************************************************** + + +AC_DEFUN([X_AC_SGI_JOB], +[ + AC_CHECK_LIB([job], [job_attachpid], [ac_have_sgi_job="yes"], []) + AC_MSG_CHECKING([for SGI job container support]) + AC_MSG_RESULT([${ac_have_sgi_job=no}]) + AM_CONDITIONAL(HAVE_SGI_JOB, test "x$ac_have_sgi_job" = "xyes") +]) diff --git a/executable_names/auxdir/x_ac_slurm_ssl.m4 b/executable_names/auxdir/x_ac_slurm_ssl.m4 new file mode 100644 index 0000000000000000000000000000000000000000..5a3e5f17699e5a2a29100ff03b704f26ef09a95e --- /dev/null +++ b/executable_names/auxdir/x_ac_slurm_ssl.m4 @@ -0,0 +1,150 @@ +##***************************************************************************** +## $Id$ +##***************************************************************************** +# AUTHOR: +# Mark Grondona +# (Mostly taken from OpenSSH configure.ac) +# +# SYNOPSIS: +# X_AC_SLURM_WITH_SSL +# +# DESCRIPTION: +# Process --with-ssl configure flag and search for OpenSSL support. +# +##***************************************************************************** + +AC_DEFUN([X_AC_SLURM_WITH_SSL], [ + + ac_slurm_with_ssl=no + ssl_default_dirs="/usr/local/openssl64 /usr/local/openssl /usr/lib/openssl \ + /usr/local/ssl /usr/lib/ssl /usr/local \ + /usr/pkg /opt /opt/openssl" + + AC_SUBST(SSL_LDFLAGS) + AC_SUBST(SSL_LIBS) + AC_SUBST(SSL_CPPFLAGS) + + SSL_LIBS="-lcrypto" + + AC_ARG_WITH(ssl, + AS_HELP_STRING(--with-ssl=PATH,Specify path to OpenSSL installation), + [ + tryssldir=$withval + + # Hack around a libtool bug on AIX. + # libcrypto is in a non-standard library path on AIX (/opt/freeware + # which is specified with --with-ssl), and libtool is not setting + # the correct runtime library path in the binaries. + if test "x$ac_have_aix" = "xyes"; then + SSL_LIBS="-lcrypto-static" + fi + ]) + + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + saved_CPPFLAGS="$CPPFLAGS" + if test "x$prefix" != "xNONE" ; then + tryssldir="$tryssldir $prefix" + fi + if test "x$tryssldir" == "xno" ; then + AC_MSG_ERROR([OpenSSL libary is required for SLURM operation, please install]) + fi + + AC_CACHE_CHECK([for OpenSSL directory], ac_cv_openssldir, [ + for ssldir in $tryssldir "" $ssl_default_dirs; do + CPPFLAGS="$saved_CPPFLAGS" + LDFLAGS="$saved_LDFLAGS" + LIBS="$saved_LIBS $SSL_LIBS" + + # Skip directories if they don't exist + if test ! -z "$ssldir" -a ! -d "$ssldir" ; then + continue; + fi + if test ! -z "$ssldir" -a "x$ssldir" != "x/usr"; then + # Try to use $ssldir/lib if it exists, otherwise + # $ssldir + if test -d "$ssldir/lib" ; then + LDFLAGS="-L$ssldir/lib $saved_LDFLAGS" + if test ! -z "$need_dash_r" ; then + LDFLAGS="-R$ssldir/lib $LDFLAGS" + fi + else + LDFLAGS="-L$ssldir $saved_LDFLAGS" + if test ! -z "$need_dash_r" ; then + LDFLAGS="-R$ssldir $LDFLAGS" + fi + fi + # Try to use $ssldir/include if it exists, otherwise + # $ssldir + if test -d "$ssldir/include" ; then + CPPFLAGS="-I$ssldir/include $saved_CPPFLAGS" + else + CPPFLAGS="-I$ssldir $saved_CPPFLAGS" + fi + fi + + # Basic test to check for compatible version and correct linking + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include + #include + #define SIZE 8 + int main(void) + { + int a[SIZE], i; + for (i=0; i]], [[EVP_MD_CTX_cleanup(NULL);]])],[AC_DEFINE(HAVE_EVP_MD_CTX_CLEANUP, 1, + [Define to 1 if function EVP_MD_CTX_cleanup exists.])],[]) + + LIBS="$saved_LIBS" + CPPFLAGS="$saved_CPPFLAGS" + LDFLAGS="$saved_LDFLAGS" + +])dnl AC_SLURM_WITH_SSL + + diff --git a/executable_names/auxdir/x_ac_xcpu.m4 b/executable_names/auxdir/x_ac_xcpu.m4 new file mode 100644 index 0000000000000000000000000000000000000000..5a2efe7c154a02e930dc3e5b4ca9fcba5a36d00c --- /dev/null +++ b/executable_names/auxdir/x_ac_xcpu.m4 @@ -0,0 +1,46 @@ +##***************************************************************************** +## $Id: x_ac_xcpu.m4 7443 2006-03-08 20:23:25Z da $ +##***************************************************************************** +# AUTHOR: +# Morris Jette +# +# SYNOPSIS: +# X_AC_XCPU +# +# DESCRIPTION: +# Test for XCPU job launch support. +# If found define HAVE_XCPU, XCPU_DIR and HAVE_FRONT_END. +# Explicitly set path with --with-xcpu=PATH, defaults to "/mnt". +# +# NOTES: +# SLURM still has no way to signal XCPU spawned processes. +# SLURM is not confirming that all processes have completed prior +# to marking a job/node as COMPLETED. For that it needs to check +# for subdirectories (not files) under /mnt/xcpu//xcpu. +##***************************************************************************** + + +AC_DEFUN([X_AC_XCPU], +[ + AC_MSG_CHECKING([whether XCPU is enabled]) + + xcpu_default_dirs="/mnt" + + AC_ARG_WITH([xcpu], + AS_HELP_STRING(--with-xcpu=PATH,specify path to XCPU directory), + [ try_path=$withval ] + ) + + ac_xcpu=no + for xcpu_dir in $try_path "" $xcpu_default_dirs; do + if test -d "$xcpu_dir/xcpu" ; then + ac_xcpu=yes + AC_DEFINE(HAVE_XCPU, 1, [Define to 1 if using XCPU for job launch]) + AC_DEFINE_UNQUOTED(XCPU_DIR, "$xcpu_dir/xcpu", [Define location of XCPU directory]) + AC_DEFINE(HAVE_FRONT_END, 1, [Define to 1 if running slurmd on front-end only]) + break + fi + done + + AC_MSG_RESULT($ac_xcpu) +]) diff --git a/executable_names/config.h.in b/executable_names/config.h.in new file mode 100644 index 0000000000000000000000000000000000000000..d0ff61f20f497ce6ceac7887be036794a582f751 --- /dev/null +++ b/executable_names/config.h.in @@ -0,0 +1,375 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define the BG_BRIDGE_SO value */ +#undef BG_BRIDGE_SO + +/* Define the BG_DB2_SO value */ +#undef BG_DB2_SO + +/* Define the BG_SERIAL value */ +#undef BG_SERIAL + +/* Define to 1 if licensed under terms of the GNU General Public License. */ +#undef GPL_LICENSED + +/* Define to 1 for AIX operating system */ +#undef HAVE_AIX + +/* Define to 1 if emulating or running on Blue Gene system */ +#undef HAVE_BG + +/* Define to 1 if have Blue Gene files */ +#undef HAVE_BG_FILES + +/* Define to 1 if you have the header file. */ +#undef HAVE_CURSES_H + +/* Define to 1 if you have the declaration of `hstrerror', and to 0 if you + don't. */ +#undef HAVE_DECL_HSTRERROR + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#undef HAVE_DECL_STRERROR_R + +/* Define to 1 if you have the declaration of `strsignal', and to 0 if you + don't. */ +#undef HAVE_DECL_STRSIGNAL + +/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL_SYS_SIGLIST + +/* Define to 1 if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ERRNO_H + +/* Define to 1 if function EVP_MD_CTX_cleanup exists. */ +#undef HAVE_EVP_MD_CTX_CLEANUP + +/* Define to 1 if you have the `fdatasync' function. */ +#undef HAVE_FDATASYNC + +/* Define to 1 if running slurmd on front-end only */ +#undef HAVE_FRONT_END + +/* Define to 1 if you have the `hstrerror' function. */ +#undef HAVE_HSTRERROR + +/* Define to 1 if you have the `inet_aton' function. */ +#undef HAVE_INET_ATON + +/* Define to 1 if you have the `inet_ntop' function. */ +#undef HAVE_INET_NTOP + +/* Define to 1 if you have the `inet_pton' function. */ +#undef HAVE_INET_PTON + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* define if you have libelan3. */ +#undef HAVE_LIBELAN3 + +/* define if you have libelanctrl. */ +#undef HAVE_LIBELANCTRL + +/* define if you have libelanhosts. */ +#undef HAVE_LIBELANHOSTS + +/* define if you have libntbl. */ +#undef HAVE_LIBNTBL + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_MCHECK_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mtrace' function. */ +#undef HAVE_MTRACE + +/* Define to 1 if you have the header file. */ +#undef HAVE_NCURSES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* define if you have the numa library */ +#undef HAVE_NUMA + +/* define if you have the PAM library */ +#undef HAVE_PAM + +/* Define to 1 if you have the header file. */ +#undef HAVE_PAM_PAM_APPL_H + +/* Define if you have Posix semaphores. */ +#undef HAVE_POSIX_SEMS + +/* Define to 1 if you have the header file. */ +#undef HAVE_PROCTRACK_H + +/* Define if libc sets program_invocation_name */ +#undef HAVE_PROGRAM_INVOCATION_NAME + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_H + +/* Define to 1 if you have the `ptrace64' function. */ +#undef HAVE_PTRACE64 + +/* Define if you are compiling with readline. */ +#undef HAVE_READLINE + +/* Define to 1 if you have the `sched_setaffinity' function. */ +#undef HAVE_SCHED_SETAFFINITY + +/* Define to 1 if you have the header file. */ +#undef HAVE_SECURITY_PAM_APPL_H + +/* Define to 1 if you have the `setproctitle' function. */ +#undef HAVE_SETPROCTITLE + +/* Define to 1 if you have the header file. */ +#undef HAVE_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the `strerror_r' function. */ +#undef HAVE_STRERROR_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strlcpy' function. */ +#undef HAVE_STRLCPY + +/* Define to 1 if you have the `strndup' function. */ +#undef HAVE_STRNDUP + +/* Define to 1 if you have the `strsignal' function. */ +#undef HAVE_STRSIGNAL + +/* Define to 1 if you have the `sysctlbyname' function. */ +#undef HAVE_SYSCTLBYNAME + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_DR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IPC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PRCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SEM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SHM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSTEMCFG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_VFS_H + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_TERMCAP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `unsetenv' function. */ +#undef HAVE_UNSETENV + +/* Define to 1 if you have the header file. */ +#undef HAVE_VALUES_H + +/* Define to 1 if using XCPU for job launch */ +#undef HAVE_XCPU + +/* Define to 1 if you have the `\' function. */ +#undef HAVE__ + +/* Define if you have __progname. */ +#undef HAVE__PROGNAME + +/* Define to 1 if you have the external variable, _system_configuration with a + member named physmem. */ +#undef HAVE__SYSTEM_CONFIGURATION + +/* Define to 1 for memory leak debugging. */ +#undef MEMORY_LEAK_DEBUG + +/* Enable multiple slurmd on one node */ +#undef MULTIPLE_SLURMD + +/* Define to 1 if you are building a production release. */ +#undef NDEBUG + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define the project's name. */ +#undef PROJECT + +/* Define to the necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* Define to 1 if ptrace takes five arguments. */ +#undef PTRACE_FIVE_ARGS + +/* Define the project's release. */ +#undef RELEASE + +/* Define to 1 if sched_getaffinity takes three arguments. */ +#undef SCHED_GETAFFINITY_THREE_ARGS + +/* Define to 1 if sched_getaffinity takes two arguments. */ +#undef SCHED_GETAFFINITY_TWO_ARGS + +/* Define to 1 if setpgrp takes two arguments. */ +#undef SETPGRP_TWO_ARGS + +/* Define if you need setproctitle padding */ +#undef SETPROCTITLE_PS_PADDING + +/* Define to the setproctitle() emulation type */ +#undef SETPROCTITLE_STRATEGY + +/* Define the default port number for slurmctld */ +#undef SLURMCTLD_PORT + +/* Define the default port number for slurmd */ +#undef SLURMD_PORT + +/* API current age */ +#undef SLURM_API_AGE + +/* API current version */ +#undef SLURM_API_CURRENT + +/* API current major */ +#undef SLURM_API_MAJOR + +/* API current rev */ +#undef SLURM_API_REVISION + +/* Define the API's version */ +#undef SLURM_API_VERSION + +/* Define if your architecture's byteorder is big endian. */ +#undef SLURM_BIGENDIAN + +/* Define the project's major version. */ +#undef SLURM_MAJOR + +/* Define the project's micro version. */ +#undef SLURM_MICRO + +/* Define the project's minor version. */ +#undef SLURM_MINOR + +/* Define the project's version string. */ +#undef SLURM_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if strerror_r returns char *. */ +#undef STRERROR_R_CHAR_P + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define slurm_ prefix function aliases for plugins */ +#undef USE_ALIAS + +/* Version number of package */ +#undef VERSION + +/* Have definition of lsd_fatal_error() */ +#undef WITH_LSD_FATAL_ERROR_FUNC + +/* Have definition of lsd_nomem_error() */ +#undef WITH_LSD_NOMEM_ERROR_FUNC + +/* Define if you have pthreads. */ +#undef WITH_PTHREADS + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +/* Define location of XCPU directory */ +#undef XCPU_DIR + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc diff --git a/executable_names/config.xml.in b/executable_names/config.xml.in new file mode 100644 index 0000000000000000000000000000000000000000..1a9bbda1dc5bfcf2b0f07791c4a7ec99cf358df5 --- /dev/null +++ b/executable_names/config.xml.in @@ -0,0 +1,60 @@ + + + + + SLURM: Simple Linux Utility for Resource Management + + + @SLURM_MAJOR@ + @SLURM_MINOR@ + @SLURM_MICRO@ + @RELEASE@ + 1 + + + included + + SLURM: Simple Linux Utility for Resource Management + GNU General Public License + Applications/batch + + Morris Jette + jette1@llnl.gov + + + The Simple Linux Utility for Resource Management (SLURM) is an + open source, fault-tolerant, and highly scalable cluster management and job + scheduling system for large and small Linux clusters. SLURM requires no + kernel modifications for its operation and is relatively self-contained. + As a cluster resource manager, SLURM has three key functions. First, it + allocates exclusive and/or non-exclusive access to resources (compute nodes) + to users for some duration of time so they can perform work. Second, it + provides a framework for starting, executing, and monitoring work (normally + a parallel job) on the set of allocated nodes. Finally, it arbitrates + conflicting requests for resources by managing a queue of pending work. + + + http://www.llnl.gov/linux/slurm + + slurm + slurm-devel + slurm-auth-authd + slurm-auth-none + slurm-auth-munge + slurm-sched-wiki + slurm-switch-elan + + + + torque + pbs + package + + diff --git a/executable_names/configure b/executable_names/configure new file mode 100755 index 0000000000000000000000000000000000000000..2d074a23c400163f6cc0ffcc238bef09178f739b --- /dev/null +++ b/executable_names/configure @@ -0,0 +1,27595 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59. +# +# Copyright (C) 2003 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="configure.ac" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os PROJECT SLURM_API_VERSION SLURM_API_CURRENT SLURM_API_MAJOR SLURM_API_AGE SLURM_API_REVISION VERSION SLURM_MAJOR SLURM_MINOR SLURM_MICRO RELEASE SLURM_VERSION INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CMD_LDFLAGS LIB_LDFLAGS SO_LDFLAGS HAVE_AIX_TRUE HAVE_AIX_FALSE HAVE_AIX PROCTRACKDIR CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP HAVE_AIX_PROCTRACK_TRUE HAVE_AIX_PROCTRACK_FALSE CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL WITH_GNU_LD_TRUE WITH_GNU_LD_FALSE HAVE_SCHED_SETAFFINITY_TRUE HAVE_SCHED_SETAFFINITY_FALSE NUMA_LIBS HAVE_NUMA_TRUE HAVE_NUMA_FALSE PAM_LIBS HAVE_PAM_TRUE HAVE_PAM_FALSE LIBOBJS HAVE_UNSETENV_TRUE HAVE_UNSETENV_FALSE PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS BG_INCLUDES SEMAPHORE_SOURCES SEMAPHORE_LIBS NCURSES HAVE_SOME_CURSES_TRUE HAVE_SOME_CURSES_FALSE HAVE_SOME_CURSES HAVEPKGCONFIG GTK2_CFLAGS GTK2_LIBS HAVE_GTK_TRUE HAVE_GTK_FALSE DEBUG_MODULES_TRUE DEBUG_MODULES_FALSE SLURMCTLD_PORT SLURMD_PORT ELAN_LIBS HAVE_ELAN_TRUE HAVE_ELAN_FALSE HAVE_ELAN FEDERATION_LDFLAGS HAVE_FEDERATION_TRUE HAVE_FEDERATION_FALSE HAVE_FEDERATION HAVE_SGI_JOB_TRUE HAVE_SGI_JOB_FALSE READLINE_LIBS SSL_LDFLAGS SSL_LIBS SSL_CPPFLAGS MUNGE_LIBS MUNGE_CPPFLAGS MUNGE_LDFLAGS WITH_MUNGE_TRUE WITH_MUNGE_FALSE AUTHD_LIBS AUTHD_CFLAGS WITH_AUTHD_TRUE WITH_AUTHD_FALSE LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +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' + +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # 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_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$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 ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) 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 | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$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 | -n) + 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_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + 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 "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# 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_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + 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 "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS +ac_env_CXXCPP_set=${CXXCPP+set} +ac_env_CXXCPP_value=$CXXCPP +ac_cv_env_CXXCPP_set=${CXXCPP+set} +ac_cv_env_CXXCPP_value=$CXXCPP +ac_env_F77_set=${F77+set} +ac_env_F77_value=$F77 +ac_cv_env_F77_set=${F77+set} +ac_cv_env_F77_value=$F77 +ac_env_FFLAGS_set=${FFLAGS+set} +ac_env_FFLAGS_value=$FFLAGS +ac_cv_env_FFLAGS_set=${FFLAGS+set} +ac_cv_env_FFLAGS_value=$FFLAGS + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # 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 <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +Program names: + --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 + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --disable-largefile omit support for large files + --enable-shared[=PKGS] + build shared libraries [default=yes] + --enable-static[=PKGS] + build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-pam enable PAM (Pluggable Authentication Modules) + support + --enable-bluegene-emulation + Run SLURM in bluegene mode on a non-bluegene system + --enable-debug enable debugging code for development + --enable-memory-leak-debug + enable memory leak debugging code for development + --enable-multiple-slurmd + enable multiple-slurmd support + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-proctrack=PATH Specify path to proctrack sources + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] + include additional configurations [automatic] + --with-db2-dir=PATH Specify path to DB2 library's parent directory + --with-bg-serial=NAME set BG_SERIAL value BGL + --with-xcpu=PATH specify path to XCPU directory + --with-slurmctld-port=N set slurmctld default port 6817 + --with-slurmd-port=N set slurmd default port 6818 + --without-readline compile without readline support + --with-ssl=PATH Specify path to OpenSSL installation + --with-munge=PATH Specify path to munge installation + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright (C) 2003 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# 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 + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# 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 "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + +ac_aux_dir= +for ac_dir in auxdir $srcdir/auxdir; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in auxdir $srcdir/auxdir" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in auxdir $srcdir/auxdir" >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6 +if test "${ac_cv_target+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_target_alias=$target_alias +test "x$ac_cv_target_alias" = "x" && + ac_cv_target_alias=$ac_cv_host_alias +ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6 +target=$ac_cv_target +target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + + + +cat >>confdefs.h <<\_ACEOF +#define GPL_LICENSED 1 +_ACEOF + + + +# +# Determine project/version from META file. +# Sets PACKAGE, VERSION, SLURM_VERSION + +# +# Determine project/version from META file. +# These are substituted into the Makefile and config.h. +# +PROJECT="`perl -ne 'print,exit if s/^\s*NAME:\s*(\S*).*/\1/i' $srcdir/META`" + +cat >>confdefs.h <<_ACEOF +#define PROJECT "$PROJECT" +_ACEOF + + + +# Automake desires "PACKAGE" variable instead of PROJECT +PACKAGE=$PROJECT + +## Build the API version +## NOTE: We map API_MAJOR to be (API_CURRENT - API_AGE) to match the +## behavior of libtool in setting the library version number. For more +## information see src/api/Makefile.am +for name in CURRENT REVISION AGE; do + API=`perl -ne "print,exit if s/^\s*API_$name:\s*(\S*).*/\1/i" $srcdir/META` + eval SLURM_API_$name=$API +done +SLURM_API_VERSION="0x" +SLURM_API_MAJOR=`expr $SLURM_API_CURRENT - $SLURM_API_AGE` +API=`printf "%02x" $SLURM_API_MAJOR` +SLURM_API_VERSION="${SLURM_API_VERSION}$API" +API=`printf "%02x" $SLURM_API_AGE` +SLURM_API_VERSION="${SLURM_API_VERSION}$API" +API=`printf "%02x" $SLURM_API_REVISION` +SLURM_API_VERSION="${SLURM_API_VERSION}$API" + +cat >>confdefs.h <<_ACEOF +#define SLURM_API_VERSION $SLURM_API_VERSION +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SLURM_API_CURRENT $SLURM_API_CURRENT +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SLURM_API_MAJOR $SLURM_API_MAJOR +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SLURM_API_AGE $SLURM_API_AGE +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SLURM_API_REVISION $SLURM_API_REVISION +_ACEOF + + + + + + + +# rpm make target needs Version in META, not major and minor version numbers +VERSION="`perl -ne 'print,exit if s/^\s*VERSION:\s*(\S*).*/\1/i' $srcdir/META`" + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + + + +SLURM_MAJOR="`perl -ne 'print,exit if s/^\s*MAJOR:\s*(\S*).*/\1/i' $srcdir/META`" +SLURM_MINOR="`perl -ne 'print,exit if s/^\s*MINOR:\s*(\S*).*/\1/i' $srcdir/META`" +SLURM_MICRO="`perl -ne 'print,exit if s/^\s*MICRO:\s*(\S*).*/\1/i' $srcdir/META`" +RELEASE="`perl -ne 'print,exit if s/^\s*RELEASE:\s*(\S*).*/\1/i' $srcdir/META`" + +if test "$SLURM_MAJOR.$SLURM_MINOR.$SLURM_MICRO" != "$VERSION"; then + { { echo "$as_me:$LINENO: error: META information is inconsistent: $VERSION != $SLURM_MAJOR.$SLURM_MINOR.$SLURM_MICRO!" >&5 +echo "$as_me: error: META information is inconsistent: $VERSION != $SLURM_MAJOR.$SLURM_MINOR.$SLURM_MICRO!" >&2;} + { (exit 1); exit 1; }; } +fi + +# Check to see if we're on an unstable branch (no prereleases yet) +if echo "$RELEASE" | grep -e "pre0" -e "UNSTABLE"; then + if test "$RELEASE" = "UNSTABLE"; then + DATE=`date +"%Y%m%d%H%M"` + else + DATE=`echo $RELEASE | cut -d. -f3` + fi + SLURM_RELEASE="unstable cvs build $DATE" + SLURM_VERSION="$SLURM_MAJOR.$SLURM_MINOR ($SLURM_RELEASE)" +else + SLURM_RELEASE="`echo $RELEASE | sed 's/^.*\.//'`" + SLURM_VERSION="$SLURM_MAJOR.$SLURM_MINOR.$SLURM_MICRO" + test $RELEASE = "1" || SLURM_VERSION="$SLURM_VERSION-$SLURM_RELEASE" +fi + +cat >>confdefs.h <<_ACEOF +#define SLURM_MAJOR "$SLURM_MAJOR" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SLURM_MINOR "$SLURM_MINOR" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SLURM_MICRO "$SLURM_MICRO" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define RELEASE "$RELEASE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SLURM_VERSION "$SLURM_VERSION" +_ACEOF + + + + + + + + + + +am__api_version="1.9" +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE=slurm + VERSION=$VERSION + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + +echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi; + echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 + + +if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + ac_config_headers="$ac_config_headers config.h" + + ac_config_headers="$ac_config_headers slurm/slurm.h" + + +DEPDIR="${am__leading_dot}deps" + + ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6 +rm -f confinc confmf + +# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval="$enable_dependency_tracking" + +fi; +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + case "$host" in + *-*-aix*) LDFLAGS="$LDFLAGS -Wl,-brtl" # permit run time linking + LIB_LDFLAGS="$LDFLAGS -Wl,-G -Wl,-bnoentry -Wl,-bexpfull" + SO_LDFLAGS=" $LDFLAGS -Wl,-G -Wl,-bnoentry -Wl,-bexpfull" + if test "$OBJECT_MODE" = "64"; then + CFLAGS="-maix64 $CFLAGS" + CMD_LDFLAGS="$LDFLAGS -Wl,-bgcbypass:1000 -Wl,-bexpfull" # keep all common functions + else + CFLAGS="-maix32 $CFLAGS" + CMD_LDFLAGS="$LDFLAGS -Wl,-bgcbypass:1000 -Wl,-bexpfull -Wl,-bmaxdata:0x70000000" # keep all common functions + fi + ac_have_aix="yes" + ac_with_readline="no" + +cat >>confdefs.h <<\_ACEOF +#define HAVE_AIX 1 +_ACEOF + + ;; + *) ac_have_aix="no" + ;; + esac + + + + + + +if test "x$ac_have_aix" = "xyes"; then + HAVE_AIX_TRUE= + HAVE_AIX_FALSE='#' +else + HAVE_AIX_TRUE='#' + HAVE_AIX_FALSE= +fi + + HAVE_AIX="$ac_have_aix" + + + if test "x$ac_have_aix" = "xyes"; then + +# Check whether --with-proctrack or --without-proctrack was given. +if test "${with_proctrack+set}" = set; then + withval="$with_proctrack" + PROCTRACKDIR="$withval" + +fi; + if test -f "$PROCTRACKDIR/lib/proctrackext.exp"; then + PROCTRACKDIR="$PROCTRACKDIR/lib" + + CPPFLAGS="-I$PROCTRACKDIR/include $CPPFLAGS" + +for ac_header in proctrack.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + ac_have_aix_proctrack="yes" + elif test -f "$prefix/lib/proctrackext.exp"; then + PROCTRACKDIR="$prefix/lib" + + CPPFLAGS="$CPPFLAGS -I$prefix/include" + +for ac_header in proctrack.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + ac_have_aix_proctrack="yes" + else + { echo "$as_me:$LINENO: WARNING: proctrackext.exp is required for AIX proctrack support, specify location with --with-proctrack" >&5 +echo "$as_me: WARNING: proctrackext.exp is required for AIX proctrack support, specify location with --with-proctrack" >&2;} + ac_have_aix_proctrack="no" + fi + else + ac_have_aix_proctrack="no" + # Check whether --enable-largefile or --disable-largefile was given. +if test "${enable_largefile+set}" = set; then + enableval="$enable_largefile" + +fi; +if test "$enable_largefile" != no; then + + echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5 +echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_largefile_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext + CC="$CC -n32" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sys_largefile_CC=' -n32'; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5 +echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6 + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_file_offset_bits+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + while :; do + ac_cv_sys_file_offset_bits=no + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sys_file_offset_bits=64; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + break +done +fi +echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5 +echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6 +if test "$ac_cv_sys_file_offset_bits" != no; then + +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF + +fi +rm -f conftest* + echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5 +echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_large_files+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + while :; do + ac_cv_sys_large_files=no + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sys_large_files=1; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + break +done +fi +echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5 +echo "${ECHO_T}$ac_cv_sys_large_files" >&6 +if test "$ac_cv_sys_large_files" != no; then + +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF + +fi +rm -f conftest* +fi + + fi + + +if test "x$ac_have_aix_proctrack" = "xyes"; then + HAVE_AIX_PROCTRACK_TRUE= + HAVE_AIX_PROCTRACK_FALSE='#' +else + HAVE_AIX_PROCTRACK_TRUE='#' + HAVE_AIX_PROCTRACK_FALSE= +fi + + + +case "$host" in + *-*-aix*) +cat >>confdefs.h <<\_ACEOF +#define USE_ALIAS 0 +_ACEOF + ;; + *darwin*) +cat >>confdefs.h <<\_ACEOF +#define USE_ALIAS 0 +_ACEOF + ;; + *) +cat >>confdefs.h <<\_ACEOF +#define USE_ALIAS 1 +_ACEOF + ;; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done +test -n "$ac_ct_CXX" || ac_ct_CXX="g++" + + CXX=$ac_ct_CXX +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cxx_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi; + +# Check whether --enable-static or --disable-static was given. +if test "${enable_static+set}" = set; then + enableval="$enable_static" + p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi; + +# Check whether --enable-fast-install or --disable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval="$enable_fast_install" + p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi; + +echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 +if test "${lt_cv_path_SED+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done + +fi + +SED=$lt_cv_path_SED +echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6 + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +with_gnu_ld=$lt_cv_prog_gnu_ld + + +echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 +if test "${lt_cv_ld_reload_flag+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_ld_reload_flag='-r' +fi +echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$CC -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + +echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 +if test "${lt_cv_path_NM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi +echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +echo "${ECHO_T}$lt_cv_path_NM" >&6 +NM="$lt_cv_path_NM" + +echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 +echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 +if test "${lt_cv_deplibs_check_method+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump'. + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | kfreebsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 6441 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 +if test "${lt_cv_cc_needs_belf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_cc_needs_belf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +lt_cv_cc_needs_belf=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +esac + +need_locks="$enable_libtool_lock" + + + +for ac_header in dlfcn.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6 +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + echo "$as_me:$LINENO: result: $F77" >&5 +echo "${ECHO_T}$F77" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_F77="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +echo "${ECHO_T}$ac_ct_F77" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_F77" && break +done + + F77=$ac_ct_F77 +fi + + +# Provide some information about the compiler. +echo "$as_me:7076:" \ + "checking for Fortran 77 compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 +if test "${ac_cv_f77_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_f77_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + FFLAGS=-g +cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_f77_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_f77_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +G77=`test $ac_compiler_gnu = yes && echo yes` +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + +# find the maximum length of command line arguments +echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* ) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for *BSD + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 +else + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 +fi + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris* | sysv5*) + symcode='[BDRT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6 +else + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 +fi + +echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +if test "${lt_cv_objdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +echo "${ECHO_T}$lt_cv_objdir" >&6 +objdir=$lt_cv_objdir + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + AR=$ac_ct_AR +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +enable_dlopen=no +enable_win32_dll=no + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + +# Check whether --with-pic or --without-pic was given. +if test "${with_pic+set}" = set; then + withval="$with_pic" + pic_mode="$withval" +else + pic_mode=default +fi; +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# +# Check for any special shared library compilation flags. +# +lt_prog_cc_shlib= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + lt_prog_cc_shlib='-belf' + ;; + esac +fi +if test -n "$lt_prog_cc_shlib"; then + { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 +echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : + else + { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 +if test "${lt_prog_compiler_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_prog_compiler_static" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + else + lt_prog_compiler_static_works=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 + +if test x"$lt_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8126: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:8130: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + lt_prog_compiler_pic='-qnocommon' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic='-Kpic' + lt_prog_compiler_static='-dn' + ;; + + solaris*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8369: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:8373: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 + +if test x"$lt_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8429: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:8433: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds="$tmp_archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec=' ' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +echo "${ECHO_T}$ld_shlibs" >&6 +test "$ld_shlibs" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +echo "${ECHO_T}$archive_cmds_need_lc" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var" || \ + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6 + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# Report which librarie types wil actually be built +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { echo "$as_me:$LINENO: creating $ofile" >&5 +echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + +# Check whether --with-tags or --without-tags was given. +if test "${with_tags+set}" = set; then + withval="$with_tags" + tagnames="$withval" +fi; + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 +echo "$as_me: error: invalid tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 +echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} + { (exit 1); exit 1; }; } + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_CXX=yes + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_CXX=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX=' ' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_CXX=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd12*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_CXX='+b $libdir' + hardcode_libdir_separator_CXX=: + ;; + ia64*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + *) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + openbsd*) + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sco*) + archive_cmds_need_lc_CXX=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.0-5 | solaris2.0-5.*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + archive_cmds_need_lc_CXX=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6 +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + + +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + lt_prog_compiler_pic_CXX='-qnocommon' + lt_prog_compiler_wl_CXX='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12901: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:12905: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 + +if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12961: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:12965: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6 +test "$ld_shlibs_CXX" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var_CXX" || \ + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +echo "${ECHO_T}$hardcode_action_CXX" >&6 + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_CXX" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code=" subroutine t\n return\n end\n" + +# Code to be used in simple link tests +lt_simple_link_test_code=" program t\n end\n" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix4* | aix5*) + test "$enable_shared" = yes && enable_static=no + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 + +test "$ld_shlibs_F77" = no && can_build_shared=no + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + lt_prog_compiler_pic_F77='-qnocommon' + lt_prog_compiler_wl_F77='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_F77='-Kpic' + lt_prog_compiler_static_F77='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15257: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15261: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 + +if test x"$lt_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15317: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:15321: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_F77="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_F77="$tmp_archive_cmds" + fi + else + ld_shlibs_F77=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_F77=yes + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_F77=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77=' ' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='' + link_all_deplibs_F77=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_F77=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + ia64*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + *) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + sco3.2v5*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_F77='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv5*) + no_undefined_flag_F77=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_F77= + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +echo "${ECHO_T}$ld_shlibs_F77" >&6 +test "$ld_shlibs_F77" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var_F77" || \ + test "X$hardcode_automatic_F77" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +echo "${ECHO_T}$hardcode_action_F77" >&6 + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_F77" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17352: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:17356: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + lt_prog_compiler_pic_GCJ='-qnocommon' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_GCJ='-Kpic' + lt_prog_compiler_static_GCJ='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17595: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:17599: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 + +if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17655: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:17659: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_GCJ="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_GCJ="$tmp_archive_cmds" + fi + else + ld_shlibs_GCJ=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_GCJ=yes + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_GCJ=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ=' ' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_GCJ=no + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='' + link_all_deplibs_GCJ=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_GCJ=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + ia64*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + *) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + sco3.2v5*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_GCJ='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv5*) + no_undefined_flag_GCJ=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_GCJ= + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +echo "${ECHO_T}$ld_shlibs_GCJ" >&6 +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var_GCJ" || \ + test "X$hardcode_automatic_GCJ" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +echo "${ECHO_T}$hardcode_action_GCJ" >&6 + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_GCJ" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_RC" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + ;; + + *) + { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 +echo "$as_me: error: Unsupported tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 +echo "$as_me: error: unable to update list of available tagged configurations." >&2;} + { (exit 1); exit 1; }; } + fi +fi + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + + + + + +if test "$with_gnu_ld" = "yes"; then + WITH_GNU_LD_TRUE= + WITH_GNU_LD_FALSE='#' +else + WITH_GNU_LD_TRUE='#' + WITH_GNU_LD_FALSE= +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +for ac_header in mcheck.h values.h socket.h sys/socket.h \ + stdbool.h sys/ipc.h sys/shm.h sys/sem.h errno.h \ + stdlib.h dirent.h pthread.h sys/prctl.h \ + sysint.h inttypes.h termcap.h netdb.h sys/socket.h \ + sys/systemcfg.h ncurses.h curses.h sys/dr.h sys/vfs.h \ + pam/pam_appl.h security/pam_appl.h sys/sysctl.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 +echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6 +if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +int +main () +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_sys_wait_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_sys_wait_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6 +if test $ac_cv_header_sys_wait_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_WAIT_H 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_time=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_time=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$ac_cv_header_time" >&6 +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\_ACEOF +#define TIME_WITH_SYS_TIME 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + + + + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +double x = _system_configuration.physmem; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE__SYSTEM_CONFIGURATION 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + + + echo "$as_me:$LINENO: checking for program_invocation_name" >&5 +echo $ECHO_N "checking for program_invocation_name... $ECHO_C" >&6 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +extern char *program_invocation_name; +int +main () +{ +char *p; p = program_invocation_name; printf("%s\n", p); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + got_program_invocation_name=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + echo "$as_me:$LINENO: result: ${got_program_invocation_name=no}" >&5 +echo "${ECHO_T}${got_program_invocation_name=no}" >&6 + + if test "x$got_program_invocation_name" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PROGRAM_INVOCATION_NAME 1 +_ACEOF + + fi + + + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include + #include +int +main () +{ +ptrace(PT_TRACE_ME,0,0,0,0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define PTRACE_FIVE_ARGS 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + +for ac_func in ptrace64 +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +setpgrp(0,0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define SETPGRP_TWO_ARGS 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + + + +# Test if sched_setaffinity function exists and argument count (it can vary) + +for ac_func in sched_setaffinity +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_sched_setaffinity=yes +fi +done + + + +if test "x$have_sched_setaffinity" = "xyes"; then + HAVE_SCHED_SETAFFINITY_TRUE= + HAVE_SCHED_SETAFFINITY_FALSE='#' +else + HAVE_SCHED_SETAFFINITY_TRUE='#' + HAVE_SCHED_SETAFFINITY_FALSE= +fi + + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define _GNU_SOURCE + #include +int +main () +{ +cpu_set_t mask; + sched_getaffinity(0, sizeof(cpu_set_t), &mask); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define SCHED_GETAFFINITY_THREE_ARGS 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define _GNU_SOURCE + #include +int +main () +{ +cpu_set_t mask; + sched_getaffinity(0, &mask); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define SCHED_GETAFFINITY_TWO_ARGS 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +# +# Test for NUMA memory afffinity functions and set the definitions +# + echo "$as_me:$LINENO: checking for numa_available in -lnuma" >&5 +echo $ECHO_N "checking for numa_available in -lnuma... $ECHO_C" >&6 +if test "${ac_cv_lib_numa_numa_available+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnuma $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char numa_available (); +int +main () +{ +numa_available (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_numa_numa_available=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_numa_numa_available=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_numa_numa_available" >&5 +echo "${ECHO_T}$ac_cv_lib_numa_numa_available" >&6 +if test $ac_cv_lib_numa_numa_available = yes; then + ac_have_numa=yes; NUMA_LIBS="-lnuma" +fi + + + + + +if test "x$ac_have_numa" = "xyes"; then + HAVE_NUMA_TRUE= + HAVE_NUMA_FALSE='#' +else + HAVE_NUMA_TRUE='#' + HAVE_NUMA_FALSE= +fi + + if test "x$ac_have_numa" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_NUMA 1 +_ACEOF + + else + { echo "$as_me:$LINENO: WARNING: Unable to locate NUMA memory affinity functions" >&5 +echo "$as_me: WARNING: Unable to locate NUMA memory affinity functions" >&2;} + fi + +# +# Test for other affinity functions as appropriate +# TBD + + + + + echo "$as_me:$LINENO: checking whether to enable PAM support" >&5 +echo $ECHO_N "checking whether to enable PAM support... $ECHO_C" >&6 + # Check whether --enable-pam or --disable-pam was given. +if test "${enable_pam+set}" = set; then + enableval="$enable_pam" + case "$enableval" in + yes) x_ac_pam=yes ;; + no) x_ac_pam=no ;; + *) echo "$as_me:$LINENO: result: doh!" >&5 +echo "${ECHO_T}doh!" >&6 + { { echo "$as_me:$LINENO: error: bad value \"$enableval\" for --enable-pam" >&5 +echo "$as_me: error: bad value \"$enableval\" for --enable-pam" >&2;} + { (exit 1); exit 1; }; } ;; + esac + +else + x_ac_pam=yes + +fi; + + if test "$x_ac_pam" = yes; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + echo "$as_me:$LINENO: checking for pam_get_user in -lpam" >&5 +echo $ECHO_N "checking for pam_get_user in -lpam... $ECHO_C" >&6 +if test "${ac_cv_lib_pam_pam_get_user+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpam $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pam_get_user (); +int +main () +{ +pam_get_user (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pam_pam_get_user=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_pam_pam_get_user=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_pam_pam_get_user" >&5 +echo "${ECHO_T}$ac_cv_lib_pam_pam_get_user" >&6 +if test $ac_cv_lib_pam_pam_get_user = yes; then + ac_have_pam=yes; PAM_LIBS="-lpam" +fi + + + echo "$as_me:$LINENO: checking for misc_conv in -lpam_misc" >&5 +echo $ECHO_N "checking for misc_conv in -lpam_misc... $ECHO_C" >&6 +if test "${ac_cv_lib_pam_misc_misc_conv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpam_misc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char misc_conv (); +int +main () +{ +misc_conv (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pam_misc_misc_conv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_pam_misc_misc_conv=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_pam_misc_misc_conv" >&5 +echo "${ECHO_T}$ac_cv_lib_pam_misc_misc_conv" >&6 +if test $ac_cv_lib_pam_misc_misc_conv = yes; then + ac_have_pam_misc=yes; PAM_LIBS="$PAM_LIBS -lpam_misc" +fi + + + + if test "x$ac_have_pam" = "xyes" -a "x$ac_have_pam_misc" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PAM +_ACEOF + + else + { echo "$as_me:$LINENO: WARNING: Unable to locate PAM libraries" >&5 +echo "$as_me: WARNING: Unable to locate PAM libraries" >&2;} + fi + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + fi + + + +if test "x$x_ac_pam" = "xyes" -a "x$ac_have_pam" = "xyes" -a "x$ac_have_pam_misc" = "xyes"; then + HAVE_PAM_TRUE= + HAVE_PAM_FALSE='#' +else + HAVE_PAM_TRUE='#' + HAVE_PAM_FALSE= +fi + + + + + + echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6 +if test "${ac_cv_c_bigendian+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # See if sys/param.h defines the BYTE_ORDER macro. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # It does; now see whether it defined to BIG_ENDIAN or not. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_bigendian=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +# It does not; compile a test program. +if test "$cross_compiling" = yes; then + # try to guess the endianness by grepping values into an object file + ac_cv_c_bigendian=unknown + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } +short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } +int +main () +{ + _ascii (); _ebcdic (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then + ac_cv_c_bigendian=yes +fi +if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi +fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +int +main () +{ + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=no +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_bigendian=yes +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +echo "${ECHO_T}$ac_cv_c_bigendian" >&6 +case $ac_cv_c_bigendian in + yes) + +cat >>confdefs.h <<\_ACEOF +#define WORDS_BIGENDIAN 1 +_ACEOF + ;; + no) + ;; + *) + { { echo "$as_me:$LINENO: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&5 +echo "$as_me: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} + { (exit 1); exit 1; }; } ;; +esac + + if test "x$ac_cv_c_bigendian" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define SLURM_BIGENDIAN 1 +_ACEOF + + fi + + +if test $ac_cv_c_compiler_gnu = yes; then + echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 +echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 +if test "${ac_cv_prog_gcc_traditional+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_pattern="Autoconf.*'x'" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +Autoconf TIOCGETP +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +else + ac_cv_prog_gcc_traditional=no +fi +rm -f conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +Autoconf TCGETA +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +fi +rm -f conftest* + + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 +echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + + + + +for ac_header in stdlib.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5 +echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6 +if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_malloc_0_nonnull=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if STDC_HEADERS || HAVE_STDLIB_H +# include +#else +char *malloc (); +#endif + +int +main () +{ +exit (malloc (0) ? 0 : 1); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_malloc_0_nonnull=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_malloc_0_nonnull=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5 +echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6 +if test $ac_cv_func_malloc_0_nonnull = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC 0 +_ACEOF + + case $LIBOBJS in + "malloc.$ac_objext" | \ + *" malloc.$ac_objext" | \ + "malloc.$ac_objext "* | \ + *" malloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; +esac + + +cat >>confdefs.h <<\_ACEOF +#define malloc rpl_malloc +_ACEOF + +fi + + + +echo "$as_me:$LINENO: checking whether strerror_r is declared" >&5 +echo $ECHO_N "checking whether strerror_r is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_strerror_r+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef strerror_r + char *p = (char *) strerror_r; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_strerror_r=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_strerror_r=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror_r" >&5 +echo "${ECHO_T}$ac_cv_have_decl_strerror_r" >&6 +if test $ac_cv_have_decl_strerror_r = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRERROR_R 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRERROR_R 0 +_ACEOF + + +fi + + + +for ac_func in strerror_r +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +echo "$as_me:$LINENO: checking whether strerror_r returns char *" >&5 +echo $ECHO_N "checking whether strerror_r returns char *... $ECHO_C" >&6 +if test "${ac_cv_func_strerror_r_char_p+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + ac_cv_func_strerror_r_char_p=no + if test $ac_cv_have_decl_strerror_r = yes; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + char buf[100]; + char x = *strerror_r (0, buf, sizeof buf); + char *p = strerror_r (0, buf, sizeof buf); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_strerror_r_char_p=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + else + # strerror_r is not declared. Choose between + # systems that have relatively inaccessible declarations for the + # function. BeOS and DEC UNIX 4.0 fall in this category, but the + # former has a strerror_r that returns char*, while the latter + # has a strerror_r that returns `int'. + # This test should segfault on the DEC system. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + extern char *strerror_r (); +int +main () +{ +char buf[100]; + char x = *strerror_r (0, buf, sizeof buf); + exit (!isalpha (x)); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_strerror_r_char_p=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + fi + +fi +echo "$as_me:$LINENO: result: $ac_cv_func_strerror_r_char_p" >&5 +echo "${ECHO_T}$ac_cv_func_strerror_r_char_p" >&6 +if test $ac_cv_func_strerror_r_char_p = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STRERROR_R_CHAR_P 1 +_ACEOF + +fi + + + + + + + + + + + + + + +for ac_func in \ + fdatasync \ + hstrerror \ + strerror \ + mtrace \ + strndup \ + strlcpy \ + strsignal \ + inet_aton \ + inet_ntop \ + inet_pton \ + setproctitle \ + sysctlbyname \ + +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +echo "$as_me:$LINENO: checking whether hstrerror is declared" >&5 +echo $ECHO_N "checking whether hstrerror is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_hstrerror+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef hstrerror + char *p = (char *) hstrerror; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_hstrerror=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_hstrerror=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_hstrerror" >&5 +echo "${ECHO_T}$ac_cv_have_decl_hstrerror" >&6 +if test $ac_cv_have_decl_hstrerror = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_HSTRERROR 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_HSTRERROR 0 +_ACEOF + + +fi +echo "$as_me:$LINENO: checking whether strsignal is declared" >&5 +echo $ECHO_N "checking whether strsignal is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_strsignal+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef strsignal + char *p = (char *) strsignal; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_strsignal=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_strsignal=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_strsignal" >&5 +echo "${ECHO_T}$ac_cv_have_decl_strsignal" >&6 +if test $ac_cv_have_decl_strsignal = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRSIGNAL 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRSIGNAL 0 +_ACEOF + + +fi +echo "$as_me:$LINENO: checking whether sys_siglist is declared" >&5 +echo $ECHO_N "checking whether sys_siglist is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_sys_siglist+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef sys_siglist + char *p = (char *) sys_siglist; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_sys_siglist=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_sys_siglist=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_sys_siglist" >&5 +echo "${ECHO_T}$ac_cv_have_decl_sys_siglist" >&6 +if test $ac_cv_have_decl_sys_siglist = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGLIST 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGLIST 0 +_ACEOF + + +fi + + + + +for ac_func in unsetenv +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_unsetenv=yes +fi +done + + + +if test "x$have_unsetenv" = "xyes"; then + HAVE_UNSETENV_TRUE= + HAVE_UNSETENV_FALSE='#' +else + HAVE_UNSETENV_TRUE='#' + HAVE_UNSETENV_FALSE= +fi + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + echo "$as_me:$LINENO: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +echo $ECHO_N "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_join (); +int +main () +{ +pthread_join (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + acx_pthread_ok=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 +echo "${ECHO_T}$acx_pthread_ok" >&6 + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# pthread: Linux, etcetera +# --thread-safe: KAI C++ + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthread or + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + echo "$as_me:$LINENO: checking whether pthreads work without any flags" >&5 +echo $ECHO_N "checking whether pthreads work without any flags... $ECHO_C" >&6 + ;; + + -*) + echo "$as_me:$LINENO: checking whether pthreads work with $flag" >&5 +echo $ECHO_N "checking whether pthreads work with $flag... $ECHO_C" >&6 + PTHREAD_CFLAGS="$flag" + ;; + + *) + echo "$as_me:$LINENO: checking for the pthreads library -l$flag" >&5 +echo $ECHO_N "checking for the pthreads library -l$flag... $ECHO_C" >&6 + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + acx_pthread_ok=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 +echo "${ECHO_T}$acx_pthread_ok" >&6 + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: threads are created detached by default + # and the JOINABLE attribute has a nonstandard name (UNDETACHED). + echo "$as_me:$LINENO: checking for joinable pthread attribute" >&5 +echo $ECHO_N "checking for joinable pthread attribute... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int attr=PTHREAD_CREATE_JOINABLE; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ok=PTHREAD_CREATE_JOINABLE +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ok=unknown +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test x"$ok" = xunknown; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int attr=PTHREAD_CREATE_UNDETACHED; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ok=PTHREAD_CREATE_UNDETACHED +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ok=unknown +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + if test x"$ok" != xPTHREAD_CREATE_JOINABLE; then + +cat >>confdefs.h <<\_ACEOF +#define PTHREAD_CREATE_JOINABLE $ok +_ACEOF + + fi + echo "$as_me:$LINENO: result: ${ok}" >&5 +echo "${ECHO_T}${ok}" >&6 + if test x"$ok" = xunknown; then + { echo "$as_me:$LINENO: WARNING: we do not know how to create joinable pthreads" >&5 +echo "$as_me: WARNING: we do not know how to create joinable pthreads" >&2;} + fi + + echo "$as_me:$LINENO: checking if more special flags are required for pthreads" >&5 +echo $ECHO_N "checking if more special flags are required for pthreads... $ECHO_C" >&6 + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd*) flag="-D_THREAD_SAFE";; + *solaris* | alpha*-osf*) flag="-D_REENTRANT";; + esac + echo "$as_me:$LINENO: result: ${flag}" >&5 +echo "${ECHO_T}${flag}" >&6 + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with cc_r + # Extract the first word of "cc_r", so it can be a program name with args. +set dummy cc_r; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_PTHREAD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="cc_r" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_PTHREAD_CC" && ac_cv_prog_PTHREAD_CC="${CC}" +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + echo "$as_me:$LINENO: result: $PTHREAD_CC" >&5 +echo "${ECHO_T}$PTHREAD_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +else + PTHREAD_CC="$CC" +fi + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PTHREAD 1 +_ACEOF + + : +else + acx_pthread_ok=no + { { echo "$as_me:$LINENO: error: Error: Cannot figure out how to use pthreads!" >&5 +echo "$as_me: error: Error: Cannot figure out how to use pthreads!" >&2;} + { (exit 1); exit 1; }; } +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Always define WITH_PTHREADS if we make it this far + +cat >>confdefs.h <<\_ACEOF +#define WITH_PTHREADS 1 +_ACEOF + +LDFLAGS="$LDFLAGS " +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +LIBS="$PTHREAD_LIBS $LIBS" + + + +# Check whether --with-db2 or --without-db2 was given. +if test "${with_db2+set}" = set; then + withval="$with_db2" + trydb2dir=$withval +fi; + + # test for bluegene emulation mode + # Check whether --enable-bluegene-emulation or --disable-bluegene-emulation was given. +if test "${enable_bluegene_emulation+set}" = set; then + enableval="$enable_bluegene_emulation" + case "$enableval" in + yes) bluegene_emulation=yes ;; + no) bluegene_emulation=no ;; + *) { { echo "$as_me:$LINENO: error: bad value \"$enableval\" for --enable-bluegene-emulation" >&5 +echo "$as_me: error: bad value \"$enableval\" for --enable-bluegene-emulation" >&2;} + { (exit 1); exit 1; }; } ;; + esac +fi; + + if test "x$bluegene_emulation" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_BG 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_FRONT_END 1 +_ACEOF + + { echo "$as_me:$LINENO: Running in bluegene emulation mode" >&5 +echo "$as_me: Running in bluegene emulation mode" >&6;} + bg_default_dirs="" + else + bg_default_dirs="/bgl/BlueLight/ppcfloor/bglsys /opt/IBM/db2/V8.1 /u/bgdb2cli/sqllib /home/bgdb2cli/sqllib" + fi + + for bg_dir in $trydb2dir "" $bg_default_dirs; do + # Skip directories that don't exist + if test ! -z "$bg_dir" -a ! -d "$bg_dir" ; then + continue; + fi + + # Search for required BG API libraries in the directory + if test -z "$have_bg_ar" -a -f "$bg_dir/lib64/libbglbridge.so" ; then + have_bg_ar=yes + bg_bridge_so="$bg_dir/lib64/libbglbridge.so" + bg_ldflags="$bg_ldflags -L$bg_dir/lib64 -L/usr/lib64 -Wl,--unresolved-symbols=ignore-in-shared-libs -lbglbridge -lbgldb -ltableapi -lbglmachine -lexpat -lsaymessage" + fi + + # Search for required DB2 library in the directory + if test -z "$have_db2" -a -f "$bg_dir/lib64/libdb2.so" ; then + have_db2=yes + bg_db2_so="$bg_dir/lib64/libdb2.so" + bg_ldflags="$bg_ldflags -L$bg_dir/lib64 -ldb2" + fi + + # Search for headers in the directory + if test -z "$have_bg_hdr" -a -f "$bg_dir/include/rm_api.h" ; then + have_bg_hdr=yes + bg_includes="-I$bg_dir/include" + fi + done + + if test ! -z "$have_bg_ar" -a ! -z "$have_bg_hdr" -a ! -z "$have_db2" ; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_BG 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_FRONT_END 1 +_ACEOF + + # ac_with_readline="no" + # Test to make sure the api is good + have_bg_files=yes + saved_LDFLAGS="$LDFLAGS" + LDFLAGS="$saved_LDFLAGS $bg_ldflags" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + int rm_set_serial(char *); +int +main () +{ + rm_set_serial(""); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + have_bg_files=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: There is a problem linking to the bluegene api." >&5 +echo "$as_me: error: There is a problem linking to the bluegene api." >&2;} + { (exit 1); exit 1; }; } +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$saved_LDFLAGS" + fi + + if test ! -z "$have_bg_files" ; then + BG_INCLUDES="$bg_includes" + +cat >>confdefs.h <<\_ACEOF +#define HAVE_BG_FILES 1 +_ACEOF + + + +cat >>confdefs.h <<_ACEOF +#define BG_BRIDGE_SO "$bg_bridge_so" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define BG_DB2_SO "$bg_db2_so" +_ACEOF + + echo "$as_me:$LINENO: checking for BG serial value" >&5 +echo $ECHO_N "checking for BG serial value... $ECHO_C" >&6 + bg_serial="BGL" + +# Check whether --with-bg-serial or --without-bg-serial was given. +if test "${with_bg_serial+set}" = set; then + withval="$with_bg_serial" + bg_serial="$withval" +fi; + echo "$as_me:$LINENO: result: $bg_serial" >&5 +echo "${ECHO_T}$bg_serial" >&6 + +cat >>confdefs.h <<_ACEOF +#define BG_SERIAL "$bg_serial" +_ACEOF + + fi + + + + + echo "$as_me:$LINENO: checking whether XCPU is enabled" >&5 +echo $ECHO_N "checking whether XCPU is enabled... $ECHO_C" >&6 + + xcpu_default_dirs="/mnt" + + +# Check whether --with-xcpu or --without-xcpu was given. +if test "${with_xcpu+set}" = set; then + withval="$with_xcpu" + try_path=$withval + +fi; + + ac_xcpu=no + for xcpu_dir in $try_path "" $xcpu_default_dirs; do + if test -d "$xcpu_dir/xcpu" ; then + ac_xcpu=yes + +cat >>confdefs.h <<\_ACEOF +#define HAVE_XCPU 1 +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define XCPU_DIR "$xcpu_dir/xcpu" +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_FRONT_END 1 +_ACEOF + + break + fi + done + + echo "$as_me:$LINENO: result: $ac_xcpu" >&5 +echo "${ECHO_T}$ac_xcpu" >&6 + + + SEMAPHORE_SOURCES="" + SEMAPHORE_LIBS="" + echo "$as_me:$LINENO: checking for sem_open in -lposix4" >&5 +echo $ECHO_N "checking for sem_open in -lposix4... $ECHO_C" >&6 +if test "${ac_cv_lib_posix4_sem_open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix4 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char sem_open (); +int +main () +{ +sem_open (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix4_sem_open=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_posix4_sem_open=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_posix4_sem_open" >&5 +echo "${ECHO_T}$ac_cv_lib_posix4_sem_open" >&6 +if test $ac_cv_lib_posix4_sem_open = yes; then + SEMAPHORE_LIBS="-lposix4"; + +cat >>confdefs.h <<\_ACEOF +#define HAVE_POSIX_SEMS 1 +_ACEOF + +else + SEMAPHORE_SOURCES="semaphore.c" + +fi + + + + + + + echo "$as_me:$LINENO: checking for initscr in -lncurses" >&5 +echo $ECHO_N "checking for initscr in -lncurses... $ECHO_C" >&6 +if test "${ac_cv_lib_ncurses_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lncurses $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (); +int +main () +{ +initscr (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ncurses_initscr=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ncurses_initscr=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ncurses_initscr" >&5 +echo "${ECHO_T}$ac_cv_lib_ncurses_initscr" >&6 +if test $ac_cv_lib_ncurses_initscr = yes; then + ac_have_ncurses=yes +fi + + echo "$as_me:$LINENO: checking for initscr in -lcurses" >&5 +echo $ECHO_N "checking for initscr in -lcurses... $ECHO_C" >&6 +if test "${ac_cv_lib_curses_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcurses $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (); +int +main () +{ +initscr (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_curses_initscr=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_curses_initscr=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_curses_initscr" >&5 +echo "${ECHO_T}$ac_cv_lib_curses_initscr" >&6 +if test $ac_cv_lib_curses_initscr = yes; then + ac_have_curses=yes +fi + + + + if test "$ac_have_ncurses" = "yes"; then + NCURSES="-lncurses" + ac_have_some_curses="yes" + elif test "$ac_have_curses" = "yes"; then + NCURSES="-lcurses" + ac_have_some_curses="yes" + else + { echo "$as_me:$LINENO: WARNING: Can not build smap without curses or ncurses library" >&5 +echo "$as_me: WARNING: Can not build smap without curses or ncurses library" >&2;} + ac_have_some_curses="no" + fi + + + +if test "x$ac_have_some_curses" = "xyes"; then + HAVE_SOME_CURSES_TRUE= + HAVE_SOME_CURSES_FALSE='#' +else + HAVE_SOME_CURSES_TRUE='#' + HAVE_SOME_CURSES_FALSE= +fi + + + + +### Set to "no" if any test fails + ac_have_gtk="yes" + +### Check for pkg-config program + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_HAVEPKGCONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $HAVEPKGCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_HAVEPKGCONFIG="$HAVEPKGCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_HAVEPKGCONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_HAVEPKGCONFIG" && ac_cv_path_HAVEPKGCONFIG="$PATH" + ;; +esac +fi +HAVEPKGCONFIG=$ac_cv_path_HAVEPKGCONFIG + +if test -n "$HAVEPKGCONFIG"; then + echo "$as_me:$LINENO: result: $HAVEPKGCONFIG" >&5 +echo "${ECHO_T}$HAVEPKGCONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test -z "$HAVEPKGCONFIG"; then + { echo "$as_me:$LINENO: WARNING: *** pkg-config not found. Cannot probe for libglade-2.0 or gtk+-2.0." >&5 +echo "$as_me: WARNING: *** pkg-config not found. Cannot probe for libglade-2.0 or gtk+-2.0." >&2;} + ac_have_gtk="no" + fi + +### Check for libglade package + if test "$ac_have_gtk" == "yes"; then + $HAVEPKGCONFIG --exists libglade-2.0 + if ! test $? -eq 0 ; then + { echo "$as_me:$LINENO: WARNING: *** libbglade-2.0 is not available." >&5 +echo "$as_me: WARNING: *** libbglade-2.0 is not available." >&2;} + ac_have_gtk="no" + fi + fi + + +### Check for gtk2.6 package + if test "$ac_have_gtk" == "yes" ; then + $HAVEPKGCONFIG --exists gtk+-2.0 + if ! test $? -eq 0 ; then + { echo "$as_me:$LINENO: WARNING: *** gtk+-2.0 is not available." >&5 +echo "$as_me: WARNING: *** gtk+-2.0 is not available." >&2;} + ac_have_gtk="no" + else + gtk_config_major_version=`$HAVEPKGCONFIG --modversion gtk+-2.0 | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + gtk_config_minor_version=`$HAVEPKGCONFIG --modversion gtk+-2.0 | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + gtk_config_micro_version=`$HAVEPKGCONFIG --modversion gtk+-2.0 | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + + if test $gtk_config_major_version -lt 2 || test $gtk_config_minor_version -lt 6 ; then + { echo "$as_me:$LINENO: WARNING: *** gtk+-$gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version available, we need >= gtk+-2.6.0 installed for sview." >&5 +echo "$as_me: WARNING: *** gtk+-$gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version available, we need >= gtk+-2.6.0 installed for sview." >&2;} + ac_have_gtk="no" + fi + fi + fi + +### Run a test program + if test "$ac_have_gtk" == "yes" ; then + GTK2_CFLAGS=`$HAVEPKGCONFIG --cflags libglade-2.0 gtk+-2.0 gthread-2.0` + GTK2_LIBS=`$HAVEPKGCONFIG --libs libglade-2.0 gtk+-2.0 gthread-2.0` + if test ! -z "GLADE_STATIC" ; then + GTK2_LIBS=`echo $GTK2_LIBS | sed "s/-lglade-2.0/$GLADE_STATIC -lglade-2.0 $BDYNAMIC/g"` + fi + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + CFLAGS="$GTK2_CFLAGS $save_CFLAGS" + LIBS="$GTK2_LIBS $save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + #include + +int +main () +{ + + int main() + { + (void) gtk_action_group_new ("MenuActions"); + (void) gtk_ui_manager_new (); + (void) gtk_cell_renderer_combo_new(); + } + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_have_gtk="no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" + if test "$ac_have_gtk" == "yes"; then + echo "$as_me:$LINENO: result: GTK test program built properly." >&5 +echo "${ECHO_T}GTK test program built properly." >&6 + + + else + { echo "$as_me:$LINENO: WARNING: *** GTK test program execution failed." >&5 +echo "$as_me: WARNING: *** GTK test program execution failed." >&2;} + fi + fi + + + +if test "x$ac_have_gtk" = "xyes"; then + HAVE_GTK_TRUE= + HAVE_GTK_FALSE='#' +else + HAVE_GTK_TRUE='#' + HAVE_GTK_FALSE= +fi + + + + + + +# +case "$host" in +*-*-aix*) + cat >>confdefs.h <<\_ACEOF +#define SETPROCTITLE_STRATEGY PS_USE_CLOBBER_ARGV +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define SETPROCTITLE_PS_PADDING '\0' +_ACEOF + + ;; +*-*-hpux*) + cat >>confdefs.h <<\_ACEOF +#define SETPROCTITLE_STRATEGY PS_USE_PSTAT +_ACEOF + + ;; +*-*-linux*) + cat >>confdefs.h <<\_ACEOF +#define SETPROCTITLE_STRATEGY PS_USE_CLOBBER_ARGV +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define SETPROCTITLE_PS_PADDING '\0' +_ACEOF + + ;; +*) + +cat >>confdefs.h <<\_ACEOF +#define SETPROCTITLE_STRATEGY PS_USE_NONE +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define SETPROCTITLE_PS_PADDING '\0' +_ACEOF + + ;; +esac + +echo "$as_me:$LINENO: checking for __progname" >&5 +echo $ECHO_N "checking for __progname... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +extern char *__progname; puts(__progname); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_have__progname=yes + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +echo "$as_me:$LINENO: result: ${ac_have__progname=no}" >&5 +echo "${ECHO_T}${ac_have__progname=no}" >&6 +if test "$ac_have__progname" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE__PROGNAME 1 +_ACEOF + +fi + + + + + echo "$as_me:$LINENO: checking whether debugging is enabled" >&5 +echo $ECHO_N "checking whether debugging is enabled... $ECHO_C" >&6 + # Check whether --enable-debug or --disable-debug was given. +if test "${enable_debug+set}" = set; then + enableval="$enable_debug" + case "$enableval" in + yes) x_ac_debug=yes ;; + no) x_ac_debug=no ;; + *) echo "$as_me:$LINENO: result: doh!" >&5 +echo "${ECHO_T}doh!" >&6 + { { echo "$as_me:$LINENO: error: bad value \"$enableval\" for --enable-debug" >&5 +echo "$as_me: error: bad value \"$enableval\" for --enable-debug" >&2;} + { (exit 1); exit 1; }; } ;; + esac + + +fi; + if test "$x_ac_debug" = yes; then + test "$GCC" = yes && CFLAGS="$CFLAGS -Wall -fno-strict-aliasing" + else + +cat >>confdefs.h <<\_ACEOF +#define NDEBUG 1 +_ACEOF + + fi + echo "$as_me:$LINENO: result: ${x_ac_debug=no}" >&5 +echo "${ECHO_T}${x_ac_debug=no}" >&6 + + echo "$as_me:$LINENO: checking whether memory leak debugging is enabled" >&5 +echo $ECHO_N "checking whether memory leak debugging is enabled... $ECHO_C" >&6 + # Check whether --enable-memory-leak-debug or --disable-memory-leak-debug was given. +if test "${enable_memory_leak_debug+set}" = set; then + enableval="$enable_memory_leak_debug" + case "$enableval" in + yes) x_ac_memory_debug=yes ;; + no) x_ac_memory_debug=no ;; + *) echo "$as_me:$LINENO: result: doh!" >&5 +echo "${ECHO_T}doh!" >&6 + { { echo "$as_me:$LINENO: error: bad value \"$enableval\" for --enable-memory-leak-debug" >&5 +echo "$as_me: error: bad value \"$enableval\" for --enable-memory-leak-debug" >&2;} + { (exit 1); exit 1; }; } ;; + esac + + +fi; + if test "$x_ac_memory_debug" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define MEMORY_LEAK_DEBUG 1 +_ACEOF + + fi + echo "$as_me:$LINENO: result: ${x_ac_memory_debug=no}" >&5 +echo "${ECHO_T}${x_ac_memory_debug=no}" >&6 + + + + + +if test "x$ac_debug" = "xtrue"; then + DEBUG_MODULES_TRUE= + DEBUG_MODULES_FALSE='#' +else + DEBUG_MODULES_TRUE='#' + DEBUG_MODULES_FALSE= +fi + + + + + echo "$as_me:$LINENO: checking for slurmctld default port" >&5 +echo $ECHO_N "checking for slurmctld default port... $ECHO_C" >&6 + + +# Check whether --with-slurmctld-port or --without-slurmctld-port was given. +if test "${with_slurmctld_port+set}" = set; then + withval="$with_slurmctld_port" + if test `expr match "$withval" '[0-9]*$'` -gt 0; then + slurmctldport="$withval" + fi + + +fi; + echo "$as_me:$LINENO: result: ${slurmctldport=6817}" >&5 +echo "${ECHO_T}${slurmctldport=6817}" >&6 + + +cat >>confdefs.h <<_ACEOF +#define SLURMCTLD_PORT $slurmctldport +_ACEOF + + + + echo "$as_me:$LINENO: checking for slurmd default port" >&5 +echo $ECHO_N "checking for slurmd default port... $ECHO_C" >&6 + +# Check whether --with-slurmd-port or --without-slurmd-port was given. +if test "${with_slurmd_port+set}" = set; then + withval="$with_slurmd_port" + if test `expr match "$withval" '[0-9]*$'` -gt 0; then + slurmdport="$withval" + fi + + +fi; + echo "$as_me:$LINENO: result: ${slurmdport=6818}" >&5 +echo "${ECHO_T}${slurmdport=6818}" >&6 + + +cat >>confdefs.h <<_ACEOF +#define SLURMD_PORT $slurmdport +_ACEOF + + + + + + + + + echo "$as_me:$LINENO: checking for rms_prgcreate in -lrmscall" >&5 +echo $ECHO_N "checking for rms_prgcreate in -lrmscall... $ECHO_C" >&6 +if test "${ac_cv_lib_rmscall_rms_prgcreate+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrmscall $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char rms_prgcreate (); +int +main () +{ +rms_prgcreate (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_rmscall_rms_prgcreate=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_rmscall_rms_prgcreate=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_rmscall_rms_prgcreate" >&5 +echo "${ECHO_T}$ac_cv_lib_rmscall_rms_prgcreate" >&6 +if test $ac_cv_lib_rmscall_rms_prgcreate = yes; then + ac_elan_have_rmscall=yes; ELAN_LIBS="-lrmscall" +fi + + + if test "$ac_elan_have_rmscall" != "yes" ; then + { echo "$as_me:$LINENO: Cannot support QsNet without librmscall" >&5 +echo "$as_me: Cannot support QsNet without librmscall" >&6;} + fi + + echo "$as_me:$LINENO: checking for elan3_create in -lelan3" >&5 +echo $ECHO_N "checking for elan3_create in -lelan3... $ECHO_C" >&6 +if test "${ac_cv_lib_elan3_elan3_create+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lelan3 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char elan3_create (); +int +main () +{ +elan3_create (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_elan3_elan3_create=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_elan3_elan3_create=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_elan3_elan3_create" >&5 +echo "${ECHO_T}$ac_cv_lib_elan3_elan3_create" >&6 +if test $ac_cv_lib_elan3_elan3_create = yes; then + ac_elan_have_elan3=yes +else + ac_elan_noelan3=1 +fi + + + echo "$as_me:$LINENO: checking for elanctrl_open in -lelanctrl" >&5 +echo $ECHO_N "checking for elanctrl_open in -lelanctrl... $ECHO_C" >&6 +if test "${ac_cv_lib_elanctrl_elanctrl_open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lelanctrl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char elanctrl_open (); +int +main () +{ +elanctrl_open (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_elanctrl_elanctrl_open=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_elanctrl_elanctrl_open=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_elanctrl_elanctrl_open" >&5 +echo "${ECHO_T}$ac_cv_lib_elanctrl_elanctrl_open" >&6 +if test $ac_cv_lib_elanctrl_elanctrl_open = yes; then + ac_elan_have_elanctrl=yes +else + ac_elan_noelanctrl=1 +fi + + + if test "$ac_elan_have_elan3" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBELAN3 1 +_ACEOF + + ELAN_LIBS="$ELAN_LIBS -lelan3" + test "$ac_elan_have_rmscall" = "yes" && ac_have_elan="yes" + elif test "$ac_elan_have_elanctrl" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBELANCTRL 1 +_ACEOF + + ELAN_LIBS="$ELAN_LIBS -lelanctrl" + test "$ac_elan_have_rmscall" = "yes" && ac_have_elan="yes" + else + { echo "$as_me:$LINENO: Cannot support QsNet without libelan3 or libelanctrl!" >&5 +echo "$as_me: Cannot support QsNet without libelan3 or libelanctrl!" >&6;} + fi + + if test "$ac_have_elan" = yes; then + echo "$as_me:$LINENO: checking for elanhost_config_create in -lelanhosts" >&5 +echo $ECHO_N "checking for elanhost_config_create in -lelanhosts... $ECHO_C" >&6 +if test "${ac_cv_lib_elanhosts_elanhost_config_create+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lelanhosts $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char elanhost_config_create (); +int +main () +{ +elanhost_config_create (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_elanhosts_elanhost_config_create=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_elanhosts_elanhost_config_create=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_elanhosts_elanhost_config_create" >&5 +echo "${ECHO_T}$ac_cv_lib_elanhosts_elanhost_config_create" >&6 +if test $ac_cv_lib_elanhosts_elanhost_config_create = yes; then + ac_elan_have_elanhosts=yes +fi + + + if test "$ac_elan_have_elanhosts" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBELANHOSTS 1 +_ACEOF + + ELAN_LIBS="$ELAN_LIBS -lelanhosts" + else + ac_have_elan="no" + { echo "$as_me:$LINENO: Cannot build QsNet modules without libelanhosts" >&5 +echo "$as_me: Cannot build QsNet modules without libelanhosts" >&6;} + fi + fi + + + + + +if test "x$ac_have_elan" = "xyes"; then + HAVE_ELAN_TRUE= + HAVE_ELAN_FALSE='#' +else + HAVE_ELAN_TRUE='#' + HAVE_ELAN_FALSE= +fi + + + + + echo "$as_me:$LINENO: checking whether to enable AIX Federation switch support" >&5 +echo $ECHO_N "checking whether to enable AIX Federation switch support... $ECHO_C" >&6 + ntbl_default_dirs="/usr/lib" + for ntbl_dir in $ntbl_default_dirs; do + # skip dirs that don't exist + if test ! -z "$ntbl_dir" -a ! -d "$ntbl_dir" ; then + continue; + fi + + if test "$OBJECT_MODE" = "64"; then + libntbl="ntbl_64" + else + libntbl="ntbl" + fi + + # search for required NTBL API libraries + if test -f "$ntbl_dir/lib${libntbl}.so"; then + ac_have_federation="yes" + FEDERATION_LDFLAGS="-l$libntbl" + break; + fi + + done + + if test "x$ac_have_federation" != "xyes" ; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: Cannot support Federation without libntbl" >&5 +echo "$as_me: Cannot support Federation without libntbl" >&6;} + else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBNTBL 1 +_ACEOF + + fi + + + + + +if test "x$ac_have_federation" = "xyes"; then + HAVE_FEDERATION_TRUE= + HAVE_FEDERATION_FALSE='#' +else + HAVE_FEDERATION_TRUE='#' + HAVE_FEDERATION_FALSE= +fi + + + + + echo "$as_me:$LINENO: checking for job_attachpid in -ljob" >&5 +echo $ECHO_N "checking for job_attachpid in -ljob... $ECHO_C" >&6 +if test "${ac_cv_lib_job_job_attachpid+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljob $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char job_attachpid (); +int +main () +{ +job_attachpid (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_job_job_attachpid=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_job_job_attachpid=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_job_job_attachpid" >&5 +echo "${ECHO_T}$ac_cv_lib_job_job_attachpid" >&6 +if test $ac_cv_lib_job_job_attachpid = yes; then + ac_have_sgi_job="yes" +fi + + echo "$as_me:$LINENO: checking for SGI job container support" >&5 +echo $ECHO_N "checking for SGI job container support... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: ${ac_have_sgi_job=no}" >&5 +echo "${ECHO_T}${ac_have_sgi_job=no}" >&6 + + +if test "x$ac_have_sgi_job" = "xyes"; then + HAVE_SGI_JOB_TRUE= + HAVE_SGI_JOB_FALSE='#' +else + HAVE_SGI_JOB_TRUE='#' + HAVE_SGI_JOB_FALSE= +fi + + + + + echo "$as_me:$LINENO: checking for whether to include readline suport" >&5 +echo $ECHO_N "checking for whether to include readline suport... $ECHO_C" >&6 + +# Check whether --with-readline or --without-readline was given. +if test "${with_readline+set}" = set; then + withval="$with_readline" + case "$withval" in + yes) ac_with_readline=yes ;; + no) ac_with_readline=no ;; + *) echo "$as_me:$LINENO: result: doh!" >&5 +echo "${ECHO_T}doh!" >&6 + { { echo "$as_me:$LINENO: error: bad value \"$withval\" for --without-readline" >&5 +echo "$as_me: error: bad value \"$withval\" for --without-readline" >&2;} + { (exit 1); exit 1; }; } ;; + esac + + +fi; + + echo "$as_me:$LINENO: result: ${ac_with_readline=yes}" >&5 +echo "${ECHO_T}${ac_with_readline=yes}" >&6 + if test "$ac_with_readline" = "yes"; then + saved_LIBS="$LIBS" + READLINE_LIBS="-lreadline -lhistory $NCURSES" + LIBS="$saved_LIBS $READLINE_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + #include + #include + #include +int +main () +{ + + char *line = readline("in:"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_READLINE 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +READLINE_LIBS="" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$savedLIBS" + fi + + + + + + ac_slurm_with_ssl=no + ssl_default_dirs="/usr/local/openssl64 /usr/local/openssl /usr/lib/openssl \ + /usr/local/ssl /usr/lib/ssl /usr/local \ + /usr/pkg /opt /opt/openssl" + + + + + + SSL_LIBS="-lcrypto" + + +# Check whether --with-ssl or --without-ssl was given. +if test "${with_ssl+set}" = set; then + withval="$with_ssl" + + tryssldir=$withval + + # Hack around a libtool bug on AIX. + # libcrypto is in a non-standard library path on AIX (/opt/freeware + # which is specified with --with-ssl), and libtool is not setting + # the correct runtime library path in the binaries. + if test "x$ac_have_aix" = "xyes"; then + SSL_LIBS="-lcrypto-static" + fi + +fi; + + saved_LIBS="$LIBS" + saved_LDFLAGS="$LDFLAGS" + saved_CPPFLAGS="$CPPFLAGS" + if test "x$prefix" != "xNONE" ; then + tryssldir="$tryssldir $prefix" + fi + if test "x$tryssldir" == "xno" ; then + { { echo "$as_me:$LINENO: error: OpenSSL libary is required for SLURM operation, please install" >&5 +echo "$as_me: error: OpenSSL libary is required for SLURM operation, please install" >&2;} + { (exit 1); exit 1; }; } + fi + + echo "$as_me:$LINENO: checking for OpenSSL directory" >&5 +echo $ECHO_N "checking for OpenSSL directory... $ECHO_C" >&6 +if test "${ac_cv_openssldir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + for ssldir in $tryssldir "" $ssl_default_dirs; do + CPPFLAGS="$saved_CPPFLAGS" + LDFLAGS="$saved_LDFLAGS" + LIBS="$saved_LIBS $SSL_LIBS" + + # Skip directories if they don't exist + if test ! -z "$ssldir" -a ! -d "$ssldir" ; then + continue; + fi + if test ! -z "$ssldir" -a "x$ssldir" != "x/usr"; then + # Try to use $ssldir/lib if it exists, otherwise + # $ssldir + if test -d "$ssldir/lib" ; then + LDFLAGS="-L$ssldir/lib $saved_LDFLAGS" + if test ! -z "$need_dash_r" ; then + LDFLAGS="-R$ssldir/lib $LDFLAGS" + fi + else + LDFLAGS="-L$ssldir $saved_LDFLAGS" + if test ! -z "$need_dash_r" ; then + LDFLAGS="-R$ssldir $LDFLAGS" + fi + fi + # Try to use $ssldir/include if it exists, otherwise + # $ssldir + if test -d "$ssldir/include" ; then + CPPFLAGS="-I$ssldir/include $saved_CPPFLAGS" + else + CPPFLAGS="-I$ssldir $saved_CPPFLAGS" + fi + fi + + # Basic test to check for compatible version and correct linking + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + #include + #include + #define SIZE 8 + int main(void) + { + int a[SIZE], i; + for (i=0; i&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + found_crypto=1 + break; + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + if test ! -z "$found_crypto" ; then + break; + fi + done + + if test -z "$found_crypto" ; then + { { echo "$as_me:$LINENO: error: Could not find working OpenSSL library, please install or check config.log" >&5 +echo "$as_me: error: Could not find working OpenSSL library, please install or check config.log" >&2;} + { (exit 1); exit 1; }; } + fi + if test -z "$ssldir" ; then + ssldir="(system)" + fi + + ac_cv_openssldir=$ssldir + +fi +echo "$as_me:$LINENO: result: $ac_cv_openssldir" >&5 +echo "${ECHO_T}$ac_cv_openssldir" >&6 + + if (test ! -z "$ac_cv_openssldir" && test "x$ac_cv_openssldir" != "x(system)") ; then + ssldir=$ac_cv_openssldir + if test ! -z "$ssldir" -a "x$ssldir" != "x/usr"; then + # Try to use $ssldir/lib if it exists, otherwise + # $ssldir + if test -d "$ssldir/lib" ; then + SSL_LDFLAGS="-L$ssldir/lib" + else + SSL_LDFLAGS="-L$ssldir" + fi + # Try to use $ssldir/include if it exists, otherwise + # $ssldir + if test -d "$ssldir/include" ; then + SSL_CPPFLAGS="-I$ssldir/include" + else + SSL_CPPFLAGS="-I$ssldir" + fi + fi + fi + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +EVP_MD_CTX_cleanup(NULL); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_EVP_MD_CTX_CLEANUP 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$saved_LIBS" + CPPFLAGS="$saved_CPPFLAGS" + LDFLAGS="$saved_LDFLAGS" + + + + + + + _x_ac_munge_dirs="/usr /usr/local /opt/freeware /opt/munge" + _x_ac_munge_libs="lib64 lib" + + +# Check whether --with-munge or --without-munge was given. +if test "${with_munge+set}" = set; then + withval="$with_munge" + _x_ac_munge_dirs="$withval $_x_ac_munge_dirs" +fi; + + echo "$as_me:$LINENO: checking for munge installation" >&5 +echo $ECHO_N "checking for munge installation... $ECHO_C" >&6 +if test "${x_ac_cv_munge_dir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + for d in $_x_ac_munge_dirs; do + test -d "$d" || continue + test -d "$d/include" || continue + test -f "$d/include/munge.h" || continue + for bit in $_x_ac_munge_libs; do + test -d "$d/$bit" || continue + + _x_ac_munge_libs_save="$LIBS" + LIBS="-L$d/$bit -lmunge $LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char munge_encode (); +int +main () +{ +munge_encode (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + x_ac_cv_munge_dir=$d +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$_x_ac_munge_libs_save" + test -n "$x_ac_cv_munge_dir" && break + done + test -n "$x_ac_cv_munge_dir" && break + done + +fi +echo "$as_me:$LINENO: result: $x_ac_cv_munge_dir" >&5 +echo "${ECHO_T}$x_ac_cv_munge_dir" >&6 + + if test -z "$x_ac_cv_munge_dir"; then + { echo "$as_me:$LINENO: WARNING: unable to locate munge installation" >&5 +echo "$as_me: WARNING: unable to locate munge installation" >&2;} + else + MUNGE_LIBS="-lmunge" + MUNGE_CPPFLAGS="-I$x_ac_cv_munge_dir/include" + MUNGE_LDFLAGS="-L$x_ac_cv_munge_dir/$bit" + fi + + + + + + + +if test -n "$x_ac_cv_munge_dir"; then + WITH_MUNGE_TRUE= + WITH_MUNGE_FALSE='#' +else + WITH_MUNGE_TRUE='#' + WITH_MUNGE_FALSE= +fi + + + +echo "$as_me:$LINENO: checking whether to enable multiple-slurmd support" >&5 +echo $ECHO_N "checking whether to enable multiple-slurmd support... $ECHO_C" >&6 +# Check whether --enable-multiple-slurmd or --disable-multiple-slurmd was given. +if test "${enable_multiple_slurmd+set}" = set; then + enableval="$enable_multiple_slurmd" + case "$enableval" in + yes) multiple_slurmd=yes ;; + no) multiple_slurmd=no ;; + *) { { echo "$as_me:$LINENO: error: bad value \"$enableval\" for --enable-multiple-slurmd" >&5 +echo "$as_me: error: bad value \"$enableval\" for --enable-multiple-slurmd" >&2;} + { (exit 1); exit 1; }; };; + esac + +fi; +if test "x$multiple_slurmd" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define MULTIPLE_SLURMD 1 +_ACEOF + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + +AUTHD_LIBS="-lauth -le" +savedLIBS="$LIBS" +savedCFLAGS="$CFLAGS" +LIBS="$SSL_LIBS $AUTHD_LIBS $LIBS" +CFLAGS="$SSL_CPPFLAGS $CFLAGS" +echo "$as_me:$LINENO: checking for auth_init_credentials in -lauth" >&5 +echo $ECHO_N "checking for auth_init_credentials in -lauth... $ECHO_C" >&6 +if test "${ac_cv_lib_auth_auth_init_credentials+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lauth $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char auth_init_credentials (); +int +main () +{ +auth_init_credentials (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_auth_auth_init_credentials=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_auth_auth_init_credentials=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_auth_auth_init_credentials" >&5 +echo "${ECHO_T}$ac_cv_lib_auth_auth_init_credentials" >&6 +if test $ac_cv_lib_auth_auth_init_credentials = yes; then + have_authd=yes +else + have_authd=no +fi + + + + + +if test "x$have_authd" = "xyes"; then + WITH_AUTHD_TRUE= + WITH_AUTHD_FALSE='#' +else + WITH_AUTHD_TRUE='#' + WITH_AUTHD_FALSE= +fi + +LIBS="$savedLIBS" +CFLAGS="$savedCFLAGS" + + +cat >>confdefs.h <<\_ACEOF +#define WITH_LSD_FATAL_ERROR_FUNC 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define WITH_LSD_NOMEM_ERROR_FUNC 1 +_ACEOF + + + + ac_config_files="$ac_config_files Makefile config.xml auxdir/Makefile src/Makefile src/api/Makefile src/common/Makefile src/sacct/Makefile src/salloc/Makefile src/sbatch/Makefile src/sattach/Makefile src/srun/Makefile src/slaunch/Makefile src/slurmd/Makefile src/slurmd/slurmd/Makefile src/slurmd/slurmstepd/Makefile src/slurmctld/Makefile src/sbcast/Makefile src/scontrol/Makefile src/scancel/Makefile src/squeue/Makefile src/sinfo/Makefile src/smap/Makefile src/sview/Makefile src/plugins/Makefile src/plugins/auth/Makefile src/plugins/auth/authd/Makefile src/plugins/auth/munge/Makefile src/plugins/auth/none/Makefile src/plugins/checkpoint/Makefile src/plugins/checkpoint/aix/Makefile src/plugins/checkpoint/none/Makefile src/plugins/jobacct/Makefile src/plugins/jobacct/linux/Makefile src/plugins/jobacct/aix/Makefile src/plugins/jobacct/none/Makefile src/plugins/jobcomp/Makefile src/plugins/jobcomp/filetxt/Makefile src/plugins/jobcomp/none/Makefile src/plugins/jobcomp/script/Makefile src/plugins/proctrack/Makefile src/plugins/proctrack/aix/Makefile src/plugins/proctrack/pgid/Makefile src/plugins/proctrack/linuxproc/Makefile src/plugins/proctrack/rms/Makefile src/plugins/proctrack/sgi_job/Makefile src/plugins/sched/Makefile src/plugins/sched/backfill/Makefile src/plugins/sched/builtin/Makefile src/plugins/sched/gang/Makefile src/plugins/sched/hold/Makefile src/plugins/sched/wiki2/Makefile src/plugins/select/Makefile src/plugins/select/bluegene/Makefile src/plugins/select/bluegene/block_allocator/Makefile src/plugins/select/bluegene/plugin/Makefile src/plugins/select/linear/Makefile src/plugins/select/cons_res/Makefile src/plugins/switch/Makefile src/plugins/switch/elan/Makefile src/plugins/switch/none/Makefile src/plugins/switch/federation/Makefile src/plugins/mpi/Makefile src/plugins/mpi/mpichgm/Makefile src/plugins/mpi/mvapich/Makefile src/plugins/mpi/lam/Makefile src/plugins/mpi/none/Makefile src/plugins/task/Makefile src/plugins/task/affinity/Makefile src/plugins/task/none/Makefile doc/Makefile doc/man/Makefile doc/html/Makefile doc/html/configurator.html testsuite/Makefile testsuite/expect/Makefile testsuite/slurm_unit/Makefile testsuite/slurm_unit/common/Makefile testsuite/slurm_unit/slurmctld/Makefile testsuite/slurm_unit/slurmd/Makefile testsuite/slurm_unit/api/Makefile testsuite/slurm_unit/api/manual/Makefile" + + +cat >confcache <<\_ACEOF +# 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, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# 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 \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_AIX_TRUE}" && test -z "${HAVE_AIX_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_AIX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_AIX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_AIX_PROCTRACK_TRUE}" && test -z "${HAVE_AIX_PROCTRACK_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_AIX_PROCTRACK\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_AIX_PROCTRACK\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${WITH_GNU_LD_TRUE}" && test -z "${WITH_GNU_LD_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"WITH_GNU_LD\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"WITH_GNU_LD\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_SCHED_SETAFFINITY_TRUE}" && test -z "${HAVE_SCHED_SETAFFINITY_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_SCHED_SETAFFINITY\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_SCHED_SETAFFINITY\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_NUMA_TRUE}" && test -z "${HAVE_NUMA_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_NUMA\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_NUMA\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_PAM_TRUE}" && test -z "${HAVE_PAM_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_PAM\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_PAM\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_UNSETENV_TRUE}" && test -z "${HAVE_UNSETENV_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_UNSETENV\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_UNSETENV\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_SOME_CURSES_TRUE}" && test -z "${HAVE_SOME_CURSES_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_SOME_CURSES\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_SOME_CURSES\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_GTK_TRUE}" && test -z "${HAVE_GTK_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_GTK\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_GTK\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${DEBUG_MODULES_TRUE}" && test -z "${DEBUG_MODULES_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"DEBUG_MODULES\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"DEBUG_MODULES\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_ELAN_TRUE}" && test -z "${HAVE_ELAN_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_ELAN\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_ELAN\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_FEDERATION_TRUE}" && test -z "${HAVE_FEDERATION_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_FEDERATION\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_FEDERATION\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_SGI_JOB_TRUE}" && test -z "${HAVE_SGI_JOB_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_SGI_JOB\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_SGI_JOB\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${WITH_MUNGE_TRUE}" && test -z "${WITH_MUNGE_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"WITH_MUNGE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"WITH_MUNGE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${WITH_AUTHD_TRUE}" && test -z "${WITH_AUTHD_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"WITH_AUTHD\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"WITH_AUTHD\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "config.xml" ) CONFIG_FILES="$CONFIG_FILES config.xml" ;; + "auxdir/Makefile" ) CONFIG_FILES="$CONFIG_FILES auxdir/Makefile" ;; + "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "src/api/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/api/Makefile" ;; + "src/common/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/common/Makefile" ;; + "src/sacct/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/sacct/Makefile" ;; + "src/salloc/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/salloc/Makefile" ;; + "src/sbatch/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/sbatch/Makefile" ;; + "src/sattach/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/sattach/Makefile" ;; + "src/srun/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/srun/Makefile" ;; + "src/slaunch/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/slaunch/Makefile" ;; + "src/slurmd/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/slurmd/Makefile" ;; + "src/slurmd/slurmd/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/slurmd/slurmd/Makefile" ;; + "src/slurmd/slurmstepd/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/slurmd/slurmstepd/Makefile" ;; + "src/slurmctld/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/slurmctld/Makefile" ;; + "src/sbcast/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/sbcast/Makefile" ;; + "src/scontrol/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/scontrol/Makefile" ;; + "src/scancel/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/scancel/Makefile" ;; + "src/squeue/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/squeue/Makefile" ;; + "src/sinfo/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/sinfo/Makefile" ;; + "src/smap/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/smap/Makefile" ;; + "src/sview/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/sview/Makefile" ;; + "src/plugins/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/Makefile" ;; + "src/plugins/auth/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/auth/Makefile" ;; + "src/plugins/auth/authd/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/auth/authd/Makefile" ;; + "src/plugins/auth/munge/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/auth/munge/Makefile" ;; + "src/plugins/auth/none/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/auth/none/Makefile" ;; + "src/plugins/checkpoint/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/checkpoint/Makefile" ;; + "src/plugins/checkpoint/aix/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/checkpoint/aix/Makefile" ;; + "src/plugins/checkpoint/none/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/checkpoint/none/Makefile" ;; + "src/plugins/jobacct/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/jobacct/Makefile" ;; + "src/plugins/jobacct/linux/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/jobacct/linux/Makefile" ;; + "src/plugins/jobacct/aix/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/jobacct/aix/Makefile" ;; + "src/plugins/jobacct/none/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/jobacct/none/Makefile" ;; + "src/plugins/jobcomp/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/jobcomp/Makefile" ;; + "src/plugins/jobcomp/filetxt/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/jobcomp/filetxt/Makefile" ;; + "src/plugins/jobcomp/none/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/jobcomp/none/Makefile" ;; + "src/plugins/jobcomp/script/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/jobcomp/script/Makefile" ;; + "src/plugins/proctrack/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/proctrack/Makefile" ;; + "src/plugins/proctrack/aix/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/proctrack/aix/Makefile" ;; + "src/plugins/proctrack/pgid/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/proctrack/pgid/Makefile" ;; + "src/plugins/proctrack/linuxproc/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/proctrack/linuxproc/Makefile" ;; + "src/plugins/proctrack/rms/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/proctrack/rms/Makefile" ;; + "src/plugins/proctrack/sgi_job/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/proctrack/sgi_job/Makefile" ;; + "src/plugins/sched/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/sched/Makefile" ;; + "src/plugins/sched/backfill/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/sched/backfill/Makefile" ;; + "src/plugins/sched/builtin/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/sched/builtin/Makefile" ;; + "src/plugins/sched/gang/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/sched/gang/Makefile" ;; + "src/plugins/sched/hold/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/sched/hold/Makefile" ;; + "src/plugins/sched/wiki2/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/sched/wiki2/Makefile" ;; + "src/plugins/select/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/select/Makefile" ;; + "src/plugins/select/bluegene/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/select/bluegene/Makefile" ;; + "src/plugins/select/bluegene/block_allocator/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/select/bluegene/block_allocator/Makefile" ;; + "src/plugins/select/bluegene/plugin/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/select/bluegene/plugin/Makefile" ;; + "src/plugins/select/linear/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/select/linear/Makefile" ;; + "src/plugins/select/cons_res/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/select/cons_res/Makefile" ;; + "src/plugins/switch/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/switch/Makefile" ;; + "src/plugins/switch/elan/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/switch/elan/Makefile" ;; + "src/plugins/switch/none/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/switch/none/Makefile" ;; + "src/plugins/switch/federation/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/switch/federation/Makefile" ;; + "src/plugins/mpi/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/mpi/Makefile" ;; + "src/plugins/mpi/mpichgm/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/mpi/mpichgm/Makefile" ;; + "src/plugins/mpi/mvapich/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/mpi/mvapich/Makefile" ;; + "src/plugins/mpi/lam/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/mpi/lam/Makefile" ;; + "src/plugins/mpi/none/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/mpi/none/Makefile" ;; + "src/plugins/task/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/task/Makefile" ;; + "src/plugins/task/affinity/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/task/affinity/Makefile" ;; + "src/plugins/task/none/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/plugins/task/none/Makefile" ;; + "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "doc/man/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/man/Makefile" ;; + "doc/html/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/html/Makefile" ;; + "doc/html/configurator.html" ) CONFIG_FILES="$CONFIG_FILES doc/html/configurator.html" ;; + "testsuite/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; + "testsuite/expect/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/expect/Makefile" ;; + "testsuite/slurm_unit/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/slurm_unit/Makefile" ;; + "testsuite/slurm_unit/common/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/slurm_unit/common/Makefile" ;; + "testsuite/slurm_unit/slurmctld/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/slurm_unit/slurmctld/Makefile" ;; + "testsuite/slurm_unit/slurmd/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/slurm_unit/slurmd/Makefile" ;; + "testsuite/slurm_unit/api/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/slurm_unit/api/Makefile" ;; + "testsuite/slurm_unit/api/manual/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/slurm_unit/api/manual/Makefile" ;; + "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "slurm/slurm.h" ) CONFIG_HEADERS="$CONFIG_HEADERS slurm/slurm.h" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@target@,$target,;t t +s,@target_cpu@,$target_cpu,;t t +s,@target_vendor@,$target_vendor,;t t +s,@target_os@,$target_os,;t t +s,@PROJECT@,$PROJECT,;t t +s,@SLURM_API_VERSION@,$SLURM_API_VERSION,;t t +s,@SLURM_API_CURRENT@,$SLURM_API_CURRENT,;t t +s,@SLURM_API_MAJOR@,$SLURM_API_MAJOR,;t t +s,@SLURM_API_AGE@,$SLURM_API_AGE,;t t +s,@SLURM_API_REVISION@,$SLURM_API_REVISION,;t t +s,@VERSION@,$VERSION,;t t +s,@SLURM_MAJOR@,$SLURM_MAJOR,;t t +s,@SLURM_MINOR@,$SLURM_MINOR,;t t +s,@SLURM_MICRO@,$SLURM_MICRO,;t t +s,@RELEASE@,$RELEASE,;t t +s,@SLURM_VERSION@,$SLURM_VERSION,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CYGPATH_W@,$CYGPATH_W,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@install_sh@,$install_sh,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t +s,@mkdir_p@,$mkdir_p,;t t +s,@AWK@,$AWK,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@am__leading_dot@,$am__leading_dot,;t t +s,@AMTAR@,$AMTAR,;t t +s,@am__tar@,$am__tar,;t t +s,@am__untar@,$am__untar,;t t +s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t +s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t +s,@MAINT@,$MAINT,;t t +s,@CMD_LDFLAGS@,$CMD_LDFLAGS,;t t +s,@LIB_LDFLAGS@,$LIB_LDFLAGS,;t t +s,@SO_LDFLAGS@,$SO_LDFLAGS,;t t +s,@HAVE_AIX_TRUE@,$HAVE_AIX_TRUE,;t t +s,@HAVE_AIX_FALSE@,$HAVE_AIX_FALSE,;t t +s,@HAVE_AIX@,$HAVE_AIX,;t t +s,@PROCTRACKDIR@,$PROCTRACKDIR,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@DEPDIR@,$DEPDIR,;t t +s,@am__include@,$am__include,;t t +s,@am__quote@,$am__quote,;t t +s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t +s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t +s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t +s,@CCDEPMODE@,$CCDEPMODE,;t t +s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t +s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@HAVE_AIX_PROCTRACK_TRUE@,$HAVE_AIX_PROCTRACK_TRUE,;t t +s,@HAVE_AIX_PROCTRACK_FALSE@,$HAVE_AIX_PROCTRACK_FALSE,;t t +s,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@CXXDEPMODE@,$CXXDEPMODE,;t t +s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t +s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t +s,@LN_S@,$LN_S,;t t +s,@ECHO@,$ECHO,;t t +s,@AR@,$AR,;t t +s,@ac_ct_AR@,$ac_ct_AR,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@CXXCPP@,$CXXCPP,;t t +s,@F77@,$F77,;t t +s,@FFLAGS@,$FFLAGS,;t t +s,@ac_ct_F77@,$ac_ct_F77,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@WITH_GNU_LD_TRUE@,$WITH_GNU_LD_TRUE,;t t +s,@WITH_GNU_LD_FALSE@,$WITH_GNU_LD_FALSE,;t t +s,@HAVE_SCHED_SETAFFINITY_TRUE@,$HAVE_SCHED_SETAFFINITY_TRUE,;t t +s,@HAVE_SCHED_SETAFFINITY_FALSE@,$HAVE_SCHED_SETAFFINITY_FALSE,;t t +s,@NUMA_LIBS@,$NUMA_LIBS,;t t +s,@HAVE_NUMA_TRUE@,$HAVE_NUMA_TRUE,;t t +s,@HAVE_NUMA_FALSE@,$HAVE_NUMA_FALSE,;t t +s,@PAM_LIBS@,$PAM_LIBS,;t t +s,@HAVE_PAM_TRUE@,$HAVE_PAM_TRUE,;t t +s,@HAVE_PAM_FALSE@,$HAVE_PAM_FALSE,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@HAVE_UNSETENV_TRUE@,$HAVE_UNSETENV_TRUE,;t t +s,@HAVE_UNSETENV_FALSE@,$HAVE_UNSETENV_FALSE,;t t +s,@PTHREAD_CC@,$PTHREAD_CC,;t t +s,@PTHREAD_LIBS@,$PTHREAD_LIBS,;t t +s,@PTHREAD_CFLAGS@,$PTHREAD_CFLAGS,;t t +s,@BG_INCLUDES@,$BG_INCLUDES,;t t +s,@SEMAPHORE_SOURCES@,$SEMAPHORE_SOURCES,;t t +s,@SEMAPHORE_LIBS@,$SEMAPHORE_LIBS,;t t +s,@NCURSES@,$NCURSES,;t t +s,@HAVE_SOME_CURSES_TRUE@,$HAVE_SOME_CURSES_TRUE,;t t +s,@HAVE_SOME_CURSES_FALSE@,$HAVE_SOME_CURSES_FALSE,;t t +s,@HAVE_SOME_CURSES@,$HAVE_SOME_CURSES,;t t +s,@HAVEPKGCONFIG@,$HAVEPKGCONFIG,;t t +s,@GTK2_CFLAGS@,$GTK2_CFLAGS,;t t +s,@GTK2_LIBS@,$GTK2_LIBS,;t t +s,@HAVE_GTK_TRUE@,$HAVE_GTK_TRUE,;t t +s,@HAVE_GTK_FALSE@,$HAVE_GTK_FALSE,;t t +s,@DEBUG_MODULES_TRUE@,$DEBUG_MODULES_TRUE,;t t +s,@DEBUG_MODULES_FALSE@,$DEBUG_MODULES_FALSE,;t t +s,@SLURMCTLD_PORT@,$SLURMCTLD_PORT,;t t +s,@SLURMD_PORT@,$SLURMD_PORT,;t t +s,@ELAN_LIBS@,$ELAN_LIBS,;t t +s,@HAVE_ELAN_TRUE@,$HAVE_ELAN_TRUE,;t t +s,@HAVE_ELAN_FALSE@,$HAVE_ELAN_FALSE,;t t +s,@HAVE_ELAN@,$HAVE_ELAN,;t t +s,@FEDERATION_LDFLAGS@,$FEDERATION_LDFLAGS,;t t +s,@HAVE_FEDERATION_TRUE@,$HAVE_FEDERATION_TRUE,;t t +s,@HAVE_FEDERATION_FALSE@,$HAVE_FEDERATION_FALSE,;t t +s,@HAVE_FEDERATION@,$HAVE_FEDERATION,;t t +s,@HAVE_SGI_JOB_TRUE@,$HAVE_SGI_JOB_TRUE,;t t +s,@HAVE_SGI_JOB_FALSE@,$HAVE_SGI_JOB_FALSE,;t t +s,@READLINE_LIBS@,$READLINE_LIBS,;t t +s,@SSL_LDFLAGS@,$SSL_LDFLAGS,;t t +s,@SSL_LIBS@,$SSL_LIBS,;t t +s,@SSL_CPPFLAGS@,$SSL_CPPFLAGS,;t t +s,@MUNGE_LIBS@,$MUNGE_LIBS,;t t +s,@MUNGE_CPPFLAGS@,$MUNGE_CPPFLAGS,;t t +s,@MUNGE_LDFLAGS@,$MUNGE_LDFLAGS,;t t +s,@WITH_MUNGE_TRUE@,$WITH_MUNGE_TRUE,;t t +s,@WITH_MUNGE_FALSE@,$WITH_MUNGE_FALSE,;t t +s,@AUTHD_LIBS@,$AUTHD_LIBS,;t t +s,@AUTHD_CFLAGS@,$AUTHD_CFLAGS,;t t +s,@WITH_AUTHD_TRUE@,$WITH_AUTHD_TRUE,;t t +s,@WITH_AUTHD_FALSE@,$WITH_AUTHD_FALSE,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # 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_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # 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" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + # Do quote $f, to prevent DOS paths from being IFS'd. + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +# Compute $ac_file's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $ac_file | $ac_file:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || +$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X$ac_file : 'X\(//\)[^/]' \| \ + X$ac_file : 'X\(//\)$' \| \ + X$ac_file : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X$ac_file | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'`/stamp-h$_am_stamp_count +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || +$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`(dirname "$file") 2>/dev/null || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p $dirpart/$fdir + else + as_dir=$dirpart/$fdir + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 +echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + { (exit 1); exit 1; }; }; } + + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + esac +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + + diff --git a/executable_names/configure.ac b/executable_names/configure.ac new file mode 100644 index 0000000000000000000000000000000000000000..350e24b70cfe5907a9d078018151eaaeb5b500b1 --- /dev/null +++ b/executable_names/configure.ac @@ -0,0 +1,321 @@ +# $Id$ +# This file is to be processed with autoconf to generate a configure script + +dnl Prologue +dnl +AC_INIT +AC_PREREQ(2.59) +AC_CONFIG_SRCDIR([configure.ac]) +AC_CONFIG_AUX_DIR([auxdir]) +AC_CANONICAL_TARGET([]) + +X_AC_GPL_LICENSED + +# +# Determine project/version from META file. +# Sets PACKAGE, VERSION, SLURM_VERSION +X_AC_SLURM_VERSION + + +dnl Initialize Automake +dnl +AM_INIT_AUTOMAKE(slurm, $VERSION) +AM_MAINTAINER_MODE +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_HEADERS([slurm/slurm.h]) + +X_AC_AIX + +dnl +dnl Check to see if this architecture should use slurm_* prefix function +dnl aliases for plugins. +dnl +case "$host" in + *-*-aix*) AC_DEFINE(USE_ALIAS, 0, + [Define slurm_ prefix function aliases for plusins]) ;; + *darwin*) AC_DEFINE(USE_ALIAS, 0, + [Define slurm_ prefix function aliases for plusins]) ;; + *) AC_DEFINE(USE_ALIAS, 1, + [Define slurm_ prefix function aliases for plugins]) ;; +esac + +dnl Checks for programs. +dnl +AC_PROG_CC +AC_PROG_CXX +AC_PROG_MAKE_SET +AC_PROG_LIBTOOL + +AM_CONDITIONAL(WITH_GNU_LD, test "$with_gnu_ld" = "yes") + + +dnl Checks for libraries +dnl + +dnl Checks for header files. +dnl +AC_CHECK_HEADERS(mcheck.h values.h socket.h sys/socket.h \ + stdbool.h sys/ipc.h sys/shm.h sys/sem.h errno.h \ + stdlib.h dirent.h pthread.h sys/prctl.h \ + sysint.h inttypes.h termcap.h netdb.h sys/socket.h \ + sys/systemcfg.h ncurses.h curses.h sys/dr.h sys/vfs.h \ + pam/pam_appl.h security/pam_appl.h sys/sysctl.h \ + ) +AC_HEADER_SYS_WAIT +AC_HEADER_TIME +AC_HEADER_STDC + + +dnl Checks for structures. +dnl +X_AC__SYSTEM_CONFIGURATION + +dnl check to see if glibc's program_invocation_name is available: +dnl +X_AC_SLURM_PROGRAM_INVOCATION_NAME + +dnl Check if ptrace takes four or five arguments +dnl +X_AC_PTRACE + +dnl Check if setpgrp takes zero or two arguments +dnl +X_AC_SETPGRP + +dnl Check of sched_getaffinity exists and it's argument count +dnl +X_AC_AFFINITY + +dnl +dnl Check for PAM module support +X_AC_PAM + +dnl Checks for types. +dnl +X_AC_SLURM_BIGENDIAN + +dnl Checks for compiler characteristics. +dnl +AC_PROG_GCC_TRADITIONAL([]) + + +dnl checks for library functions. +dnl +AC_FUNC_MALLOC +AC_FUNC_STRERROR_R +AC_CHECK_FUNCS( \ + fdatasync \ + hstrerror \ + strerror \ + mtrace \ + strndup \ + strlcpy \ + strsignal \ + inet_aton \ + inet_ntop \ + inet_pton \ + setproctitle \ + sysctlbyname \ +) + +AC_CHECK_DECLS([hstrerror, strsignal, sys_siglist]) + +AC_CHECK_FUNCS(unsetenv, [have_unsetenv=yes]) +AM_CONDITIONAL(HAVE_UNSETENV, test "x$have_unsetenv" = "xyes") + +ACX_PTHREAD([], AC_MSG_ERROR([Error: Cannot figure out how to use pthreads!])) + +# Always define WITH_PTHREADS if we make it this far +AC_DEFINE(WITH_PTHREADS,1,[Define if you have pthreads.]) +LDFLAGS="$LDFLAGS " +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +LIBS="$PTHREAD_LIBS $LIBS" + +X_AC_BLUEGENE +X_AC_XCPU +X_AC_SLURM_SEMAPHORE + +X_AC_NCURSES +AM_CONDITIONAL(HAVE_SOME_CURSES, test "x$ac_have_some_curses" = "xyes") +AC_SUBST(HAVE_SOME_CURSES) + +X_AC_GTK +AM_CONDITIONAL(HAVE_GTK, test "x$ac_have_gtk" = "xyes") + +dnl checks for system services. +dnl + + +dnl checks for system-specific stuff. +dnl + +dnl check for how to emulate setproctitle +dnl +X_AC_SETPROCTITLE + +dnl check for debug compilation +dnl +X_AC_DEBUG +AM_CONDITIONAL(DEBUG_MODULES, test "x$ac_debug" = "xtrue") + + +dnl check for slurmd and slurmctld default ports +dnl +X_AC_SLURM_PORTS([6817], [6818]) + + +dnl check for whether to include Elan support +dnl +X_AC_ELAN +AM_CONDITIONAL(HAVE_ELAN, test "x$ac_have_elan" = "xyes") +AC_SUBST(HAVE_ELAN) + +dnl check for whether to include Federation support +dnl +X_AC_FEDERATION +AM_CONDITIONAL(HAVE_FEDERATION, test "x$ac_have_federation" = "xyes") +AC_SUBST(HAVE_FEDERATION) + +dnl check for SGI job container support +dnl +X_AC_SGI_JOB + +dnl Check for whether to include readline support +dnl +X_AC_READLINE + +dnl +dnl +X_AC_SLURM_WITH_SSL + + +dnl +dnl Check for compilation of SLURM auth modules: +dnl +X_AC_MUNGE + +dnl +dnl Check if multiple-slurmd support is requested and define MULTIPLE_SLURMD +dnl if it is. +dnl +AC_MSG_CHECKING(whether to enable multiple-slurmd support) +AC_ARG_ENABLE([multiple-slurmd], + AS_HELP_STRING(--enable-multiple-slurmd,enable multiple-slurmd support), + [ case "$enableval" in + yes) multiple_slurmd=yes ;; + no) multiple_slurmd=no ;; + *) AC_MSG_ERROR([bad value "$enableval" for --enable-multiple-slurmd]);; + esac ] +) +if test "x$multiple_slurmd" = "xyes"; then + AC_DEFINE([MULTIPLE_SLURMD], [1], [Enable multiple slurmd on one node]) + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + + +AUTHD_LIBS="-lauth -le" +savedLIBS="$LIBS" +savedCFLAGS="$CFLAGS" +LIBS="$SSL_LIBS $AUTHD_LIBS $LIBS" +CFLAGS="$SSL_CPPFLAGS $CFLAGS" +AC_CHECK_LIB(auth, auth_init_credentials, [have_authd=yes], [have_authd=no]) +AC_SUBST(AUTHD_LIBS) +AC_SUBST(AUTHD_CFLAGS) +AM_CONDITIONAL(WITH_AUTHD, test "x$have_authd" = "xyes") +LIBS="$savedLIBS" +CFLAGS="$savedCFLAGS" + +dnl Add LSD-Tools defines: +AC_DEFINE(WITH_LSD_FATAL_ERROR_FUNC, 1, [Have definition of lsd_fatal_error()]) +AC_DEFINE(WITH_LSD_NOMEM_ERROR_FUNC, 1, [Have definition of lsd_nomem_error()]) + +dnl All slurm Makefiles: + +AC_CONFIG_FILES([Makefile + config.xml + auxdir/Makefile + src/Makefile + src/api/Makefile + src/common/Makefile + src/sacct/Makefile + src/salloc/Makefile + src/sbatch/Makefile + src/sattach/Makefile + src/srun/Makefile + src/slaunch/Makefile + src/slurmd/Makefile + src/slurmd/slurmd/Makefile + src/slurmd/slurmstepd/Makefile + src/slurmctld/Makefile + src/sbcast/Makefile + src/scontrol/Makefile + src/scancel/Makefile + src/squeue/Makefile + src/sinfo/Makefile + src/smap/Makefile + src/sview/Makefile + src/plugins/Makefile + src/plugins/auth/Makefile + src/plugins/auth/authd/Makefile + src/plugins/auth/munge/Makefile + src/plugins/auth/none/Makefile + src/plugins/checkpoint/Makefile + src/plugins/checkpoint/aix/Makefile + src/plugins/checkpoint/none/Makefile + src/plugins/jobacct/Makefile + src/plugins/jobacct/linux/Makefile + src/plugins/jobacct/aix/Makefile + src/plugins/jobacct/none/Makefile + src/plugins/jobcomp/Makefile + src/plugins/jobcomp/filetxt/Makefile + src/plugins/jobcomp/none/Makefile + src/plugins/jobcomp/script/Makefile + src/plugins/proctrack/Makefile + src/plugins/proctrack/aix/Makefile + src/plugins/proctrack/pgid/Makefile + src/plugins/proctrack/linuxproc/Makefile + src/plugins/proctrack/rms/Makefile + src/plugins/proctrack/sgi_job/Makefile + src/plugins/sched/Makefile + src/plugins/sched/backfill/Makefile + src/plugins/sched/builtin/Makefile + src/plugins/sched/gang/Makefile + src/plugins/sched/hold/Makefile + src/plugins/sched/wiki2/Makefile + src/plugins/select/Makefile + src/plugins/select/bluegene/Makefile + src/plugins/select/bluegene/block_allocator/Makefile + src/plugins/select/bluegene/plugin/Makefile + src/plugins/select/linear/Makefile + src/plugins/select/cons_res/Makefile + src/plugins/switch/Makefile + src/plugins/switch/elan/Makefile + src/plugins/switch/none/Makefile + src/plugins/switch/federation/Makefile + src/plugins/mpi/Makefile + src/plugins/mpi/mpichgm/Makefile + src/plugins/mpi/mvapich/Makefile + src/plugins/mpi/lam/Makefile + src/plugins/mpi/none/Makefile + src/plugins/task/Makefile + src/plugins/task/affinity/Makefile + src/plugins/task/none/Makefile + doc/Makefile + doc/man/Makefile + doc/html/Makefile + doc/html/configurator.html + testsuite/Makefile + testsuite/expect/Makefile + testsuite/slurm_unit/Makefile + testsuite/slurm_unit/common/Makefile + testsuite/slurm_unit/slurmctld/Makefile + testsuite/slurm_unit/slurmd/Makefile + testsuite/slurm_unit/api/Makefile + testsuite/slurm_unit/api/manual/Makefile + ] +) + +AC_OUTPUT + diff --git a/executable_names/doc/Makefile.am b/executable_names/doc/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..06af8571a0d9df8625fa21f5d73744c93cd1bc72 --- /dev/null +++ b/executable_names/doc/Makefile.am @@ -0,0 +1,14 @@ + +SUBDIRS = man html + + +EXTRA_DIST = \ + pubdesign/Makefile \ + pubdesign/report.tex \ + pubdesign/sample.config \ + figures \ + common + + +dist-hook: + -rm -rf `find $(distdir) -name ".svn"` diff --git a/executable_names/doc/Makefile.in b/executable_names/doc/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..ff3b6411cd732d1a5222ec4ac1e1c316d9f30209 --- /dev/null +++ b/executable_names/doc/Makefile.in @@ -0,0 +1,568 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = doc +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +SUBDIRS = man html +EXTRA_DIST = \ + pubdesign/Makefile \ + pubdesign/report.tex \ + pubdesign/sample.config \ + figures \ + common + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/pubdesign + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive dist-hook distclean distclean-generic \ + distclean-libtool distclean-recursive distclean-tags distdir \ + dvi dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am uninstall-info-am + + +dist-hook: + -rm -rf `find $(distdir) -name ".svn"` +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/doc/bgl.report/Makefile b/executable_names/doc/bgl.report/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..7fe7a35ec07bed12f83b11f0ca8fc0bd38e73ccd --- /dev/null +++ b/executable_names/doc/bgl.report/Makefile @@ -0,0 +1,56 @@ +# The following comments are to remind me how the automatic variables work: +# $@ - target +# $% - target member +# $< - First prerequisite +# $? - All (newer) prerequisites +# $^ - All prerequisites +# $+ - $^ but with repetitions +# $* - $* stem of pattern (for "foo.c" in %.c:%.o this would be "foo") +# 'info "GNU make"': "Using variables": "Automatic" also lists a few more. + +REPORT = report + +TEX = ../common/llnlCoverPage.tex $(REPORT).tex + +FIGDIR = ../figures +FIGS = $(FIGDIR)/arch.eps \ + $(FIGDIR)/connections.eps \ + $(FIGDIR)/entities.eps \ + $(FIGDIR)/interactive-job-init.eps \ + $(FIGDIR)/slurm-arch.eps + +PLOTS = $(FIGDIR)/times.eps + +BIB = ../common/project.bib + +%.eps: %.dia + dia --nosplash -e $@ $< +%.eps: %.gpl + gnuplot $< +%.eps: %.fig + fig2dev -Lps $< $@ +%.eps: %.obj + tgif -print -eps $< +%.ps: %.dvi + dvips -K -t letter -o $(@F) $( } + { s nameptr "{vv~}{ll}{, jj}{, f{.}.}" format.name$ 't := + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #1 > + { ", " * } + 'skip$ + if$ + t "others" = + { " et~al." * } + { "" * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.names} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " et~al." * } + { " \& " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.springer.names } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.springer.names + editor num.names$ #1 > + { ", eds." * } + { ", ed." * } + if$ + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title "t" change.case$ } + if$ +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {format.date} +{ year empty$ + { "there's no year in " cite$ * warning$ } + 'year + if$ +} + +FUNCTION {format.btitle} +{ title emphasize +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { "Volume" volume tie.or.space.connect + series empty$ + 'skip$ + { " of " * series emphasize * } + if$ + add.period$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { "number" } + { "Number" } + if$ + number tie.or.space.connect + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { " in " * series * } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ " edn." * } + { edition "t" change.case$ " edn." * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { "" pages n.dashify tie.or.space.connect } + { "" pages tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {format.vol} +{ volume bold +} + +FUNCTION {pre.format.pages} +{ pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { " " * pages n.dashify * } + if$ + } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { "chapter" } + { type "l" change.case$ } + if$ + chapter tie.or.space.connect + pages empty$ + 'skip$ + { " " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { editor empty$ + { "In: " booktitle emphasize * } + { "In " format.editors * ": " * booktitle emphasize * } + if$ + } + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {format.article.crossref} +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { "In {\em " journal * "\/}" * } + if$ + } + { "In " key * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + editor num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al." * } + { " and " * editor #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + "In " + } + { "Volume" volume tie.or.space.connect + " of " * + } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { "" } + if$ + } + { "" } + if$ + } + { "" } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {and.the.note} +{ note output + note empty$ + 'skip$ + { add.period$ } + if$ +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + crossref missing$ + { journal emphasize "journal" output.check + format.vol output + format.date parens output + format.pages output + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + and.the.note + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + stupid.colon + format.btitle "title" output.check + new.sentence + crossref missing$ + { format.edition output + format.bvolume output + new.block + format.number.series output + new.sentence + publisher "publisher" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + } + { format.book.crossref output.nonnull + } + if$ + and.the.note + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + stupid.colon + format.title "title" output.check + howpublished address new.block.checkb + howpublished output + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + stupid.colon + crossref missing$ + { chapter output + new.block + format.number.series output + new.sentence + "In:" output + format.btitle "title" output.check + new.sentence + format.edition output + format.bvolume output + publisher "publisher" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + } + { chapter output + new.block + format.incoll.inproc.crossref output.nonnull + } + if$ + format.pages output + and.the.note + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence + format.bvolume output + format.number.series output + new.block + format.edition output + publisher "publisher" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + format.pages output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + and.the.note + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence + format.bvolume output + format.number.series output + address empty$ + { organization publisher new.sentence.checkb + organization empty$ + 'skip$ + { insert.comma } + if$ + organization output + publisher empty$ + 'skip$ + { insert.comma } + if$ + publisher output + format.date parens output + } + { insert.comma + address output.nonnull + organization empty$ + 'skip$ + { insert.comma } + if$ + organization output + publisher empty$ + 'skip$ + { insert.comma } + if$ + publisher output + format.date parens output + } + if$ + } + { format.incoll.inproc.crossref output.nonnull + } + if$ + format.pages output + and.the.note + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization empty$ + 'skip$ + { organization output.nonnull + address output + } + if$ + } + { format.authors output.nonnull } + if$ + stupid.colon + format.btitle "title" output.check + author empty$ + { organization empty$ + { address new.block.checka + address output + } + 'skip$ + if$ + } + { organization address new.block.checkb + organization output + address empty$ + 'skip$ + { insert.comma } + if$ + address output + } + if$ + new.sentence + format.edition output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + "Master's thesis" format.thesis.type output.nonnull + school empty$ + 'skip$ + { insert.comma } + if$ + school "school" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + howpublished new.block.checka + howpublished output + format.date parens output + and.the.note + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.btitle "title" output.check + new.block + "PhD thesis" format.thesis.type output.nonnull + school empty$ + 'skip$ + { insert.comma } + if$ + school "school" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization empty$ + { "" } + { organization output + stupid.colon } + if$ + } + { format.editors output.nonnull + stupid.colon + } + if$ + format.btitle "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence + format.bvolume output + format.number.series output + address empty$ + { organization publisher new.sentence.checkb + organization empty$ + 'skip$ + { insert.comma } + if$ + organization output + publisher empty$ + 'skip$ + { insert.comma } + if$ + publisher output + format.date parens output + } + { insert.comma + address output.nonnull + organization empty$ + 'skip$ + { insert.comma } + if$ + organization output + publisher empty$ + 'skip$ + { insert.comma } + if$ + publisher output + format.date parens output + } + if$ + } + { format.incoll.inproc.crossref output.nonnull + } + if$ + and.the.note + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + format.tr.number output.nonnull + institution empty$ + 'skip$ + { insert.comma } + if$ + institution "institution" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + note "note" output.check + format.date parens output + fin.entry +} + +FUNCTION {default.type} { misc } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + + + diff --git a/executable_names/doc/clusterworld/Makefile b/executable_names/doc/clusterworld/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..282b42f89fdfff3c3ca69d839bfb401d76858e4d --- /dev/null +++ b/executable_names/doc/clusterworld/Makefile @@ -0,0 +1,59 @@ +# The following comments are to remind me how the automatic variables work: +# $@ - target +# $% - target member +# $< - First prerequisite +# $? - All (newer) prerequisites +# $^ - All prerequisites +# $+ - $^ but with repetitions +# $* - $* stem of pattern (for "foo.c" in %.c:%.o this would be "foo") +# 'info "GNU make"': "Using variables": "Automatic" also lists a few more. + +REPORT = report + +TEX = ../common/llnlCoverPage.tex $(REPORT).tex + +FIGDIR = ../figures +FIGS = $(FIGDIR)/allocate-init.eps \ + $(FIGDIR)/arch.eps \ + $(FIGDIR)/connections.eps \ + $(FIGDIR)/entities.eps \ + $(FIGDIR)/interactive-job-init.eps \ + $(FIGDIR)/queued-job-init.eps \ + $(FIGDIR)/slurm-arch.eps \ + $(FIGDIR)/times.eps + +PLOTS = $(FIGDIR)/times.eps + +BIB = ../common/project.bib + +%.eps: %.dia + dia --nosplash -e $@ $< +%.eps: %.gpl + gnuplot $< +%.eps: %.fig + fig2dev -Lps $< $@ +%.eps: %.obj + tgif -print -eps $< +%.ps: %.dvi + dvips -K -t letter -o $(@F) $( +% \end{verbatim} +% at any time, though the remote \srun\ is not terminated as the result +% of an attach. + +\section{Job Initiation Design} + +There are three modes in which jobs may be run by users under SLURM. The +first and most simple mode is {\em interactive} mode, in which stdout and +stderr are displayed on the user's terminal in real time, and stdin and +signals may be forwarded from the terminal transparently to the remote +tasks. The second mode is {\em batch} or {\em queued} mode, in which the job is +queued until the request for resources can be satisfied, at which time the +job is run by SLURM as the submitting user. In the third mode, {\em allocate} +mode, a job is allocated to the requesting user, under which the user may +manually run job steps via a script or in a sub-shell spawned by \srun . + +\begin{figure}[tb] +\centerline{\epsfig{file=../figures/connections.eps,scale=0.35}} +\caption{\small Job initiation connections overview. 1. \srun\ connects to + \slurmctld\ requesting resources. 2. \slurmctld\ issues a response, + with list of nodes and job step credential. 3. \srun\ opens a listen + port for job IO connections, then sends a run job step + request to \slurmd . 4. \slurmd initiates job step and connects + back to \srun\ for stdout/err } +\label{connections} +\end{figure} + +Figure~\ref{connections} shows a high-level depiction of the connections +that occur between SLURM components during a general interactive +job startup. \srun\ requests a resource allocation and job step +initiation from the {\tt slurmctld}, which responds with the job id, +list of allocated nodes, job step credential, etc. if the request is granted, +\srun\ then initializes a listen port for stdio connections and connects +to the {\tt slurmd}s on the allocated nodes requesting that the remote +processes be initiated. The {\tt slurmd}s begin execution of the tasks and +connect back to \srun\ for stdout and stderr. This process is described +in more detail below. Details of the batch and allocate modes of operation +are not presented due to space constraints. + +\subsection{Interactive Job Initiation} + +\begin{figure}[tb] +\centerline{\epsfig{file=../figures/interactive-job-init.eps,scale=0.45} } +\caption{\small Interactive job initiation. \srun\ simultaneously allocates + nodes and a job step from \slurmctld\ then sends a run request to all + {\tt slurmd}s in job. Dashed arrows indicate a periodic request that + may or may not occur during the lifetime of the job} +\label{init-interactive} +\end{figure} + +Interactive job initiation is shown in +Figure~\ref{init-interactive}. The process begins with a user invoking +\srun\ in interactive mode. In Figure~\ref{init-interactive}, the user +has requested an interactive run of the executable ``{\tt cmd}'' in the +default partition. + +After processing command line options, \srun\ sends a message to +\slurmctld\ requesting a resource allocation and a job step initiation. +This message simultaneously requests an allocation (or job) and a job +step. \srun\ waits for a reply from {\tt slurmctld}, which may not come +instantly if the user has requested that \srun\ block until resources are +available. When resources are available for the user's job, \slurmctld\ +replies with a job step credential, list of nodes that were allocated, +cpus per node, and so on. \srun\ then sends a message each \slurmd\ on +the allocated nodes requesting that a job step be initiated. +The \slurmd\ daemons verify that the job is valid using the forwarded job +step credential and then respond to \srun . + +Each \slurmd\ invokes a job manager process to handle the request, which +in turn invokes a session manager process that initializes the session for +the job step. An IO thread is created in the job manager that connects +all tasks' IO back to a port opened by \srun\ for stdout and stderr. +Once stdout and stderr have successfully been connected, the task thread +takes the necessary steps to initiate the user's executable on the node, +initializing environment, current working directory, and interconnect +resources if needed. + +Each \slurmd\ forks a copy of itself that is responsible for the job +step on this node. This local job manager process then creates an +IO thread that initializes stdout, stdin, and stderr streams for each +local task and connects these streams to the remote \srun . Meanwhile, +the job manager forks a session manager process that initializes +the session becomes the requesting user and invokes the user's processes. + +As user processes exit, their exit codes are collected, aggregated when +possible, and sent back to \srun\ in the form of a task exit message. +Once all tasks have exited, the session manager exits, and the job +manager process waits for the IO thread to complete, then exits. +The \srun\ process either waits for all tasks to exit, or attempts to +clean up the remaining processes some time after the first task exits +(based on user option). Regardless, once all tasks are finished, +\srun\ sends a message to the \slurmctld\ releasing the allocated nodes, +then exits with an appropriate exit status. + +When the \slurmctld\ receives notification that \srun\ no longer needs +the allocated nodes, it issues a request for the epilog to be run on +each of the {\tt slurmd}s in the allocation. As {\tt slurmd}s report that the +epilog ran successfully, the nodes are returned to the partition. + +\section{Results} + +\begin{figure}[htb] +\centerline{\epsfig{file=../figures/times.eps,scale=0.7}} +\caption{\small Time to execute /bin/hostname with various node counts} +\label{timing} +\end{figure} + +We were able to perform some SLURM tests on a 1000-node cluster +in November 2002. Some development was still underway at that time +and tuning had not been performed. The results for executing the +program {\em /bin/hostname} on two tasks per node and various node +counts are shown in Figure~\ref{timing}. We found SLURM performance +to be comparable to the +Quadrics Resource Management System (RMS) \cite{Quadrics2002} for all +job sizes and about 80 times faster than IBM LoadLeveler\cite{LL2002} +at tested job sizes. + +\section{Future Plans} + +SLURM begin production use on LLNL Linux clusters in March 2003 +and is available from our web site\cite{SLURM2003}. + +While SLURM is able to manage 1000 nodes without difficulty using +sockets and Ethernet, we are reviewing other communication mechanisms +that may offer improved scalability. One possible alternative +is STORM \cite{STORM2001}. STORM uses the cluster interconnect +and Network Interface Cards to provide high-speed communications, +including a broadcast capability. STORM only supports the Quadrics +Elan interconnnect at present, but it does offer the promise of improved +performance and scalability. + +Looking ahead, we anticipate adding support for additional +interconnects (InfiniBand and the IBM +Blue Gene \cite{BlueGene2002} system\footnote{Blue Gene has a different +interconnect than any supported by SLURM and a 3-D topography with +restrictive allocation constraints.}). We anticipate adding a job +preempt/resume capability to the next release of SLURM. This will +provide an external scheduler the infrastructure required to perform gang +scheduling. We also anticipate adding a checkpoint/restart capability at +some time in the future ,and we plan to support changing the node count +associated with running jobs (as needed for MPI2). Recording resource +use by each parallel job is planned for a future release. + +\section{Acknowledgments} + +SLURM is jointly developed by LLNL and Linux NetworX. +Contributors to SLURM development include: +\begin{itemize} +\item Jay Windley of Linux NetworX for his development of the plugin +mechanism and work on the security components +\item Joey Ekstrom for his work developing the user tools +\item Kevin Tew for his work developing the communications infrastructure +\item Jim Garlick for his development of the Quadrics Elan interface and +technical guidance +\item Gregg Hommes, Bob Wood, and Phil Eckert for their help designing the +SLURM APIs +\item Mark Seager and Greg Tomaschke for their support of this project +\item Chris Dunlap for technical guidance +\item David Jackson of Linux NetworX for technical guidance +\item Fabrizio Petrini of Los Alamos National Laboratory for his work to +integrate SLURM with STORM communications +\end{itemize} + +%\appendix +%\newpage +%\section{Glossary} +% +%\begin{description} +%\item[Authd] User authentication mechanism +%\item[DCE] Distributed Computing Environment +%\item[DFS] Distributed File System (part of DCE) +%\item[DPCS] Distributed Production Control System, a meta-batch system +% and resource manager developed by LLNL +%\item[Globus] Grid scheduling infrastructure +%\item[Kerberos] Authentication mechanism +%\item[LoadLeveler] IBM's parallel job management system +%\item[LLNL] Lawrence Livermore National Laboratory +%\item[Munge] User authentication mechanism developed by LLNL +%\item[NQS] Network Queuing System (a batch system) +%\item[RMS] Quadrics' Resource Management System +%\item[TotalView] Etnus' debugger +%\end{description} + +\raggedright +% make the bibliography +\bibliographystyle{splncs} +\bibliography{project} + +% make the back cover page +%\makeLLNLBackCover +\end{document} diff --git a/executable_names/doc/clusterworld/sample.config b/executable_names/doc/clusterworld/sample.config new file mode 100644 index 0000000000000000000000000000000000000000..e0d5f2f38b79bf76c358ab5f27e0041542ea2cf0 --- /dev/null +++ b/executable_names/doc/clusterworld/sample.config @@ -0,0 +1,57 @@ +# +# Sample /etc/slurm.conf +# Author: John Doe +# Date: 11/06/2001 + +ControlMachine=lx0000 ControlAddr=elx0000 +BackupController=lx0001 BackupAddr=elx0001 + +AuthType="auth/authd" +Epilog=/etc/slurm/epilog +FastSchedule=1 +FirstJobId=65536 +HashBase=10 +HeartbeatInterval=60 +InactiveLimit=120 +JobCredentialPrivateKey=/etc/slurm/private.key +JobCredentialPublicCertificate=/etc/slurm/public.cert +KillWait=30 +PluginDir=/usr/lib/slurm +Prioritize=/usr/local/slurm/etc/priority +Prolog=/etc/slurm/prolog +ReturnToService=0 +SlurmctldDebug=4 +SlurmctldLogFile=/var/tmp/slurmctld.log +SlurmctldPidFile=/var/run/slurmctld.pid +SlurmctldPort=7002 +SlurmctldTimeout=120 +SlurmdDebug=4 +SlurmdLogFile=/var/tmp/slurmd.log +SlurmdPidFile=/var/run/slurmd.pid +SlurmdPort=7003 +SlurmdSpoolDir=/var/tmp/slurmd.spool +SlurmdTimeout=120 +SlurmUser=slurm +StateSaveLocation=/tmp/slurm.state +TmpFS=/tmp + +# +# Node Configurations +# +NodeName=DEFAULT TmpDisk=16384 Procs=16 RealMemory=2048 Weight=16 +NodeName=lx[0000-0002] NodeAddr=elx[0000-0002] State=DRAINED +NodeName=lx[0003-8000] NodeAddr=elx[0003-8000] + +NodeName=DEFAULT CPUs=32 RealMemory=4096 Weight=40 Feature=1200MHz +NodeName=lx[8001-9999] NodeAddr=elx[8001-9999] +# +# Partition Configurations +# +PartitionName=DEFAULT MaxTime=30 MaxNodes=2 Shared=NO +PartitionName=debug Nodes=lx[0003-0030] State=UP Default=YES +PartitionName=class Nodes=lx[0031-0040] AllowGroups=students,teachers +PartitionName=login Nodes=lx[0000-0002] State=DOWN # Don't schedule work here + +# +PartitionName=DEFAULT MaxTime=UNLIMITED RootOnly=YES +PartitionName=batch Nodes=lx[0041-9999] MaxNodes=4096 diff --git a/executable_names/doc/clusterworld/splncs.bst b/executable_names/doc/clusterworld/splncs.bst new file mode 100644 index 0000000000000000000000000000000000000000..096949614c3bf77c6b4ba5c173d2ba9e2eacd86e --- /dev/null +++ b/executable_names/doc/clusterworld/splncs.bst @@ -0,0 +1,1080 @@ +% BibTeX bibliography style `splncs' + +% An attempt to match the bibliography style required for use with +% numbered references in Springer Verlag's "Lecture Notes in Computer +% Science" series. (See Springer's documentation for llncs.sty for +% more details of the suggested reference format.) Note that this +% file will not work for author-year style citations. + +% Use \documentclass{llncs} and \bibliographystyle{splncs}, and cite +% a reference with (e.g.) \cite{smith77} to get a "[1]" in the text. + +% Copyright (C) 1999 Jason Noble. +% Last updated: Thursday 20 May 1999, 13:22:19 +% +% Based on the BibTeX standard bibliography style `unsrt' + +ENTRY + { address + author + booktitle + chapter + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + } + {} + { label } + +INTEGERS { output.state before.all mid.sentence after.sentence + after.block after.authors between.elements} + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'after.authors := + #5 'between.elements := +} + +STRINGS { s t } + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { " " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { + output.state after.authors = + { ": " * write$ + newline$ + "\newblock " write$ + } + { output.state between.elements = + { ", " * write$ } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {fin.entry} +{ write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {stupid.colon} +{ after.authors 'output.state := } + +FUNCTION {insert.comma} +{ output.state before.all = + 'skip$ + { between.elements 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "" swap$ * "" * } + if$ +} + +FUNCTION {bold} +{ duplicate$ empty$ + { pop$ "" } + { "\textbf{" swap$ * "}" * } + if$ +} + +FUNCTION {parens} +{ duplicate$ empty$ + { pop$ "" } + { "(" swap$ * ")" * } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.springer.names} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr "{vv~}{ll}{, jj}{, f{.}.}" format.name$ 't := + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #1 > + { ", " * } + 'skip$ + if$ + t "others" = + { " et~al." * } + { "" * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.names} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " et~al." * } + { " \& " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.springer.names } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.springer.names + editor num.names$ #1 > + { ", eds." * } + { ", ed." * } + if$ + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title "t" change.case$ } + if$ +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {format.date} +{ year empty$ + { "there's no year in " cite$ * warning$ } + 'year + if$ +} + +FUNCTION {format.btitle} +{ title emphasize +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { "Volume" volume tie.or.space.connect + series empty$ + 'skip$ + { " of " * series emphasize * } + if$ + add.period$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { "number" } + { "Number" } + if$ + number tie.or.space.connect + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { " in " * series * } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ " edn." * } + { edition "t" change.case$ " edn." * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { "" pages n.dashify tie.or.space.connect } + { "" pages tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {format.vol} +{ volume bold +} + +FUNCTION {pre.format.pages} +{ pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { " " * pages n.dashify * } + if$ + } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { "chapter" } + { type "l" change.case$ } + if$ + chapter tie.or.space.connect + pages empty$ + 'skip$ + { " " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { editor empty$ + { "In: " booktitle emphasize * } + { "In " format.editors * ": " * booktitle emphasize * } + if$ + } + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {format.article.crossref} +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { "In {\em " journal * "\/}" * } + if$ + } + { "In " key * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + editor num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al." * } + { " and " * editor #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + "In " + } + { "Volume" volume tie.or.space.connect + " of " * + } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { "" } + if$ + } + { "" } + if$ + } + { "" } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {and.the.note} +{ note output + note empty$ + 'skip$ + { add.period$ } + if$ +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + crossref missing$ + { journal emphasize "journal" output.check + format.vol output + format.date parens output + format.pages output + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + and.the.note + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + stupid.colon + format.btitle "title" output.check + new.sentence + crossref missing$ + { format.edition output + format.bvolume output + new.block + format.number.series output + new.sentence + publisher "publisher" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + } + { format.book.crossref output.nonnull + } + if$ + and.the.note + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + stupid.colon + format.title "title" output.check + howpublished address new.block.checkb + howpublished output + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + stupid.colon + crossref missing$ + { chapter output + new.block + format.number.series output + new.sentence + "In:" output + format.btitle "title" output.check + new.sentence + format.edition output + format.bvolume output + publisher "publisher" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + } + { chapter output + new.block + format.incoll.inproc.crossref output.nonnull + } + if$ + format.pages output + and.the.note + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence + format.bvolume output + format.number.series output + new.block + format.edition output + publisher "publisher" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + format.pages output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + and.the.note + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence + format.bvolume output + format.number.series output + address empty$ + { organization publisher new.sentence.checkb + organization empty$ + 'skip$ + { insert.comma } + if$ + organization output + publisher empty$ + 'skip$ + { insert.comma } + if$ + publisher output + format.date parens output + } + { insert.comma + address output.nonnull + organization empty$ + 'skip$ + { insert.comma } + if$ + organization output + publisher empty$ + 'skip$ + { insert.comma } + if$ + publisher output + format.date parens output + } + if$ + } + { format.incoll.inproc.crossref output.nonnull + } + if$ + format.pages output + and.the.note + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization empty$ + 'skip$ + { organization output.nonnull + address output + } + if$ + } + { format.authors output.nonnull } + if$ + stupid.colon + format.btitle "title" output.check + author empty$ + { organization empty$ + { address new.block.checka + address output + } + 'skip$ + if$ + } + { organization address new.block.checkb + organization output + address empty$ + 'skip$ + { insert.comma } + if$ + address output + } + if$ + new.sentence + format.edition output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + "Master's thesis" format.thesis.type output.nonnull + school empty$ + 'skip$ + { insert.comma } + if$ + school "school" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + howpublished new.block.checka + howpublished output + format.date parens output + and.the.note + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.btitle "title" output.check + new.block + "PhD thesis" format.thesis.type output.nonnull + school empty$ + 'skip$ + { insert.comma } + if$ + school "school" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization empty$ + { "" } + { organization output + stupid.colon } + if$ + } + { format.editors output.nonnull + stupid.colon + } + if$ + format.btitle "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence + format.bvolume output + format.number.series output + address empty$ + { organization publisher new.sentence.checkb + organization empty$ + 'skip$ + { insert.comma } + if$ + organization output + publisher empty$ + 'skip$ + { insert.comma } + if$ + publisher output + format.date parens output + } + { insert.comma + address output.nonnull + organization empty$ + 'skip$ + { insert.comma } + if$ + organization output + publisher empty$ + 'skip$ + { insert.comma } + if$ + publisher output + format.date parens output + } + if$ + } + { format.incoll.inproc.crossref output.nonnull + } + if$ + and.the.note + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + format.tr.number output.nonnull + institution empty$ + 'skip$ + { insert.comma } + if$ + institution "institution" output.check + address empty$ + 'skip$ + { insert.comma } + if$ + address output + format.date parens output + and.the.note + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + stupid.colon + format.title "title" output.check + new.block + note "note" output.check + format.date parens output + fin.entry +} + +FUNCTION {default.type} { misc } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + + + diff --git a/executable_names/doc/common/Logo_for_papers.ps b/executable_names/doc/common/Logo_for_papers.ps new file mode 100644 index 0000000000000000000000000000000000000000..69bfd6c32831a32457cc8178ba7d80ba42f56cb6 --- /dev/null +++ b/executable_names/doc/common/Logo_for_papers.ps @@ -0,0 +1,7246 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/henshaw/reviewAndRelease/Logo_for_papers.ps +%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley +%%BoundingBox: 206 -203 405 997 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 199 string def + +% define space for color conversions +/grays 199 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +206 -203 translate + +% size of image (on paper, in 1/72inch coords) +199.00800 1200.02400 scale + +199 1200 8 % dimensions of data +[199 0 0 -1200 0 1200] % mapping matrix +{currentfile pix readhexstring pop} +image + +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffefc1ffffffffffffffc1c1c1c1c1ffffffffffffffc1c1ffffffffffc1 +e0ffffffffffffd0c1c1c1c1d0ffffffffffffd0c1ffffffffffc1c1ffffffffffffefc1 +c1c1c1c1ffffffffffffc1c1efffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9f91515cef9f9f9b31515f9f9f9f9f9f9231515151540f9f9f9f9f9f9 +f9f9f9f9f91515151515156af9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f98787f9f9f9ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff9292ffffffffffffffffffffffffffffffff151515ffffffff +ff6415151515151515ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9f91515f9f9f9f94f1540f9f9f9f9f92315154f23151587f9f9f9f9f9 +f9f9f9f9f91515151515151523f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f91515f9f9f9ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffd01554ffffffffffffffffffffffffffffff73151592ffffffff +ff1515151515151515ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f9961515f9f9f9f91515cef9f9f9f9f91515f9f9f9f91515f9f9f9f9f9 +f9f9f9f9961515f9f9f9eb1515f9f9f9f9a487cef9f9f9f9f9f9b387b3f9f9f9f9f9b387 +a4f9f9f9f9f9f9f987c1eb1515f9f9f9ffffff92a2ffffe092ffffffffffc192d0ffffff +ffffffffc192ffffffff4515e0ffffffffffffffffa292ffffffffff1515ffffffffffff +ff1515ffffffffffffffffffffe09292ffffffffffa292f1ffffffffffffff92f1ffc192 +ffffffffffffffffffffffffffffffffffffff +fffffffffff9f9f940154ff9f9f9f91515f9f9f9f9f9f91515cef9f9f9f9f9f9f9f9f9f9 +f9f9f9f9401515f9f9f9f91515f9f987151515156af9f932157915151579f9f9eb151515 +1515f9f95c15ce15151515151515eb2315b1151515f115151515ffffff2515151515ffff +ff151515151515ffff1515151515ffffffffffe01515151515ffff1515151554ffffffff +f11515ffffffffffffff2515b115151554ffffff1515151515ffff2515c11515ff151515 +15a21515921583ffffb11534ffffffffffffff +fffffffffff9f9f91515ebf9f9f9961515f9f9f9f9f9f9a41515151532f9f9f9f9f9f9f9 +f9f9f9f9151515f9f9f9f91515f9eb1515f9f9871587f915156af9f91515ebf91515f9f9 +b31596f915151596c1f9151532f9f9151545ff641515b1ff1515d0ff1515ffffd01515ff +ff1515ffff1515ffffff1515ffffffffffffff1515ffff2515c1ff921515ffffffffffff +5415151515151515ffff151545ffff1515ffd01525ffff5415d0ff151515b1d0151573ff +ff151564ff1515ffff1515ffffffffffffffff +fffffffffff9f9f91515f9f9f9f932154ff9f9f9f9f9f9f9f91515151540f9f9f9f9f9f9 +f9f9f9f915155cf9f9f9f91515f92315ebf9f9f91515f91515f9f9f94f15c1f9f9f9f9f9 +4015cef91515ebf9f9f9151596f9f91515ffff921545ffff1515ffff1515ffffff1515ff +921534ffff1515ffffff1515ffffffffffff731573ffff921573ff251515ffffffffffff +1515151515151515ffff1515ffffff1515ff1515ffffffd01554ff1515ffffff1515ffff +ff1515d0ff1515ff541525ffffffffffffffff +fffffffffff9f9871515f9f9f9f91515ebf9f9f9f9f9c1c1f9f9f9eb1515f9f9f9f9f9f9 +f9f9f9f91515f9f9f9f9c11515f9151515151515154f7915b3f9f9f91515f9ce15151523 +1515f9f91515f9f9f9f91515f9f9f91515ffff1515ffffff1515ffd015151515151515ff +1515ffffff1515ffffff1515ffffffffffff1515ffffff731592ff151592ffffffffffff +1515ffffffffffffff8315a2ffff921592ff1515151515151592ff1515ffff921592ffff +ff1515ffff1515ff1515ffffffffffffffffff +fffffffffff9f94f1515f9f9f9f91515f9f9f9f9f9f91515f9f9f9f91515f9f9f9f9f9f9 +f9f9f9f91515f9f9f9eb15154ff91515f9f9f9f9f9f91515c1f9f9f91515f91515f9f9f9 +1515f9f91515f9f9f9f91515f9f9f91515ffff1515ffffff1515ffc11592ffffffffffff +1515ffffff1515ffffb11564ffffffffffff1515ffffff1515ffff1515ffffffffffffff +1515ffffffffffffff1515ffffff2515f1ff1515ffffffffffffff1515ffff921583ffff +ff1515ffff6415f115d0ffffffffffffffffff +fffffffffff9f9eb1515152315151532f9f91515f9f93215158787151523f9151523f9f9 +f9f9f979151515151515156af9f932154feb401523f9151515cea41515cef91515f9f915 +1596f9a4156af9f9f9c1151587f96a15aaffff1515ffffff1515ffff1515f1e01515d0f1 +1534ffffff1515ffff151545b1ffffffffff641515ff641515ffff1515ffffffffffffff +1515151515151564ff1515ffffff1515ffff151573ff251515ff7315b1ffffff15151534 +151583fffff1151573ffffffffffffffffffff +f9f9f9f9f9f9f9f9a4151515151523f9f9f91515f9f9f9151515151515f9f9151587f9f9 +f9f9f9151515151515156af9f9f9f91515151515f9f915151515151515f9f91515151532 +15c1f94f15c1f9f9f9f9151515f91515f9f9f91515f9f9ce1532f9f9151515151573ff92 +1592ffff921583ffff731515b1ffffffffffff1515151515ffffff1515ffffffffffffd0 +15151515151515d0ff1515ffffff1515ffffff1515151515e0ff1515ffffffffe0151515 +4515e0ffffff1515ffffffffffffffffffffff +f9f9f9f9f9f9f9f9f9eb874f4fb3f9f9f9ebc1c1f9f9f9f9a44f4fa4f9f9f9c1c1ebf9f9 +f9f9f9c1c1c1c1c1ebf9f9f9f9f9f9f9874f96f9f9f91515f9965ccef9f9f9f9965cc1ce +c1ebf9c1c1f9f9f9f9f9b38787f9c1c1f9f9f9c1c1f9f9ddc1ddf9f9ffe05483ffffffd0 +d0ffffffe0d0ffffffff9292ffffffffffffffffa254a2fffffff1d0e0fffffffffffff1 +d0d0d0d0d0d0d0ffffd0d0ffffffd0d0ffffffff9254b1ffffffd0d0ffffffffffffffff +1515ffffffff1515ffffffffffffffffffffff +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9dd1532f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff151573d054 +1515ffff151515ffffffffffffffffffffffff +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9791596f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff15151515 +25ffff921515ffffffffffffffffffffffffff +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefef9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefef9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefef9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe15151515151515151515151515151515151515151515151515f9f9f9 +f915151515151515151515151515151515151515151515151515c1f9f9f9f91515151515 +15151515151515151515151515151515151515154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe15151515151515151515151515151515151515151515151515f9f9f9 +f915151515151515151515151515151515151515151515151515c1f9f9f9f91515151515 +15151515151515151515151515151515151515154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9cff9e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6f91515f9f9f9 +f91515f9eef9cff9d7f9eef9f9f6f9eef9cff9e2f9eef9f94a15c1f9f9f9f91515f9f9f6 +f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9eef91515f9f9f9 +f91515f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f94315c1f9f9f9f91515f9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9c4f9dcf9e7f9f9f2f9dcf9c4f9dcf9f2f9f9f2f91515f9f9f9 +f91515f9e7f9c4f9ccf9e7f9f9f2f9e7f9c4f9dcf9e7f9f94715c1f9f9f9f91515f9f9f2 +f9dcf9ccf9dcf9f2f9f9e7f9c0f9ccf9e7f987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515eee2eaf2eef6f6f9f9f2f2eae2eaf2f2f9f9f6f9f21515f9f9f9 +f91515f6f6eee2eaeaeef6f6f9f9f6f6eee2eaf2eef6f6f94f15c1f9f9f9f91515f9f6f9 +f2f2eaeaeef2f2f9f9f6f6eedfeaeaeef6f687154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515d4f9cff9d4f9e7eef6dcf9cff9cff9dcf6eee7f6dc1515f9f9f9 +f91515e7f9d4f9cff9d4f9e7eeeee7f9d4f9cff9d4f9e7ee4f15c1f9f9f9f91515eee7f6 +dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e77c154ffefefefefefefefeffffd0251525d0 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515cff9ccf9cff9e2eef6d7f9ccf9ccf9d7f6eee2f6d71515f9f9f9 +f91515e2f9cff9ccf9cff9e2eeeee2f9cff9ccf9cff9e2ee4f15c1f9f9f9f91515eee2f6 +d7f9ccf9cff9d7f6eee2f9cff9ccf9cff9e27c154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f2dfeeeef2f6f9f9f9f6eeeedfeeeef6f9f9f9f9f61515f9f9f9 +f91515f9f6f2dfeee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f94f15c1f9f9f9f91515f9f9f9 +f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f987154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9cff9e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6f91515f9f9f9 +f91515f9eef9cff9d7f9eef9f9f6f9eef9cff9e2f9eef9f94a15c1f9f9f9f91515f9f9f6 +f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef987154ffefefefefefefefeffffff921592ff +fffffffffffff145d0921515fffff115b1ffffff92e0ffffff1564ff151515ff1515ffff +15ffffa215ffff1515ff15541515ffffffff8325d0b115d0ffa225ffff1525ffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffff921592ff +ffffffffffff92ffffff7315ffffff1573ffffff1525ffffff15ffffffff1525ff73ff25 +f1ffffff15a2ffff1545ffffff1525ffffff15ffffff92ffff15ffffffb115ffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9eef91515f9f9f9 +f91515f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f94315c1f9f9f9f91515f9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff987154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffe015fffffff115ffff73f115f1ffffe0ffffffff15fffffff115 +ffffffff5415ffff15ffffffff1515ffff15e0ffffffffffb115ffffffff15ffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffff921592ff +ffffffffffffff641554ff15ffffffff15f1ff15ff1534ffd0ffffffffff15ffffff9215 +5454545454a2ffff15ffffffff1515ffff15ffffffffffff54155454545454ffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9d4f9e7f9eef9f9f6f9e7f9d4f9e7f9f6f9f9f6f91515f9f9f9 +f91515f9eef9d4f9dcf9eef9f9f6f9eef9d4f9e7f9eef9f94a15c1f9f9f9f91515f9f9f6 +f9e7f9dcf9e7f9f6f9f9eef9cff9dcf9eef987154ffefefefefefefefeffffff921592ff +ffffffffffff34a2ffffff15ffffffff1564ffd0ff4515ff25ffffffffff15ffffff9215 +ffffffffffffffff15ffffffff1515ffff15c1ffffffffff5415ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515c4f9c0f9c4f9dce7f2ccf9c0f9c0f9ccf2e7dcf2cc1515f9f9f9 +f91515dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce74f15c1f9f9f9f91515e7dcf2 +ccf9c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dc74154ffefefefefefefefeffffff921592ff +fffffff192ff15ffffffff15ffffffff251554ffffff15f1b1ffffffffff15ffffffff15 +a2ffffffffffffff15ffffffff1515ffff2515ffffffffffff15e0ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515dfe2dcf2dff6eef6f9e7f2dce2dcf2e7f9f6eef9e71515f9f9f9 +f91515eef6dfe2dceadff6eef6f6eef6dfe2dcf2dff6eef64f15c1f9f9f9f91515f6eef9 +e7f2dceadff2e7f9f6eef6dfdfdceadff6ee84154ffefefefefefefefeffffff641592ff +ffffff64d0ff15e0ffff8315ffffffffc11525ffffff4515ffffffffffff15ffffffff54 +15e0ffffffd0ffff15ffffffff1515ffffff1545ffffffffff1515ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515d4f9cff9d4f9e7eef6dcf9cff9cff9dcf6eee7f6dc1515f9f9f9 +f91515e7f9d4f9cff9d4f9e7eeeee7f9d4f9cff9d4f9e7ee4f15c1f9f9f9f91515eee7f6 +dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e77c154ffefefefefefefefeffffff54545454 +54545454ffffff1534ffff5454ffffffff15ffffffffff83ffffffff5454545483ffffff +d0251525c1ffff54545454ffff545454ffffff541515c1ffffffb1151583ffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515cff9ccf9cff9e2eef6d7f9ccf9ccf9d7f6eee2f6d71515f9f9f9 +f91515e2f9cff9ccf9cff9e2eeeee2f9cff9ccf9cff9e2ee4f15c1f9f9f9f91515eee2f6 +d7f9ccf9cff9d7f6eee2f9cff9ccf9cff9e27c154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f2dfeeeef2f6f9f9f9f6eeeedfeeeef6f9f9f9f9f61515f9f9f9 +f91515f9f6f2dfeee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f94f15c1f9f9f9f91515f9f9f9 +f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9c0f9d7f9e7f9f9f2f9d7f9c0f9d7f9f2f9f9f2f91515f9f9f9 +f91515f9e7f9c0f9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f94715c1f9f9f9f91515f9f9f2 +f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7f987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9eef91515f9f9f9 +f91515f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f94315c1f9f9f9f91515f9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9d4f9e7f9eef9f9f6f9e7f9d4f9e7f9f6f9f9f6f91515f9f9f9 +f91515f9eef9d4f9dcf9eef9f9f6f9eef9d4f9e7f9eef9f94a15c1f9f9f9f91515f9f9f6 +f9e7f9dcf9e7f9f6f9f9eef9cff9dcf9eef987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515c4f9c0f9c4f9dce7f2ccf9c0f9c0f9ccf2e7dcf2cc1515f9f9f9 +f91515dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce74f15c1f9f9f9f91515e7dcf2 +ccf9c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dc74154ffefefefefefefefeffff1515151515 +ffffffffffffff45ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515dff2dcf9dff9eef6f9e7f9dcf2dcf9e7f9f6eef9e71515f9f9f9 +f91515eef9dff2dcf6dff9eef6f6eef9dff2dcf9dff9eef64f15c1f9f9f9f91515f6eef9 +e7f9dcf6dff9e7f9f6eef9dfeedcf6dff9ee84154ffefefefefefefefeffffff541573ff +ffffffffffffd015a2ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515e2eedff6e2f9f2f6f9eaf6dfeedff6eaf9f6f2f9ea1515f9f9f9 +f91515f2f9e2eedff2e2f9f2f6f6f2f9e2eedff6e2f9f2f64f15c1f9f9f9f91515f6f2f9 +eaf6dff2e2f6eaf9f6f2f9e2eadff2e2f9f284154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515c0f9bcf9c0f9d7e7f2c8f9bcf9bcf9c8f2e7d7f2c81515f9f9f9 +f91515d7f9c0f9bcf9c0f9d7e7e7d7f9c0f9bcf9c0f9d7e74f15c1f9f9f9f91515e7d7f2 +c8f9bcf9c0f9c8f2e7d7f9c0f9bcf9c0f9d774154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f2cfeee2f2eef9f9f6f6e2eecfeee2f6f6f9f9f6f61515f9f9f9 +f91515f9eef2cfeed7f2eef9f9f6f9eef2cfeee2f2eef9f94a15c1f9f9f9f91515f9f9f6 +f6e2eed7f2e2f6f6f9f9eef2cceed7f2eef987154ffefefefefefefefeffffff921592ff +ffffffffffe08315d0ff34151515ffff151515ffffff34924525ffffd08315ff1515ffc1 +152573151525ffb1151515ffffffffff15736415d0ffffd08315ff1515ffff9234831534 +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefeffffff921592ff +ffffffffffffff15d0ffffb115ffffffff15e0ffff15ffffff1515fffff115d05415ffff +1545c1fff11554b1ffa215b1ffffff25ffffffff15c1fffff115d05415ffc183ffffff15 +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9c0f9d7f9e7f9f9f2f9d7f9c0f9d7f9f2f9f9f2f91515f9f9f9 +f91515f9e7f9c0f9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f94715c1f9f9f9f91515f9f9f2 +f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7f987154ffefefefefefefefeffffff921592ff +ffffffffffffff15ffffffff1545ffffe054ffff7345ffffff9215ffffff15ffffffffff +1515ffffff1515ffffff5415ffff2515ffffffff1515ffffff15ffffffff15ffffffff54 +15ffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffff921592ff +ffffffffffffff15ffffffff1515ffff25ffffff15255492925415ffffff15ffffffffff +1545ffffff1515ffffff9215ffff1515ffffffff5415ffffff15ffffffd0155492929234 +15ffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf987154ffefefefefefefefeffffff921592ff +ffffffffffffff15ffffffffff15ffffb1ffffff1545ffffffffffffffff15ffffffffff +1554ffffff1515ffffff9215ffff1515ffffffff9215ffffff15ffffff9215ffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefeffffff921592ff +ffffffff73ffff15d0ffffffff1573f1ffffffff3415ffffffffffffffff15ffffffffff +1554ffffff1515ffffff9215ffff1515ffffffff5415ffffff15fffffff115ffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515eee2eaf2eef6f6f9f9f2f2eae2eaf2f2f9f9f6f9f21515f9f9f9 +f91515f6f6eee2eaeaeef6f6f9f9f6f6eee2eaf2eef6f6f94f15c1f9f9f9f91515f9f6f9 +f2f2eaeaeef2f2f9f9f6f6eedfeaeaeef6f687154ffefefefefefefefeffffff921592ff +ffffffb1b1ffff15d0fffffffff11525fffffffff115b1ffffffffffffff15ffffffffff +1515ffffff1515ffffff6415ffff9215ffffffff1554ffffff15ffffffff1525ffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515c4f9c0f9c4f9dce7f2ccf9c0f9c0f9ccf2e7dcf2cc1515f9f9f9 +f91515dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce74f15c1f9f9f9f91515e7dcf2 +ccf9c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dc74154ffefefefefefefefeffffff15151515 +15151515ffb183154592ffffffff15b1ffffffffff9215151515b1ff92641545b1ffff92 +151592ff92151592ffff541592ffffe01573e045ffffff92641545b1ffffff1515151515 +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515dff2dcf9dff9eef6f9e7f9dcf2dcf9e7f9f6eef9e71515f9f9f9 +f91515eef9dff2dcf6dff9eef6f6eef9dff2dcf9dff9eef64f15c1f9f9f9f91515f6eef9 +e7f9dcf6dff9e7f9f6eef9dfeedcf6dff9ee84154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffd0e0ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffd0d0ffffffffffffffffffffffffffffd0ffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515e2eedff6e2f9f2f6f9eaf6dfeedff6eaf9f6f2f9ea1515f9f9f9 +f91515f2f9e2eedff2e2f9f2f6f6f2f9e2eedff6e2f9f2f64f15c1f9f9f9f91515f6f2f9 +eaf6dff2e2f6eaf9f6f2f9e2eadff2e2f9f284154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515c0f9bcf9c0f9d7e7f2c8f9bcf9bcf9c8f2e7d7f2c81515f9f9f9 +f91515d7f9c0f9bcf9c0f9d7e7e7d7f9c0f9bcf9c0f9d7e74f15c1f9f9f9f91515e7d7f2 +c8f9bcf9c0f9c8f2e7d7f9c0f9bcf9c0f9d774154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9cff9e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6f91515f9f9f9 +f91515f9eef9cff9d7f9eef9f9f6f9eef9cff9e2f9eef9f94a15c1f9f9f9f91515f9f9f6 +f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9eef91515f9f9f9 +f91515f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f94315c1f9f9f9f91515f9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffd07354ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515eee2eaf2eef6f6f9f9f2f2eae2eaf2f2f9f9f6f9f21515f9f9f9 +f91515f6f6eee2eaeaeef6f6f9f9f6f6eee2eaf2eef6f6f94f15c1f9f9f9f91515f9f6f9 +f2f2eaeaeef2f2f9f9f6f6eedfeaeaeef6f687154ffefefefefefefefeffffd0151515ff +ffffffffffb115d0ffffffffffffffffffffffffffffffffa215ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffd01592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515d4f9cff9d4f9e7eef6dcf9cff9cff9dcf6eee7f6dc1515f9f9f9 +f91515e7f9d4f9cff9d4f9e7eeeee7f9d4f9cff9d4f9e7ee4f15c1f9f9f9f91515eee7f6 +dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e77c154ffefefefefefefefeffffff92731545 +ffffffffffff15ffffffffffffffffffffffff1515ffffffff92ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff1592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515cff9ccf9cff9e2eef6d7f9ccf9ccf9d7f6eee2f6d71515f9f9f9 +f91515e2f9cff9ccf9cff9e2eeeee2f9cff9ccf9cff9e2ee4f15c1f9f9f9f91515eee2f6 +d7f9ccf9cff9d7f6eee2f9cff9ccf9cff9e27c154ffefefefefefefefeffffff92d07315 +b1ffffffffff15ffffffffffffffffffffffff1515ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff1592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f2dfeeeef2f6f9f9f9f6eeeedfeeeef6f9f9f9f9f61515f9f9f9 +f91515f9f6f2dfeee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f94f15c1f9f9f9f91515f9f9f9 +f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f987154ffefefefefefefefeffffff92d0ff25 +15ffffffffff15ffffffffff5454ffffffffff1554ffffffff73ffffffffff831554ffff +ffffffb1fff15473ffffffffffff6454e0ffffffff1592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefeffffff92d0ffff +1515ffffffff15ffffff5445d03415d0ffff7315151515151515ffffffff15ffffd015e0 +ff151515ff15541515ffffffa273d0731554ffffff1592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9cff9e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6f91515f9f9f9 +f91515f9eef9cff9d7f9eef9f9f6f9eef9cff9e2f9eef9f94a15c1f9f9f9f91515f9f9f6 +f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef987154ffefefefefefefefeffffff92d0ffff +ff1515ffffff15ffffff73ffffff1515ffffff1554ffffffff15ffffff15ffffffff3415 +ffff5415e0ffffff15ffffff73ffffff5415ffffff1592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffff92d0ffff +ffb11573ffff15ffffffffffffff1515ffffff1554ffffffff15ffff9215ffffffffd015 +ffff9215ffffffff15d0ffffffffffff7315ffffff1592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9eef91515f9f9f9 +f91515f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f94315c1f9f9f9f91515f9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff987154ffefefefefefefefeffffff92d0ffff +ffffff1525ff15ffffff3415ffff1515ffffff1554ffffffff15ffff4515ffffffffff15 +ffff9215ffffffff15d0ffff8325f1ff9215ffffff1592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffff9292ffff +ffffff1515ff15ffffff15ffffff1515ffffff1554ffffffff15ffff5415ffffffffff15 +ffff9215ffffffff15d0ffff15ffffff9215ffffff1592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf987154ffefefefefefefefeffffff9292ffff +ffffffff451515ffffff15ffffff1515ffffff1554ffffffff15ffffff15a2ffffff9215 +ffff5415ffffffff15d0ff9215ffffff1515ffffff1592ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515c4f9c0f9c4f9dce7f2ccf9c0f9c0f9ccf2e7dcf2cc1515f9f9f9 +f91515dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce74f15c1f9f9f9f91515e7dcf2 +ccf9c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dc74154ffefefefefefefefeffffff4573ffff +ffffffffff1515ffffff152592251515ffffff15159273fff115ffffffb115f1ffff15ff +ffff4515ffffffff15c1fff1155492259215ffffff1564ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515dff2dcf9dff9eef6f9e7f9dcf2dcf9e7f9f6eef9e71515f9f9f9 +f91515eef9dff2dcf6dff9eef6f6eef9dff2dcf9dff9eef64f15c1f9f9f9f91515f6eef9 +e7f9dcf6dff9e7f9f6eef9dfeedcf6dff9ee84154ffefefefefefefefeffff54545454ff +ffffffffffb115ffffff8315a2ff545454fffff11545ff54545454ffffff64151525ffff +ff54545454e0ffff545454ffc11564ffb15454ff54545454ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515d4eecff6d4f9e7eef6dcf6cfeecff6dcf6eee7f6dc1515f9f9f9 +f91515e7f9d4eecff2d4f9e7eeeee7f9d4eecff6d4f9e7ee4f15c1f9f9f9f91515eee7f6 +dcf6cff2d4f6dcf6eee7f9d4eacff2d4f9e77c154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515cff9ccf9cff9e2eef6d7f9ccf9ccf9d7f6eee2f6d71515f9f9f9 +f91515e2f9cff9ccf9cff9e2eeeee2f9cff9ccf9cff9e2ee4f15c1f9f9f9f91515eee2f6 +d7f9ccf9cff9d7f6eee2f9cff9ccf9cff9e27c154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f2dfeeeef2f6f9f9f9f6eeeedfeeeef6f9f9f9f9f61515f9f9f9 +f91515f9f6f2dfeee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f94f15c1f9f9f9f91515f9f9f9 +f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9c0f9d7f9e7f9f9f2f9d7f9c0f9d7f9f2f9f9f2f91515f9f9f9 +f91515f9e7f9c0f9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f94715c1f9f9f9f91515f9f9f2 +f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7f987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf987154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf987154ffefefefefefefefeffffd0251525d0 +fffffffffffffffffffffffffff19215ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515c4f9c0f9c4f9dce7f2ccf9c0f9c0f9ccf2e7dcf2cc1515f9f9f9 +f91515dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce74f15c1f9f9f9f91515e7dcf2 +ccf9c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dc74154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffffffffffff15ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffe015ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515dff2dcf9dff9eef6f9e7f9dcf2dcf9e7f9f6eef9e71515f9f9f9 +f91515eef9dff2dcf6dff9eef6f6eef9dff2dcf9dff9eef64f15c1f9f9f9f91515f6eef9 +e7f9dcf6dff9e7f9f6eef9dfeedcf6dff9ee84154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffffffffffff15ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff1554ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515e2eedff6e2f9f2f6f9eaf6dfeedff6eaf9f6f2f9ea1515f9f9f9 +f91515f2f9e2eedff2e2f9f2f6f6f2f9e2eedff6e2f9f2f64f15c1f9f9f9f91515f6f2f9 +eaf6dff2e2f6eaf9f6f2f9e2eadff2e2f9f284154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffffffffffff15ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff1592ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515c0f9bcf9c0f9d7e7f2c8f9bcf9bcf9c8f2e7d7f2c81515f9f9f9 +f91515d7f9c0f9bcf9c0f9d7e7e7d7f9c0f9bcf9c0f9d7e74f15c1f9f9f9f91515e7d7f2 +c8f9bcf9c0f9c8f2e7d7f9c0f9bcf9c0f9d774154ffefefefefefefefeffffff921592ff +ffffffffffffff34151515c1ffffff15ff64151515ffffffff6425921515ffffffb11554 +7315d0ffff34151515ffffffff1573d092ffffb145921515ffffff9225d0e01554151515 +34ffff151515ffffffffffffffffffffffffff +fefefefefefefefe1515f9cff9e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6f91515f9f9f9 +f91515f9eef9cff9d7f9eef9f9f6f9eef9cff9e2f9eef9f94a15c1f9f9f9f91515f9f9f6 +f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef987154ffefefefefefefefeffffff921592ff +ffffffffffff92ffffff7315ffffff1545ffffff2515ffff25fffffffff115ffffff1534 +ffffffff92ffffff7315ffffff1592ffffff1592ffffff7315ffffff1545ffe092ff7315 +ffffffff34ffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffff921592ff +ffffffffffffffffffffff15ffffff15ffffffffff15f1ff15ffffffffff1534ffff1515 +ffffffffffffffffff15ffffff1592ffffff15ffffffffff15b1ffff1583ffffffffff15 +fffffff1ffffffffffffffffffffffffffffff +fefefefefefefefe1515f9c0f9d7f9e7f9f9f2f9d7f9c0f9d7f9f2f9f9f2f91515f9f9f9 +f91515f9e7f9c0f9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f94715c1f9f9f9f91515f9f9f2 +f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7f987154ffefefefefefefefeffffff921592ff +ffffffffffffff641554ff15ffffff15ffffffffff15d09215ffffffffff1515ffff1554 +ffffffffff641592ff15ffffff1592ffffff15ffffffffff1554ffff15d0ffffffffff83 +15ffff15ffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefeffffff921592ff +ffffffffffff34a2ffffff15ffffff15ffffffffff15ff9215ffffffffff1515ffff1554 +ffffffff34a2ffffff15ffffff1592ffffff15ffffffffff1554ffff15d0ffffffffffff +15fff183ffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf987154ffefefefefefefefeffffff921592ff +fffffff192ff15ffffffff15ffffff15ffffffffe092ffff15d0ffffffff15d0ffff1554 +ffffffff15ffffffff15ffffff1592ffffff1554ffffffff15ffffff15d0ffffffffffff +151515ffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefeffffff641592ff +ffffff64d0ff15e0ffff8315ffffff15a2ffffff15ffffff3415ffffffff25ffffff1554 +ffffffff15e0ffd08315ffffff1534ffffff1515ffffffd015ffffff15d0ffffffffffff +5415b1fffefefefefefefefefefefefefefefe +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf987154ffefefefefefefefeffffff54545454 +54545454ffffff1534ffff5454ffd0ff341515ffffffffffff73151515d0ffffe0545454 +54ffffffff1534ffff5454ffffd01515ffffffc1151534ffffffff54545454ffffffffff +ff15fffffefefefefefefefefefefefefefefe +fefefefefefefefe1515d4f9cff9d4f9e7eef6dcf9cff9cff9dcf6eee7f6dc1515f9f9f9 +f91515e7f9d4f9cff9d4f9e7eeeee7f9d4f9cff9d4f9e7ee4f15c1f9f9f9f91515eee7f6 +dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e77c154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff15fffffefefefefefefefefefefefefefefe +fefefefefefefefe1515cff2ccf9cff9e2eef6d7f9ccf2ccf9d7f6eee2f6d71515f9f9f9 +f91515e2f9cff2ccf6cff9e2eeeee2f9cff2ccf9cff9e2ee4f15c1f9f9f9f91515eee2f6 +d7f9ccf6cff9d7f6eee2f9cfeeccf6cff9e27c154ffefefefefefefefeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +d0b1fffffefefefefefefefefefefefefefefe +fefefefefefefefe1515e2eedff6e2f9f2f6f9eaf6dfeedff6eaf9f6f2f9ea1515f9f9f9 +f91515f2f9e2eedff2e2f9f2f6f6f2f9e2eedff6e2f9f2f64f15c1f9f9f9f91515f6f2f9 +eaf6dff2e2f6eaf9f6f2f9e2eadff2e2f9f284154ffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefeffffff +23fffffffefefefefefefefefefefefefefefe +fefefefefefefefe1515c0f9bcf9c0f9d7e7f2c8f9bcf9bcf9c8f2e7d7f2c81515f9f9f9 +f91515d7f9c0f9bcf9c0f9d7e7e7d7f9c0f9bcf9c0f9d7e74f15c1f9f9f9f91515e7d7f2 +c8f9bcf9c0f9c8f2e7d7f9c0f9bcf9c0f9d774154ffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe6a5c32 +ebf9f9f9fefefefefefefefefefefefefefefe +fefefefefefefefe1515f9cff9e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6f91515f9f9f9 +f91515f9eef9cff9d7f9eef9f9f6f9eef9cff9e2f9eef9f94a15c1f9f9f9f91515f9f9f6 +f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef987154ffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef9c1f9 +f9f9f9f9fefefefefefefefefefefefefefefe +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefe +fefefefefefefefe1515f9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9eef91515f9f9f9 +f91515f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f94315c1f9f9f9f91515f9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff987154ffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefe +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9cc69154ffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefe +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf987154ffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefe +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf6d154ffefefefefefefefef9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fefefefefefe +fefefefefefefefefefefefefefefefefefefe +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9871515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +15f9f9f9fefefefefefefefefefefefefefefe +fefefefefefefefe1515d4f9cff9d4f9e7eef6dcf9cff9cff9dcf6eee7f6dc1515f9f9f9 +f91515e7f9d4f9cff9d4f9e7eeeee7f9d4f9cff9d4f9e7ee4f15c1f9f9f9f91515eee7f6 +dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e77c1515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +fffffef9fefefefefefefefefefefefefefefe +fefefefefefefefe1515cff9ccf9cff9e2eef6d7f9ccf9ccf9d7f6eee2f6d71515f9f9f9 +f91515e2f9cff9ccf9cff9e2eeeee2f9cff9ccf9cff9e2ee4f15c1f9f9f9f91515eee2f6 +d7f9ccf9cff9d7f6eee2f9cff9ccf9cff9e2d2bcb5c1a5c1a2c1a5c1b5bcc1adc1a5c1a2 +c1adc1bcb5c1adc1a2c1a5c1adc1bcb5c1a5c1a2c1a5c1b5bcbcb5c1a5c1a2c1a5c1b5bc +c1adc1a5c1a2c1adc1b5bcc1adc1a2c1a5c1adc1bcb5c1a5c1a2c1a5c1b5bcbc34151543 +fffffffffefefefefefefefefefefefefefefe +fefefefefefefefe1515f2dfeeeef2f6f9f9f9f6eeeedfeeeef6f9f9f9f9f61515f9f9f9 +f91515f9f6f2dfeee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f94f15c1f9f9f9f91515f9f9f9 +f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f9f9f6eef2dfee +eef6f9f9f9f9f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f9 +f9f6eef2dfeeeef6f9f9f9f9f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f9f9151515ffff +fffffffffffffefefefefefefefefefefefefe +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f15c1f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcf9bc +f9c0eedfcfeec0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf +eec0f9bcf9bcf9c0eecfdfeec0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf581515ffffff +fffffffffffffffffefefefefefefefefefefe +fefefefefefefefe1515f9c0f9d7f9e7f9f9f2f9d7f9c0f9d7f9f2f9f9f2f91515f9f9f9 +f91515f9e7f9c0f9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f94715c1f9f9f9f91515f9f9f2 +f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f9f2f9d7f9c0f9 +d7f9f2f9f9f2f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f9 +f2f9d7f9c0f9d7f9f2f9f9f2f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7151515ffffffff +fffffffffffffffffffffefefefefefefefefe +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bc +f9bceadccceabcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc +eabcf9bcf9bcf9bceaccdceabcf9bcf9bcf9bceadcccf9bcf9bcf9bc6a1515ffffffffff +fffffffffffffffffffffffefefefefefefefe +fefefefefefefefe1515f9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9eef91515f9f9f9 +f91515f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f94315c1f9f9f9f91515f9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9eef9cff9bcf9 +cff9eef9f9eef9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9 +eef9cff9bcf9cff9eef9f9eef9cff9c0f9cff9eef9f9dff9bcf9c0151515ffffffffffff +fffffffffffffffffffffffffffefefefefefe +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc4f15c1f9f9f9f91515dcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bc +f9bceadccceabcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc +eabcf9bcf9bcf9bceaccdceabcf9bcf9bcf9bceadcccf9bcf9bc6a1515ffffffffffffff +fffffffffffffffffffffffffffefefefefefe +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f93f15c1f9f9f9f91515f9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9 +ccf9eaf9f9eaf9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9 +eaf9ccf9bcf9ccf9eaf9f9eaf9ccf9bcf9ccf9eaf9f9dcf9bc151515ffffffffffffffff +fffffffffffffffffffffffffefefefefefefe +fefefefefefefefe1515c4f9c0f9c4f9dce7f2ccf9c0f9c0f9ccf2e7dcf2cc1515f9f9f9 +f91515dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce74f15c1f9f9f9f91515e7dcf2 +ccf9c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce7f2ccf9c4f9c0 +f9ccf2e7dcf2ccf9c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce7 +f2ccf9c4f9c0f9ccf2dce7f2ccf9c0f9c4f9ccf2e7dcf9c46a1515ffffffffffffffffff +fffffffffffffffffffffffefefefefefefefe +fefefefefefefefe1515f9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9eef91515f9f9f9 +f91515f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f94315c1f9f9f9f91515f9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9eef9cff9bcf9 +cff9eef9f9eef9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9 +eef9cff9bcf9cff9eef9f9eef9cff9c0f9cff9eef9f9df151515ffffffffffffffffffff +fffffffffffffffffffefefefefefefefefefe +fefefefefefefefe1515d4eecff6d4f9e7eef6dcf6cfeecff6dcf6eee7f6dc1515f9f9f9 +f91515e7f9d4eecff2d4f9e7eeeee7f9d4eecff6d4f9e7ee4f15c1f9f9f9f91515eee7f6 +dcf6cff2d4f6dcf6eee7f9d4eacff2d4f9e7eeeee7f9d4eecff6d4f9e7eef6dcf6d4eecf +f6dcf6eee7f6dcf6cff2d4f6dcf6eee7f9d4eacff2d4f9e7eeeee7f9d4eecff6d4f9e7ee +f6dcf6d4eecff6dcf6e7eef6dcf6cff2d4f6dcf6eee7151515ffffffffffffffffffffff +fffffffffffffffffefefefefefefefefefefe +fefefefefefefefe1515cff9ccf9cff9e2eef6d7f9ccf9ccf9d7f6eee2f6d71515f9f9f9 +f91515e2f9cff9ccf9cff9e2eeeee2f9cff9ccf9cff9e2ee4f15c1f9f9f9f91515eee2f6 +d7f9ccf9cff9d7f6eee2f9cff9ccf9cff9e2eeeee2f9cff9ccf9cff9e2eef6d7f9cff9cc +f9d7f6eee2f6d7f9ccf9cff9d7f6eee2f9cff9ccf9cff9e2eeeee2f9cff9ccf9cff9e2ee +f6d7f9cff9ccf9d7f6e2eef6d7f9ccf9cff9d7f6ee54151542ffffffffffffffffffffff +fffffffffffffffffefefefefefefefefefefe +fefefefefefefefe1515f2dfeeeef2f6f9f9f9f6eeeedfeeeef6f9f9f9f9f61515f9f9f9 +f91515f9f6f2dfeee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f94f15c1f9f9f9f91515f9f9f9 +f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f9f9f6eef2dfee +eef6f9f9f9f9f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f9 +f9f6eef2dfeeeef6f9f9f9f9f6eeeee7f2eef6f9151515ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515cff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf4f1587f9f9f9f91515dfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcf9bc +f9c0eedfcfeec0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf +eec0f9bcf9bcf9c0eecfdfeec0f9bcf9bcf9c05f1515ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9c0f9d7f9e7f9f9f2f9d7f9c0f9d7f9f2f9f9f2f91515f9f9f9 +f91515f9e7f9c0f9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f980154ff9f9f9f91515f9f9f2 +f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f9f2f9d7f9c0f9 +d7f9f2f9f9f2f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f9 +f2f9d7f9c0f9d7f9f2f9f9f2f9d7f9c8f9d7151515ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabc1515f9f9f9 +f91515ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdcc11515f9f9f9f9151554ccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bc +f9bceadccceabcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdc +eabcf9bcf9bcf9bceaccdceabcf9bcf9bc6a1515e0ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515f9f9f9 +f91515f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9ea1515f9f9f9f9f9151579ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9 +ccf9eaf9f9eaf9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9 +eaf9ccf9bcf9ccf9eaf9f9eaf9ccf9bc151515e0ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec01515f9f9f9 +f91515a5f9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfee1f156af9f9f9f9791515ee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcf9bc +f9c0eedfcfeec0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdf +eec0f9bcf9bcf9c0eecfdfeec0f9bc6a1515e0ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf91515c1f9f9 +f9401587dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf91515ebf9f9f9f9151515 +b3ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9 +ccf9eaf9f9eaf9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9 +eaf9ccf9bcf9ccf9eaf9f9eaf9cc151515dfffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515c4f9c0f9c4f9dce7f2ccf9c0f9c0f9ccf2e7dcf2cc151587f9f9 +f979154ff9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce7f2cc151515f9f9f9f9f91515 +15b3c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce7f2ccf9c4f9c0 +f9ccf2e7dcf2ccf9c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce7 +f2ccf9c4f9c0f9ccf2dce7f2cc151515dfffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515f9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9eef915154ff9f9 +f9dd1515dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9eef9971515cef9f9f9f9f940 +151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515dfffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe1515b1eedff6e2f9f2f6f9eaf6dfeedff6eaf9f6f2f9ea151515f9f9 +f9f91515f9e2eedff2e2f9f2f6f6f2f9e2eedff6e2f9f2f6f9eaf62a1515ebf9f9f9f9f9 +dd1515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +1515151515151515151515151515dfffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe40156df9bcf9c0f9d7e7f2c8f9bcf9bcf9c8f2e7d7f2c8151515f9f9 +f9f91515f9c0f9bcf9c0f9d7e7e7d7f9c0f9bcf9c0f9d7e7f2c8f9c0151515f9f9f9f9f9 +f9f9c14f1515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +15151515151515151515151515dfffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefe87154fcff9e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6f9741515f9f9 +f9f91515eef9cff9d7f9eef9f9f6f9eef9cff9e2f9eef9f9f6f9e2f9cf151515cef9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefec11515f9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabceb1515f9f9 +f9f91515a4bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9b3151515ddf9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefef91515c0f9d7f9e7f9f9f2f9d7f9c0f9d7f9f2f9f9f2f9d71515ebf9 +f9f9b31515f9c0f9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f9f2f9d7f9c0f9d72315151596 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefef91515f9bcf9bcf9ccdceabcf9bcf9bcf9bceadccceabcf92a156af9 +f9f9f91515b3f9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bcf9bc98151515 +154fc1f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefef9151569f9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf9cceb1515f9 +f9f9f9791515bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9eb15 +151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +1515151515151515feffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefef9151532bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfeec0f9bc1515ce +f9f9f9f91515ebbcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfee +c05c15151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +15151515151515feffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefef9321515f9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf9ccf97d1515 +f9f9f9f9151515f9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9 +ccf9eaf9f9eaf9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9 +eaf9cc151515feffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefef9961515cff9d4f9e7eef6dcf9cff9cff9dcf6eee7f6dcf9cff91515 +f9f9f9f96a1515cff9d4f9e7eeeee7f9d4f9cff9d4f9e7eef6dcf9d4f9cff9dcf6eee7f6 +dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e7eeeee7f9d4f9cff9d4f9e7eef6dcf9d4f9cf +f9dcf6eee7f6dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e7eeeee7f9d4f9cff9d4f9e7ee +f6dc151515fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefefdf91515f9dcf9e7f9f9f2f9dcf9c4f9dcf9f2f9f9f2f9dcf9cc1515 +b3f9f9f9f9151523ccf9e7f9f9f2f9e7f9c4f9dcf9e7f9f9f2f9dcf9c4f9dcf9f2f9f9f2 +f9dcf9ccf9dcf9f2f9f9e7f9c0f9ccf9e7f9f9f2f9e7f9c4f9dcf9e7f9f9f2f9dcf9c4f9 +dcf9f2f9f9f2f9dcf9ccf9dcf9f2f9f9e7f9c0f9ccf9e7f9f9f2f9e7f9c4f9dcf9e7f9f9 +f2151515fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefffff9151595eee2f6f2f6f9eaeedfdfdfeeeaf9f6f2f9eaeedfe76315 +15f9f9f9f9eb1515cae2f6f2f6f6f2f6e2dfdfeee2f6f2f6f9eaeee2dfdfeeeaf9f6f2f9 +eaeedfe7e2eeeaf9f6f2f6e2dcdfe7e2f6f2f6f6f2f6e2dfdfeee2f6f2f6f9eaeee2dfdf +eeeaf9f6f2f9eaeedfe7e2eeeaf9f6f2f6e2dcdfe7e2f6f2f6f6f2f6e2dfdfeee2f6f2f6 +151515fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefffffffff979151ff9c0f9d7e7f2c8f9bcf9bcf9c8f2e7d7f2c8f9bcf9c015 +15ddf9f9f9f9321515c0f9d7e7e7d7f9c0f9bcf9c0f9d7e7f2c8f9c0f9bcf9c8f2e7d7f2 +c8f9bcf9c0f9c8f2e7d7f9c0f9bcf9c0f9d7e7e7d7f9c0f9bcf9c0f9d7e7f2c8f9c0f9bc +f9c8f2e7d7f2c8f9bcf9c0f9c8f2e7d7f9c0f9bcf9c0f9d7e7e7d7f9c0f9bcf9c0f9d758 +1515fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefffffffffffffff91515e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6f9e2f9d7f9b9 +1515f9f9f9f9f91515b3eef9f9f6f9eef9cff9e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6 +f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef9f9f6f9eef9cff9e2f9eef9f9f6f9e2f9cff9 +e2f9f6f9f9f6f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef9f9f6f9eef9cff9e2f9ee1515 +15fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefffffffffffffffff9151579bcf9ccdceabcf9bcf9bcf9bceadccceabcf9bcf9bcf9 +1515f9f9f9f9f94f1515f9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bc +f9bceadccceabcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bc6a1515 +fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefeffffffffffffffffeb1515f9dff9f9eef9cff9bcf9cff9eef9f9eef9cff9c0f9cf +6a1515f9f9f9f9f95c1515f9f9eef9dff9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9eef9cff9bcf9 +cff9eef9f9eef9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cf151515fd +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefffffffffffffffff91515bcf9ccdceabcf9bcf9bcf9bceadccceabcf9bcf9bcf9 +bc151532f9f9f9f9f915153fdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bc +f9bceadccceabcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bc6a1515fdff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefeffffffffffffffffff151596dcf9f9eaf9ccf9bcf9ccf9eaf9f9eaf9ccf9bcf9cc +f9ea1515ebf9f9f9f9f9151515eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9 +ccf9eaf9f9eaf9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bc151515fdffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefeffffffffffffffff961515f9cfdfeec0f9bcf9bcf9c0eedfcfeec0f9bcf9bcf9 +c0ee151515f9f9f9f9f9eb15158dcff9bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcf9bc +f9c0eedfcfeec0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bc6a1515fdffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefffffffffffffffffa15155ef9f9eaf9ccf9bcf9ccf9eaf9f9eaf9ccf9bcf9cc +f9eaf9231515f9f9f9f9f9ce151515dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9 +ccf9eaf9f9eaf9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dc151515fcffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefeffffffffffffffffa41515e7eef6dcf9cff9cff9dcf6eee7f6dcf9cff9d4f9 +dcf6eee7151515f9f9f9f9f9ce151540d4f9cff9d4f9e7eef6dcf9d4f9cff9dcf6eee7f6 +dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e7eeeee7f9d4f9cff9d4f9e7eef6dcf9d4f9cf +f9dcf6eee7f6dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e7eeeee7151515fcffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefffffffffffffffffb1515f9f9f2f9dcf9c4f9dcf9f2f9f9f2f9dcf9ccf9dc +f9f2f9f9bb151540f9f9f9f9f9eb1515154ef9dcf9e7f9f9f2f9dcf9c4f9dcf9f2f9f9f2 +f9dcf9ccf9dcf9f2f9f9e7f9c0f9ccf9e7f9f9f2f9e7f9c4f9dcf9e7f9f9f2f9dcf9c4f9 +dcf9f2f9f9f2f9dcf9ccf9dcf9f2f9f9e7f9c0f9ccf9e7f9f9f2151515fcffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefeffffffffffffffffff151532f9f9f6eeeedfeeeef6f9f9f9f9f6eeeee7f2ee +f6f9f9f9f69c151540f9f9f9f9f9f915151587eef2f6f9f9f9f6eef2dfeeeef6f9f9f9f9 +f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f9f9f6eef2dfee +eef6f9f9f9f9f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f9f9151515fcffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefeffffffffffffffffdd1515dfeec0f9bcf9bcf9c0eedfcfeec0f9bcf9bcf9 +c0eedfcff9bc6a1515ebf9f9f9f9f9eb15151515bcf9cfdfeec0f9bcf9bcf9c0eedfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcf9bc +f9c0eedfcfeec0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cf581515fcffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefeffffffffffffffff6a1515f2f9d7f9c0f9d7f9f2f9f9f2f9d7f9c8f9d7 +f9f2f9f9e7f9c06a151523f9f9f9f9f9f9eb15151515f9f9f2f9d7f9c0f9d7f9f2f9f9f2 +f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f9f2f9d7f9c0f9 +d7f9f2f9f9f2f9d7f9c8f9d7f9f2f9f9e7f9bcf9c8f9e7151515fcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +fefefefefefefefffffffffffffffffb1515eabcf9bcf9bcf9bceadccceabcf9bcf9bcf9 +bceadcccf9bcf9bc6a1515a4f9f9f9f9f9f9f9231515154aeabcf9bcf9bcf9bceadcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bc +f9bceadccceabcf9bcf9bcf9bceadcccf9bcf9bcf9bc6a1515fcffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd4ffffffffffffffff321515f9cff9bcf9cff9eef9f9eef9cff9c0f9cf +f9eef9f9dff9bcf9c0a4151515f9f9f9f9f9f9f9f94f1515151566f9bcf9cff9eef9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9eef9cff9bcf9 +cff9eef9f9eef9cff9c0f9cff9eef9f9dff9bcf9c0151515fbffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd091fffffffffffffffb151569f9bcf9bcf9bceadccceabcf9bcf9bcf9 +bceadcccf9bcf9bcf9bcdd151515ddf9f9f9f9f9f9f9c115151515151573f9bceadcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bc +f9bceadccceabcf9bcf9bcf9bceadcccf9bcf9bc6a1515ddffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015fffffffffffffffff21515ccf9bcf9ccf9eaf9f9eaf9ccf9bcf9cc +f9eaf9f9dcf9bcf9bcf9dcf932151523f9f9f9f9f9f9f9f9f9eb15151515151515151515 +154340151515151515151515151515151515151515151515151515151515151515151515 +15151515151515151515151515151515151515151515dcffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffffffff15154fc0f9c0f9ccf2e7dcf2ccf9c0f9c4f9 +ccf2e7dcf9c4f9c0f9c4f9dce7231515156af9f9f9f9f9f9f9f9f9f9b315151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515dcffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015fffefffffffffffffffd15154fbcf9cff9eef9f9eef9cff9c0f9cf +f9eef9f9dff9bcf9c0f9dff9f9eef91515151523f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9c1 +c18787c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1 +c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1edffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffffffffffb41515c3dff6eaf9f6f2f9eaf6dff2e2f6 +eaf9f6f2f9e2eedff2e2f9f2f6f6f2f98d151515156af9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9feffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffffffffffff151515f9dcf9f2f9f9f2f9dcf9ccf9dc +f9f2f9f9e7f9c4f9ccf9e7f9f9f2f9e7f9c4eb231515151579f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9feffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015fffffffffffffffffffffffd151523eef6f9f9f9f9f6eeeee7f2ee +f6f9f9f9f6f2dfeee7f2f6f9f9f9f9f6f2dfeeeeab15151515151587ebf9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9feffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffffffffffffffc515156ac0eedfcfeec0f9bcf9bcf9 +c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf998151515151515151587c1f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9feffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015fffffffffffffffffffffffffff51515cef2f9f9f2f9d7f9c8f9d7 +f9f2f9f9e7f9c0f9c8f9e7f9f9f2f9e7f9c0f9d7f9e7f9f9f2f986231515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515dcffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffffffffffffffffff151515e0dccceabcf9bcf9bcf9 +bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bcb33f15151515 +151515151515151515151515151515151515151515151515151515151515151515151515 +1515151515151515151515151515dcffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffffffffffffffffffff6a1515f9f9eaf9ccf9bcf9cc +f9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9 +ccf9eaf9f9eaf9ccf9bc151515dbffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015fffffffffffffffffffffffffffffffe151515cfeec0f9bcf9bcf9 +c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcf9bc +f9c0eedfcfeec0f9bca41515dbffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015fffffffffffffffffffffffffffffffffd231515eaf9ccf9bcf9cc +f9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9 +ccf9eaf9f9eaf9cc151515dbffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff15fffffffffffffffffffe151515ccf9c0f9c4f9 +ccf2e7dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce7f2ccf9c4f9c0f9ccf2e7dcf2 +ccf9c0f9c4f9ccf2e7dcf9c4f9c0f9c4f9dce7e7dcf9c4f9c0f9c4f9dce7f2ccf9c4f9c0 +f9ccf2e7dcf2cc151515afffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515ffffffffffffffffffff231515c5f9c0f9cf +f9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9eef9cff9bcf9 +cff9eef9f9ee151515aeffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff15156affffffffffffffffffff151515c0f2e2f6 +eaf9f6f2f9e2eadff2e2f9f2f6f6f2f9e2eedff6e2f9f2f6f9eaf6e2eedff6eaf9f6f2f9 +eaf6dff2e2f6eaf9f6f2f9e2eadff2e2f9f2f6f6f2f9e2eedff6e2f9f2f6f9eaf6e2eedf +f6eaf9f6f2151515aeffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff15151515ffffffffffffffffffff6b151515f9e7 +f9f6f9f9eef9d4f9dcf9eef9f9f6f9eef9d4f9e7f9eef9f9f6f9e7f9d4f9e7f9f6f9f9f6 +f9e7f9dcf9e7f9f6f9f9eef9cff9dcf9eef9f9f6f9eef9d4f9e7f9eef9f9f6f9e7f9d4f9 +e7f9f6f9151515ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff15151515ceffffffffffffffffffff23151523e2 +f9f6f9f9eef9cff9d7f9eef9f9f6f9eef9cff9e2f9eef9f9f6f9e2f9cff9e2f9f6f9f9f6 +f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef9f9f6f9eef9cff9e2f9eef9f9f6f9e2f9cff9 +e2f9f6151515aeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515feffffffffffffffffffff40151515 +bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bc +f9bcc01515aeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffffffffffffffff1515 +1539f9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9eef9cff9bcf9cff9eef9f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cff9dff9f9eef9cff9bcf9 +cf231515aeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515fffffeffffffffffffffffffffff23 +151534ccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bcf9bceadcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcf9ccdceabcf9bcf9bc +ce1515aeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffffffffffffffffffff +cc15151559f9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bc23 +1515adfffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffffffffffffffffffff +ffff15151515c1bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcf9bcf9c0eedfcfee +c0f9bcf9bcf9c0eedfcff9bcf9bcf9bcf9cfdfdfcff9bcf9bcf9bcf9cfdfeec0f9bcce15 +15adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffffffffffffffffffff +ffffffff1515151569f9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9ccf9bcf9ccf9eaf9f9ea +f9ccf9bcf9ccf9eaf9f9dcf9bcf9bcf9dcf9f9eaf9dcf9bcf9ccf9dcf9f9eaf9cc231515 +adfffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515fffffffffffffffdffffffffffffff +ffffffffff4f15151523ebe7eeeee7f9d4f9cff9d4f9e7eef6dcf9d4f9cff9dcf6eee7f6 +dcf9cff9d4f9dcf6eee7f9d4f9cff9d4f9e7eeeee7f9d4f9cff9d4f9e7eef6dc231515ad +fffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1588ffffffffffff +ffffffffffffffa8151515154ff2f9e7f9c4f9dcf9e7f9f9f2f9dcf9c4f9dcf9f2f9f9f2 +f9dcf9ccf9dcf9f2f9f9e7f9c0f9ccf9e7f9f9f2f9e7f9c4f9dcf9e7f9f9f2231515adff +fffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffffff +ffffffffffffffffff32151515155cf6f2dfeeeef2f6f9f9f9f6eef2dfeeeef6f9f9f9f9 +f6eeeee7f2eef6f9f9f9f6f2dceee7f2f6f9f9f9f9f6f2dfeeeef2f6f9f9231515adffff +fffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffffff +ffffffffffffffffffffffe2231515151515cee7eeeef6f9f6f2e7eed4eae7f2f6f9f6f6 +f2e7eadceee7f2f6f9f6eeeecfeadceeeef6f9f6f6eeeed4eae7eeeef6231515ffffffff +fffffffffffdfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffffff +ffffffffffffffffffffffffffc92315151515156ae0f9f9f6f9e2f9cff9e2f9f6f9f9f6 +f9e2f9d7f9e2f9f6f9f9eef9ccf9d7f9eef9f9f6f9eef9cff9e2f9ee231515acffffffff +fffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515fffffffffffe +ffffffffffffffffffffffffffffffed401515151515153cc0bcf9bcf9bcf9bceadcccea +bcf9bcf9bcf9bceadcccf9bcf9bcf9bcf9ccdcdcccf9bcf9bcf9bcce1515acffffffffff +fffffffff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +96fffffffffffffffffffffffffffffffffffff9321515151515151515151f878bc1f9ee +f9cff9c0f9cff9eef9f9dff9bcf9c0f9dff9f9eef9dff9bcf9cf231515acffffffffffff +fffffdfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffffffffffffffffffffffffffffffffffea7a151515151515151515151515 +15151515151515151515151515151515151515151515151515151515acffffffffffffff +fffcf9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92fffffffffffffffffffffffffffffffffffffffffffffffffffffffdc5964f23151515 +151515151515151515151515151515151515151515151515151515acffffffffffffffff +fafbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffefdfcfbfaf9f9f9fafafafbfbfbfdfdfdfefefefffffffffffffffffffff9 +f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff5415eaffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9fb +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff54151515e6ffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef9f9ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf9f9ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf9f9ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf9f9ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffffacfaffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffe687 +c1c1c1c1ffffffffffffc1c1f1ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff +ffffffffffffffd015ffffffffffffff1515151515ffffffffffffff1515ffffffffff15 +92ffffffffffff541515151554ffffffffffff5415ffffffffff1515ffffffffffffd015 +15151515ffffffffffff1515d0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer diff --git a/executable_names/doc/common/Rule_and_address.ps b/executable_names/doc/common/Rule_and_address.ps new file mode 100644 index 0000000000000000000000000000000000000000..587d2bb8fadeca313ecbae7e86df26f83cd889a4 --- /dev/null +++ b/executable_names/doc/common/Rule_and_address.ps @@ -0,0 +1,11341 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/henshaw/reviewAndRelease/Rule_and_address.ps +%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley +%%BoundingBox: -187 667 1413 918 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 1600 string def + +% define space for color conversions +/grays 1600 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +-187 667 translate + +% size of image (on paper, in 1/72inch coords) +1599.98400 250.99200 scale + +1600 251 8 % dimensions of data +[1600 0 0 -251 0 251] % mapping matrix +{currentfile pix readhexstring pop} +image + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe380 +72c6fffffffffffffffffffffffffff1e3c6c6c6e3ffffffffffffffffffffffffffffff +fffffff1c69ce3ffffffffffffffffffffffffffffff9c72c6ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +8e1d395656481d39ffffffffff8e1d5656481d8effffffffffffffffffffffffffffffff +ff8e80ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffd456c6ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff481d +1d8efffffffffffffffffffffff1801d1d1d1d1d1d1d72c6ffffffffffffffffffffffff +ffe3391d1d1dc6ffffffffaa64e3ffffffffffffff721d1d8effffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffff1729cffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +f1e3c6391d56c6e3fffffffffff1e3b82b9ce3f1ffffffffffffffffffffffffffffffff +aa1d1dd4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff561d48ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809cd4 +aab8ffffffffffffffffffe3721d72c6e3ffffffd49c391db8ffffffffffffffffffffff +ffffe3d41d1dc6ffffffff1d1d80ffffffffffff8080c6aab8ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e1d1de3ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff561d80ffffffffffffffffffff39e3ffffffffffffffffffffffffffffffffffff +c61d1de3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff641d56ffffffffffaa1dffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e48ffff +ffffffffffffffffffffd42b1db8ffffffffffffffffaa1de3ffffffffffffffffffffff +ffffffff1d1dc6ffffffff391d8effffffffff8e48ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c1d2bffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff641d8effffffffffffffffffff56e3ffffffffffffffffffffffffffffffffffff +ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe3b8e3ffffffffb81d2bffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe31d56ffff +ffffffffffffffffffff481d8effffffffffffffffffe31df1ffffffffffffffffffffff +ffffffff1d1dc6ffffffffe3b8f1ffffffffe31d56ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8d4ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d8effffffffffffffffffff56e3ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffaa1d56ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa1d56ffff +ffffffffffffffffff8e1d56ffffffffffffffffffffe38effffffffffffffffffffffff +ffffffff391dc6ffffffffffffffffffffffaa1d56ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d8effffffffffffffffffff56e3ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffe3c6ffffffffffffffffff +ffffffffffffffffffffc6d4ffffffffffffffffffffffffffaa1d56ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffe3c6e3ffffffffffffffaa1d56ffff +ffffffffffffffffff481dd4ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff561de3ffffffffffffffffffffffaa1d56ffffffffffffffffffe3c6f1ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d8effffffffffffffffffff56e3ffffd49c8039aaff642b1d2b64d4fffff1aa +8e6439e3ffe3725656567272ffffb880565680ffffffe39c6480643956b8ffffe3aa8048 +b8e3641d56ffffd464808e803948e3ffd4aa804856ffffffff8e1d489caaaae356565664 +80b8ffff806456569cffffffffffffffffffe38064727248488ee3ffffffff8e1d489caa +b8ffffffffffffffe31d2bfffffffffffffffffffffffffffffffff1aa561d1d1d64c6ff +ffffffff561de3ffffc69c72488effffffff8e1d489caab8ffffffe3646472723956b8ff +ffffffb8805672ff8e1d1dc6b89c641de3d4561d1d3980f1ffffe3aa8e642bffffffffff +b8641d1d1d56b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d8effffffffffffffffffff56e3ffffaa641d1d8e2b648e561d1d56ffffe38e +641d1de3ffffffaa1d1de3ffffffffff1d56ffffffff4839f1ffffd41d1dffffc664391d +c6641d1d56ffe31d80ffffffff39c6ffb88e391d56ffffc62b1d1d1d1d1d39ffff391d72 +ffffffffffff1dc6ffffffffffffffffffd41d72ffffffff481d64ffffe3391d1d1d1d1d +56ffffffffffffff8e1d39ffffffffffffffffffffffffffffffff6448e3ffe3391d39ff +ffffffff561de3ffffaa8e1d1d8effffff801d1d1d1d1d56fffff1399cffffffe31d1d9c +ffffff80391d72c61d1d1db88e481d1d9c2b80802b1d1d8effffd48e561d1dffffffffb8 +48d4ffff801d1dc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d8effffffffffffffffffff56e3ffffffff481d56e3ffffff9c1d1df1ffffff +e31d1de3ffffffe32b1db8ffffffffe31daaffffff481de3ffffffff801d9cffffff8e1d +648ee3b880ff8e1daaffffffff80c6ffffff8e1d56fffff1e39c1d80e3e3e3ffff801d48 +ffffffffff8e48ffffffffffffffffffff481de3ffffffffc61d1d8effffe38e1d48e3e3 +e3ffffffffffffff8e1d48ffffffffffffffffffffffffffffffff64f1ffffffe31d1db8 +ffffffff561de3ffffffff561d8effffffe39c1d48e3e3e3ffe33939ffffffffff8e1d2b +e3ffffff8e1d4864c6c62be3ffe31d1d80f1ffffff641d48ffffffffc61d1dffffffffaa +aaffffffff481d80ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d8effffffffffffffffffff56e3ffffffff561d9cffffffffff1d1dd4ffffff +e31d1de3ffffffff721d64ffffffff8056ffffffaa1d56ffffffffffc61d72ffffff8e1d +64ffffffffff801d64e3fffffff1ffffffff8e1d56ffffffffaa1d8effffffffffe31d1d +c6ffffffe31db8ffffffffffffffffffb81d72ffffffffffff801d1de3ffffaa1d56ffff +ffffffffffffffff8e1d39ffffffffffffffffffffffffffffffffffffffffffff561d8e +ffffffff561de3ffffffff561d8effffffffaa1d56ffffffff801d80fffffffffff12b1d +48ffffff8e1d48ffffffffffffff1d1de3ffffffffc61d1dffffffffc61d1dffffffffff +ffffffffff8e1d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d8effffffffffffffffffff56e3ffffffff561daaffffffffff1d1dc6ffffff +e31d1de3ffffffffb81d1df1ffffff56f1ffffff801d39b8c6c6c6c6c61d56ffffff8e1d +c6ffffffffffb81d1d1d56c6ffffffffffff8e1d56ffffffffaa1d8effffffffffff801d +39ffffff9c2bf1ffffffffffffffffff8e1d8effffffffffffd41d1d9cffffaa1d56ffff +ffffffffffffffffaa1d1dfffffffffffffffffffffffffffffffffffffff1aa561d1d8e +ffffffff561de3ffffffff561d8effffffffaa1d56ffffffff561d8effffffffffff641d +1de3ffff8e1d72ffffffffffffff1d1de3ffffffffc61d1dffffffffc61d1dffffffffff +fffff1b872391d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d8effffffffffffffffffff48e3ffffffff561daaffffffffff1d1dc6ffffff +e31d1de3ffffffffff391d80ffffc664ffffffff721d398e8e8e8e8e8e8ec6ffffff8e1d +c6fffffffffff180391d1d1d2b64c6ffffff8e1d56ffffffffaa1d8efffffffffffff12b +1dc6ffff64b8ffffffffffffffffffff721d8effffffffffffff1d1daaffffaa1d56ffff +ffffffffffffffffe31d1d8effffffffffffffffffffffffffffffc68048648ec6481d8e +ffffffff561de3ffffffff561d8effffffffaa1d56ffffffff391d8effffffffffff8e1d +1de3ffff8e1d72ffffffffffffff1d1de3ffffffffc61d1dffffffffc61d1dfffffffff1 +8048568eaa721d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d80ffffffffffffffffffff39ffffffffff561daaffffffffff1d1dc6ffffff +e31d1de3ffffffffffb81d1de3ff39b8ffffffff721d56ffffffffffffffffffffff8e1d +c6ffffffffffffffffc6721d1d1d1de3ffff8e1d56ffffffffaa1d8effffffffffffff64 +1d8efff148ffffffffffffffffffffff721d72ffffffffffffff1d1db8ffffaa1d56ffff +ffffffffffffffffff561d1dfffffffffffffffffffffffffffff12b1dd4ffffff561d8e +ffffffff561de3ffffffff561d8effffffffaa1d56ffffffff391d80ffffffffffff8e1d +1de3ffff8e1d72ffffffffffffff1d1de3ffffffffc61d1dffffffffc61d1dffffffff80 +1dd4ffffff8e1d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff9c1d64fffffffffffffffffff12bffffffffff561daaffffffffff1d1dc6ffffff +e31d1de3ffffffffffff481d9cc639ffffffffff8e1d2bffffffffffffffffffffff8e1d +c6fffffffffff1ffffffffe3b82b1db8ffff8e1d56ffffffffaa1d8effffffffffffffaa +1d39ff649cffffffffffffffffffffff9c1d39f1ffffffffffff1d1dd4ffff9c1d56ffff +ffffffffffffffffffaa1d1d8effffffffffffffffffffffffff481d8effffffff561d8e +ffffffff481dc6ffffffff561d8effffffff9c1d56ffffffff641d56ffffffffffff801d +48ffffff8e1d72ffffffffffffff1d1de3ffffffffc61d1dffffffffc61d1dffffffe31d +80ffffffff8e1d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffe31d2bb8ffffffffffffffe34864ffffffffff561daaffffffffff1d1dc6ffffff +e31d1de3ffffffffffff9c1d4864e3ffffffffffd41d1d64ffffffffffffffffffff8e1d +aaffffffffff8eb8ffffffffff721dc6ffff8e1d56ffffffffaa1d80ffffffffffffffff +391d8039e3ffffffffffffffffffffffd41d1db8ffffffffff8e1d8effffff8e1d56ffff +ffffffffffffffffffff641d1d64e3ffffffffffffffffffffe31d1db8ffffffe32b1d8e +ffffffff1d1dc6ffffffff561d8effffffff8e1d56ffffffff9c1d1de3ffffffffff391d +e3ffffff8e1d64ffffffffffffff1d1de3ffffffffc61d1dffffffffc61d1dffffffaa1d +80ffffffff561d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffff641d1d8effffffffffe3481dd4ffffffffff481daaffffffffff1d1dc6ffffff +e31d1de3fffffffffffff11d1d56ffffffffffffff801d1d8effffffffe3b8ffffff8e1d +8effffffffff8e80ffffffffff5639ffffff8e1d56ffffffffb81d2bf1ffffffffffffff +aa1d1daaffffffffffffffffffffffffff481d56ffffffffe31d56ffffffff8e1d56ffff +ffffffffffffffffffffff561d1d39e3fffffffffffff1729cff1d1d39ffffe364481d8e +ffffffff1d1dc6ffffffff561d8effffffff8e1d56fffffffff12b1d8effffffffaa1d8e +ffffffff8e1d56ffffffffffffff1d1de3ffffffffc61d1dffffffffc61d1dffffffc61d +48ffffff80561d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffe3561d1d2b485656391d56d4ffffffffd4b82b1d64aae3ffffff1d1d80b8e3c6 +8e1d1d80b8e3ffffffffff801d9cffffffffffffffff801d1d5680805656e3ffd4aa561d +489caaffffff801d9ce3e3d48056e3ffe3b8561d2baad4ffffe31d1d395680ffffffffff +ff3939ffffffffffffffffffffffffffffd4481d56b8e3c65664e3ffffe3c6561d2b9caa +e3ffffffffffffffffffffffaa481d1d56648e8e80564872e3ffb81d1d395664e3561d48 +aaffc6aa1d1d80aaf1d4b8391d56aad4ffc6561d2b8eaae3ffffe3481d80c6e3b8488ef1 +fffff1aa561d399caafffff1c69c1d1d8eb8e3ffffb81d1d8eb8e3c6801d1d9cb8ffff56 +1d2b5656b88e1d48aae3ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffd4722b1d1d2b72d4ffffffffffffaa8e8e8e8e8ec6ffffe38e8e8e8ec68e +8e8e8e8e8ee3ffffffffffff56e3fffffffffffffffffff1802b1d64c6ffffffb88e8e8e +8e8e8ef1ffffc68e561d1d48aaffffffb88e8e8e8e8eaaffffffc656568ef1ffffffffff +ff7280ffffffffffffffffffffffffffffffff9c2b1d1d48d4ffffffffc68e8e8e8e8e8e +e3ffffffffffffffffffffffffffe3642b1d1d1d64aaffffffffffc664569cffffaa8e8e +8eff8e8e8e8e8e8ee3aa8e8e8e8e8eb8ff8e8e8e8e8e8ee3ffffffff721d1d1d64f1ffff +ffffe38e8e8e8e8e8ee3fff18e8e8e8e8e8ee3ffffd48e8e8e8ed48e8e8e8e8e8ee3fff1 +805680ffffc68e8e8ed4ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff80c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f156ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +728effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6 +1de3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c8eaa39 +8effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff641d1d72 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe39ce3ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffe3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffff1f1ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +e38e8eaaaaaa8e8effffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffc68eaaaaaa9c8ee3ffffffffffffffffffffb8e3ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffd48e8e9c8eb8ffffffffffffffffd48e8e +9c8e9cffffffffffffffffffffffffffffffffffffffffffffffffb8e3ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +d48e724872ffffffffffffffffff8e8eaaaaaa9c8ef1ffffffffffffffffffffffffffff +fffffffff19c80481dc6ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffe3c6481d39c6e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffff1d4641d1d80e3f1ffffffffffffffffff8e1d1df1ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffff1e38e1d1d1daafffffffffffffff1e38e +39c6e3ffffffffffffffffffffffffffffffffffffffffffffffb81d1dd4ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f1e38e1d72ffffffffffffffffffe3d4481d2bb8e3ffffffffffffffffffffffffffffff +ffffffffffe3d41d1dc6ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffc61d1dc6ffffffffffffffffffffff9c1d2bffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffe31d1d1d2bffffffffffffffffffc6 +56ffffffffffffffffffffffffffffffffffffd439c6ffffffffb81d1de3ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffc61d72ffffffffffffffffffffff641d56ffffffffffffffffffffffffffffffffff +ffffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff728effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffc61d1dc6ffffffffffffffffffffffffc6e3ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffe31d721d1d80ffffffffffffffffc6 +56ffffffffffffffffffffffffffffffffffc61d1dc6ffffffffffc6e3ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffc61d72ffffffffffffffffffffff721d56ffffffffffffffffffffffffffffffffff +ffffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffe32b1d9cffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffc61d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffe31dc69c1d1daaffffffffffffffd4 +56ffffffffffffffffffffffffffffffffffc61d1de3ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffc61d72ffffffffffffffffffffff721d56ffffffffffffffffffffffffffffffffff +ffffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffe31d1dc6ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3e3ffffffffffff +ffffffffffffffffffffffffffffffffffffffe3e3f1ffffffffffffffffe3ffffffffff +ffffffffffffffffc61d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffe3e3ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffe3e3ffffffffffffffffffffffffffff +ffffffffffffffe3f1ffffffffffffffffffffffffe31dc6ff721d1dc6ffffffffffffe3 +56ffffffffffffffffffffffffffffffffffc61d1de3ffffffffffffffffffffffffffff +ffffe3f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff1d80ffffffffffffffffffffff721d56ffffffffffffffffffffffffffffffffff +ffffffffffffff1d1de3ffffffffffffffffffffffffffffffe3e3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffe31d1dc6ffffffffffffffffffe3e3ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffe38e481d1d3980f1ffffb86456566480b8ff +ffff9c9cffffffe3805656729ce3aa8e6456f1722b1daaffffc6726480643980e3ffe39c +8e4856ff722b1d1d48b8ffffffffffffe38048391d1d48c6ffffe38e6472723948d4ffff +ffffffffffffffffc61d1dc6ffffffffffffffffffe3aa8e561dffffe36456565680c6ff +ff8e8056568effffffe3806480643980ffffffc68e6448ffb8391d8ef1b88e6480f1802b +1d2b72e3ffb8391d1d489cffffffffffffe3646480643956b8ffffffd4aa80488ec6561d +1de3ffffaa6472804848aaffffffffffffffffffffe31dc6ffff561d1db8ffffffffffe3 +56ffffffffffe38e481d1d3980f1ffffffff8e1d1d9caaaae39c9c561de3fffffffff18e +646472483964e3ffffe3aa8e568eff80391d1d56c6ffffffffffd480391d1d488effffff +ffffff1d8effffffffffffffffffffff721d56fffffffffffffffffffffffff19c391d1d +2b64ffffffffff391de3d4641d1d2b64c6ffffffffffb8646480641d56d4ffffffe39c80 +48aae3481d56ffffffc6561d1d1d48c6ffffffffc61d1d80aaaad4ffffffb8646480641d +56d4ffffffd49c7239e3d4391d72b85656566480c6ffff726456568effffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffd41d80ffff8e1d1d56ffffffff391d8effffff +ffff5664ffffffffff5639ffffd472391d568e1d1d1daaffd41dc6ffffff801d72ffd464 +1d1d5680648e721d1d1dc6ffffffffe31d8effffff561dc6ffff2b64ffffffff4839ffff +ffffffffffffffffc61d1dc6ffffffffffffffffffd48e561d1dffffffff2b1d1dffffff +ffffe31dc6fffffff1399cffffffb81d56ffff9c481d39ff391d1d8ee380391d6448568e +721d1d72d448aaaa391d1de3fffffffff139aaffffffe31d1d9cffffb8562b1d8e561d1d +1de3ff9c48e3ffffff481daaffffffffffffffffffe31dc6ffffd41d1d1dd4ffffffffe3 +56ffffffffd41d80ffff8e1d1d56fffff1391d1d1d1d1d1db88e641d1de3ffffffff642b +e3ffffff721d1dd4ffc6722b1d8048568e801d1d39ffffffffb81d9cffff721d1d8effff +ffffff1d8effffffffffffffffffffff721d56ffffffffffffffffffffffe32b64ffffb8 +1d1d8effffffff391db81d648e561d1d39f1ffffff9c1daaffffffd41d39f1ffffc6561d +1dc6721d1d56ffffaa39e3ffe3561d39ffffff9c1d1d1d1d1d1db8ffff9c1daaffffffd4 +1d39f1ffffb8481d1dff561d1d72ffff2b1d8effffffffffc61dc6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffc639ffffffffb81d1de3ffffffb81d64ffffff +ffe31d2bf1ffffffff1d8effffffffaa1d3980e3c648c6ff4864ffffffffe31d1de3ffff +641d1db8ffffffe3391d80fffffff1398efffffffff11dd4ff8039f1ffffffff9c1d8eff +ffffffffffffffffc61d1dc6ffffffffffffffffffffffc61d1dffffffffb81d1dd4ffff +ffffb856ffffffe33939ffffffffff391dc6ffffc61d2b56b8d456aaffffe31d2bb8ffff +ff8e1d1d56e3ffffe3391d9cffffffe33939ffffffffff9c1d2be3ffffff721d489ce3aa +1dffd41d9cffffffff9c1d56ffffffffffffffffffe31dc6ffffffc6391d48ffffffffe3 +56ffffffffc639ffffffffb81d1de3ffffe3b81d1de3e3e3ffffe31d1de3ffffff801db8 +ffffffffff561d56ffffff9c1d48c6ffffffb81d1daaffffffaa64ffffffff801d1df1ff +ffffff1d8effffffffffffffffffffff721d56ffffffffffffffffffffffe31de3ffffff +d41d48ffffffff391d64e3ffffffb81d1daaffffc62b56ffffffffff8e1d48e3ffffff1d +1d648ee39c80ffff8e8effffffff641db8ffffe3c61d1de3e3e3ffffc62b56ffffffffff +8e1d48e3ffffe31d1d729ce3808effffb81d64ffffffffff5664ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffe3ffffffffff391dc6ffffffff3948ffffff +ff56481d80ffffffc61de3ffffffffaa1d1df1ffffffffb81d9cffffffffff1d1d8effff +8e1d39ffffffffff8e1d64ffffff721dd4ffffffffff1de3ff3964ffffffffffc61d1dff +ffffffffffffffffc61d1dc6ffffffffffffffffffffffc61d1dffffffffff481d8effff +ffff80aaffffff9c1d64ffffffffff561d8effffc61d1db8ffffffffffffff1d56ffffff +ffd41d1db8ffffffff8e1d8effffff9c1d72ffffffffffe31d1d64ffffff721d48ffffff +ffff481de3ffffffffc61d1dffffffffffffffffffe31dc6ffffffff9c1d1d9cffffffe3 +56ffffffffffe3ffffffffff391dc6ffffffc61d1dffffffffffe31d1de3ffffd41d39ff +ffffffffffb81d1de3ffffc61d80ffffffffff481d80ffffffffe3ffffffffff1d1de3ff +ffffff1d8effffffffffffffffffffff721d56ffffffffffffffffffffffffe3ffffffff +ff5639ffffffff391db8ffffffffff721d80ffff391dc6ffffffffffe31d1db8ffffff1d +1d48fffffffffffffff1ffffffffaa1d8effffffe31d1dffffffffff391dc6ffffffffff +e31d1db8ffffe31d1d80ffffffffffffff482bffffffffe31db8ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffffffffe3c6aa2b1dc6ffffffff641de3ffff +d41dc61d1de3ffff8e64ffffffffffaa1d48ffffffffff561d8ee3e3e3e3e3391d64ffff +8e1d56ffffffffff8e1d56fffff11d1df1ffffffffffffffc61d56e3e3e3e3e3b81d1de3 +ffffffffffffffffc61d1dc6ffffffffffffffffffffffc61d1dffffffffff801d48ffff +ffff48f1ffffff721d56e3e3e3e3e3561d80ffffc61d2bffffffffffffffff1d72ffffff +ffe31d1dc6ffffffffb81d8effffff641d8effffffffffff481d1df1ffff721d80ffffff +ffe31d1db8e3e3e3e3b81d1de3ffffffffffffffffe31dc6ffffffffff801d2bc6ffffe3 +56ffffffffffffffffe3c6aa2b1dc6ffffffc61d1dffffffffffe31d1de3ffff9c1d56ff +ffffffffffe31d1db8ffffc61d8effffffffff561d56ffffffffffffffe3b89c1d1de3ff +ffffff1d8effffffffffffffffffffff721d56ffffffffffffffffffffffffffffffe3c6 +aa3939ffffffff391de3ffffffffffe31d56ffd41d1dffffffffffffff391d80ffffff1d +1daaffffffffffffffffffffd4b8641d8effffffe31d1dffffffffd41d1dffffffffffff +ff391d80ffffe31d1de3ffffffffffffff8e1d9cffffff8e39f1ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffffaa481d569c391dc6ffffffff9c1d80ffff +808eff481db8ffff56f1ffffffffffaa1d56ffffffffff1d1d1d1d1d1d1d1d1d39aaffff +8e1d56ffffffffff8e1d56ffffd41d1dffffffffffffffff8e1d1d1d1d1d1d1d1d2b56ff +ffffffffffffffffc61d1dc6ffffffffffffffffffffffc61d1dffffffffffd41d1df1ff +ffb872ffffffff561d1d1d1d1d1d1d1d39aaffffc61d39ffffffffffffffff1d72ffffff +ffe31d1dffffffffffc61d8effffff481d8effffffffffff8e1d1de3ffff721d8effffff +ffc61d1d1d1d1d1d1d1d1d48ffffffffffffffffffe31dc6ffffffffffff641d1dd4ffe3 +56ffffffffffffaa481d569c391dc6ffffffc61d1dffffffffffe31d1de3ffff801d56ff +ffffffffffff1d1daaffffc61d8effffffffff561d56ffffffffff8e391d64aa1d1de3ff +ffffff1d8effffffffffffffffffffff721d56ffffffffffffffffffffffffffb8391d48 +8e4839ffffffff391de3ffffffffffff1d56ffb81d1dffffffffffffff561d72ffffff1d +1dc6ffffffffffffffe3641d2b72721d8effffffe31d1dffffffffb81d1dffffffffffff +ff561d72ffffe31d1dffffffffffffffffd41d2bffffff56c6ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffc639489ce3ffff391dc6ffffffffd41d2bffff +56f1ff8e1d64fff164ffffffffffffaa1d56ffffffffff1d1daaffffffffffffffffffff +8e1d56ffffffffff8e1d56ffffc61d1de3ffffffffffffff8e1d72ffffffffffffffffff +ffffffffffffffffc61d1dc6ffffffffffffffffffffffc61d1dffffffffffff561daaff +ff39b8ffffffff561d72ffffffffffffffffffffc61d39ffffffffffffffff1d72ffffff +ffe31d1df1ffffffffc61d8effffff391d80ffffffffffff8e1d1de3ffff721d8effffff +ffc61d1de3ffffffffffffffffffffffffffffffffe31dc6ffffffffffffe32b1d48e3e3 +56ffffffffc639489ce3ffff391dc6ffffffc61d1dffffffffffe31d1de3ffff641d48ff +ffffffffffff1d1daaffffc61d8effffffffff561d56ffffffaa2b56aae3ffff1d1de3ff +ffffff1d8effffffffffffffffffffff721d56ffffffffffffffffffffffd44839b8e3ff +ff5639ffffffff391de3ffffffffffff1d80ffaa1d1df1ffffffffffff561d72ffffff1d +1dc6ffffffffffff8e2b80d4ffffaa1d8effffffe31d1dffffffffaa1d1df1ffffffffff +ff561d72ffffe31d1dffffffffffffffffff391db8ffe356ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffff80ffff391dc6ffffffff391dc6ffffffffff391db872 +8effffe31d1dd49cb8ffffffffffffaa1d56ffffffffff481d80ffffffffffffffffffff +8e1d56ffffffffff8e1d56ffffe31d1db8ffffffffffffffb81d48ffffffffffffffffff +ffffffffffffffffc61d1dc6ffffffffffffff80ffffffc61d1dfffffffffffff12b48ff +9c64ffffffffff641d48ffffffffffffffffffffc61d39ffffffffffffffff1d72ffffff +ffe31d1dc6ffffffffc61d8effffff641d56ffffffffffff801d48ffffff721d8effffff +ffe31d1db8ffffffffffffffffffffffffffffffffe31dc6ffffffffffffffc61d1d39b8 +56ffffffff391dc6ffffffff391dc6ffffffc61d1dffffffffffe31d1de3ffff9c1d2bf1 +ffffffffffff1d1de3ffffc61d8effffffffff561d56fffff11d1de3ffffffff1d1de3ff +ffffe31d72ffffffffffffffffffffff721d56ffffffffffffffe356ffff561daaffffff +ff5639ffffffff1d1de3ffffffffffc61db8ffd41d1d8effffffffffff561d9cffffff1d +1dc6ffffffffff9c1d56ffffffffaa1d8effffffe31d1dffffffffd41d1d8effffffffff +ff561d9cffffe31d1dffffffffffffffffff8e1d56ff9cb8ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffff56ffff1d1de3ffffffff391dc6ffffffffff641d641d +e3ffffff721d5664ffffffffffffffaa1d56ffffffffffaa1d48ffffffffffffffffffff +8e1d56ffffffffff8e1d56ffffff391d64ffffffffffffffff2b1de3ffffffffffffffff +ffffffffffffffffc61d1dc6ffffffffffffff56ffffffc61d1dffffffffffffff721dd4 +64f1ffffffffff9c1d1df1ffffffffffffffffffc61d39ffffffffffffffff1d72ffffff +ffe31d1dc6ffffffffc61d80ffffff801d1dffffffffffff481dc6ffffff721d8effffff +ffff391d80ffffffffffffffffffffffffffffffffe31dc6ffffffffffffffffb81d1d39 +56ffffffff1d1de3ffffffff391dc6ffffffc61d1dffffffffffe31d1de3ffffb81d1d9c +ffffffffffe31d39ffffffc61d8effffffffff561d56ffffe31d1dfffffffff11d1de3ff +ffffc61d72ffffffffffffffffffffff721d56ffffffffffffffaa56ffff391dc6ffffff +ff4839ffffffff1d1de3ffffffffff5639ffffff1d1d2bffffffffffff391de3ffffff1d +1dc6ffffffffff8e1d72ffffffff9c1d8effffffe31d1dffffffffff1d1d2bffffffffff +ff391de3ffffe31d1dffffffffffffffffffd41d1de348ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff801d72ffffffffffffffaa64fff11d1db8ffffc6642b1dc6ffffffffff9c1d1d80 +ffffffffe31d1d64ffffffffffffffaa1d39ffffffffffff481d80e3ffffffffd4ffffff +801d56ffffffffff8e1d56ffffffd41d2b9cffffffffffffff801d39d4ffffffffe3d4ff +ffffffffffffffffb81d1dc6ffffffffffffe348ffffffc61d1dffffffffffffffb81d48 +64ffffffffffffe3391d72ffffffffffc6e3ffffc61d1dffffffffffffffff1d72ffffff +ffe31d1dc6ffffffffb81d72ffffffd41d1db8ffffffffd41d64ffffffff721d72ffffff +ffffc62b2bb8ffffffffffd4ffffffffffffffffffe31db8ffffffffffffffffff801d1d +56fffffff11d1db8ffffc6642b1dc6ffffffc61d1de3ffffffffe31d1de3ffffff481d2b +e3ffffffff8e1d9cffffffb81d8effffffffff561d56ffffd41d1dd4ffffb8641d1de3ff +ffffc61d72ffffffffffffffffffffff641d56ffffffffffffff8072ffff2b1d9cffffe3 +723939ffffffff1d1d8effffffffaa39b8ffffffaa1d1db8ffffffffd41d9cffffffff1d +1d8effffffffff801d48ffffffaa561d8effffffe31d1db8ffffffffaa1d1db8ffffffff +d41d9cffffffe31d1dc6ffffffffffffffffff481d4864ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +fffff1391d48b8c6c6c6b88e641d72ffff481d1d808056ff391db8ffffffffffd41d1dff +ffffffffff561d8effffffffffffff9c1d39ffffffffffffc61d1d39aae3b86448ffffff +561d39ffffffffff8e1d48ffffffff9c1d1d48c6e3b839b8fff12b1d1d80e3e39c2be3ff +fffffffffffffff1641d1d80c6c6c6c69c722b56ffffffb81d1de3ffffffffffffff1d1d +9cffffffffffffffe32b1d2b9cf1d4561df1ffffb81d1df1ffffffffffffc61d56ffffff +ffe31d1daaffffffff8e1d64ffffffffc61d39e3ffffff4839e3ffffffff641d64ffffff +ffffff8e1d1d56c6e39c3980ffffffffffffffffffb81d9cffffffffffffffffffff481d +56ffffffff481d1d808056ff391db8ffffffff1d1d2b8e56e3ffd41d1dc6ffffffff391d +56ffffffd41d80ffffffff8e1d80ffffffffff561d48ffffff2b1d2b8e6480ff1d1dd4ff +ffffb81d64ffffffffffffffffffffff391d39aac6c6c6b88e721d8effff641d1d807248 +f1562bffffffff1d1d1d39b8b87256ffffffffffff721d39e3ffffff4880fffffffff11d +1d80ffffffffffb81d1d568e399caa1d72ffffffff2b1d1d6472c6ffff721d39e3ffffff +4880ffffffffd41d1db8ffffffffffffffffffc61d1db8ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffff8e5656565656565656565656b8ffffc664393980f1ff645664b8ffffffffff4872ff +ffffffffff9c39d4ffffffffffb8726456566472e3ffffffffb864391d2b568ee3ffd480 +56565664c6ffffff9c565672c6ffffff8e562b1d39569cffffffd480481d1d3964d4ffff +ffffffffffffff9c56565656565656565656569cffd48e6456566480f1ffffffffff6439 +e3ffffffffffffffffd464391d1d489cf1ffff8e6456565672c6ffffe38e645656729cff +b86456565672f1ffffaa565672b8ffffffb8481d5672649cffffffff9c725656566480ff +ffffffff8e562b1d3964aaffffffffffffffffc67256565672b8ffffffffffffffffff64 +56ffffffffc664393980f1ff64566472ffffff9c483956b8e38e6456566480e3ffffe364 +392b646464b8ffffffc68056565672b8ffffff64565664aaffb85639488effff565664c6 +e38e56565672aaffffffffffffffff9c5656565656565656565656d4ffffe364484880e3 +ff805664aafff172b856391d489cf1fffffffffffff18e48396464649cffffffffaa6456 +565664aaffffffff9c563956c6ffb8565672ffffffd45639488efffffff18e4839646464 +9cffffffff9c6456565664c6ffffffffffffffff482bf1ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff64c6ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff48ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff728effffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffd41de3ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffb8c6e3568effffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff561d1d80ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffc68ed4ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe3d49c56ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +aa1d1d1d1dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18e9cffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +e3648e8e8e8e8e8e8e8e8e8e8e8e80c6ffffffffffffffffffffffffffffffffffffffff +ffffb81d1dffffffffffffffffffffffffffffffffffffffffffffffffffffffaa9cf1ff +ffffffffffffffffffffffffffffffffffffffffffffffffe380481d56ffffffffffffff +ffff8e728e8e8e8072c6ffffffffffffffffffffffffffffffffffffffb81d1d1de3ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb89cffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb872728e +807272727272728eaad4ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ff1d1d565656561d1d39565656391dc6ffffffffffffffffffffffffffffffffffffffff +ffffc61d1dffffffffffffffffffffffffffffffffffffffffffffffffffffd41d1d9cff +ffffffffffffffffffffffffffffffffffffffffffffffffffff641d56ffffffffffffff +ffffffe3561d1d9cffffffffffffffffffffffffffffffffffffffffe348c6c648e3ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61d1d72ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3721d +1d568e8e8e80561d1d1d80ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ff1db8ffffffff391d8effffffff64c6ffffffffffffffffffffffffffffffffffffffff +ffffe31d1dffffffffffffffffffffffffffffffffffffffffffffffffffffe31d1d9cff +ffffffffffffffffffffffffffffffffffffffffffffffffffff8e1d56ffffffffffffff +ffffffff9c1d1dffffffffffffffffffffffffffffffffffffffffff56b8ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffff19ce3ffffffffe31d1d80ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd41d +39ffffffffffffe3aa481d48e3ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe38ee3ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffb8b8ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ff1dc6ffffffff391d8effffffff72c6ffffffffffffffffffffffffffffffffffffffff +ffffe31d1dffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff8e1d56ffffffffffffff +ffffffffaa1d1dffffffffffffffffffffffffffffffffffffffff9c1de3ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffe31d1dc6ffffffffffe3c6ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1d +39ffffffffffffffffe31d1d48ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61d1dc6ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff561d8effffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ff72e3ffffffff391d8effffffffaae3ffffffffffffffffffffffffffffffffffffffff +ffffe31d1dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff8e1d56ffffffffffffff +ffffffffaa1d1dffffffffffffffffffffffffffffffffffffffff391de3ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffe31d1de3ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1d +48ffffffffffffffffff9c1d1d80ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61d1dffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff561d9cffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8efffffffffffffffff1d4c6e3ffffffffffffffffffe3c6c6e3ff +ffffe31d1dffffffe3e3fffffffffffffffff1fffffff1e3e3ffffffffffffffffffe3ff +fffffffffffff1c6c6d4f1fffffffffff1e3e3ffffffffffffffaa1d64ffffffffffffff +ffffffffaa1d1dfffffffffffffff1ffffe3e3f1ffffffffffffff1d1de3ffffffffffff +ffffe3c6e3f1fffffffffffffffffffffff1e3e3fffffffff1ffffe3e3e3ffffffffffe3 +e3ffffffffffffffffffffe3e3e3ffffffffffffe31d1de3ffffffffffffffe3ffffffff +fffffff1c6c6f1ffffffffffffffffe3ffffffe3e3ffffffffffffffffffffffffffff1d +56fffffffffffffffffff1391d1de3fffffffffff1d4d4fffffffffffffffff1ffffffe3 +e3e3ffffffffffffffffffe3e3e3ffffffffffffffffffe3ffffe3e3ffffc61d1dffffff +fffffffff1ffffffe3e3f1fffffffff1e3e3fffffffffffffffffff1d4c6e3ffffffffff +fffff1ffffffe3e3ffffffffffffff561daaffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffffffffff8e1d1d1d1db8fffffffffffff1721d1d1d1d56 +f1ffe31d1dfff1481d1d39d4ffffffffffb82bc6ff801d1d1d80ffffffffffd4801daaff +ffffffffff8e1d1d1d1d2be3ffffffb81d1d1d1d9cffffffffffaa1d72ffffffffffffff +ffffffffaa1d1dfffffffff18e2baaff801d1d1d72ffffffffffff1d1de3ffffffffffff +c6391d1d1d1d8effffffffffe39c39c6f1481d56ffffb86456ff801d1d1d72ffffe3391d +1d48f1fffffffffffff1561d1d1d64f1ffffffffe31d1de3ffffffffe38e398effffffff +ffe3721d1d1d1d56e3ffffffffe3561dfff1391d1d39d4ffffffffffffffffffffffff1d +56ffffffffffffffffffff801d1d9cffffffff8e1d1d1d1db8ffffffffd48039fff1481d +1d1d48f1fffffffffff1561d1d1d64f1ffffffffffb8562bff801d1dffffc61d1dffffff +fffff19c2bffe3391d1d2be3ffff9c1d1d1d80ffffffffffffff8e1d1d1d1d72ffffffff +d48056ffd42b1d1d2bc6ffffffffff561daaffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffffffe36480f1ffff8e1d80fffffff18e568eb8b88e391d +f1ffe31d1db8566472391d1daaffffb8562b1db8806472642b1d56f1ffff80641d1daaff +ffffffd44880b8c6aa641de3ffe35664b8aa721d1dc6ffffffffaa1d72ffffffffffffff +ffffffffaa1d1dffffffaa641d1d8e806472561d1d64ffffffb8561d1d1d1d1db8fff180 +48b8f1ffe3641d56e3ffff8e561d1dc6481d1d56c664391d56646472641d1d72b8488080 +481d39d4ffffffff8e489caa8e391d56fffff18e481d1d1d1d1daaaa641d1d8effffffff +b84880e3fff18e1d39e3ffe372481d1db85672642b1d1db8ffffffffffffffffffffff1d +56ffffffffffffffffffffb81d1d9cffffb83980f1ffe3561d80ffd464391d39c6396472 +561d1d48e3ffffff8e489caa9c391d56ffffffc664391d56b81d1d1dffaa391d1d1d1d1d +e39c562b1dd4567272481d39f180648e641d1d64ffffffffe36480f1ffff8e1d56ffff72 +561d56b8647272391d2bc6ffffb8641d1d1d1d1d39ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffffff2b2bffffffffff2b1dc6ffff801db8ffffffffb82b +ffffe31d1d64ffffffff481d56ffffffff721d1dc6ffffffc61d1db8ffffffff391daaff +fffff1398effffffffff64e3ffc61dffffffff9c1d64ffffffffaa1d72ffffffffffffff +ffffffffaa1d1dffffffffff391d39e3ffffff8e1d1df1ffffffff1d1de3ffffffff8e1d +9cfffffffff12b1d48ffffffff1d1d56aaff6472ffff9c1d1db8ffffff9c1d1d64ffffff +ff1d1d8effffffff56f1ffffffc61d1db8ffffffe31d1dffffffffffff1d1d8effffffc6 +1d64ffffffffff801d64ffffffc61d1d80fffffff1481d64ffffffffffffffffffffff1d +56ffffffffffffffffffffc61d1d8effff1d39ffffffffff2b1dc6ffffc61d2b56ffffff +ffd4391d56ffffff56f1ffffffc61d1db8ffffffff8e1d5656f1c648ffffc61d39ffffff +ffffff641d2be3ffffff641d2b9cffffff9c1d1dc6ffffff2b2bffffffffff391dc6ffff +ff1d1d72ffffffe31d1d48ffffffff561dc6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffffb81d56ffffffffff561d9cfff12b39f1ffffffffc664 +ffffe31d1de3ffffffff9c1d39ffffffff8e1d8effffffffff481d9cffffffff391daaff +ffff561de3ffffffffff80ffffe3b8ffffffffff2b56ffffffffaa1d72ffffffffffffff +ffffffffaa1d1dffffffffff561d8effffffffe31d1db8ffffffff1d1de3ffffffff391d +e3ffffffffffb81d1db8ffffff1d1d8effffffd4ffffaa1d39ffffffffe31d1db8ffffff +ff641d72ffffffffc6ffffffffff481d8effffffe31d1dffffffffffff1d1d8effffff72 +1d9cffffffffffff391de3ffffe31d1de3ffffffff8e1d56ffffffffffffffffffffff1d +56ffffffffffffffffffffc61d1d9cffaa1d9cffffffffff561d9cffffc61d1de3ffffff +ffff9c1d1de3ffffc6ffffffffff481d8effffffff8e1d1dc6ffffc6ffffc61d39ffffff +ffffff721db8ffffffffaa1d1de3ffffffff391daaffffb81d56ffffffffff801d9cffff +ff3939ffffffffff9c1d1dffffffff561dc6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffff641d56c6c6c6c6c6561d80ffb81d72ffffffffffffff +ffffe31d1dffffffffffc61d39ffffffff8e1dc6ffffffffff561d8effffffff391daaff +ffd41d2bffffffffffffffffffffffffe3c69c8e2b56ffffffffaa1d72ffffffffffffff +ffffffffaa1d1dffffffffff561daaffffffffff1d1d8effffffff1d1de3ffffffd41d1d +ffffffffffffff391d80ffffff1d1de3ffffffffffffaa1d56ffffffffff1d1dc6ffffff +ff8e1d72ffffffffffffffd4aa8e391d8effffffe31d1dffffffffffff1d1d8effffff1d +1dc6ffffffffffff721d64ffffe31d1dffffffffffaa1d39ffffffffffffffffffffff1d +56ffffffffffffffffffff8e1d1dc6ff641d8ec6c6c6c6c6561d80ffffc61d39ffffffff +ffffff1d1db8ffffffffffe3b88e391d8effffffff8e1d48ffffffffffffc61d39ffffff +ffffff721dffffffffffc61d1dffffffffff561daaffff641d56c6c6c6c6c68e1d80ffff +ff3956ffffffffffc61d1de3ffffff561dc6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffff561d3956565656565672c6ff8e1d8effffffffffffff +ffffe31d1dffffffffffc61d39ffffffff8e1dc6ffffffffff561d8effffffff391daaff +ffb81d39fffffffffffffffffffff1721d398ed43956ffffffffaa1d72ffffffffffffff +ffffffffaa1d1dffffffffff561daaffffffffff1d1d8effffffff1d1de3ffffffaa1d1d +ffffffffffffff561d72ffffff1d1de3ffffffffffffaa1d56ffffffffff1d1de3ffffff +ff8e1d72ffffffffff9c391d72b8561d8effffffe31d1dffffffffffff1d1d8effffc61d +1dc6ffffffffffff8e1d56ffffe31d1dffffffffffaa1d39ffffffffffffffffffffff1d +56ffffffffffffffffffff481d2bffff561d4856565656565672c6ffffc61d39ffffffff +ffffff391dc6ffffff9c2b1d56b8561d8effffffff8e1d56ffffffffffffc61d39ffffff +ffffff721dffffffffffc61d56ffffffffff561daaffff561d3956565656565664c6ffff +ff3956ffffffffffc61d1de3ffffff561dc6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffff561d64ffffffffffffffffff8e1d56ffffffffffffff +ffffe31d1dffffffffffc61d39ffffffff8e1dc6ffffffffff561d8effffffff391daaff +ffaa1d1dffffffffffffffffffaa1d56e3ffffff3956ffffffffaa1d72ffffffffffffff +ffffffffaa1d1dffffffffff561daaffffffffff1d1d8effffffff1d1de3ffffffaa1d1d +f1ffffffffffff561d80ffffff1d1de3ffffffffffffaa1d56ffffffffff1d1de3ffffff +ff8e1d72ffffffe3481d9cffffff561d8effffffe31d1dffffffffffff1d1d8effffc61d +1db8ffffffffffff8e1d64ffffe31d1dffffffffffaa1d39ffffffffffffffffffffff1d +56ffffffffffffffffffe31d1daaffff561db8ffffffffffffffffffffc61d39ffffffff +ffffff2b1de3fff1481d9cf1ffff561d8effffffff8e1d56ffffffffffffc61d39ffffff +ffffff721dffffffffffc61d48ffffffffff561daaffff561d64ffffffffffffffffffff +ff3956ffffffffffc61d1de3ffffff561dc6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffff641d56ffffffffffffffffffaa1d1dffffffffffffff +ffffe31d1dffffffffffc61d39ffffffff8e1dc6ffffffffff561d8effffffff391daaff +ffc61d1de3ffffffffffffffff481db8ffffffff3956ffffffffaa1d56ffffffffffffff +ffffffffaa1d1dffffffffff561daaffffffffff1d1d8effffffff1d1de3ffffffc61d1d +d4ffffffffffff561d8effffff1d1de3ffffffffffffaa1d56ffffffffff1d1dc6ffffff +ff8e1d72ffffff641d80ffffffff561d8effffffe31d1dffffffffffff1d1d8effffff1d +1d9cffffffffffff8e1d9cffffe31d1dffffffffffaa1d39ffffffffffffffffffffd41d +56ffffffffffffffffff8e1d56ffffff641d8effffffffffffffffffffc61d39ffffffff +fffff11d56ffffb81d80ffffffff561d8effffffff8e1d56ffffffffffffc61d39ffffff +ffffff721dffffffffffc61d1dffffffffff561daaffff641d56ffffffffffffffffffff +ff3956ffffffffffc61d1de3ffffff561dc6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffff8e1d2be3ffffffffffffffffd41d1daaffffffffffff +ffffe31d1dffffffffffc61d39ffffffff8e1dc6ffffffffff561d8effffffff391daaff +ffe31d1d8efffffffffffffff11d1de3ffffffff2b56ffffffff8e1d56ffffffffffffff +ffffffffaa1d1dffffffffff561daaffffffffff1d1d8effffffe31d1de3fffffff11d1d +9cffffffffffff391dd4ffffff1d1de3ffffffffffffaa1d56ffffffffff1d1dc6ffffff +ff8e1d64ffffff1d1dc6ffffffff481d8effffffe31d1dffffffffffff1d1d8effffff48 +1d64ffffffffffff7239e3ffffe31d1dffffffffffaa1d39ffffffffffffffffffffc61d +48ffffffffffffffffe32b39c6ffffff8e1d39e3ffffffffffffffffffc61d39ffffffff +ffffb82be3ffff801dc6ffffffff481d8effffffff8e1d48ffffffffffffc61d39ffffff +ffffff721dffffffffffc61d1dffffffffff561d9cffff8e1d2be3ffffffffffffffffff +ff3956ffffffffffc61d1de3ffffff561dc6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffff391d8effffffffe3481d64e3ffffffffaae3ffff561d39aaffffffffe3 +ffffc61d1dffffffffffb81d39ffffffff801dc6ffffffffff561d8effffffff391daaff +ffffc61d2b9cf1fffffff1f1f11d1d9cffffb8642b56ffffffff8e1d56ffffffffffffff +ffffffff9c1d1dffffffffff481daaffffffffff1d1d8effffffe31d1de3ffffffff801d +39e3ffffffff802bb8ffffffff1d1dc6ffffffffffff9c1d56ffffffffff1d1dc6ffffff +ff801d56fffff11d1d56f1ffd480391d8effffffe31d1dc6ffffffffff1d1d8effffffb8 +1d1daaffffffffd42bb8ffffffe31d1dffffffffffaa1d39ffffffffffffffffffffc61d +39ffffffffffffd48e2b64ffffffffffe3391d64e3ffffffffaae3ffffc61d1d9cffffff +ffaa48c6ffffff8e1d56f1ffe380391d8effffffff8e1d1dffffffffffffc61d1dc6ffff +ffffff641dffffffffffc61d1dffffffffff481d8effffe3481d64e3ffffffffd4e3ffff +ff3956ffffffffffc61d1de3ffffff641d8effffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffb81d1d56fffffffffff1481d1d64b89c3939ffffffe32b1d1d48aa9c562b +f1ffc61d1de3ffffffffaa1d1dffffffff641d8effffffffff561d80fffffff11d1d8eff +ffffff9c1d1d488eb88e39e3ff561d1d482b80ff3939ffffffff801d39ffffffffffffff +ffffffff641d1db8ffffffff391d8effffffffff1d1d64ffffffc61d1d9cffffffffe339 +1d2bd4ffff8e1daaffffffffe31d1d9cffffffffffff8e1d39ffffffffe31d1daaffffff +ff721d48ffffff8e1d1d393939e3561d56ffffffff391d1d5639d4ffe31d1d48ffffffff +801d1d9cffffc61d72ffffffffb81d1de3ffffffffaa1d2bf1fffffffffffffffff1561d +1d56808e8e642b1d1d8effffffffffffffaa1d1d1d64b88e3939ffffffc61d1d1d2b808e +392bc6ffffffffc61d1d395639e3561d56ffffffff561d1de3fffffffffff11d1d1d4839 +ffffff561db8ffffffffb81d1de3ffffffff391d80fffffff1481d1d64b89c482bffffff +f11d39ffffffffffc61d1dc6ffffffaa1d1d394864ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffe36472808e80728effffffffe38056394864aafffffffffff18e564848568ee3 +e38e7272726480f1ffffc67272649cb88e72727272c6ffffff80726472c68e7272727280 +ffffffff9c6448395664b8ffffe3805664b8ffff807272b8ff8e647272729cffffffffff +ffff8e727272727272c6aa8072727272c6fffff172727272d48e8072727272aafffffff1 +8e563964648ed4fffffff1806472727272aaffffc68e72726472aaff8e8072727272e3ff +ff9c7264729cffff9c56569cffff8e727272ffffffe3805664aaffb88072727272d4ffff +ffb86439646480b8ffffffe38e8064727280f1ffffb87272728effffffffffffffaa7272 +7272727272808eb8e3ffffffffffffffffffc68e56394872aaffffffffc61d3980565664 +9cf1ffffffffffff9c565672e3ff8e727272ff9c72727272648effffffffffd4645656c6 +ffaa8072727280e3e38e7272727280ffffff80726480ffffffe380563948649ce3ffff8e +727272728effffffb8727272b8ffffff9c56568effffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61d39ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61d39ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61d39ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61d39ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61d1dffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa1d1de3ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe38e8e8e8e8e80f1ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +f1c6c6ffffffd4c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffff19c645656569ce3ff +ffffffffffffffffffffff8ef1ffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffff1ffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffff1e3ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +e38e801d1d1d728efffffffffffffffffff1561d8effffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffe39c4848809caaaa8e802b48 +80ffffffffffffffffffb81d9cffffffffffffffffffffffffffffffff8e4864644872e3 +ffffffffffffffffffaa488effffffffff56395656565639399cffffff39394856565648 +3948ffffffffffffc6641daaffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff801d64ffffffffffffffffffffffe3391d48ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffc63948c6ffffffffffffffe32b +80ffffffffffffffffff561d48ffffffffffffffffffffffffffffc62b72fffffff1562b +b8ffffffffffffffb81d1daaffffffffff39565656565656569cffffff1d485656565656 +5664ffffff9c7248801d1db8ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72fffffffffffffffffffffffff1b8ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff482bf1ffffffffffffffffff80 +9cfffffffffffffffff11d1d1daaffffffffffffffffffffffffff561dd4ffffffffc61d +56ffffffffffffff48801daaffffffffff39ffffffffffffffffffffff1daaffffffffff +ffffffffff1d8effff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff561d9cffffffffffffffffffff9c +b8ffffffffffffffff9c80481d39ffffffffffffffffffffffffe31d1dfffffffffff11d +1df1ffffffffff808e8e1daaffffffffff48ffffffffffffffffffffff1db8ffffffffff +ffffffffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffb81d1de3ffffffffffffffffffffff +ffffffffffffffffff56c6c61d1db8ffffffffffffffffffffffaa1d56ffffffffffff39 +1dc6ffffffffc62bff8e1daaffffffffff56ffffffffffffffffffffff1dc6ffffffffff +ffffffffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72fffffffffffffffffffffff1c69c8effffaa9caaaaaa8ee3ffff9caaaa9c +b8ffffffffaa7256729ce3ffffffffe3b89cffc68072c6ffffd49cb8ffc672728ee3ffff +c6807272c6ffffffffffffffe39c7256648ec6ffffffffffffc68effe39c7280ffffffe3 +8e645680b8ffffffffffffffffffffffffffffffff801d39ffffffffffffffffffffffff +ffffffffffffffffd439ffff481d72ffffffffffffffffffffff8e1d39ffffffffffff48 +1db8ffffffff64c6ff8e1daaffffffffff56ffffc6c6e3ffffffffffff1dc6ffe3c6d4ff +ffffffffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffb8641d1d56ffffe3b81d1d8ee3ffffffe3721db8 +e3ffff8e1db8ffffb82b39c6ffd464391d569c1d1d1db8c6641d1d80645672481d1daa8e +648e72391d64ffffffffff8e2baaffffe3561d48e3ffff9c561d39ff561d1d1dffe35656 +e3fff19c1d48e3ffffffffffffffffffffffffffff481d56ffffffffffffffffffffffff +fffffffffffffff1398effff9c1d1df1ffffffffffffffffffffaa1d1de3ffffffffe31d +1daaffffffaa9cffff641daaffffffffff48641d1d1d1d48aaffffffff1d72391d1d1d1d +72e3ffffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffff561d56ffffffff641d80ffffffffff6464ff +ffffc61daaffffffffaa1d2bffffffaa1d4856f1c61dc6ffff641d1dd4ffffff641d1d9c +ffffffc61d1dc6ffffffc61daaffffffffff481d64ffffffff5639489cff8056ff561dd4 +ffffffff641d8effffffffffffffffffffffffffff391d64ffffffffffffffffffffffff +ffffffffffffffb81dd4ffffe31d1daaffffffffffffffffffffff1d1d8effffffff9c1d +1db8ffffff48ffffff561daaffffffffff1d489cb8801d1d1daaffffe31d1d80b88e1d1d +1d56ffffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffff561d56ffffffffe31d56ffffffffe31db8ff +ffff801dffffffffffff1d1dd4ffffaa1d1de3ffffc6e3ffff721d64ffffffffaa1d1de3 +ffffffff391daaffffff6439ffffffffffff9c1d2be3ffffff561d9cffffe3c6e31d39ff +ffffffff8e1d64ffffffffffffffffffffffffffff391d56ffffffffffffffffffffffff +ffffffffffffff6464ffffffff801d64ffffffffffffffffffffff801d1d8eb8c68e721d +1dd4ffff808effffff561daaffffffffff72f1ffffffe3391d48ffffe356d4fffffff172 +1d1db8ffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffff561d56ffffffffff641dd4ffffff9c39ffff +ffff3939ffffffffffff1d1db8ffffaa1d48ffffffffffffff721d8effffffffc61d1dff +ffffffff561daaffffff3956ffffffffffffe31d1dc6ffffff561dffffffffffb81d56ff +ffffffff8e1d48ffffffffffffffffffffffffffff391d48ffffffffffffffffffffffff +fffffffffffff11df1ffffffffff1d1df1fffffffffffffffffffff1481d1d1d1d72e31d +1dffffc61de3ffffff561daaffffffffffffffffffffff9c1d1dfffffffffffffffffff1 +1d1d56ffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffff561d56ffffffffff9c1d48ffffff64d4ffff +ffff1d2b6472727272724856c6ffffaa1d56ffffffffffffff721d8effffffffc61d2bff +ffffffff561daaffffe31d56fffffffffffff11d1daaffffff5639ffffffffff8e1d2b64 +72727272563972ffffffffffffffffffffffffffff561d2bf1ffffffffffffffffffffff +ffffffffffff721d5656565656562b1d64ffffffffffffffffffffffffc68e8eb8ffb81d +48ffff6472c6c6c6c6481d80c6c6ffffffffffffffffffd41d1dc6ffffffffffffffffff +721d1dffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffffffffff561d56fffffffffff11d1dd4ffff56ffffff +ffff1d39ffffffffffffffffffffffaa1d56ffffffffffffff721d8effffffffc61d39ff +ffffffff561daaffffc61d56ffffffffffffff1d1daaffffff5639ffffffffff8e1d56ff +ffffffffffffffffffffffffffffffffffffffffff801d1dc6ffffffffffffffffffffff +ffffffffffe31d9cffffffffffffb81d1de3ffffffffffffffffffffffffffffffff801d +8effe31d1d1d1d1d1d1d1d1d1d1dffffffffffffffffffe31d1dffffffffffffffffffff +8e1d56ffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffffc6ffffff561d56ffffffffffff561d8effaaaaffffff +ffff1d2bffffffffffffffffffffffaa1d56ffffffffffffff721d8effffffffc61d1dff +ffffffff561daaffffe31d39ffffffffffffff1d1dc6ffffff5639ffffffffff9c1d39ff +ffffffffffffffffffffffffffffffffffffffffffd41d1d72ffffffffffffffffffffff +ffffffffff8e1de3fffffffffffff12b1d8effffffffffffffffffffffffffffffe3392b +e3ffc6808e8e8e8e8e391d648e80ffffffffffffffffffe31d39ffffffffffffffffffff +801d8effffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffff56ffffff561d56ffffffffffffb81d39f164ffffffff +ffff561d8effffffffffffffffffffaa1d56ffffffffffffff721d8effffffffc61d1dff +ffffffff561d9cffffff481daaffffffffffe31d39f1ffffff5639ffffffffffc61d1dc6 +ffffffffffffffffffffffd4e3ffffffffffffffffffc61d1d64e3ffffffffffffffffff +fffffffff12bb8ffffffffffffffff801d39f1ffffffffffffffffffffffffffc62b48f1 +ffffffffffffffffff561daaffffff8ee3ffffffffffffaa1d9cffd4aaffffffffffffff +3948ffffffffffffff1d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffff8e1d72ffffffffffffffb856ffffff561d56ffffffffffffff1d1d6472ffffffff +ffff9c1d1dc6ffffffffffffffffffaa1d39ffffffffffffff721d8effffffffc61d1dff +ffffffff561d8effffff8e1d2bffffffffffaa1d80ffffffff561dffffffffffff391d56 +ffffffffffffffffffb82b1dd4ffffffffffffffffffff9c1d1d56ffffffffffffffffff +d4ffffff7239ffffffffffffffffffb81d1d8effffffffffffffffffffffffff392be3ff +ffffffffffffffffff561daaffffffb839ffffffffffff5648ffffff48ffffffffffffaa +1db8ffffffffffffe31d1dc6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffe3481d56b8c6c6c6b8aa9c4864ffffff391d39ffffffffffffffb81d1db8ffffffff +fffff1481d398ec6d4b88064ffffff9c1d39f1ffffffffffff561d80ffffffffb81d1df1 +ffffffff481d80ffffffe3391d72f1ffffc64864f1ffffffff481de3ffffffffffaa1d1d +489ce3c69c64b8ffff8e1d48ffffffffffffffffffffffff8e2b1d2b72b8d4e3e3c69c56 +80ffffb81d48e3ffffffffffffffffc61d1d1dd4fffffffffffffffffff1aa4880f1ffff +ffffffffffffffffe32b1d8effffffe32b72e3ffffe38e64ffffffff6464b8f1ffe3aa48 +b8ffffffffffffffb81d1d8effffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffff561d1d1d1d1d1d1d1d1d1d1d8effaa391d1d1d1d9cffffffffffff392bf1ffffffff +fffffff1641d1d1d1d1d9cffff9c1d1d1d1d1d1dc6ffffaa481d1d1d1d80d4561d1d1d1d +39ffffff391d1d1d9cffffd42b1d1d72561daaffffffff481d1d1d1d1d64ffffffffe348 +1d1d1d1d48d4ffffff641d9cfffffffffffffffffffffffffff1801d1d1d1d1d1d1d489c +ffff721d1d1d1d39ffffffffffff561d1d1d1d1d8effffffffffffe3802b1daaffffffff +ffffffffffff561d1d1d1d1d1d1dffff8e1d1d1d1d1d72ffffffffffaa1d1d1d1d1d56e3 +ffffffffffff391d1d1d1d1d1d1dffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffe3e3e3e3e3e3e3e3e3e3e3e3fffff1e3e3e3e3e3f1ffffffffffffd4d4ffffffffff +ffffffffffe3b8aac6f1fffffff1e3e3e3e3e3e3fffffff1e3e3e3e3e3e3ffe3e3e3e3e3 +e3ffffffe3e3e3e3f1ffffffffc6aaaab8f1ffffffffffe3e3e3e3e3e3e3fffffffffff1 +d4b8b8d4f1ffffffff3939f1fffffffffffffffffffffffffffffff1c6aaaaaab8d4ffff +ffffe3e3e3e3e3e3ffffffffffffe3e3ffffffe3f1ffffffffffffe39cc6ffffffffffff +ffffffffffffe3e3e3e3e3e3e3e3ffffffd4aaaab8e3ffffffffffffffe3aaaab8e3ffff +ffffffffffffe3e3e3e3e3e3e3e3ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff5648ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffb81db8ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffe3aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +fffffff1c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffe3aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffd45656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +56565656565656565656565656565656 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffc63939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +393939393939393939393939393939393939393939393939393939393939393939393939 +39393939393939393939393939393939 +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffd45656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +565656565656565656565656565656565656565656565656565656565656565656565656 +56565656565656565656565656565656 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffe38e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffffe3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffe38e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffe36472727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +72727272727272727272727272727272 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffe36472727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +72727272727272727272727272727272 +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +fffffff1c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6 +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffe36472727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +727272727272727272727272727272727272727272727272727272727272727272727272 +72727272727272727272727272727272 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff +ffffffffe3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3 +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +ffffffc61d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d +1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer diff --git a/executable_names/doc/common/acm.cls b/executable_names/doc/common/acm.cls new file mode 100644 index 0000000000000000000000000000000000000000..440a28bfeca5581c1335a9c8de21b1e7d7da1c50 --- /dev/null +++ b/executable_names/doc/common/acm.cls @@ -0,0 +1,1357 @@ +% "WWW2005-submission.CLS" - VERSION 1.4 +% "COMPATIBLE" WITH THE "ACM_PROC_ARTICLE-SP.CLS" V2.6SP +% PRODUCES A 'TIGHTER' PAPER AND DOES INCLUDE A RELEASE STATEMENT +% SPECIFICALLY TAILORED FOR WWW'YY. (As originally requested by Sheridan Printing 1/24/2002) +% Original by Gerald Murray January 24th. 2002 +% Improved on 11/11/2002 - GM +% Modified for "www2004" 1/26/2004 - GM +% ---- Start of 'updates' ---- +% +% Allowance made to switch default fonts between those systems using +% METAFONT and those using 'Type 1' or 'Truetype' fonts. +% See LINE NUMBER 236 for details. +% Also provided for enumerated/annotated Corollaries 'surrounded' by +% enumerated Theorems (line 790). +% Gerry November 11th. 1999 +% +% Georgia fixed bug in sub-sub-section numbering in paragraphs (July 29th. 2002) +% JS/GM fix to vertical spacing before Proofs (July 30th. 2002) +% Superscript fix Oct. 2002 +% +% ---- End of 'updates' ---- +% +\def\fileversion{v1.4} % for ACM's tracking purposes +\def\filedate{January 26, 2004} % Gerry Murray's tracking data +\def\docdate {Monday 26th. January 2004} % Gerry Murray (with deltas to doc} +\usepackage{epsfig} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{amsfonts} +% +% WWW-RELEASE DOCUMENT STYLE +% G.K.M. Tobin August-October 1999 +% adapted from ARTICLE document style by Ken Traub, Olin Shivers +% also using elements of esub2acm.cls +% HEAVILY MODIFIED, SUBSEQUENTLY, BY GERRY MURRAY 2000 +% ARTICLE DOCUMENT STYLE -- Released 16 March 1988 +% for LaTeX version 2.09 +% Copyright (C) 1988 by Leslie Lamport +% +% +%%% www-release.cls is an 'ALTERNATE-RELEASE' document style for producing +%%% two-column camera-ready pages specifically for the WWW'02 conference. +%%% THIS FILE DOES NOT STRICTLY ADHERE TO THE SIGS (BOARD-ENDORSED) +%%% PROCEEDINGS STYLE. It has been designed to produce a 'tighter' +%%% paper in response to concerns over page budgets. +%%% The main features of this style are: +%%% +%%% 1) Two columns. +%%% 2) Side and top margins of 4.5pc, bottom margin of 6pc, column gutter of +%%% 2pc, hence columns are 20pc wide and 55.5pc tall. (6pc =3D 1in, approx) +%%% 3) First page has title information, and an extra 6pc of space at the +%%% bottom of the first column for the ACM copyright notice. +%%% 4) Text is 9pt on 10pt baselines; titles (except main) are 9pt bold. +%%% +%%% +%%% There are a few restrictions you must observe: +%%% +%%% 1) You cannot change the font size; ACM wants you to use 9pt. +%%% 3) You must start your paper with the \maketitle command. Prior to the +%%% \maketitle you must have \title and \author commands. If you have a +%%% \date command it will be ignored; no date appears on the paper, since +%%% the proceedings will have a date on the front cover. +%%% 4) Marginal paragraphs, tables of contents, lists of figures and tables, +%%% and page headings are all forbidden. +%%% 5) The `figure' environment will produce a figure one column wide; if you +%%% want one that is two columns wide, use `figure*'. +%%% +% +%%% +%%% WARNING: +%%% Some dvi-ps converters heuristically allow chars to drift from their +%%% true positions a few pixels. This may be noticeable with the 9pt sans-serif +%%% bold font used for section headers. +%%% You may turn this hackery off via the -e option: +%%% dvips -e 0 foo.dvi >foo.ps +%%% +\typeout{Document Class 'www2005-submission' From www-release by Gerry Murray} +\typeout{Based in part upon document Style `acmconf' <22 May 89>. Hacked 4/91 by} +\typeout{shivers@cs.cmu.edu, 4/93 by theobald@cs.mcgill.ca} +\typeout{Excerpts were taken from (Journal Style) 'esub2acm.cls'.} +\typeout{****** Bugs/comments/suggestions/technicalities to Gerry Murray -- murray@hq.acm.org ******} +\typeout{Questions on the style, SIGS policies, etc. to Julie Goetz goetz@acm.org or Adrienne Griscti griscti@acm.org} +\oddsidemargin 4.5pc +\evensidemargin 4.5pc +\advance\oddsidemargin by -1in % Correct for LaTeX gratuitousness +\advance\evensidemargin by -1in % Correct for LaTeX gratuitousness +\marginparwidth 0pt % Margin pars are not allowed. +\marginparsep 11pt % Horizontal space between outer margin and + % marginal note + + % Top of page: +\topmargin 4.5pc % Nominal distance from top of page to top of + % box containing running head. +\advance\topmargin by -1in % Correct for LaTeX gratuitousness +\headheight 0pt % Height of box containing running head. +\headsep 0pt % Space between running head and text. + % Bottom of page: +\footskip 30pt % Distance from baseline of box containing foot + % to baseline of last line of text. +\@ifundefined{footheight}{\newdimen\footheight}{}% this is for LaTeX2e +\footheight 12pt % Height of box containing running foot. + +%% Must redefine the top margin so there's room for headers and +%% page numbers if you are using the preprint option. Footers +%% are OK as is. Olin. +\advance\topmargin by -37pt % Leave 37pt above text for headers +\headheight 12pt % Height of box containing running head. +\headsep 25pt % Space between running head and text. + +\textheight 666pt % 9 1/4 column height +\textwidth 42pc % Width of text line. + % For two-column mode: +\columnsep 2pc % Space between columns +\columnseprule 0pt % Width of rule between columns. +\hfuzz 1pt % Allow some variation in column width, otherwise it's + % too hard to typeset in narrow columns. + +\footnotesep 5.6pt % Height of strut placed at the beginning of every + % footnote =3D height of normal \footnotesize strut, + % so no extra space between footnotes. + +\skip\footins 8.1pt plus 4pt minus 2pt % Space between last line of text and + % top of first footnote. +\floatsep 11pt plus 2pt minus 2pt % Space between adjacent floats moved + % to top or bottom of text page. +\textfloatsep 18pt plus 2pt minus 4pt % Space between main text and floats + % at top or bottom of page. +\intextsep 11pt plus 2pt minus 2pt % Space between in-text figures and + % text. +\@ifundefined{@maxsep}{\newdimen\@maxsep}{}% this is for LaTeX2e +\@maxsep 18pt % The maximum of \floatsep, + % \textfloatsep and \intextsep (minus + % the stretch and shrink). +\dblfloatsep 11pt plus 2pt minus 2pt % Same as \floatsep for double-column + % figures in two-column mode. +\dbltextfloatsep 18pt plus 2pt minus 4pt% \textfloatsep for double-column + % floats. +\@ifundefined{@dblmaxsep}{\newdimen\@dblmaxsep}{}% this is for LaTeX2e +\@dblmaxsep 18pt % The maximum of \dblfloatsep and + % \dbltexfloatsep. +\@fptop 0pt plus 1fil % Stretch at top of float page/column. (Must be + % 0pt plus ...) +\@fpsep 8pt plus 2fil % Space between floats on float page/column. +\@fpbot 0pt plus 1fil % Stretch at bottom of float page/column. (Must be + % 0pt plus ... ) +\@dblfptop 0pt plus 1fil % Stretch at top of float page. (Must be 0pt plus ...) +\@dblfpsep 8pt plus 2fil % Space between floats on float page. +\@dblfpbot 0pt plus 1fil % Stretch at bottom of float page. (Must be + % 0pt plus ... ) +\marginparpush 5pt % Minimum vertical separation between two marginal + % notes. + +\parskip 0pt plus 1pt % Extra vertical space between paragraphs. +\parindent 9pt % GM July 2000 / was 0pt - width of paragraph indentation. +\partopsep 2pt plus 1pt minus 1pt% Extra vertical space, in addition to + % \parskip and \topsep, added when user + % leaves blank line before environment. + +\@lowpenalty 51 % Produced by \nopagebreak[1] or \nolinebreak[1] +\@medpenalty 151 % Produced by \nopagebreak[2] or \nolinebreak[2] +\@highpenalty 301 % Produced by \nopagebreak[3] or \nolinebreak[3] + +\@beginparpenalty -\@lowpenalty % Before a list or paragraph environment. +\@endparpenalty -\@lowpenalty % After a list or paragraph environment. +\@itempenalty -\@lowpenalty % Between list items. + +\@namedef{ds@10pt}{\@latexerr{The `10pt' option is not allowed in the `acmconf' + document style.}\@eha} +\@namedef{ds@11pt}{\@latexerr{The `11pt' option is not allowed in the `acmconf' + document style.}\@eha} +\@namedef{ds@12pt}{\@latexerr{The `12pt' option is not allowed in the `acmconf' + document style.}\@eha} + +\@options + +\lineskip 2pt % \lineskip is 1pt for all font sizes. +\normallineskip 2pt +\def\baselinestretch{1} + +\abovedisplayskip 9pt plus2pt minus4.5pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus3pt% +\belowdisplayshortskip 5.4pt plus3pt minus3pt% +\let\@listi\@listI % Setting of \@listi added 9 Jun 87 + +\def\small{\@setsize\small{9pt}\viiipt\@viiipt +\abovedisplayskip 7.6pt plus 3pt minus 4pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus2pt% +\belowdisplayshortskip 3.6pt plus2pt minus 2pt +\def\@listi{\leftmargin\leftmargini %% Added 22 Dec 87 +\topsep 4pt plus 2pt minus 2pt\parsep 2pt plus 1pt minus 1pt +\itemsep \parsep}} + +\def\footnotesize{\@setsize\footnotesize{9pt}\ixpt\@ixpt +\abovedisplayskip 6.4pt plus 2pt minus 4pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus 1pt% +\belowdisplayshortskip 2.7pt plus 1pt minus 2pt +\def\@listi{\leftmargin\leftmargini %% Added 22 Dec 87 +\topsep 3pt plus 1pt minus 1pt\parsep 2pt plus 1pt minus 1pt +\itemsep \parsep}} + +\newcount\aucount +\newcount\originalaucount +\newdimen\auwidth +\auwidth=\textwidth +\newdimen\auskip +\newcount\auskipcount +\newdimen\auskip +\global\auskip=1pc +\newdimen\allauboxes +\allauboxes=\auwidth +\newtoks\addauthors +\newcount\addauflag +\global\addauflag=0 %Haven't shown additional authors yet + +\newtoks\subtitletext +\gdef\subtitle#1{\subtitletext={#1}} + +\gdef\additionalauthors#1{\addauthors={#1}} + +\gdef\numberofauthors#1{\global\aucount=#1 +\ifnum\aucount>3\global\originalaucount=\aucount \global\aucount=3\fi %g} +\global\auskipcount=\aucount\global\advance\auskipcount by 1 +\global\multiply\auskipcount by 2 +\global\multiply\auskip by \auskipcount +\global\advance\auwidth by -\auskip +\global\divide\auwidth by \aucount} + +% \and was modified to count the number of authors. GKMT 12 Aug 1999 +\def\alignauthor{% % \begin{tabular} +\end{tabular}% + \begin{tabular}[t]{p{\auwidth}}\centering}% + +% *** NOTE *** NOTE *** NOTE *** NOTE *** +% If you have 'font problems' then you may need +% to change these, e.g. 'arialb' instead of "arialbd". +% Gerry Murray 11/11/1999 +% *** OR ** comment out block A and activate block B or vice versa. +% ********************************************** +% +% -- Start of block A -- (Type 1 or Truetype fonts) +%\newfont{\secfnt}{timesbd at 12pt} % was timenrb originally - now is timesbd +%\newfont{\secit}{timesbi at 12pt} %13 Jan 00 gkmt +%\newfont{\subsecfnt}{timesi at 11pt} % was timenrri originally - now is timesi +%\newfont{\subsecit}{timesbi at 11pt} % 13 Jan 00 gkmt -- was times changed to timesbi gm 2/4/2000 +% % because "normal" is italic, "italic" is Roman +%\newfont{\ttlfnt}{arialbd at 18pt} % was arialb originally - now is arialbd +%\newfont{\ttlit}{arialbi at 18pt} % 13 Jan 00 gkmt +%\newfont{\subttlfnt}{arial at 14pt} % was arialr originally - now is arial +%\newfont{\subttlit}{ariali at 14pt} % 13 Jan 00 gkmt +%\newfont{\subttlbf}{arialbd at 14pt} % 13 Jan 00 gkmt +%\newfont{\aufnt}{arial at 12pt} % was arialr originally - now is arial +%\newfont{\auit}{ariali at 12pt} % 13 Jan 00 gkmt +%\newfont{\affaddr}{arial at 10pt} % was arialr originally - now is arial +%\newfont{\affaddrit}{ariali at 10pt} %13 Jan 00 gkmt +%\newfont{\eaddfnt}{arial at 12pt} % was arialr originally - now is arial +%\newfont{\ixpt}{times at 9pt} % was timenrr originally - now is times +%\newfont{\confname}{timesi at 8pt} % was timenrri - now is timesi +%\newfont{\crnotice}{times at 8pt} % was timenrr originally - now is times +%\newfont{\ninept}{times at 9pt} % was timenrr originally - now is times +% ********************************************* +% -- End of block A -- +% +% +% -- Start of block B -- METAFONT +% +++++++++++++++++++++++++++++++++++++++++++++ +% Next (default) block for those using Metafont +% Gerry Murray 11/11/1999 +% *** THIS BLOCK FOR THOSE USING METAFONT ***** +% ********************************************* +\newfont{\secfnt}{ptmb at 12pt} +\newfont{\secit}{ptmbi at 12pt} %13 Jan 00 gkmt +\newfont{\subsecfnt}{ptmri at 11pt} +\newfont{\subsecit}{ptmbi at 11pt} % 13 Jan 00 gkmt -- was ptmr changed to ptmbi gm 2/4/2000 + % because "normal" is italic, "italic" is Roman +\newfont{\ttlfnt}{phvb at 18pt} +\newfont{\ttlit}{phvbo at 18pt} % GM 2/4/2000 +\newfont{\subttlfnt}{phvr at 14pt} +\newfont{\subttlit}{phvro at 14pt} % GM 2/4/2000 +\newfont{\subttlbf}{phvb at 14pt} % 13 Jan 00 gkmt +\newfont{\aufnt}{phvr at 12pt} +\newfont{\auit}{phvro at 12pt} % GM 2/4/2000 +\newfont{\affaddr}{phvr at 10pt} +\newfont{\affaddrit}{phvro at 10pt} % GM 2/4/2000 +\newfont{\eaddfnt}{phvr at 12pt} +\newfont{\ixpt}{ptmr at 9pt} +\newfont{\confname}{ptmri at 8pt} +\newfont{\crnotice}{ptmr at 8pt} +\newfont{\ninept}{ptmr at 9pt} +% +++++++++++++++++++++++++++++++++++++++++++++ +% -- End of block B -- + +\def\email#1{{{\eaddfnt{\vskip 4pt#1}}}} + +\def\addauthorsection{\ifnum\originalaucount>3 + \section{Additional Authors}\the\addauthors + \fi} + +\newcount\savesection +\newcount\sectioncntr +\global\sectioncntr=1 + +\setcounter{secnumdepth}{3} + +\def\appendix{\par +\section*{APPENDIX} +\setcounter{section}{0} + \setcounter{subsection}{0} + \def\thesection{\Alph{section}} } + +\leftmargini 22.5pt +\leftmarginii 19.8pt % > \labelsep + width of '(m)' +\leftmarginiii 16.8pt % > \labelsep + width of 'vii.' +\leftmarginiv 15.3pt % > \labelsep + width of 'M.' +\leftmarginv 9pt +\leftmarginvi 9pt + +\leftmargin\leftmargini +\labelsep 4.5pt +\labelwidth\leftmargini\advance\labelwidth-\labelsep + +\def\@listI{\leftmargin\leftmargini \parsep 3.6pt plus 2pt minus 1pt% +\topsep 7.2pt plus 2pt minus 4pt% +\itemsep 3.6pt plus 2pt minus 1pt} + +\let\@listi\@listI +\@listi + +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth-\labelsep + \topsep 3.6pt plus 2pt minus 1pt + \parsep 1.8pt plus 0.9pt minus 0.9pt + \itemsep \parsep} + +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii\advance\labelwidth-\labelsep + \topsep 1.8pt plus 0.9pt minus 0.9pt + \parsep \z@ \partopsep 1pt plus 0pt minus 1pt + \itemsep \topsep} + +\def\@listiv{\leftmargin\leftmarginiv + \labelwidth\leftmarginiv\advance\labelwidth-\labelsep} + +\def\@listv{\leftmargin\leftmarginv + \labelwidth\leftmarginv\advance\labelwidth-\labelsep} + +\def\@listvi{\leftmargin\leftmarginvi + \labelwidth\leftmarginvi\advance\labelwidth-\labelsep} + +\def\labelenumi{\theenumi.} +\def\theenumi{\arabic{enumi}} + +\def\labelenumii{(\theenumii)} +\def\theenumii{\alph{enumii}} +\def\p@enumii{\theenumi} + +\def\labelenumiii{\theenumiii.} +\def\theenumiii{\roman{enumiii}} +\def\p@enumiii{\theenumi(\theenumii)} + +\def\labelenumiv{\theenumiv.} +\def\theenumiv{\Alph{enumiv}} +\def\p@enumiv{\p@enumiii\theenumiii} + +\def\labelitemi{$\bullet$} +\def\labelitemii{\bf --} +\def\labelitemiii{$\ast$} +\def\labelitemiv{$\cdot$} + +\def\verse{\let\\=\@centercr + \list{}{\itemsep\z@ \itemindent -1.5em\listparindent \itemindent + \rightmargin\leftmargin\advance\leftmargin 1.5em}\item[]} +\let\endverse\endlist + +\def\quotation{\list{}{\listparindent 1.5em + \itemindent\listparindent + \rightmargin\leftmargin \parsep 0pt plus 1pt}\item[]} +\let\endquotation=\endlist + +\def\quote{\list{}{\rightmargin\leftmargin}\item[]} +\let\endquote=\endlist + +\def\descriptionlabel#1{\hspace\labelsep \bf #1} +\def\description{\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + +\let\enddescription\endlist + +\def\theequation{\arabic{equation}} + +\arraycolsep 4.5pt % Half the space between columns in an array environment. +\tabcolsep 5.4pt % Half the space between columns in a tabular environment. +\arrayrulewidth .4pt % Width of rules in array and tabular environment. +\doublerulesep 1.8pt % Space between adjacent rules in array or tabular env. + +\tabbingsep \labelsep % Space used by the \' command. (See LaTeX manual.) + +\skip\@mpfootins =\skip\footins + +\fboxsep =2.7pt % Space left between box and text by \fbox and \framebox. +\fboxrule =.4pt % Width of rules in box made by \fbox and \framebox. + +\def\thepart{\Roman{part}} % Roman numeral part numbers. +\def\thesection {\arabic{section}} +\def\thesubsection {\thesection.\arabic{subsection}} +%\def\thesubsubsection {\thesubsection.\arabic{subsubsection}} % GM 7/30/2002 +%\def\theparagraph {\thesubsubsection.\arabic{paragraph}} % GM 7/30/2002 +\def\thesubparagraph {\theparagraph.\arabic{subparagraph}} + +\def\@pnumwidth{1.55em} +\def\@tocrmarg {2.55em} +\def\@dotsep{4.5} +\setcounter{tocdepth}{3} + +\def\tableofcontents{\@latexerr{\tableofcontents: Tables of contents are not + allowed in the `acmconf' document style.}\@eha} + +\def\l@part#1#2{\addpenalty{\@secpenalty} + \addvspace{2.25em plus 1pt} % space above part line + \begingroup + \@tempdima 3em % width of box holding part number, used by + \parindent \z@ \rightskip \@pnumwidth %% \numberline + \parfillskip -\@pnumwidth + {\large \bf % set line in \large boldface + \leavevmode % TeX command to enter horizontal mode. + #1\hfil \hbox to\@pnumwidth{\hss #2}}\par + \nobreak % Never break after part entry + \endgroup} + +\def\l@section#1#2{\addpenalty{\@secpenalty} % good place for page break + \addvspace{1.0em plus 1pt} % space above toc entry + \@tempdima 1.5em % width of box holding section number + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \bf % Boldface. + \leavevmode % TeX command to enter horizontal mode. + \advance\leftskip\@tempdima %% added 5 Feb 88 to conform to + \hskip -\leftskip %% 25 Jan 88 change to \numberline + #1\nobreak\hfil \nobreak\hbox to\@pnumwidth{\hss #2}\par + \endgroup} + + +\def\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\def\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\def\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\def\l@subparagraph{\@dottedtocline{5}{10em}{5em}} + +\def\listoffigures{\@latexerr{\listoffigures: Lists of figures are not + allowed in the `acmconf' document style.}\@eha} + +\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} + +\def\listoftables{\@latexerr{\listoftables: Lists of tables are not + allowed in the `acmconf' document style.}\@eha} +\let\l@table\l@figure + +\def\footnoterule{\kern-3\p@ + \hrule width .4\columnwidth + \kern 2.6\p@} % The \hrule has default height of .4pt . +\long\def\@makefntext#1{\noindent +\hbox to .5em{\hss\textsuperscript{\@thefnmark}}#1} % C. Clifton / GM Oct. 2nd. 2002 +\long\def\@maketntext#1{\noindent +#1} + +\long\def\@maketitlenotetext#1#2{\noindent + \hbox to 1.8em{\hss$^{#1}$}#2} + +\setcounter{topnumber}{2} +\def\topfraction{.7} +\setcounter{bottomnumber}{1} +\def\bottomfraction{.3} +\setcounter{totalnumber}{3} +\def\textfraction{.2} +\def\floatpagefraction{.5} +\setcounter{dbltopnumber}{2} +\def\dbltopfraction{.7} +\def\dblfloatpagefraction{.5} + +% +\long\def\@makecaption#1#2{ + \vskip \baselineskip + \setbox\@tempboxa\hbox{\textbf{#1: #2}} + \ifdim \wd\@tempboxa >\hsize % IF longer than one line: + \textbf{#1: #2}\par % THEN set as ordinary paragraph. + \else % ELSE center. + \hbox to\hsize{\hfil\box\@tempboxa\hfil}\par + \fi} + +% + +\long\def\@makecaption#1#2{ + \vskip 10pt + \setbox\@tempboxa\hbox{\textbf{#1: #2}} + \ifdim \wd\@tempboxa >\hsize % IF longer than one line: + \textbf{#1: #2}\par % THEN set as ordinary paragraph. + \else % ELSE center. + \hbox to\hsize{\hfil\box\@tempboxa\hfil} + \fi} + +\@ifundefined{figure}{\newcounter {figure}} % this is for LaTeX2e + +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{Figure \thefigure} +\def\figure{\@float{figure}} +\let\endfigure\end@float +\@namedef{figure*}{\@dblfloat{figure}} +\@namedef{endfigure*}{\end@dblfloat} + +\@ifundefined{table}{\newcounter {table}} % this is for LaTeX2e + +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{Table \thetable} +\def\table{\@float{table}} +\let\endtable\end@float +\@namedef{table*}{\@dblfloat{table}} +\@namedef{endtable*}{\end@dblfloat} + +\newtoks\titleboxnotes +\newcount\titleboxnoteflag + +\def\maketitle{\par + \begingroup + \def\thefootnote{\fnsymbol{footnote}} + \def\@makefnmark{\hbox + to 0pt{$^{\@thefnmark}$\hss}} + \twocolumn[\@maketitle] +\@thanks + \endgroup + \setcounter{footnote}{0} + \let\maketitle\relax + \let\@maketitle\relax + \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\gdef\@subtitle{}\let\thanks\relax + \@copyrightspace} + +%% CHANGES ON NEXT LINES +\newif\if@ll % to record which version of LaTeX is in use + +\expandafter\ifx\csname LaTeXe\endcsname\relax % LaTeX2.09 is used +\else% LaTeX2e is used, so set ll to true +\global\@lltrue +\fi + +\if@ll + \NeedsTeXFormat{LaTeX2e} + \ProvidesClass{www2005-submission} [2004/1/26 - V1.4 - based on sig-alt-release.cls] + \RequirePackage{latexsym}% QUERY: are these two really needed? + \let\dooptions\ProcessOptions +\else + \let\dooptions\@options +\fi +%% END CHANGES + +\def\@height{height} +\def\@width{width} +\def\@minus{minus} +\def\@plus{plus} +\def\hb@xt@{\hbox to} +\newif\if@faircopy +\@faircopyfalse +\def\ds@faircopy{\@faircopytrue} + +\def\ds@preprint{\@faircopyfalse} + +\@twosidetrue +\@mparswitchtrue +\def\ds@draft{\overfullrule 5\p@} +%% CHANGE ON NEXT LINE +\dooptions + +\lineskip \p@ +\normallineskip \p@ +\def\baselinestretch{1} +\def\@ptsize{0} %needed for amssymbols.sty + +%% CHANGES ON NEXT LINES +\if@ll% allow use of old-style font change commands in LaTeX2e +\@maxdepth\maxdepth +% +\DeclareOldFontCommand{\rm}{\ninept\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*{\cal}{\@fontswitch{\relax}{\mathcal}} +\DeclareRobustCommand*{\mit}{\@fontswitch{\relax}{\mathnormal}} +\fi +% +\if@ll + \renewcommand{\rmdefault}{cmr} % was 'ttm' +% Note! I have also found 'mvr' to work ESPECIALLY well. +% Gerry - October 1999 +% You may need to change your LV1times.fd file so that sc is +% mapped to cmcsc - -for smallcaps -- that is if you decide +% to change {cmr} to {times} above. (Not recommended) + \renewcommand{\@ptsize}{} + \renewcommand{\normalsize}{% + \@setfontsize\normalsize\@ixpt{10.5\p@}%\ninept% + \abovedisplayskip 6\p@ \@plus2\p@ \@minus\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip 6\p@ \@minus 3\p@ + \belowdisplayshortskip 6\p@ \@minus 3\p@ + \let\@listi\@listI + } +\else + \def\@normalsize{%changed next to 9 from 10 + \@setsize\normalsize{9\p@}\ixpt\@ixpt + \abovedisplayskip 6\p@ \@plus2\p@ \@minus\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip 6\p@ \@minus 3\p@ + \belowdisplayshortskip 6\p@ \@minus 3\p@ + \let\@listi\@listI + }% +\fi +\if@ll + \newcommand\scriptsize{\@setfontsize\scriptsize\@viipt{8\p@}} + \newcommand\tiny{\@setfontsize\tiny\@vpt{6\p@}} + \newcommand\large{\@setfontsize\large\@xiipt{14\p@}} + \newcommand\Large{\@setfontsize\Large\@xivpt{18\p@}} + \newcommand\LARGE{\@setfontsize\LARGE\@xviipt{20\p@}} + \newcommand\huge{\@setfontsize\huge\@xxpt{25\p@}} + \newcommand\Huge{\@setfontsize\Huge\@xxvpt{30\p@}} +\else + \def\scriptsize{\@setsize\scriptsize{8\p@}\viipt\@viipt} + \def\tiny{\@setsize\tiny{6\p@}\vpt\@vpt} + \def\large{\@setsize\large{14\p@}\xiipt\@xiipt} + \def\Large{\@setsize\Large{18\p@}\xivpt\@xivpt} + \def\LARGE{\@setsize\LARGE{20\p@}\xviipt\@xviipt} + \def\huge{\@setsize\huge{25\p@}\xxpt\@xxpt} + \def\Huge{\@setsize\Huge{30\p@}\xxvpt\@xxvpt} +\fi +\normalsize + +% make aubox hsize/number of authors up to 3, less gutter +% then showbox gutter showbox gutter showbox -- GKMT Aug 99 +\newbox\@acmtitlebox +\def\@maketitle{\newpage + \null + \setbox\@acmtitlebox\vbox{% +\baselineskip 20pt +\vskip 2em % Vertical space above title. + \begin{center} + {\ttlfnt \@title\par} % Title set in 18pt Helvetica (Arial) bold size. + \vskip 1.5em % Vertical space after title. +%This should be the subtitle. +{\subttlfnt \the\subtitletext\par}\vskip 1.25em%\fi + {\baselineskip 16pt\aufnt % each author set in \12 pt Arial, in a + \lineskip .5em % tabular environment + \begin{tabular}[t]{c}\@author + \end{tabular}\par} + \vskip 1.5em % Vertical space after author. + \end{center}} + \dimen0=\ht\@acmtitlebox + \advance\dimen0 by -12.75pc\relax % Increased space for title box -- KBT + \unvbox\@acmtitlebox + \ifdim\dimen0<0.0pt\relax\vskip-\dimen0\fi} + + +\newcount\titlenotecount +\global\titlenotecount=0 +\newtoks\tntoks +\newtoks\tntokstwo +\newtoks\tntoksthree +\newtoks\tntoksfour +\newtoks\tntoksfive + +\def\abstract{ +\ifnum\titlenotecount>0 % was =1 + \insert\footins{% + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + }% + \color@begingroup +\ifnum\titlenotecount=1 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=2 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=3 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=4 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\S$}\rule\z@\footnotesep\ignorespaces\the\tntoksfour\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=5 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\S$}\rule\z@\footnotesep\ignorespaces\the\tntoksfour\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\P$}\rule\z@\footnotesep\ignorespaces\the\tntoksfive\@finalstrut\strutbox}% +\fi + \color@endgroup} %g} +\fi +\setcounter{footnote}{0} +\section*{ABSTRACT}\normalsize%\ninept +} + +\def\endabstract{\if@twocolumn\else\endquotation\fi} + +\def\keywords{\if@twocolumn +\section*{Keywords} +\else \small +\quotation +\fi} + +\def\terms{\if@twocolumn +\section*{General Terms} +\else \small +\quotation +\fi} + +% -- Classification needs to be a bit smart due to optionals - Gerry/Georgia November 2nd. 1999 +\newcount\catcount +\global\catcount=1 + +\def\category#1#2#3{% +\ifnum\catcount=1 +\section*{Categories and Subject Descriptors} +\advance\catcount by 1\else{\unskip; }\fi + \@ifnextchar [{\@category{#1}{#2}{#3}}{\@category{#1}{#2}{#3}[]}% +} + +\def\@category#1#2#3[#4]{% + \begingroup + \let\and\relax + #1 [\textbf{#2}]% + \if!#4!% + \if!#3!\else : #3\fi + \else + :\space + \if!#3!\else #3\kern\z@---\hskip\z@\fi + \textit{#4}% + \fi + \endgroup +} +% + +%%% This section (written by KBT) handles the 1" box in the lower left +%%% corner of the left column of the first page by creating a picture, +%%% and inserting the predefined string at the bottom (with a negative +%%% displacement to offset the space allocated for a non-existent +%%% caption). +%%% +\newtoks\copyrightnotice +\def\ftype@copyrightbox{8} +\def\@copyrightspace{ +\@float{copyrightbox}[b] +\begin{center} +\setlength{\unitlength}{1pc} +\begin{picture}(20,0) %Space for (specific) copyright notice was 20,6 +\put(0,-0.95){\crnotice{\@toappear}} +\end{picture} +\end{center} +\end@float} + +\def\@toappear{} % Default setting blank - commands below change this. +\long\def\toappear#1{\def\@toappear{\parbox[b]{20pc}{\baselineskip 9pt#1}}} +\def\toappearbox#1{\def\@toappear{\raisebox{5pt}{\framebox[20pc]{\parbox[b]{19pc}{#1}}}}} + +\newtoks\conf +\newtoks\confinfo +\def\conferenceinfo#1#2{\global\conf={#1}\global\confinfo{#2}} + + +\def\marginpar{\@latexerr{The \marginpar command is not allowed in the + `acmconf' document style.}\@eha} + +\mark{{}{}} % Initializes TeX's marks + +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} + +\def\@begintheorem#1#2{% + \parskip 0pt % GM July 2000 (for tighter spacing) + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {{\sc #1}\hskip 5\p@\relax#2.}% + ] + \it +} +\def\@opargbegintheorem#1#2#3{% + \parskip 0pt % GM July 2000 (for tighter spacing) + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\sc #1\ #2\ % This mod by Gerry to enumerate corollaries + \setbox\@tempboxa\hbox{(#3)} % and bracket the 'corollary title' + \ifdim \wd\@tempboxa>\z@ % and retain the correct numbering of e.g. theorems + \hskip 5\p@\relax % if they occur 'around' said corollaries. + \box\@tempboxa % Gerry - Nov. 1999. + \fi.}% + ] + \it +} +\newif\if@qeded + +% -- original +%\def\proof{% +% \vspace{-\parskip} % GM July 2000 (for tighter spacing) +% \global\@qededfalse +% \@ifnextchar[{\@xproof}{\@proof}% +%} +% -- end of original + +% (JSS) Fix for vertical spacing bug - Gerry Murray July 30th. 2002 +\def\proof{% +\vspace{-\lastskip}\vspace{-\parsep}\penalty-51% +\global\@qededfalse +\@ifnextchar[{\@xproof}{\@proof}% +} + +\def\endproof{% + \if@qeded\else\qed\fi + \endtrivlist +} +\def\@proof{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\sc Proof.}% + ] + \ignorespaces +} +\def\@xproof[#1]{% + \trivlist + \item[\hskip 10\p@\hskip \labelsep{\sc Proof #1.}]% + \ignorespaces +} +\def\qed{% + \unskip + \kern 10\p@ + \begingroup + \unitlength\p@ + \linethickness{.4\p@}% + \framebox(6,6){}% + \endgroup + \global\@qededtrue +} + +\def\newdef#1#2{% + \expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \global\@namedef{#1}{\@defthm{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}% + }% +} +\def\@defthm#1#2{% + \refstepcounter{#1}% + \@ifnextchar[{\@ydefthm{#1}{#2}}{\@xdefthm{#1}{#2}}% +} +\def\@xdefthm#1#2{% + \@begindef{#2}{\csname the#1\endcsname}% + \ignorespaces +} +\def\@ydefthm#1#2[#3]{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\it #2% + \savebox\@tempboxa{#3}% + \ifdim \wd\@tempboxa>\z@ + \ \box\@tempboxa + \fi.% + }]% + \ignorespaces +} +\def\@begindef#1#2{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\it #1\ \rm #2.}% + ]% +} +\def\theequation{\arabic{equation}} + +\newcounter{part} +\newcounter{section} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] +\def\thepart{\Roman{part}} +\def\thesection{\arabic{section}} +\def\thesubsection{\thesection.\arabic{subsection}} +\def\thesubsubsection{\thesubsection.\arabic{subsubsection}} %removed \subsecfnt 29 July 2002 gkmt +\def\theparagraph{\thesubsubsection.\arabic{paragraph}} %removed \subsecfnt 29 July 2002 gkmt +\newif\if@uchead +\@ucheadfalse + +%% CHANGES: NEW NOTE +%% NOTE: OK to use old-style font commands below, since they were +%% suitably redefined for LaTeX2e +%% END CHANGES +\setcounter{secnumdepth}{3} +\def\part{% + \@startsection{part}{9}{\z@}{-10\p@ \@plus -4\p@ \@minus -2\p@} + {4\p@}{\normalsize\@ucheadtrue}% +} +\def\section{% + \@startsection{section}{1}{\z@}{-10\p@ \@plus -4\p@ \@minus -2\p@}% GM + {4\p@}{\baselineskip 14pt\secfnt\@ucheadtrue}% +} + +\def\subsection{% + \@startsection{subsection}{2}{\z@}{-8\p@ \@plus -2\p@ \@minus -\p@} + {4\p@}{\secfnt}% +} +\def\subsubsection{% + \@startsection{subsubsection}{3}{\z@}{-8\p@ \@plus -2\p@ \@minus -\p@}% + {4\p@}{\subsecfnt}% +} +\def\paragraph{% + \vskip 12pt\@startsection{paragraph}{3}{\z@}{6\p@ \@plus \p@}% + {-5\p@}{\subsecfnt}% +} +\let\@period=. +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec %gkmt, 11 aug 99 + \global\let\@period\@empty + \leavevmode + \global\let\@period.% + \fi + \par % + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa + \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty + \addvspace\@tempskipa + \fi +\parskip=0pt % GM July 2000 (non numbered) section heads + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}} + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}% +} +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \edef\@svsec{% + \begingroup + %\ifnum#2>2 \noexpand\rm \fi % changed to next 29 July 2002 gkmt + \ifnum#2>2 \noexpand#6 \fi + \csname the#1\endcsname + \endgroup + \ifnum #2=1\relax .\fi + \hskip 1em + }% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6\relax + \@hangfrom{\hskip #3\relax\@svsec}% + \begingroup + \interlinepenalty \@M + \if@uchead + \uppercase{#8}% + \else + #8% + \fi + \par + \endgroup + \endgroup + \csname #1mark\endcsname{#7}% + \vskip -12pt %gkmt, 11 aug 99 and GM July 2000 (was -14) - numbered section head spacing +\addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7% + }% + \else + \def\@svsechd{% + #6% + \hskip #3\relax + \@svsec + \if@uchead + \uppercase{#8}% + \else + #8% + \fi + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7% + }% + }% + \fi + \@xsect{#5}\hskip 1pt + \par +} +\def\@xsect#1{% + \@tempskipa #1\relax + \ifdim \@tempskipa>\z@ + \par + \nobreak + \vskip \@tempskipa + \@afterheading + \else + \global\@nobreakfalse + \global\@noskipsectrue + \everypar{% + \if@noskipsec + \global\@noskipsecfalse + \clubpenalty\@M + \hskip -\parindent + \begingroup + \@svsechd + \@period + \endgroup + \unskip + \@tempskipa #1\relax + \hskip -\@tempskipa + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi + }% + \fi + \ignorespaces +} +\def\@trivlist{% + \@topsepadd\topsep + \if@noskipsec + \global\let\@period\@empty + \leavevmode + \global\let\@period.% + \fi + \ifvmode + \advance\@topsepadd\partopsep + \else + \unskip + \par + \fi + \if@inlabel + \@noparitemtrue + \@noparlisttrue + \else + \@noparlistfalse + \@topsep\@topsepadd + \fi + \advance\@topsep \parskip + \leftskip\z@skip + \rightskip\@rightskip + \parfillskip\@flushglue + \@setpar{\if@newlist\else{\@@par}\fi} + \global\@newlisttrue + \@outerparskip\parskip +} + +%%% Actually, 'abbrev' works just fine as the default +%%% Bibliography style. + +\typeout{Using 'Abbrev' bibliography style} +\newcommand\bibyear[2]{% + \unskip\quad\ignorespaces#1\unskip + \if#2..\quad \else \quad#2 \fi +} +\newcommand{\bibemph}[1]{{\em#1}} +\newcommand{\bibemphic}[1]{{\em#1\/}} +\newcommand{\bibsc}[1]{{\sc#1}} +\def\@normalcite{% + \def\@cite##1##2{[##1\if@tempswa , ##2\fi]}% +} +\def\@citeNB{% + \def\@cite##1##2{##1\if@tempswa , ##2\fi}% +} +\def\@citeRB{% + \def\@cite##1##2{##1\if@tempswa , ##2\fi]}% +} +\def\start@cite#1#2{% + \edef\citeauthoryear##1##2##3{% + ###1% + \ifnum#2=\z@ \else\ ###2\fi + }% + \ifnum#1=\thr@@ + \let\@@cite\@citeyear + \else + \let\@@cite\@citenormal + \fi + \@ifstar{\@citeNB\@@cite}{\@normalcite\@@cite}% +} +\def\cite{\start@cite23} +\def\citeNP{\cite*} +\def\citeA{\start@cite10} +\def\citeANP{\citeA*} +\def\shortcite{\start@cite23} +\def\shortciteNP{\shortcite*} +\def\shortciteA{\start@cite20} +\def\shortciteANP{\shortciteA*} +\def\citeyear{\start@cite30} +\def\citeyearNP{\citeyear*} +\def\citeN{% + \@citeRB + \def\citeauthoryear##1##2##3{##1\ [##3% + \def\reserved@a{##1}% + \def\citeauthoryear####1####2####3{% + \def\reserved@b{####1}% + \ifx\reserved@a\reserved@b + ####3% + \else + \errmessage{Package acmart Error: author mismatch + in \string\citeN^^J^^J% + See the acmart package documentation for explanation}% + \fi + }% + }% + \@ifstar\@citeyear\@citeyear +} +\def\shortciteN{% + \@citeRB + \def\citeauthoryear##1##2##3{##2\ [##3% + \def\reserved@a{##2}% + \def\citeauthoryear####1####2####3{% + \def\reserved@b{####2}% + \ifx\reserved@a\reserved@b + ####3% + \else + \errmessage{Package acmart Error: author mismatch + in \string\shortciteN^^J^^J% + See the acmart package documentation for explanation}% + \fi + }% + }% + \@ifstar\@citeyear\@citeyear % GM July 2000 +} +\def\@citenormal{% + \@ifnextchar [{\@tempswatrue\@citex;} + {\@tempswafalse\@citex,[]}% % GM July 2000 +} +\def\@citeyear{% + \@ifnextchar [{\@tempswatrue\@citex,}% + {\@tempswafalse\@citex,[]}% +} +\def\@citex#1[#2]#3{% + \let\@citea\@empty + \@cite{% + \@for\@citeb:=#3\do{% + \@citea + \def\@citea{#1 }% + \edef\@citeb{\expandafter\@iden\@citeb}% + \if@filesw + \immediate\write\@auxout{\string\citation{\@citeb}}% + \fi + \@ifundefined{b@\@citeb}{% + {\bf ?}% + \@warning{% + Citation `\@citeb' on page \thepage\space undefined% + }% + }% + {\csname b@\@citeb\endcsname}% + }% + }{#2}% +} +\let\@biblabel\@gobble +\newdimen\bibindent +\setcounter{enumi}{1} +\bibindent=0em +\def\thebibliography#1{% +\ifnum\addauflag=0\addauthorsection\global\addauflag=1\fi + \section{% + {REFERENCES} + \vskip -9pt % GM July 2000 (for tighter spacing) + \@mkboth{{\refname}}{{\refname}}% + }% + \list{[\arabic{enumi}]}{% + \settowidth\labelwidth{[#1]}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \advance\leftmargin\bibindent + \parsep=0pt\itemsep=1pt % GM July 2000 + \itemindent -\bibindent + \listparindent \itemindent + \usecounter{enumi} + }% + \let\newblock\@empty + \raggedright % GM July 2000 + \sloppy + \sfcode`\.=1000\relax +} + + +\gdef\balancecolumns +{\vfill\eject +\global\@colht=\textheight +\global\ht\@cclv=\textheight +} + +\newcount\colcntr +\global\colcntr=0 +\newbox\savebox + +\gdef \@makecol {% +\global\advance\colcntr by 1 +\ifnum\colcntr>2 \global\colcntr=1\fi + \ifvoid\footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox{% +\boxmaxdepth \@maxdepth + \@tempdima\dp\@cclv + \unvbox \@cclv + \vskip-\@tempdima + \vskip \skip\footins + \color@begingroup + \normalcolor + \footnoterule + \unvbox \footins + \color@endgroup + }% + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global \let \@midlist \@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht {% +\@texttop + \dimen@ \dp\@outputbox + \unvbox \@outputbox + \vskip -\dimen@ + \@textbottom + }% + \fi + \global \maxdepth \@maxdepth +} +\def\titlenote{\@ifnextchar[\@xtitlenote{\stepcounter\@mpfn +\global\advance\titlenotecount by 1 +\ifnum\titlenotecount=1 + \raisebox{9pt}{$\ast$} +\fi +\ifnum\titlenotecount=2 + \raisebox{9pt}{$\dagger$} +\fi +\ifnum\titlenotecount=3 + \raisebox{9pt}{$\ddagger$} +\fi +\ifnum\titlenotecount=4 +\raisebox{9pt}{$\S$} +\fi +\ifnum\titlenotecount=5 +\raisebox{9pt}{$\P$} +\fi + \@titlenotetext +}} + +\long\def\@titlenotetext#1{\insert\footins{% +\ifnum\titlenotecount=1\global\tntoks={#1}\fi +\ifnum\titlenotecount=2\global\tntokstwo={#1}\fi +\ifnum\titlenotecount=3\global\tntoksthree={#1}\fi +\ifnum\titlenotecount=4\global\tntoksfour={#1}\fi +\ifnum\titlenotecount=5\global\tntoksfive={#1}\fi + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + }% + \color@begingroup + \color@endgroup}} + +%%%%%%%%%%%%%%%%%%%%%%%%% +\ps@plain +\baselineskip=11pt +\let\thepage\relax % For NO page numbers - GM Nov. 30th. 1999 and July 2000 +\def\setpagenumber#1{\global\setcounter{page}{#1}} +%\pagenumbering{arabic} % Arabic page numbers GM July 2000 +\twocolumn % Double column. +\flushbottom % Even bottom -- alas, does not balance columns at end of document +\pagestyle{plain} + +% Need Copyright Year and Copyright Data to be user definable (in .tex file). +% Gerry Nov. 30th. 1999 +\newtoks\copyrtyr +\newtoks\acmcopyr +\newtoks\boilerplate +%... +%... Lisa needed the following to be an integral part of this particular class file +%... +%Copyright is held by the author/owner(s). +%WWW2005, May 10--14, 2005, Chiba, Japan. +%ACM 1-58113-680-3/04/0005. +% +%... +%... +%... +%\global\acmcopyr={1-58113-449-5/02/0005} % Default +\global\acmcopyr={xxx} % Default +\global\copyrtyr={2003} % Default - 12/4/2000 *** Gerry +\def\CopyrightYear#1{\global\copyrtyr{#1}} +\def\crdata#1{\global\acmcopyr{#1}} +\def\permission#1{\global\boilerplate{#1}} +% +\global\boilerplate={Copyright is held by the author/owner(s).\\ {\it Operating System Reviews}} +\newtoks\copyrightetc +% original \global\copyrightetc{ACM 1-58113-844-X/04/0005.\the\acmcopyr} +% commented out following line---cew +%\global\copyrightetc{ACM 1-58113-844-X/04/0005} % "xxx" not needed after the period. + +\toappear{\the\boilerplate\par +{\confname{\the\conf}} \the\confinfo\par \the\copyrightetc.} +% +%% End of www2005-submission.cls -- V1.4 - 1/26/2004 -- +%% Gerry Murray -- Monday January 26th. 2004 diff --git a/executable_names/doc/common/chngpage.sty b/executable_names/doc/common/chngpage.sty new file mode 100644 index 0000000000000000000000000000000000000000..6381292d24ffd0effad9ced42c2ef8366fe67d9a --- /dev/null +++ b/executable_names/doc/common/chngpage.sty @@ -0,0 +1,318 @@ +% chngpage.sty +% +% Provides commands to change the page layout in the middle of a document, +% and to robustly check for typesetting on odd or even pages. +% Instructions for use are at the end of this file. +% +% author: Peter Wilson (CUA) +% (now at peter.r.wilson@boeing.com) +% Copyright 2000 +% Released under the Latex Project Public License +% +% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{chngpage}[2001/02/24 v1.1c change page layout] + +%% Note: internal package commands all include the string `cp@' +%% new \if for the strict option +\newif\ifcpstrict + \cpstrictfalse + +%% Declare and process options +\DeclareOption{strict}{\cpstricttrue} +\ProcessOptions\relax + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% new commands for strict checking of odd/even page +%% Works by writing a label and then checking its pageref + +\newif\ifcpoddpage +\newcounter{cp@cnt} +\newcounter{cp@tempcnt} +\newcommand{\cplabelprefix}{^_} + +\newcommand{\cp@setref}[3]{% + \ifx#1\relax + 0% in case no label in the *.aux file (page number made = 0) + \else + \expandafter#2#1% + \fi} + +\newcommand{\cp@pageref}[1]{% + \expandafter\cp@setref\csname r@#1\endcsname\@secondoftwo{#1}} + +\AtBeginDocument{% % special code if hyperrref package is used + \@ifpackageloaded{hyperref}{% + \renewcommand{\cp@pageref}[1]{% + \expandafter\ifx\csname r@#1\endcsname\relax + 0% % zero + \else + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\@car + \expandafter\expandafter\expandafter\@gobble + \csname r@#1\endcsname\@nil + \fi}}{}} + +%% User level command to check for odd/even page +\DeclareRobustCommand{\checkoddpage}{% + \stepcounter{cp@cnt}\label{\cplabelprefix\thecp@cnt}% + \cpoddpagefalse% + \c@cp@tempcnt=\cp@pageref{\cplabelprefix\thecp@cnt} % must have a space here + \ifodd\c@cp@tempcnt\cpoddpagetrue\fi} + +%% end newcommands for strict checking of odd/even page +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% copy of some of the code from the ifmtarg package to save requiring ifmtarg +\begingroup +\catcode`\Q=3 +\long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil} +\long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4} +\endgroup + +%% set the page output parameters +%\newcommand{\ch@ngetext}{% +\DeclareRobustCommand{\ch@ngetext}{% + \setlength{\@colht}{\textheight}\setlength{\@colroom}{\textheight}% + \setlength{\vsize}{\textheight}\setlength{\columnwidth}{\textwidth}% + \if@twocolumn% + \advance\columnwidth-\columnsep \divide\columnwidth\tw@% + \@firstcolumntrue% + \fi% + \setlength{\hsize}{\columnwidth}% + \setlength{\linewidth}{\hsize}% +} + +%\newcommand{\changetext}[5]{% +\DeclareRobustCommand{\changetext}[5]{% + \@ifmtarg{#1}{}{\addtolength{\textheight}{#1}}% + \@ifmtarg{#2}{}{\addtolength{\textwidth}{#2}}% + \@ifmtarg{#3}{}{\addtolength{\evensidemargin}{#3}}% + \@ifmtarg{#4}{}{\addtolength{\oddsidemargin}{#4}}% + \@ifmtarg{#5}{}{\addtolength{\columnsep}{#5}}% + \ch@ngetext% +} + +%\newcommand{\changepage}[9]{% +\DeclareRobustCommand{\changepage}[9]{% + \@ifmtarg{#1}{}{\addtolength{\textheight}{#1}}% + \@ifmtarg{#2}{}{\addtolength{\textwidth}{#2}}% + \@ifmtarg{#3}{}{\addtolength{\evensidemargin}{#3}}% + \@ifmtarg{#4}{}{\addtolength{\oddsidemargin}{#4}}% + \@ifmtarg{#5}{}{\addtolength{\columnsep}{#5}}% + \ch@ngetext% + \@ifmtarg{#6}{}{\addtolength{\topmargin}{#6}}% + \@ifmtarg{#7}{}{\addtolength{\headheight}{#7}}% + \@ifmtarg{#8}{}{\addtolength{\headsep}{#8}}% + \@ifmtarg{#9}{}{\addtolength{\footskip}{#9}}% +} + + +\newenvironment{adjustwidth}[3][\@empty]{% + \begin{list}{}{% + \topsep\z@% + \listparindent\parindent% + \parsep\parskip% + \@ifmtarg{#2}{\setlength{\leftmargin}{\z@}}{\setlength{\leftmargin}{#2}}% + \@ifmtarg{#3}{\setlength{\rightmargin}{\z@}}{\setlength{\rightmargin}{#3}}% + \ifx\@empty #1\relax \else + \cpoddpagefalse + \ifcpstrict\checkoddpage\else + \ifodd\c@page\cpoddpagetrue\fi + \fi + \ifcpoddpage\else % even numbered page + \@ifmtarg{#3}{\setlength{\leftmargin}{\z@}}{\setlength{\leftmargin}{#3}}% + \@ifmtarg{#2}{\setlength{\rightmargin}{\z@}}{\setlength{\rightmargin}{#2}}% + \fi + \fi} + \item[]}{\end{list}} + + + +\endinput + +% Usage: +% ------ +% +%%%%%%%%%%%%% +% \changetext +%%%%%%%%%%%%% +% The \changetext command is for changing the size and horizontal position +% of the text block on a page. The command takes 5 arguments, each of which +% is a length or is empty. i.e., +% +% \changetext{textheight}{textwidth}{evensidemargin}{oddsidemargin}{columnsep} +% +% The given lengths are added to the corresponding current lengths and +% the remainder of the current page is typeset using the changed text block +% layout. The new layout remains in effect until another \change... command +% is issued. +% +%%%%%%%%%%%%% +% \changepage +%%%%%%%%%%%%% +% The \changepage command is for changing the general layout of +% a page. The command takes 9 arguments, each of which is a length or is empty. +% The first 5 arguments are the same as for \changetext and have the same effect. +% The last four arguments are: +% +% \changepage{5 args}{topmargin}{headheight}{headsep}{footskip} +% +% These lengths are added to the corresponding current lengths and +% thus modify the vertical positions of the elements of the page. The +% remainder of the current page is typeset using the changed text block +% and page layout. The new layout remains in effect until another +% \change... command is issued. +% +% NOTE 1: Not supplying a value for a length argument is equivalent +% to giving it a zero length value. +% +% NOTE 2: For any given page, everything is constant except for the textwidth +% and columnsep (for example, what is the meaning of two +% topmargins on a single column page?). +% It is therefore best to change anything else at the +% start of a new page. Further, any changes only apply to whole +% paragraphs. If you want an odd shaped paragraph use either +% the hanging package or the TeX \parshape command. +% +% For example, to change from single column pages to double column +% pages where the text block is both shorter and wider, then to revert +% back to the initial layout: +% ... single column normal page +% \newpage % or \clearpage +% \changetext{-5\baselineskip}{10em}{-5em}{-5em}{} +% \twocolumn +% ... two column pages +% \clearpage +% \changetext{5\baselineskip}{-10em}{5em}{5em}{} +% \onecolumn +% ... normal pages +% +% Note the adjustments to the margins which will keep the vertical centerline +% of the textblock at the same position on the page. +% +% As another example, to increase the width of a single paragraph: +% +% \changetext{0pt}{5em}{}{}{}% +% Start of wider paragraph text ... +% ... end of paragraph. +% +% \changetext{0pt}{-5em}{}{}{} +% Start of a normal paragraph ... +% +% Under some circumstances you can include a \change... command as part of +% the argument to \afterpage (from the afterpage package) and it may work. +% Similarly it may work in a heading style used for \thispagestyle to change +% a single page. +% +%%%%%%%%%%%%% +% adjustwidth +%%%%%%%%%%%%% +% Within an adjustwidth environment the left and right margins can be +% adjusted. The environment takes one optional argument and two required +% length arguments: +% +% \begin{adjustwidth}[]{leftmargin}{rightmargin} +% +% A positive length value will increase the relevant margin (shortening +% the text lines) while a negative length value will decrease the margin +% (lengthening text lines). An empty length argument means no change +% to the margin. At the end of the environment the margins revert to +% their original values. +% +% For example, to extend the text into the right margin: +% \begin{adjustwidth}{}{-8em} +% +% Any appearance of the optional argument (even just []) will cause +% the values of the margins to switch between odd and even pages. +% +% If the document is being set twosided it might be advantageous +% to have any wider text extending into the outside margin. This +% could be done via the optional argument, as: +% \begin{adjustwidth}[]{}{-8em} +% +% To have the adjusted text horizontally centered with respect to +% any surrounding text, the margins should be adjusted equally: +% \begin{adjustwidth}{-4em}{-4em} +% +% For interest, \begin{quotation} is pretty much equivalent +% to \begin{adjustwidth}{2.5em}{2.5em} +% +% The environment may also be used inside a float if the contents are +% a bit too wide for the text block, but can still fit within the physical +% page: +% \begin{figure} +% \begin{adjustwidth}{-2em}{-2em} +% \includegraphics{wide} +% \caption{Wide figure} +% \end{adjustwidth} +% \end{figure} +% +% Sometimes, because of the asynchronous nature of the TeX output +% routine, the margin switching may be incorrect (like \marginpar sometimes) +% near the top of a page. This can be corrected by using the package +% option `strict' (i.e., \usepackage[strict]{chngpage}), which causes +% adjustwidth to use the \checkoddpage command (see below). +% +% A disadvantage of the strict option is that the package generates +% a new label for each adjustwidth environment, and TeX may run out +% of space if there are an excessive number of labels in the document. +% +% Whether or not the strict option is used, `strict adjustwidths' +% can be turned on by putting the command \cpstricttrue before +% the environment, and turned of by using \cpstrictfalse. +% +% NOTE: In a twocolumn document, the adjustwidth environment +% treats both columns equally. For example, if the width is meant +% to be wider at the outer margin, then on odd pages the extra width +% will be at the right of any column, and on even pages the extra +% will be at the left of any column. You can get interesting effects +% by careful hand tuning on two column pages. +% +%%%%%%%%%%%%%%% +% \checkoddpage +%%%%%%%%%%%%%%% +% The \checkoddpage command can be used anywhere in the body of +% a document to determine if TeX is typesetting on an odd or +% even numbered page. If on an odd page then \ifcpoddpage is +% set TRUE, otherwise (on an even page) \ifcpoddpage is set +% FALSE. +% +% This works by the \checkoddpage command generating a label and +% then checking the \pageref for the label (actually, a special version +% of \pageref is required and is used internally by \checkoddpage). +% This mechanism requires at least two LaTeX passes to ensure that +% the labels have settled (on the initial pass there will be no labels +% in the *.aux file to be checked). +% +% The label identifier is composed of the command \cplabelprefix +% and an automatically generated number. \cplabelprefix, initially +% defined as `^_', can be changed in the preamble if it will cause +% a clash with any author-defined labels. The default labels will +% be of the form `^_N' where N is a positive integer. +% +% Changes in version 1.1c (2001/02/24) +% ----------------------- +% o Fixed problem when used with the calc package +% (can't do \setcounter{cp@tempcnt}{\cp@pageref{....}} +% o Fixed problem when used with the hyperef package +% (hyperref adds new arguments to \newlabel in the *.aux file) +% +% Changes in version 1.1b (2001/01/31) +% ----------------------- +% o Added strict option for robust adjustwidth; checks odd/even +% pages via labels instead of by the page counter. +% +% Changes in version 1.1a (2001/01/18) +% ----------------------- +% o Added missing {} in last 4 arguments of \changepage +% +% Changes in version 1.1 (2000/07/22) +% ---------------------- +% o Empty arguments made available +% o Added adjustwidth environment +% +% +% Peter W. +% +% diff --git a/executable_names/doc/common/llncs.cls b/executable_names/doc/common/llncs.cls new file mode 100644 index 0000000000000000000000000000000000000000..29e505e60de79ebe2010b8099ab7c49a8187038f --- /dev/null +++ b/executable_names/doc/common/llncs.cls @@ -0,0 +1,1189 @@ +% LLNCS DOCUMENT CLASS -- version 2.13 (28-Jan-2002) +% Springer Verlag LaTeX2e support for Lecture Notes in Computer Science +% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{llncs}[2002/01/28 v2.13 +^^J LaTeX document class for Lecture Notes in Computer Science] +% Options +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\DeclareOption{citeauthoryear}{\let\citeauthoryear=Y} +\DeclareOption{oribibl}{\let\oribibl=Y} +\let\if@custvec\iftrue +\DeclareOption{orivec}{\let\if@custvec\iffalse} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} + +\let\if@openbib\iffalse +\DeclareOption{openbib}{\let\if@openbib\iftrue} + +% languages +\let\switcht@@therlang\relax +\def\ds@deutsch{\def\switcht@@therlang{\switcht@deutsch}} +\def\ds@francais{\def\switcht@@therlang{\switcht@francais}} + +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} + +\ProcessOptions + +\LoadClass[twoside]{article} +\RequirePackage{multicol} % needed for the list of participants, index + +\setlength{\textwidth}{12.2cm} +\setlength{\textheight}{19.3cm} +\renewcommand\@pnumwidth{2em} +\renewcommand\@tocrmarg{3.5em} +% +\def\@dottedtocline#1#2#3#4#5{% + \ifnum #1>\c@tocdepth \else + \vskip \z@ \@plus.2\p@ + {\leftskip #2\relax \rightskip \@tocrmarg \advance\rightskip by 0pt plus 2cm + \parfillskip -\rightskip \pretolerance=10000 + \parindent #2\relax\@afterindenttrue + \interlinepenalty\@M + \leavevmode + \@tempdima #3\relax + \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip + {#4}\nobreak + \leaders\hbox{$\m@th + \mkern \@dotsep mu\hbox{.}\mkern \@dotsep + mu$}\hfill + \nobreak + \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}% + \par}% + \fi} +% +\def\switcht@albion{% +\def\abstractname{Abstract.} +\def\ackname{Acknowledgement.} +\def\andname{and} +\def\lastandname{\unskip, and} +\def\appendixname{Appendix} +\def\chaptername{Chapter} +\def\claimname{Claim} +\def\conjecturename{Conjecture} +\def\contentsname{Table of Contents} +\def\corollaryname{Corollary} +\def\definitionname{Definition} +\def\examplename{Example} +\def\exercisename{Exercise} +\def\figurename{Fig.} +\def\keywordname{{\bf Key words:}} +\def\indexname{Index} +\def\lemmaname{Lemma} +\def\contriblistname{List of Contributors} +\def\listfigurename{List of Figures} +\def\listtablename{List of Tables} +\def\mailname{{\it Correspondence to\/}:} +\def\noteaddname{Note added in proof} +\def\notename{Note} +\def\partname{Part} +\def\problemname{Problem} +\def\proofname{Proof} +\def\propertyname{Property} +\def\propositionname{Proposition} +\def\questionname{Question} +\def\remarkname{Remark} +\def\seename{see} +\def\solutionname{Solution} +\def\subclassname{{\it Subject Classifications\/}:} +\def\tablename{Table} +\def\theoremname{Theorem}} +\switcht@albion +% Names of theorem like environments are already defined +% but must be translated if another language is chosen +% +% French section +\def\switcht@francais{%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e.}% + \def\ackname{Remerciements.}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice} + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bf Mots-cl\'e:}} + \def\indexname{Index} + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs} + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\it Correspondence to\/}:} + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\remarkname{Remarque}% + \def\seename{voir} + \def\solutionname{Solution}% + \def\subclassname{{\it Subject Classifications\/}:} + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung.}% + \def\ackname{Danksagung.}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bf Schl\"usselw\"orter:}} + \def\indexname{Index} +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter} + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\it Correspondence to\/}:} + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\remarkname{Anmerkung}% + \def\seename{siehe} + \def\solutionname{L\"osung}% + \def\subclassname{{\it Subject Classifications\/}:} + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} + +% Ragged bottom for the actual page +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} + +\renewcommand\small{% + \@setfontsize\small\@ixpt{11}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 8\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} + +\frenchspacing +\widowpenalty=10000 +\clubpenalty=10000 + +\setlength\oddsidemargin {63\p@} +\setlength\evensidemargin {63\p@} +\setlength\marginparwidth {90\p@} + +\setlength\headsep {16\p@} + +\setlength\footnotesep{7.7\p@} +\setlength\textfloatsep{8mm\@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {8mm\@plus 2\p@ \@minus 2\p@} + +\setcounter{secnumdepth}{2} + +\newcounter {chapter} +\renewcommand\thechapter {\@arabic\c@chapter} + +\newif\if@mainmatter \@mainmattertrue +\newcommand\frontmatter{\cleardoublepage + \@mainmatterfalse\pagenumbering{Roman}} +\newcommand\mainmatter{\cleardoublepage + \@mainmattertrue\pagenumbering{arabic}} +\newcommand\backmatter{\if@openright\cleardoublepage\else\clearpage\fi + \@mainmatterfalse} + +\renewcommand\part{\cleardoublepage + \thispagestyle{empty}% + \if@twocolumn + \onecolumn + \@tempswatrue + \else + \@tempswafalse + \fi + \null\vfil + \secdef\@part\@spart} + +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\centering + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >-2\relax + \huge\bfseries \partname~\thepart + \par + \vskip 20\p@ + \fi + \Huge \bfseries #2\par}% + \@endpart} +\def\@spart#1{% + {\centering + \interlinepenalty \@M + \normalfont + \Huge \bfseries #1\par}% + \@endpart} +\def\@endpart{\vfil\newpage + \if@twoside + \null + \thispagestyle{empty}% + \newpage + \fi + \if@tempswa + \twocolumn + \fi} + +\newcommand\chapter{\clearpage + \thispagestyle{empty}% + \global\@topnum\z@ + \@afterindentfalse + \secdef\@chapter\@schapter} +\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \refstepcounter{chapter}% + \typeout{\@chapapp\space\thechapter.}% + \addcontentsline{toc}{chapter}% + {\protect\numberline{\thechapter}#1}% + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% + \if@twocolumn + \@topnewpage[\@makechapterhead{#2}]% + \else + \@makechapterhead{#2}% + \@afterheading + \fi} +\def\@makechapterhead#1{% +% \vspace*{50\p@}% + {\centering + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \large\bfseries \@chapapp{} \thechapter + \par\nobreak + \vskip 20\p@ + \fi + \fi + \interlinepenalty\@M + \Large \bfseries #1\par\nobreak + \vskip 40\p@ + }} +\def\@schapter#1{\if@twocolumn + \@topnewpage[\@makeschapterhead{#1}]% + \else + \@makeschapterhead{#1}% + \@afterheading + \fi} +\def\@makeschapterhead#1{% +% \vspace*{50\p@}% + {\centering + \normalfont + \interlinepenalty\@M + \Large \bfseries #1\par\nobreak + \vskip 40\p@ + }} + +\renewcommand\section{\@startsection{section}{1}{\z@}% + {-18\p@ \@plus -4\p@ \@minus -4\p@}% + {12\p@ \@plus 4\p@ \@minus 4\p@}% + {\normalfont\large\bfseries\boldmath + \rightskip=\z@ \@plus 8em\pretolerance=10000 }} +\renewcommand\subsection{\@startsection{subsection}{2}{\z@}% + {-18\p@ \@plus -4\p@ \@minus -4\p@}% + {8\p@ \@plus 4\p@ \@minus 4\p@}% + {\normalfont\normalsize\bfseries\boldmath + \rightskip=\z@ \@plus 8em\pretolerance=10000 }} +\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-18\p@ \@plus -4\p@ \@minus -4\p@}% + {-0.5em \@plus -0.22em \@minus -0.1em}% + {\normalfont\normalsize\bfseries\boldmath}} +\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% + {-12\p@ \@plus -4\p@ \@minus -4\p@}% + {-0.5em \@plus -0.22em \@minus -0.1em}% + {\normalfont\normalsize\itshape}} +\renewcommand\subparagraph[1]{\typeout{LLNCS warning: You should not use + \string\subparagraph\space with this class}\vskip0.5cm +You should not use \verb|\subparagraph| with this class.\vskip0.5cm} + +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} + +\let\footnotesize\small + +\if@custvec +\def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle#1$}} +{\mbox{\boldmath$\textstyle#1$}} +{\mbox{\boldmath$\scriptstyle#1$}} +{\mbox{\boldmath$\scriptscriptstyle#1$}}} +\fi + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi} + +\def\getsto{\mathrel{\mathchoice {\vcenter{\offinterlineskip +\halign{\hfil +$\displaystyle##$\hfil\cr\gets\cr\to\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr\gets +\cr\to\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr\gets +\cr\to\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +\gets\cr\to\cr}}}}} +\def\lid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil +$\displaystyle##$\hfil\cr<\cr\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr<\cr +\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr<\cr +\noalign{\vskip1pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +<\cr +\noalign{\vskip0.9pt}=\cr}}}}} +\def\gid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil +$\displaystyle##$\hfil\cr>\cr\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr>\cr +\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr>\cr +\noalign{\vskip1pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +>\cr +\noalign{\vskip0.9pt}=\cr}}}}} +\def\grole{\mathrel{\mathchoice {\vcenter{\offinterlineskip +\halign{\hfil +$\displaystyle##$\hfil\cr>\cr\noalign{\vskip-1pt}<\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr +>\cr\noalign{\vskip-1pt}<\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr +>\cr\noalign{\vskip-0.8pt}<\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +>\cr\noalign{\vskip-0.3pt}<\cr}}}}} +\def\bbbr{{\rm I\!R}} %reelle Zahlen +\def\bbbm{{\rm I\!M}} +\def\bbbn{{\rm I\!N}} %natuerliche Zahlen +\def\bbbf{{\rm I\!F}} +\def\bbbh{{\rm I\!H}} +\def\bbbk{{\rm I\!K}} +\def\bbbp{{\rm I\!P}} +\def\bbbone{{\mathchoice {\rm 1\mskip-4mu l} {\rm 1\mskip-4mu l} +{\rm 1\mskip-4.5mu l} {\rm 1\mskip-5mu l}}} +\def\bbbc{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}}} +\def\bbbq{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm +Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle\rm Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle\rm Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}}} +\def\bbbt{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm +T$}\hbox{\hbox to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle\rm T$}\hbox{\hbox +to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle\rm T$}\hbox{\hbox +to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm T$}\hbox{\hbox +to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}}} +\def\bbbs{{\mathchoice +{\setbox0=\hbox{$\displaystyle \rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox +to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle \rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox +to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle \rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox +to0pt{\kern0.5\wd0\vrule height0.45\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.4\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox +to0pt{\kern0.55\wd0\vrule height0.45\ht0\hss}\box0}}}} +\def\bbbz{{\mathchoice {\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}} +{\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}} +{\hbox{$\mathsf\scriptstyle Z\kern-0.3em Z$}} +{\hbox{$\mathsf\scriptscriptstyle Z\kern-0.2em Z$}}}} + +\let\ts\, + +\setlength\leftmargini {17\p@} +\setlength\leftmargin {\leftmargini} +\setlength\leftmarginii {\leftmargini} +\setlength\leftmarginiii {\leftmargini} +\setlength\leftmarginiv {\leftmargini} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} + +\def\@listI{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 8\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@} +\let\@listi\@listI +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep 0\p@ \@plus2\p@ \@minus\p@} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep 0\p@ \@plus\p@\@minus\p@ + \parsep \z@ + \partopsep \p@ \@plus\z@ \@minus\p@} + +\renewcommand\labelitemi{\normalfont\bfseries --} +\renewcommand\labelitemii{$\m@th\bullet$} + +\setlength\arraycolsep{1.4\p@} +\setlength\tabcolsep{1.4\p@} + +\def\tableofcontents{\chapter*{\contentsname\@mkboth{{\contentsname}}% + {{\contentsname}}} + \def\authcount##1{\setcounter{auco}{##1}\setcounter{@auth}{1}} + \def\lastand{\ifnum\value{auco}=2\relax + \unskip{} \andname\ + \else + \unskip \lastandname\ + \fi}% + \def\and{\stepcounter{@auth}\relax + \ifnum\value{@auth}=\value{auco}% + \lastand + \else + \unskip, + \fi}% + \@starttoc{toc}\if@restonecol\twocolumn\fi} + +\def\l@part#1#2{\addpenalty{\@secpenalty}% + \addvspace{2em plus\p@}% % space above part line + \begingroup + \parindent \z@ + \rightskip \z@ plus 5em + \hrule\vskip5pt + \large % same size as for a contribution heading + \bfseries\boldmath % set line in boldface + \leavevmode % TeX command to enter horizontal mode. + #1\par + \vskip5pt + \hrule + \vskip1pt + \nobreak % Never break after part entry + \endgroup} + +\def\@dotsep{2} + +\def\hyperhrefextend{\ifx\hyper@anchor\@undefined\else +{chapter.\thechapter}\fi} + +\def\addnumcontentsmark#1#2#3{% +\addtocontents{#1}{\protect\contentsline{#2}{\protect\numberline + {\thechapter}#3}{\thepage}\hyperhrefextend}} +\def\addcontentsmark#1#2#3{% +\addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}\hyperhrefextend}} +\def\addcontentsmarkwop#1#2#3{% +\addtocontents{#1}{\protect\contentsline{#2}{#3}{0}\hyperhrefextend}} + +\def\@adcmk[#1]{\ifcase #1 \or +\def\@gtempa{\addnumcontentsmark}% + \or \def\@gtempa{\addcontentsmark}% + \or \def\@gtempa{\addcontentsmarkwop}% + \fi\@gtempa{toc}{chapter}} +\def\addtocmark{\@ifnextchar[{\@adcmk}{\@adcmk[3]}} + +\def\l@chapter#1#2{\addpenalty{-\@highpenalty} + \vskip 1.0em plus 1pt \@tempdima 1.5em \begingroup + \parindent \z@ \rightskip \@tocrmarg + \advance\rightskip by 0pt plus 2cm + \parfillskip -\rightskip \pretolerance=10000 + \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip + {\large\bfseries\boldmath#1}\ifx0#2\hfil\null + \else + \nobreak + \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern + \@dotsep mu$}\hfill + \nobreak\hbox to\@pnumwidth{\hss #2}% + \fi\par + \penalty\@highpenalty \endgroup} + +\def\l@title#1#2{\addpenalty{-\@highpenalty} + \addvspace{8pt plus 1pt} + \@tempdima \z@ + \begingroup + \parindent \z@ \rightskip \@tocrmarg + \advance\rightskip by 0pt plus 2cm + \parfillskip -\rightskip \pretolerance=10000 + \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip + #1\nobreak + \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern + \@dotsep mu$}\hfill + \nobreak\hbox to\@pnumwidth{\hss #2}\par + \penalty\@highpenalty \endgroup} + +\def\l@author#1#2{\addpenalty{\@highpenalty} + \@tempdima=\z@ %15\p@ + \begingroup + \parindent \z@ \rightskip \@tocrmarg + \advance\rightskip by 0pt plus 2cm + \pretolerance=10000 + \leavevmode \advance\leftskip\@tempdima %\hskip -\leftskip + \textit{#1}\par + \penalty\@highpenalty \endgroup} + +\setcounter{tocdepth}{0} +\newdimen\tocchpnum +\newdimen\tocsecnum +\newdimen\tocsectotal +\newdimen\tocsubsecnum +\newdimen\tocsubsectotal +\newdimen\tocsubsubsecnum +\newdimen\tocsubsubsectotal +\newdimen\tocparanum +\newdimen\tocparatotal +\newdimen\tocsubparanum +\tocchpnum=\z@ % no chapter numbers +\tocsecnum=15\p@ % section 88. plus 2.222pt +\tocsubsecnum=23\p@ % subsection 88.8 plus 2.222pt +\tocsubsubsecnum=27\p@ % subsubsection 88.8.8 plus 1.444pt +\tocparanum=35\p@ % paragraph 88.8.8.8 plus 1.666pt +\tocsubparanum=43\p@ % subparagraph 88.8.8.8.8 plus 1.888pt +\def\calctocindent{% +\tocsectotal=\tocchpnum +\advance\tocsectotal by\tocsecnum +\tocsubsectotal=\tocsectotal +\advance\tocsubsectotal by\tocsubsecnum +\tocsubsubsectotal=\tocsubsectotal +\advance\tocsubsubsectotal by\tocsubsubsecnum +\tocparatotal=\tocsubsubsectotal +\advance\tocparatotal by\tocparanum} +\calctocindent + +\def\l@section{\@dottedtocline{1}{\tocchpnum}{\tocsecnum}} +\def\l@subsection{\@dottedtocline{2}{\tocsectotal}{\tocsubsecnum}} +\def\l@subsubsection{\@dottedtocline{3}{\tocsubsectotal}{\tocsubsubsecnum}} +\def\l@paragraph{\@dottedtocline{4}{\tocsubsubsectotal}{\tocparanum}} +\def\l@subparagraph{\@dottedtocline{5}{\tocparatotal}{\tocsubparanum}} + +\def\listoffigures{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn + \fi\section*{\listfigurename\@mkboth{{\listfigurename}}{{\listfigurename}}} + \@starttoc{lof}\if@restonecol\twocolumn\fi} +\def\l@figure{\@dottedtocline{1}{0em}{1.5em}} + +\def\listoftables{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn + \fi\section*{\listtablename\@mkboth{{\listtablename}}{{\listtablename}}} + \@starttoc{lot}\if@restonecol\twocolumn\fi} +\let\l@table\l@figure + +\renewcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}{\listfigurename}}% + \@starttoc{lof}% + } + +\renewcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } + +\ifx\oribibl\undefined +\ifx\citeauthoryear\undefined +\renewenvironment{thebibliography}[1] + {\section*{\refname} + \def\@biblabel##1{##1.} + \small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \if@openbib + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + \fi + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \if@openbib + \renewcommand\newblock{\par}% + \else + \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}% + \fi + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.=\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand\immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\,\hskip\z@skip}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else + \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +\else +\renewenvironment{thebibliography}[1] + {\section*{\refname} + \small + \list{}% + {\settowidth\labelwidth{}% + \leftmargin\parindent + \itemindent=-\parindent + \labelsep=\z@ + \if@openbib + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + \fi + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{}}% + \if@openbib + \renewcommand\newblock{\par}% + \else + \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}% + \fi + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.=\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} + \def\@cite#1{#1}% + \def\@lbibitem[#1]#2{\item[]\if@filesw + {\def\protect##1{\string ##1\space}\immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} + \fi +\else +\@cons\@openbib@code{\noexpand\small} +\fi + +\def\idxquad{\hskip 10\p@}% space that divides entry from number + +\def\@idxitem{\par\hangindent 10\p@} + +\def\subitem{\par\setbox0=\hbox{--\enspace}% second order + \noindent\hangindent\wd0\box0}% index entry + +\def\subsubitem{\par\setbox0=\hbox{--\,--\enspace}% third + \noindent\hangindent\wd0\box0}% order index entry + +\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax} + +\renewenvironment{theindex} + {\@mkboth{\indexname}{\indexname}% + \thispagestyle{empty}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\par + \def\,{\relax\ifmmode\mskip\thinmuskip + \else\hskip0.2em\ignorespaces\fi}% + \normalfont\small + \begin{multicols}{2}[\@makeschapterhead{\indexname}]% + } + {\end{multicols}} + +\renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width 2truecm + \kern2.6\p@} + \newdimen\fnindent + \fnindent1em +\long\def\@makefntext#1{% + \parindent \fnindent% + \leftskip \fnindent% + \noindent + \llap{\hb@xt@1em{\hss\@makefnmark\ }}\ignorespaces#1} + +\long\def\@makecaption#1#2{% + \vskip\abovecaptionskip + \sbox\@tempboxa{{\bfseries #1.} #2}% + \ifdim \wd\@tempboxa >\hsize + {\bfseries #1.} #2\par + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip} + +\def\fps@figure{htbp} +\def\fnum@figure{\figurename\thinspace\thefigure} +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +\def\fps@table{htbp} +\def\fnum@table{\tablename~\thetable} +\renewenvironment{table} + {\setlength\abovecaptionskip{0\p@}% + \setlength\belowcaptionskip{10\p@}% + \@float{table}} + {\end@float} +\renewenvironment{table*} + {\setlength\abovecaptionskip{0\p@}% + \setlength\belowcaptionskip{10\p@}% + \@dblfloat{table}} + {\end@dblfloat} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% LaTeX does not provide a command to enter the authors institute +% addresses. The \institute command is defined here. + +\newcounter{@inst} +\newcounter{@auth} +\newcounter{auco} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newtoks\tocauthor +\newbox\titrun +\newtoks\titlerunning +\newtoks\toctitle + +\def\clearheadinfo{\gdef\@author{No Author Given}% + \gdef\@title{No Title Given}% + \gdef\@subtitle{}% + \gdef\@institute{No Institute Given}% + \gdef\@thanks{}% + \global\titlerunning={}\global\authorrunning={}% + \global\toctitle={}\global\tocauthor={}} + +\def\institute#1{\gdef\@institute{#1}} + +\def\institutename{\par + \begingroup + \parskip=\z@ + \parindent=\z@ + \setcounter{@inst}{1}% + \def\and{\par\stepcounter{@inst}% + \noindent$^{\the@inst}$\enspace\ignorespaces}% + \setbox0=\vbox{\def\thanks##1{}\@institute}% + \ifnum\c@@inst=1\relax + \gdef\fnnstart{0}% + \else + \xdef\fnnstart{\c@@inst}% + \setcounter{@inst}{1}% + \noindent$^{\the@inst}$\enspace + \fi + \ignorespaces + \@institute\par + \endgroup} + +\def\@fnsymbol#1{\ensuremath{\ifcase#1\or\star\or{\star\star}\or + {\star\star\star}\or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi}} + +\def\inst#1{\unskip$^{#1}$} +\def\fnmsep{\unskip$^,$} +\def\email#1{{\tt#1}} +\AtBeginDocument{\@ifundefined{url}{\def\url#1{#1}}{}% +\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +} +\def\homedir{\~{ }} + +\def\subtitle#1{\gdef\@subtitle{#1}} +\clearheadinfo + +\renewcommand\maketitle{\newpage + \refstepcounter{chapter}% + \stepcounter{section}% + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \setcounter{figure}{0} + \setcounter{table}{0} + \setcounter{equation}{0} + \setcounter{footnote}{0}% + \begingroup + \parindent=\z@ + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \if@twocolumn + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi + \else + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \fi + \thispagestyle{empty}\@thanks +% + \def\\{\unskip\ \ignorespaces}\def\inst##1{\unskip{}}% + \def\thanks##1{\unskip{}}\def\fnmsep{\unskip}% + \instindent=\hsize + \advance\instindent by-\headlineindent + \if!\the\toctitle!\addcontentsline{toc}{title}{\@title}\else + \addcontentsline{toc}{title}{\the\toctitle}\fi + \if@runhead + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rm\unboldmath\ignorespaces\@title}% + \ifdim\wd\titrun>\instindent + \typeout{Title too long for running head. Please supply}% + \typeout{a shorter form with \string\titlerunning\space prior to + \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rm + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% + \fi +% + \if!\the\tocauthor!\relax + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\toc@uthor{\@author}}% + \else + \def\\{\noexpand\protect\noexpand\newline}% + \protected@xdef\scratch{\the\tocauthor}% + \protected@xdef\toc@uthor{\scratch}% + \fi + \addcontentsline{toc}{author}{\toc@uthor}% + \if@runhead + \if!\the\authorrunning! + \value{@inst}=\value{@auth}% + \setcounter{@auth}{1}% + \else + \edef\@author{\the\authorrunning}% + \fi + \global\setbox\authrun=\hbox{\small\unboldmath\@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{Names of authors too long for running head. Please supply}% + \typeout{a shorter form with \string\authorrunning\space prior to + \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rm + Authors Suppressed Due to Excessive Length}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% + \fi + \endgroup + \setcounter{footnote}{\fnnstart}% + \clearheadinfo} +% +\def\@maketitle{\newpage + \markboth{}{}% + \def\lastand{\ifnum\value{@inst}=2\relax + \unskip{} \andname\ + \else + \unskip \lastandname\ + \fi}% + \def\and{\stepcounter{@auth}\relax + \ifnum\value{@auth}=\value{@inst}% + \lastand + \else + \unskip, + \fi}% + \begin{center}% + \let\newline\\ + {\Large \bfseries\boldmath + \pretolerance=10000 + \@title \par}\vskip .8cm +\if!\@subtitle!\else {\large \bfseries\boldmath + \vskip -.65cm + \pretolerance=10000 + \@subtitle \par}\vskip .8cm\fi + \setbox0=\vbox{\setcounter{@auth}{1}\def\and{\stepcounter{@auth}}% + \def\thanks##1{}\@author}% + \global\value{@inst}=\value{@auth}% + \global\value{auco}=\value{@auth}% + \setcounter{@auth}{1}% +{\lineskip .5em +\noindent\ignorespaces +\@author\vskip.35cm} + {\small\institutename} + \end{center}% + } + +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{.} + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\@spbegintheorem#1#2#3#4{\trivlist + \item[\hskip\labelsep{#3#1\ #2\@thmcounterend}]#4} + +\def\@spopargbegintheorem#1#2#3#4#5{\trivlist + \item[\hskip\labelsep{#4#1\ #2}]{#4(#3)\@thmcounterend\ }#5} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % alle Umgebungen wie Theorem. + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % alle Umgebungen mit eigenem Zaehler + \if@envcntsect % mit section numeriert + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % nicht mit section numeriert + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{chapter}}% + \fi + \fi +\fi +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\itshape} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\itshape}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\itshape}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\itshape}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\theopargself{\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }} + } + +\renewenvironment{abstract}{% + \list{}{\advance\topsep by0.35cm\relax\small + \leftmargin=1cm + \labelwidth=\z@ + \listparindent=\z@ + \itemindent\listparindent + \rightmargin\leftmargin}\item[\hskip\labelsep + \bfseries\abstractname]} + {\endlist} + +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. + +\def\ps@headings{\let\@mkboth\@gobbletwo + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}% + \leftmark\hfil} + \def\@oddhead{\normalfont\small\hfil\rightmark\hspace{\headlineindent}% + \llap{\thepage}} + \def\chaptermark##1{}% + \def\sectionmark##1{}% + \def\subsectionmark##1{}} + +\def\ps@titlepage{\let\@mkboth\@gobbletwo + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}% + \hfil} + \def\@oddhead{\normalfont\small\hfil\hspace{\headlineindent}% + \llap{\thepage}} + \def\chaptermark##1{}% + \def\sectionmark##1{}% + \def\subsectionmark##1{}} + +\if@runhead\ps@headings\else +\ps@empty\fi + +\setlength\arraycolsep{1.4\p@} +\setlength\tabcolsep{1.4\p@} + +\endinput +%end of file llncs.cls diff --git a/executable_names/doc/common/llncs.dem b/executable_names/doc/common/llncs.dem new file mode 100644 index 0000000000000000000000000000000000000000..74209f0303dce2e2498b5ae00d52d8df132a1bc9 --- /dev/null +++ b/executable_names/doc/common/llncs.dem @@ -0,0 +1,1093 @@ +% This is LLNCS.DEM the demonstration file of +% the LaTeX macro package from Springer-Verlag +% for Lecture Notes in Computer Science, +% version 2.2 for LaTeX2e +% +\documentclass{llncs} +% +\usepackage{makeidx} % allows for indexgeneration +% +\begin{document} +% +\frontmatter % for the preliminaries +% +\pagestyle{headings} % switches on printing of running heads +\addtocmark{Hamiltonian Mechanics} % additional mark in the TOC +% +\chapter*{Preface} +% +This textbook is intended for use by students of physics, physical +chemistry, and theoretical chemistry. The reader is presumed to have a +basic knowledge of atomic and quantum physics at the level provided, for +example, by the first few chapters in our book {\it The Physics of Atoms +and Quanta}. The student of physics will find here material which should +be included in the basic education of every physicist. This book should +furthermore allow students to acquire an appreciation of the breadth and +variety within the field of molecular physics and its future as a +fascinating area of research. + +For the student of chemistry, the concepts introduced in this book will +provide a theoretical framework for that entire field of study. With the +help of these concepts, it is at least in principle possible to reduce +the enormous body of empirical chemical knowledge to a few basic +principles: those of quantum mechanics. In addition, modern physical +methods whose fundamentals are introduced here are becoming increasingly +important in chemistry and now represent indispensable tools for the +chemist. As examples, we might mention the structural analysis of +complex organic compounds, spectroscopic investigation of very rapid +reaction processes or, as a practical application, the remote detection +of pollutants in the air. + +\vspace{1cm} +\begin{flushright}\noindent +April 1995\hfill Walter Olthoff\\ +Program Chair\\ +ECOOP'95 +\end{flushright} +% +\chapter*{Organization} +ECOOP'95 is organized by the department of Computer Science, Univeristy +of \AA rhus and AITO (association Internationa pour les Technologie +Object) in cooperation with ACM/SIGPLAN. +% +\section*{Executive Commitee} +\begin{tabular}{@{}p{5cm}@{}p{7.2cm}@{}} +Conference Chair:&Ole Lehrmann Madsen (\AA rhus University, DK)\\ +Program Chair: &Walter Olthoff (DFKI GmbH, Germany)\\ +Organizing Chair:&J\o rgen Lindskov Knudsen (\AA rhus University, DK)\\ +Tutorials:&Birger M\o ller-Pedersen\hfil\break +(Norwegian Computing Center, Norway)\\ +Workshops:&Eric Jul (University of Kopenhagen, Denmark)\\ +Panels:&Boris Magnusson (Lund University, Sweden)\\ +Exhibition:&Elmer Sandvad (\AA rhus University, DK)\\ +Demonstrations:&Kurt N\o rdmark (\AA rhus University, DK) +\end{tabular} +% +\section*{Program Commitee} +\begin{tabular}{@{}p{5cm}@{}p{7.2cm}@{}} +Conference Chair:&Ole Lehrmann Madsen (\AA rhus University, DK)\\ +Program Chair: &Walter Olthoff (DFKI GmbH, Germany)\\ +Organizing Chair:&J\o rgen Lindskov Knudsen (\AA rhus University, DK)\\ +Tutorials:&Birger M\o ller-Pedersen\hfil\break +(Norwegian Computing Center, Norway)\\ +Workshops:&Eric Jul (University of Kopenhagen, Denmark)\\ +Panels:&Boris Magnusson (Lund University, Sweden)\\ +Exhibition:&Elmer Sandvad (\AA rhus University, DK)\\ +Demonstrations:&Kurt N\o rdmark (\AA rhus University, DK) +\end{tabular} +% +\begin{multicols}{3}[\section*{Referees}] +V.~Andreev\\ +B\"arwolff\\ +E.~Barrelet\\ +H.P.~Beck\\ +G.~Bernardi\\ +E.~Binder\\ +P.C.~Bosetti\\ +Braunschweig\\ +F.W.~B\"usser\\ +T.~Carli\\ +A.B.~Clegg\\ +G.~Cozzika\\ +S.~Dagoret\\ +Del~Buono\\ +P.~Dingus\\ +H.~Duhm\\ +J.~Ebert\\ +S.~Eichenberger\\ +R.J.~Ellison\\ +Feltesse\\ +W.~Flauger\\ +A.~Fomenko\\ +G.~Franke\\ +J.~Garvey\\ +M.~Gennis\\ +L.~Goerlich\\ +P.~Goritchev\\ +H.~Greif\\ +E.M.~Hanlon\\ +R.~Haydar\\ +R.C.W.~Henderso\\ +P.~Hill\\ +H.~Hufnagel\\ +A.~Jacholkowska\\ +Johannsen\\ +S.~Kasarian\\ +I.R.~Kenyon\\ +C.~Kleinwort\\ +T.~K\"ohler\\ +S.D.~Kolya\\ +P.~Kostka\\ +U.~Kr\"uger\\ +J.~Kurzh\"ofer\\ +M.P.J.~Landon\\ +A.~Lebedev\\ +Ch.~Ley\\ +F.~Linsel\\ +H.~Lohmand\\ +Martin\\ +S.~Masson\\ +K.~Meier\\ +C.A.~Meyer\\ +S.~Mikocki\\ +J.V.~Morris\\ +B.~Naroska\\ +Nguyen\\ +U.~Obrock\\ +G.D.~Patel\\ +Ch.~Pichler\\ +S.~Prell\\ +F.~Raupach\\ +V.~Riech\\ +P.~Robmann\\ +N.~Sahlmann\\ +P.~Schleper\\ +Sch\"oning\\ +B.~Schwab\\ +A.~Semenov\\ +G.~Siegmon\\ +J.R.~Smith\\ +M.~Steenbock\\ +U.~Straumann\\ +C.~Thiebaux\\ +P.~Van~Esch\\ +from Yerevan Ph\\ +L.R.~West\\ +G.-G.~Winter\\ +T.P.~Yiou\\ +M.~Zimmer\end{multicols} +% +\section*{Sponsoring Institutions} +% +Bernauer-Budiman Inc., Reading, Mass.\\ +The Hofmann-International Company, San Louis Obispo, Cal.\\ +Kramer Industries, Heidelberg, Germany +% +\tableofcontents +% +\mainmatter % start of the contributions +% +\title{Hamiltonian Mechanics unter besonderer Ber\"ucksichtigung der +h\"ohreren Lehranstalten} +% +\titlerunning{Hamiltonian Mechanics} % abbreviated title (for running head) +% also used for the TOC unless +% \toctitle is used +% +\author{Ivar Ekeland\inst{1} \and Roger Temam\inst{2} +Jeffrey Dean \and David Grove \and Craig Chambers \and Kim~B.~Bruce \and +Elsa Bertino} +% +\authorrunning{Ivar Ekeland et al.} % abbreviated author list (for running head) +% +%%%% modified list of authors for the TOC (add the affiliations) +\tocauthor{Ivar Ekeland (Princeton University), +Roger Temam (Universit\'{e} de Paris-Sud), +Jeffrey Dean, David Grove, Craig Chambers (Universit\`a di Geova), +Kim B. Bruce (Stanford University), +Elisa Bertino (Digita Research Center)} +% +\institute{Princeton University, Princeton NJ 08544, USA,\\ +\email{I.Ekeland@princeton.edu},\\ WWW home page: +\texttt{http://users/\homedir iekeland/web/welcome.html} +\and +Universit\'{e} de Paris-Sud, +Laboratoire d'Analyse Num\'{e}rique, B\^{a}timent 425,\\ +F-91405 Orsay Cedex, France} + +\maketitle % typeset the title of the contribution + +\begin{abstract} +The abstract should summarize the contents of the paper +using at least 70 and at most 150 words. It will be set in 9-point +font size and be inset 1.0 cm from the right and left margins. +There will be two blank lines before and after the Abstract. \dots +\end{abstract} +% +\section{Fixed-Period Problems: The Sublinear Case} +% +With this chapter, the preliminaries are over, and we begin the search +for periodic solutions to Hamiltonian systems. All this will be done in +the convex case; that is, we shall study the boundary-value problem +\begin{eqnarray*} + \dot{x}&=&JH' (t,x)\\ + x(0) &=& x(T) +\end{eqnarray*} +with $H(t,\cdot)$ a convex function of $x$, going to $+\infty$ when +$\left\|x\right\| \to \infty$. + +% +\subsection{Autonomous Systems} +% +In this section, we will consider the case when the Hamiltonian $H(x)$ +is autonomous. For the sake of simplicity, we shall also assume that it +is $C^{1}$. + +We shall first consider the question of nontriviality, within the +general framework of +$\left(A_{\infty},B_{\infty}\right)$-subquadratic Hamiltonians. In +the second subsection, we shall look into the special case when $H$ is +$\left(0,b_{\infty}\right)$-subquadratic, +and we shall try to derive additional information. +% +\subsubsection{The General Case: Nontriviality.} +% +We assume that $H$ is +$\left(A_{\infty},B_{\infty}\right)$-sub\-qua\-dra\-tic at infinity, +for some constant symmetric matrices $A_{\infty}$ and $B_{\infty}$, +with $B_{\infty}-A_{\infty}$ positive definite. Set: +\begin{eqnarray} +\gamma :&=&{\rm smallest\ eigenvalue\ of}\ \ B_{\infty} - A_{\infty} \\ + \lambda : &=& {\rm largest\ negative\ eigenvalue\ of}\ \ + J \frac{d}{dt} +A_{\infty}\ . +\end{eqnarray} + +Theorem~\ref{ghou:pre} tells us that if $\lambda +\gamma < 0$, the +boundary-value problem: +\begin{equation} +\begin{array}{rcl} + \dot{x}&=&JH' (x)\\ + x(0)&=&x (T) +\end{array} +\end{equation} +has at least one solution +$\overline{x}$, which is found by minimizing the dual +action functional: +\begin{equation} + \psi (u) = \int_{o}^{T} \left[\frac{1}{2} + \left(\Lambda_{o}^{-1} u,u\right) + N^{\ast} (-u)\right] dt +\end{equation} +on the range of $\Lambda$, which is a subspace $R (\Lambda)_{L}^{2}$ +with finite codimension. Here +\begin{equation} + N(x) := H(x) - \frac{1}{2} \left(A_{\infty} x,x\right) +\end{equation} +is a convex function, and +\begin{equation} + N(x) \le \frac{1}{2} + \left(\left(B_{\infty} - A_{\infty}\right) x,x\right) + + c\ \ \ \forall x\ . +\end{equation} + +% +\begin{proposition} +Assume $H'(0)=0$ and $ H(0)=0$. Set: +\begin{equation} + \delta := \liminf_{x\to 0} 2 N (x) \left\|x\right\|^{-2}\ . + \label{eq:one} +\end{equation} + +If $\gamma < - \lambda < \delta$, +the solution $\overline{u}$ is non-zero: +\begin{equation} + \overline{x} (t) \ne 0\ \ \ \forall t\ . +\end{equation} +\end{proposition} +% +\begin{proof} +Condition (\ref{eq:one}) means that, for every +$\delta ' > \delta$, there is some $\varepsilon > 0$ such that +\begin{equation} + \left\|x\right\| \le \varepsilon \Rightarrow N (x) \le + \frac{\delta '}{2} \left\|x\right\|^{2}\ . +\end{equation} + +It is an exercise in convex analysis, into which we shall not go, to +show that this implies that there is an $\eta > 0$ such that +\begin{equation} + f\left\|x\right\| \le \eta + \Rightarrow N^{\ast} (y) \le \frac{1}{2\delta '} + \left\|y\right\|^{2}\ . + \label{eq:two} +\end{equation} + +\begin{figure} +\vspace{2.5cm} +\caption{This is the caption of the figure displaying a white eagle and +a white horse on a snow field} +\end{figure} + +Since $u_{1}$ is a smooth function, we will have +$\left\|hu_{1}\right\|_\infty \le \eta$ +for $h$ small enough, and inequality (\ref{eq:two}) will hold, +yielding thereby: +\begin{equation} + \psi (hu_{1}) \le \frac{h^{2}}{2} + \frac{1}{\lambda} \left\|u_{1} \right\|_{2}^{2} + \frac{h^{2}}{2} + \frac{1}{\delta '} \left\|u_{1}\right\|^{2}\ . +\end{equation} + +If we choose $\delta '$ close enough to $\delta$, the quantity +$\left(\frac{1}{\lambda} + \frac{1}{\delta '}\right)$ +will be negative, and we end up with +\begin{equation} + \psi (hu_{1}) < 0\ \ \ \ \ {\rm for}\ \ h\ne 0\ \ {\rm small}\ . +\end{equation} + +On the other hand, we check directly that $\psi (0) = 0$. This shows +that 0 cannot be a minimizer of $\psi$, not even a local one. +So $\overline{u} \ne 0$ and +$\overline{u} \ne \Lambda_{o}^{-1} (0) = 0$. \qed +\end{proof} +% +\begin{corollary} +Assume $H$ is $C^{2}$ and +$\left(a_{\infty},b_{\infty}\right)$-subquadratic at infinity. Let +$\xi_{1},\allowbreak\dots,\allowbreak\xi_{N}$ be the +equilibria, that is, the solutions of $H' (\xi ) = 0$. +Denote by $\omega_{k}$ +the smallest eigenvalue of $H'' \left(\xi_{k}\right)$, and set: +\begin{equation} + \omega : = {\rm Min\,} \left\{\omega_{1},\dots,\omega_{k}\right\}\ . +\end{equation} +If: +\begin{equation} + \frac{T}{2\pi} b_{\infty} < + - E \left[- \frac{T}{2\pi}a_{\infty}\right] < + \frac{T}{2\pi}\omega + \label{eq:three} +\end{equation} +then minimization of $\psi$ yields a non-constant $T$-periodic solution +$\overline{x}$. +\end{corollary} +% + +We recall once more that by the integer part $E [\alpha ]$ of +$\alpha \in \bbbr$, we mean the $a\in \bbbz$ +such that $a< \alpha \le a+1$. For instance, +if we take $a_{\infty} = 0$, Corollary 2 tells +us that $\overline{x}$ exists and is +non-constant provided that: + +\begin{equation} + \frac{T}{2\pi} b_{\infty} < 1 < \frac{T}{2\pi} +\end{equation} +or +\begin{equation} + T\in \left(\frac{2\pi}{\omega},\frac{2\pi}{b_{\infty}}\right)\ . + \label{eq:four} +\end{equation} + +% +\begin{proof} +The spectrum of $\Lambda$ is $\frac{2\pi}{T} \bbbz +a_{\infty}$. The +largest negative eigenvalue $\lambda$ is given by +$\frac{2\pi}{T}k_{o} +a_{\infty}$, +where +\begin{equation} + \frac{2\pi}{T}k_{o} + a_{\infty} < 0 + \le \frac{2\pi}{T} (k_{o} +1) + a_{\infty}\ . +\end{equation} +Hence: +\begin{equation} + k_{o} = E \left[- \frac{T}{2\pi} a_{\infty}\right] \ . +\end{equation} + +The condition $\gamma < -\lambda < \delta$ now becomes: +\begin{equation} + b_{\infty} - a_{\infty} < + - \frac{2\pi}{T} k_{o} -a_{\infty} < \omega -a_{\infty} +\end{equation} +which is precisely condition (\ref{eq:three}).\qed +\end{proof} +% + +\begin{lemma} +Assume that $H$ is $C^{2}$ on $\bbbr^{2n} \setminus \{ 0\}$ and +that $H'' (x)$ is non-de\-gen\-er\-ate for any $x\ne 0$. Then any local +minimizer $\widetilde{x}$ of $\psi$ has minimal period $T$. +\end{lemma} +% +\begin{proof} +We know that $\widetilde{x}$, or +$\widetilde{x} + \xi$ for some constant $\xi +\in \bbbr^{2n}$, is a $T$-periodic solution of the Hamiltonian system: +\begin{equation} + \dot{x} = JH' (x)\ . +\end{equation} + +There is no loss of generality in taking $\xi = 0$. So +$\psi (x) \ge \psi (\widetilde{x} )$ +for all $\widetilde{x}$ in some neighbourhood of $x$ in +$W^{1,2} \left(\bbbr / T\bbbz ; \bbbr^{2n}\right)$. + +But this index is precisely the index +$i_{T} (\widetilde{x} )$ of the $T$-periodic +solution $\widetilde{x}$ over the interval +$(0,T)$, as defined in Sect.~2.6. So +\begin{equation} + i_{T} (\widetilde{x} ) = 0\ . + \label{eq:five} +\end{equation} + +Now if $\widetilde{x}$ has a lower period, $T/k$ say, +we would have, by Corollary 31: +\begin{equation} + i_{T} (\widetilde{x} ) = + i_{kT/k}(\widetilde{x} ) \ge + ki_{T/k} (\widetilde{x} ) + k-1 \ge k-1 \ge 1\ . +\end{equation} + +This would contradict (\ref{eq:five}), and thus cannot happen.\qed +\end{proof} +% +\paragraph{Notes and Comments.} +The results in this section are a +refined version of \cite{clar:eke}; +the minimality result of Proposition +14 was the first of its kind. + +To understand the nontriviality conditions, such as the one in formula +(\ref{eq:four}), one may think of a one-parameter family +$x_{T}$, $T\in \left(2\pi\omega^{-1}, 2\pi b_{\infty}^{-1}\right)$ +of periodic solutions, $x_{T} (0) = x_{T} (T)$, +with $x_{T}$ going away to infinity when $T\to 2\pi \omega^{-1}$, +which is the period of the linearized system at 0. + +\begin{table} +\caption{This is the example table taken out of {\it The +\TeX{}book,} p.\,246} +\begin{center} +\begin{tabular}{r@{\quad}rl} +\hline +\multicolumn{1}{l}{\rule{0pt}{12pt} + Year}&\multicolumn{2}{l}{World population}\\[2pt] +\hline\rule{0pt}{12pt} +8000 B.C. & 5,000,000& \\ + 50 A.D. & 200,000,000& \\ +1650 A.D. & 500,000,000& \\ +1945 A.D. & 2,300,000,000& \\ +1980 A.D. & 4,400,000,000& \\[2pt] +\hline +\end{tabular} +\end{center} +\end{table} +% +\begin{theorem} [Ghoussoub-Preiss]\label{ghou:pre} +Assume $H(t,x)$ is +$(0,\varepsilon )$-subquadratic at +infinity for all $\varepsilon > 0$, and $T$-periodic in $t$ +\begin{equation} + H (t,\cdot )\ \ \ \ \ {\rm is\ convex}\ \ \forall t +\end{equation} +\begin{equation} + H (\cdot ,x)\ \ \ \ \ {\rm is}\ \ T{\rm -periodic}\ \ \forall x +\end{equation} +\begin{equation} + H (t,x)\ge n\left(\left\|x\right\|\right)\ \ \ \ \ + {\rm with}\ \ n (s)s^{-1}\to \infty\ \ {\rm as}\ \ s\to \infty +\end{equation} +\begin{equation} + \forall \varepsilon > 0\ ,\ \ \ \exists c\ :\ + H(t,x) \le \frac{\varepsilon}{2}\left\|x\right\|^{2} + c\ . +\end{equation} + +Assume also that $H$ is $C^{2}$, and $H'' (t,x)$ is positive definite +everywhere. Then there is a sequence $x_{k}$, $k\in \bbbn$, of +$kT$-periodic solutions of the system +\begin{equation} + \dot{x} = JH' (t,x) +\end{equation} +such that, for every $k\in \bbbn$, there is some $p_{o}\in\bbbn$ with: +\begin{equation} + p\ge p_{o}\Rightarrow x_{pk} \ne x_{k}\ . +\end{equation} +\qed +\end{theorem} +% +\begin{example} [{{\rm External forcing}}] +Consider the system: +\begin{equation} + \dot{x} = JH' (x) + f(t) +\end{equation} +where the Hamiltonian $H$ is +$\left(0,b_{\infty}\right)$-subquadratic, and the +forcing term is a distribution on the circle: +\begin{equation} + f = \frac{d}{dt} F + f_{o}\ \ \ \ \ + {\rm with}\ \ F\in L^{2} \left(\bbbr / T\bbbz; \bbbr^{2n}\right)\ , +\end{equation} +where $f_{o} : = T^{-1}\int_{o}^{T} f (t) dt$. For instance, +\begin{equation} + f (t) = \sum_{k\in \bbbn} \delta_{k} \xi\ , +\end{equation} +where $\delta_{k}$ is the Dirac mass at $t= k$ and +$\xi \in \bbbr^{2n}$ is a +constant, fits the prescription. This means that the system +$\dot{x} = JH' (x)$ is being excited by a +series of identical shocks at interval $T$. +\end{example} +% +\begin{definition} +Let $A_{\infty} (t)$ and $B_{\infty} (t)$ be symmetric +operators in $\bbbr^{2n}$, depending continuously on +$t\in [0,T]$, such that +$A_{\infty} (t) \le B_{\infty} (t)$ for all $t$. + +A Borelian function +$H: [0,T]\times \bbbr^{2n} \to \bbbr$ +is called +$\left(A_{\infty} ,B_{\infty}\right)$-{\it subquadratic at infinity} +if there exists a function $N(t,x)$ such that: +\begin{equation} + H (t,x) = \frac{1}{2} \left(A_{\infty} (t) x,x\right) + N(t,x) +\end{equation} +\begin{equation} + \forall t\ ,\ \ \ N(t,x)\ \ \ \ \ + {\rm is\ convex\ with\ respect\ to}\ \ x +\end{equation} +\begin{equation} + N(t,x) \ge n\left(\left\|x\right\|\right)\ \ \ \ \ + {\rm with}\ \ n(s)s^{-1}\to +\infty\ \ {\rm as}\ \ s\to +\infty +\end{equation} +\begin{equation} + \exists c\in \bbbr\ :\ \ \ H (t,x) \le + \frac{1}{2} \left(B_{\infty} (t) x,x\right) + c\ \ \ \forall x\ . +\end{equation} + +If $A_{\infty} (t) = a_{\infty} I$ and +$B_{\infty} (t) = b_{\infty} I$, with +$a_{\infty} \le b_{\infty} \in \bbbr$, +we shall say that $H$ is +$\left(a_{\infty},b_{\infty}\right)$-subquadratic +at infinity. As an example, the function +$\left\|x\right\|^{\alpha}$, with +$1\le \alpha < 2$, is $(0,\varepsilon )$-subquadratic at infinity +for every $\varepsilon > 0$. Similarly, the Hamiltonian +\begin{equation} +H (t,x) = \frac{1}{2} k \left\|k\right\|^{2} +\left\|x\right\|^{\alpha} +\end{equation} +is $(k,k+\varepsilon )$-subquadratic for every $\varepsilon > 0$. +Note that, if $k<0$, it is not convex. +\end{definition} +% + +\paragraph{Notes and Comments.} +The first results on subharmonics were +obtained by Rabinowitz in \cite{rab}, who showed the existence of +infinitely many subharmonics both in the subquadratic and superquadratic +case, with suitable growth conditions on $H'$. Again the duality +approach enabled Clarke and Ekeland in \cite{clar:eke:2} to treat the +same problem in the convex-subquadratic case, with growth conditions on +$H$ only. + +Recently, Michalek and Tarantello (see \cite{mich:tar} and \cite{tar}) +have obtained lower bound on the number of subharmonics of period $kT$, +based on symmetry considerations and on pinching estimates, as in +Sect.~5.2 of this article. + +% +% ---- Bibliography ---- +% +\begin{thebibliography}{5} +% +\bibitem {clar:eke} +Clarke, F., Ekeland, I.: +Nonlinear oscillations and +boundary-value problems for Hamiltonian systems. +Arch. Rat. Mech. Anal. {\bf 78} (1982) 315--333 + +\bibitem {clar:eke:2} +Clarke, F., Ekeland, I.: +Solutions p\'{e}riodiques, du +p\'{e}riode donn\'{e}e, des \'{e}quations hamiltoniennes. +Note CRAS Paris {\bf 287} (1978) 1013--1015 + +\bibitem {mich:tar} +Michalek, R., Tarantello, G.: +Subharmonic solutions with prescribed minimal +period for nonautonomous Hamiltonian systems. +J. Diff. Eq. {\bf 72} (1988) 28--55 + +\bibitem {tar} +Tarantello, G.: +Subharmonic solutions for Hamiltonian +systems via a $\bbbz_{p}$ pseudoindex theory. +Annali di Matematica Pura (to appear) + +\bibitem {rab} +Rabinowitz, P.: +On subharmonic solutions of a Hamiltonian system. +Comm. Pure Appl. Math. {\bf 33} (1980) 609--633 + +\end{thebibliography} + +% +% second contribution with nearly identical text, +% slightly changed contribution head (all entries +% appear as defaults), and modified bibliography +% +\title{Hamiltonian Mechanics2} + +\author{Ivar Ekeland\inst{1} \and Roger Temam\inst{2}} + +\institute{Princeton University, Princeton NJ 08544, USA +\and +Universit\'{e} de Paris-Sud, +Laboratoire d'Analyse Num\'{e}rique, B\^{a}timent 425,\\ +F-91405 Orsay Cedex, France} + +\maketitle +% +% Modify the bibliography environment to call for the author-year +% system. This is done normally with the citeauthoryear option +% for a particular contribution. +\makeatletter +\renewenvironment{thebibliography}[1] + {\section*{\refname} + \small + \list{}% + {\settowidth\labelwidth{}% + \leftmargin\parindent + \itemindent=-\parindent + \labelsep=\z@ + \if@openbib + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + \fi + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{}}% + \if@openbib + \renewcommand\newblock{\par}% + \else + \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}% + \fi + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.=\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} + \def\@cite#1{#1}% + \def\@lbibitem[#1]#2{\item[]\if@filesw + {\def\protect##1{\string ##1\space}\immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\makeatother +% +\begin{abstract} +The abstract should summarize the contents of the paper +using at least 70 and at most 150 words. It will be set in 9-point +font size and be inset 1.0 cm from the right and left margins. +There will be two blank lines before and after the Abstract. \dots +\end{abstract} +% +\section{Fixed-Period Problems: The Sublinear Case} +% +With this chapter, the preliminaries are over, and we begin the search +for periodic solutions to Hamiltonian systems. All this will be done in +the convex case; that is, we shall study the boundary-value problem +\begin{eqnarray*} + \dot{x}&=&JH' (t,x)\\ + x(0) &=& x(T) +\end{eqnarray*} +with $H(t,\cdot)$ a convex function of $x$, going to $+\infty$ when +$\left\|x\right\| \to \infty$. + +% +\subsection{Autonomous Systems} +% +In this section, we will consider the case when the Hamiltonian $H(x)$ +is autonomous. For the sake of simplicity, we shall also assume that it +is $C^{1}$. + +We shall first consider the question of nontriviality, within the +general framework of +$\left(A_{\infty},B_{\infty}\right)$-subquadratic Hamiltonians. In +the second subsection, we shall look into the special case when $H$ is +$\left(0,b_{\infty}\right)$-subquadratic, +and we shall try to derive additional information. +% +\subsubsection{The General Case: Nontriviality.} +% +We assume that $H$ is +$\left(A_{\infty},B_{\infty}\right)$-sub\-qua\-dra\-tic at infinity, +for some constant symmetric matrices $A_{\infty}$ and $B_{\infty}$, +with $B_{\infty}-A_{\infty}$ positive definite. Set: +\begin{eqnarray} +\gamma :&=&{\rm smallest\ eigenvalue\ of}\ \ B_{\infty} - A_{\infty} \\ + \lambda : &=& {\rm largest\ negative\ eigenvalue\ of}\ \ + J \frac{d}{dt} +A_{\infty}\ . +\end{eqnarray} + +Theorem 21 tells us that if $\lambda +\gamma < 0$, the boundary-value +problem: +\begin{equation} +\begin{array}{rcl} + \dot{x}&=&JH' (x)\\ + x(0)&=&x (T) +\end{array} +\end{equation} +has at least one solution +$\overline{x}$, which is found by minimizing the dual +action functional: +\begin{equation} + \psi (u) = \int_{o}^{T} \left[\frac{1}{2} + \left(\Lambda_{o}^{-1} u,u\right) + N^{\ast} (-u)\right] dt +\end{equation} +on the range of $\Lambda$, which is a subspace $R (\Lambda)_{L}^{2}$ +with finite codimension. Here +\begin{equation} + N(x) := H(x) - \frac{1}{2} \left(A_{\infty} x,x\right) +\end{equation} +is a convex function, and +\begin{equation} + N(x) \le \frac{1}{2} + \left(\left(B_{\infty} - A_{\infty}\right) x,x\right) + + c\ \ \ \forall x\ . +\end{equation} + +% +\begin{proposition} +Assume $H'(0)=0$ and $ H(0)=0$. Set: +\begin{equation} + \delta := \liminf_{x\to 0} 2 N (x) \left\|x\right\|^{-2}\ . + \label{2eq:one} +\end{equation} + +If $\gamma < - \lambda < \delta$, +the solution $\overline{u}$ is non-zero: +\begin{equation} + \overline{x} (t) \ne 0\ \ \ \forall t\ . +\end{equation} +\end{proposition} +% +\begin{proof} +Condition (\ref{2eq:one}) means that, for every +$\delta ' > \delta$, there is some $\varepsilon > 0$ such that +\begin{equation} + \left\|x\right\| \le \varepsilon \Rightarrow N (x) \le + \frac{\delta '}{2} \left\|x\right\|^{2}\ . +\end{equation} + +It is an exercise in convex analysis, into which we shall not go, to +show that this implies that there is an $\eta > 0$ such that +\begin{equation} + f\left\|x\right\| \le \eta + \Rightarrow N^{\ast} (y) \le \frac{1}{2\delta '} + \left\|y\right\|^{2}\ . + \label{2eq:two} +\end{equation} + +\begin{figure} +\vspace{2.5cm} +\caption{This is the caption of the figure displaying a white eagle and +a white horse on a snow field} +\end{figure} + +Since $u_{1}$ is a smooth function, we will have +$\left\|hu_{1}\right\|_\infty \le \eta$ +for $h$ small enough, and inequality (\ref{2eq:two}) will hold, +yielding thereby: +\begin{equation} + \psi (hu_{1}) \le \frac{h^{2}}{2} + \frac{1}{\lambda} \left\|u_{1} \right\|_{2}^{2} + \frac{h^{2}}{2} + \frac{1}{\delta '} \left\|u_{1}\right\|^{2}\ . +\end{equation} + +If we choose $\delta '$ close enough to $\delta$, the quantity +$\left(\frac{1}{\lambda} + \frac{1}{\delta '}\right)$ +will be negative, and we end up with +\begin{equation} + \psi (hu_{1}) < 0\ \ \ \ \ {\rm for}\ \ h\ne 0\ \ {\rm small}\ . +\end{equation} + +On the other hand, we check directly that $\psi (0) = 0$. This shows +that 0 cannot be a minimizer of $\psi$, not even a local one. +So $\overline{u} \ne 0$ and +$\overline{u} \ne \Lambda_{o}^{-1} (0) = 0$. \qed +\end{proof} +% +\begin{corollary} +Assume $H$ is $C^{2}$ and +$\left(a_{\infty},b_{\infty}\right)$-subquadratic at infinity. Let +$\xi_{1},\allowbreak\dots,\allowbreak\xi_{N}$ be the +equilibria, that is, the solutions of $H' (\xi ) = 0$. +Denote by $\omega_{k}$ +the smallest eigenvalue of $H'' \left(\xi_{k}\right)$, and set: +\begin{equation} + \omega : = {\rm Min\,} \left\{\omega_{1},\dots,\omega_{k}\right\}\ . +\end{equation} +If: +\begin{equation} + \frac{T}{2\pi} b_{\infty} < + - E \left[- \frac{T}{2\pi}a_{\infty}\right] < + \frac{T}{2\pi}\omega + \label{2eq:three} +\end{equation} +then minimization of $\psi$ yields a non-constant $T$-periodic solution +$\overline{x}$. +\end{corollary} +% + +We recall once more that by the integer part $E [\alpha ]$ of +$\alpha \in \bbbr$, we mean the $a\in \bbbz$ +such that $a< \alpha \le a+1$. For instance, +if we take $a_{\infty} = 0$, Corollary 2 tells +us that $\overline{x}$ exists and is +non-constant provided that: + +\begin{equation} + \frac{T}{2\pi} b_{\infty} < 1 < \frac{T}{2\pi} +\end{equation} +or +\begin{equation} + T\in \left(\frac{2\pi}{\omega},\frac{2\pi}{b_{\infty}}\right)\ . + \label{2eq:four} +\end{equation} + +% +\begin{proof} +The spectrum of $\Lambda$ is $\frac{2\pi}{T} \bbbz +a_{\infty}$. The +largest negative eigenvalue $\lambda$ is given by +$\frac{2\pi}{T}k_{o} +a_{\infty}$, +where +\begin{equation} + \frac{2\pi}{T}k_{o} + a_{\infty} < 0 + \le \frac{2\pi}{T} (k_{o} +1) + a_{\infty}\ . +\end{equation} +Hence: +\begin{equation} + k_{o} = E \left[- \frac{T}{2\pi} a_{\infty}\right] \ . +\end{equation} + +The condition $\gamma < -\lambda < \delta$ now becomes: +\begin{equation} + b_{\infty} - a_{\infty} < + - \frac{2\pi}{T} k_{o} -a_{\infty} < \omega -a_{\infty} +\end{equation} +which is precisely condition (\ref{2eq:three}).\qed +\end{proof} +% + +\begin{lemma} +Assume that $H$ is $C^{2}$ on $\bbbr^{2n} \setminus \{ 0\}$ and +that $H'' (x)$ is non-de\-gen\-er\-ate for any $x\ne 0$. Then any local +minimizer $\widetilde{x}$ of $\psi$ has minimal period $T$. +\end{lemma} +% +\begin{proof} +We know that $\widetilde{x}$, or +$\widetilde{x} + \xi$ for some constant $\xi +\in \bbbr^{2n}$, is a $T$-periodic solution of the Hamiltonian system: +\begin{equation} + \dot{x} = JH' (x)\ . +\end{equation} + +There is no loss of generality in taking $\xi = 0$. So +$\psi (x) \ge \psi (\widetilde{x} )$ +for all $\widetilde{x}$ in some neighbourhood of $x$ in +$W^{1,2} \left(\bbbr / T\bbbz ; \bbbr^{2n}\right)$. + +But this index is precisely the index +$i_{T} (\widetilde{x} )$ of the $T$-periodic +solution $\widetilde{x}$ over the interval +$(0,T)$, as defined in Sect.~2.6. So +\begin{equation} + i_{T} (\widetilde{x} ) = 0\ . + \label{2eq:five} +\end{equation} + +Now if $\widetilde{x}$ has a lower period, $T/k$ say, +we would have, by Corollary 31: +\begin{equation} + i_{T} (\widetilde{x} ) = + i_{kT/k}(\widetilde{x} ) \ge + ki_{T/k} (\widetilde{x} ) + k-1 \ge k-1 \ge 1\ . +\end{equation} + +This would contradict (\ref{2eq:five}), and thus cannot happen.\qed +\end{proof} +% +\paragraph{Notes and Comments.} +The results in this section are a +refined version of \cite{2clar:eke}; +the minimality result of Proposition +14 was the first of its kind. + +To understand the nontriviality conditions, such as the one in formula +(\ref{2eq:four}), one may think of a one-parameter family +$x_{T}$, $T\in \left(2\pi\omega^{-1}, 2\pi b_{\infty}^{-1}\right)$ +of periodic solutions, $x_{T} (0) = x_{T} (T)$, +with $x_{T}$ going away to infinity when $T\to 2\pi \omega^{-1}$, +which is the period of the linearized system at 0. + +\begin{table} +\caption{This is the example table taken out of {\it The +\TeX{}book,} p.\,246} +\begin{center} +\begin{tabular}{r@{\quad}rl} +\hline +\multicolumn{1}{l}{\rule{0pt}{12pt} + Year}&\multicolumn{2}{l}{World population}\\[2pt] +\hline\rule{0pt}{12pt} +8000 B.C. & 5,000,000& \\ + 50 A.D. & 200,000,000& \\ +1650 A.D. & 500,000,000& \\ +1945 A.D. & 2,300,000,000& \\ +1980 A.D. & 4,400,000,000& \\[2pt] +\hline +\end{tabular} +\end{center} +\end{table} +% +\begin{theorem} [Ghoussoub-Preiss] +Assume $H(t,x)$ is +$(0,\varepsilon )$-subquadratic at +infinity for all $\varepsilon > 0$, and $T$-periodic in $t$ +\begin{equation} + H (t,\cdot )\ \ \ \ \ {\rm is\ convex}\ \ \forall t +\end{equation} +\begin{equation} + H (\cdot ,x)\ \ \ \ \ {\rm is}\ \ T{\rm -periodic}\ \ \forall x +\end{equation} +\begin{equation} + H (t,x)\ge n\left(\left\|x\right\|\right)\ \ \ \ \ + {\rm with}\ \ n (s)s^{-1}\to \infty\ \ {\rm as}\ \ s\to \infty +\end{equation} +\begin{equation} + \forall \varepsilon > 0\ ,\ \ \ \exists c\ :\ + H(t,x) \le \frac{\varepsilon}{2}\left\|x\right\|^{2} + c\ . +\end{equation} + +Assume also that $H$ is $C^{2}$, and $H'' (t,x)$ is positive definite +everywhere. Then there is a sequence $x_{k}$, $k\in \bbbn$, of +$kT$-periodic solutions of the system +\begin{equation} + \dot{x} = JH' (t,x) +\end{equation} +such that, for every $k\in \bbbn$, there is some $p_{o}\in\bbbn$ with: +\begin{equation} + p\ge p_{o}\Rightarrow x_{pk} \ne x_{k}\ . +\end{equation} +\qed +\end{theorem} +% +\begin{example} [{{\rm External forcing}}] +Consider the system: +\begin{equation} + \dot{x} = JH' (x) + f(t) +\end{equation} +where the Hamiltonian $H$ is +$\left(0,b_{\infty}\right)$-subquadratic, and the +forcing term is a distribution on the circle: +\begin{equation} + f = \frac{d}{dt} F + f_{o}\ \ \ \ \ + {\rm with}\ \ F\in L^{2} \left(\bbbr / T\bbbz; \bbbr^{2n}\right)\ , +\end{equation} +where $f_{o} : = T^{-1}\int_{o}^{T} f (t) dt$. For instance, +\begin{equation} + f (t) = \sum_{k\in \bbbn} \delta_{k} \xi\ , +\end{equation} +where $\delta_{k}$ is the Dirac mass at $t= k$ and +$\xi \in \bbbr^{2n}$ is a +constant, fits the prescription. This means that the system +$\dot{x} = JH' (x)$ is being excited by a +series of identical shocks at interval $T$. +\end{example} +% +\begin{definition} +Let $A_{\infty} (t)$ and $B_{\infty} (t)$ be symmetric +operators in $\bbbr^{2n}$, depending continuously on +$t\in [0,T]$, such that +$A_{\infty} (t) \le B_{\infty} (t)$ for all $t$. + +A Borelian function +$H: [0,T]\times \bbbr^{2n} \to \bbbr$ +is called +$\left(A_{\infty} ,B_{\infty}\right)$-{\it subquadratic at infinity} +if there exists a function $N(t,x)$ such that: +\begin{equation} + H (t,x) = \frac{1}{2} \left(A_{\infty} (t) x,x\right) + N(t,x) +\end{equation} +\begin{equation} + \forall t\ ,\ \ \ N(t,x)\ \ \ \ \ + {\rm is\ convex\ with\ respect\ to}\ \ x +\end{equation} +\begin{equation} + N(t,x) \ge n\left(\left\|x\right\|\right)\ \ \ \ \ + {\rm with}\ \ n(s)s^{-1}\to +\infty\ \ {\rm as}\ \ s\to +\infty +\end{equation} +\begin{equation} + \exists c\in \bbbr\ :\ \ \ H (t,x) \le + \frac{1}{2} \left(B_{\infty} (t) x,x\right) + c\ \ \ \forall x\ . +\end{equation} + +If $A_{\infty} (t) = a_{\infty} I$ and +$B_{\infty} (t) = b_{\infty} I$, with +$a_{\infty} \le b_{\infty} \in \bbbr$, +we shall say that $H$ is +$\left(a_{\infty},b_{\infty}\right)$-subquadratic +at infinity. As an example, the function +$\left\|x\right\|^{\alpha}$, with +$1\le \alpha < 2$, is $(0,\varepsilon )$-subquadratic at infinity +for every $\varepsilon > 0$. Similarly, the Hamiltonian +\begin{equation} +H (t,x) = \frac{1}{2} k \left\|k\right\|^{2} +\left\|x\right\|^{\alpha} +\end{equation} +is $(k,k+\varepsilon )$-subquadratic for every $\varepsilon > 0$. +Note that, if $k<0$, it is not convex. +\end{definition} +% + +\paragraph{Notes and Comments.} +The first results on subharmonics were +obtained by Rabinowitz in \cite{2rab}, who showed the existence of +infinitely many subharmonics both in the subquadratic and superquadratic +case, with suitable growth conditions on $H'$. Again the duality +approach enabled Clarke and Ekeland in \cite{2clar:eke:2} to treat the +same problem in the convex-subquadratic case, with growth conditions on +$H$ only. + +Recently, Michalek and Tarantello (see Michalek, R., Tarantello, G. +\cite{2mich:tar} and Tarantello, G. \cite{2tar}) have obtained lower +bound on the number of subharmonics of period $kT$, based on symmetry +considerations and on pinching estimates, as in Sect.~5.2 of this +article. + +% +% ---- Bibliography ---- +% +\begin{thebibliography}{} +% +\bibitem[1980]{2clar:eke} +Clarke, F., Ekeland, I.: +Nonlinear oscillations and +boundary-value problems for Hamiltonian systems. +Arch. Rat. Mech. Anal. {\bf 78} (1982) 315--333 + +\bibitem[1981]{2clar:eke:2} +Clarke, F., Ekeland, I.: +Solutions p\'{e}riodiques, du +p\'{e}riode donn\'{e}e, des \'{e}quations hamiltoniennes. +Note CRAS Paris {\bf 287} (1978) 1013--1015 + +\bibitem[1982]{2mich:tar} +Michalek, R., Tarantello, G.: +Subharmonic solutions with prescribed minimal +period for nonautonomous Hamiltonian systems. +J. Diff. Eq. {\bf 72} (1988) 28--55 + +\bibitem[1983]{2tar} +Tarantello, G.: +Subharmonic solutions for Hamiltonian +systems via a $\bbbz_{p}$ pseudoindex theory. +Annali di Matematica Pura (to appear) + +\bibitem[1985]{2rab} +Rabinowitz, P.: +On subharmonic solutions of a Hamiltonian system. +Comm. Pure Appl. Math. {\bf 33} (1980) 609--633 + +\end{thebibliography} +\clearpage +\addtocmark[2]{Author Index} % additional numbered TOC entry +\renewcommand{\indexname}{Author Index} +\printindex +\clearpage +\addtocmark[2]{Subject Index} % additional numbered TOC entry +\markboth{Subject Index}{Subject Index} +\renewcommand{\indexname}{Subject Index} +\input{subjidx.ind} +\end{document} diff --git a/executable_names/doc/common/llncs.doc b/executable_names/doc/common/llncs.doc new file mode 100644 index 0000000000000000000000000000000000000000..08e1f97c355762cc6f768a445401cb6990d1bdc6 --- /dev/null +++ b/executable_names/doc/common/llncs.doc @@ -0,0 +1,1277 @@ +% This is LLNCS.DOC the documentation file of +% the LaTeX2e class from Springer-Verlag +% for Lecture Notes in Computer Science, version 2.4 +\documentclass{llncs} +\usepackage{llncsdoc} +% +\begin{document} +\markboth{\LaTeXe{} Class for Lecture Notes in Computer +Science}{\LaTeXe{} Class for Lecture Notes in Computer Science} +\thispagestyle{empty} +\begin{flushleft} +\LARGE\bfseries Instructions for Authors\\ +Coding with \LaTeX\\[2cm] +\end{flushleft} +\rule{\textwidth}{1pt} +\vspace{2pt} +\begin{flushright} +\Huge +\begin{tabular}{@{}l} +\LaTeXe{} Class\\ +for Lecture Notes\\ +in Computer Science\\[6pt] +{\Large Version 2.4} +\end{tabular} +\end{flushright} +\rule{\textwidth}{1pt} +\vfill +\begin{flushleft} +\large\itshape +\begin{tabular}{@{}l} +{\Large\upshape\bfseries Springer}\\[8pt] +Berlin\enspace Heidelberg\enspace New\kern0.1em York\\[5pt] +Barcelona\enspace Budapest\enspace Hong\kern0.2em Kong\\[5pt] +London\enspace Milan\enspace Paris\enspace\\[5pt] +Santa\kern0.2em Clara\enspace Singapore\enspace Tokyo +\end{tabular} +\end{flushleft} +\newpage +% +\section*{For further information please contact us:} +% +\begin{flushleft} +\begin{tabular}{l@{\quad}l@{\hspace{3mm}}l@{\quad}l} +$\bullet$&\multicolumn{3}{@{}l}{\bfseries Springer-\kern-2pt Verlag +Heidelberg}\\[1mm] +&\multicolumn{3}{@{}l}{Department New Technologies/Product +Development}\\ +&\multicolumn{3}{@{}l}{Springer-Verlag, Postfach 105280, D-69042 +Heidelberg +1, FRG}\\[0.5mm] + & Telefax: & (0\,62\,21)487688\\ + & & (0\,62\,21)487366\\ + & Internet: & \tt lncs@springer.de & for editorial questions\\ + & & \tt texhelp@springer.de & for \TeX{} problems +\end{tabular} +\end{flushleft} +\rule{\textwidth}{1pt} +% +\section*{Acceptable formats of your disk/magnetic tape and output:} +% +The following formats are acceptable: 5.25$^{\prime\prime}$ diskette +MS-DOS, 5.25$^{\prime\prime}$ CP/M, 3.5$^{\prime\prime}$ diskette +MS-DOS, 3.5$^{\prime\prime}$ diskette Apple MacIntosh, 9-track 1600 +bpi magnetic tape VAX/VMS, 9-track 1600 bpi magnetic tape ANSI with +label, SUN-Streamer Tape. + +Once you have completed your work using this macro package, +please submit your own printout of the {\em final +version together with the disk or magnetic tape}, containing your +\LaTeX{} input (source) file und the final DVI-file and make sure +that the text is {\em identical in both cases.} + +\bigskip +This macro package, as well as all other macro packages, style +files, and document classes that Springer distributes, are also +available through our mailserver (for people with only e-mail access). + +{\tt svserv@vax.ntp.springer.de}\hfil first try the \verb|help| +command. + +\noindent We are also reachable through the world wide web: +\begin{flushleft} +\tt +\begin{tabular}{@{}l@{\quad}r@{\tt:}l} +\rmfamily URLs are & http&//www.springer.de \\ + & gopher&//ftp.springer.de \\ + & ftp&//ftp.springer.de +\end{tabular} +\end{flushleft} + + + + +% +\newpage +\tableofcontents +\newpage +% +\section{Introduction} +% +Authors wishing to code their contribution +with \LaTeX{}, as well as those who have already coded with \LaTeX{}, +will be provided with a document class that will give the text the +desired layout. Authors are requested to +adhere strictly to these instructions; {\em the class +file must not be changed}. + +The text output area is automatically set within an area of +12.2\,cm horizontally and 19.3\,cm vertically. + +If you are already familiar with \LaTeX{}, then the +LLNCS class should not give you any major difficulties. +It will change the layout to the required LLNCS style +(it will for instance define the layout of \verb|\section|). +We had to invent some extra commands, +which are not provided by \LaTeX{} (e.g.\ +\verb|\institute|, see also Sect.\,\ref{contbegin}) + +For the main body of the paper (the text) you +should use the commands of the standard \LaTeX{} ``article'' class. +Even if you are familiar with those commands, we urge you to read +this entire documentation thoroughly. It contains many suggestions on +how to use our commands properly; thus your paper +will be formatted exactly to LLNCS standard. +For the input of the references at the end of your contribution, +please follow our instructions given in Sect.\,\ref{refer} References. + +The majority of these hints are not specific for LLNCS; they may improve +your use of \LaTeX{} in general. +Furthermore, the documentation provides suggestions about the proper +editing and use +of the input files (capitalization, abbreviation etc.) (see +Sect.\,\ref{refedit} How to Edit Your Input File). +% +\section{How to Proceed} +% +The package consists of the following files: +\begin{flushleft} +\begin{tabular}{@{}p{2.5cm}l} +{\tt history.txt}& the version history of the package\\[2pt] +{\tt llncs.cls} & class file for \LaTeX{}\\[2pt] +{\tt llncs.dem} & an example showing how to code the text\\[2pt] +{\tt llncs.doc} & general instructions (source of this document),\\ + & {\tt llncs.doc} means {\itshape l\/}atex {\itshape doc\/}umentation for\\ + & {\itshape L\/}ecture {\itshape N}otes in {\itshape C\/}omputer {\itshape S\/}cience\\ +{\tt llncsdoc.sty} & class modifications to help for the instructions\\ +{\tt llncs.ind} & an external (faked) author index file\\ +{\tt subjidx.ind} & subject index demo from the Springer book package\\ +{\tt llncs.dvi} & the resultig DVI file (remember to use binary transfer!)\\[2pt] +{\tt sprmindx.sty} & supplementary style file for MakeIndex\\ + & (usage: {\tt makeindex -s sprmindx.sty }) +\end{tabular} +\end{flushleft} +% +\subsection{How to Invoke the LLNCS Document Class} +% +The LLNCS class is an extension of the standard \LaTeX{} ``article'' +document class. Therefore you may use all ``article'' commands for the +body of your contribution to prepare your manuscript. +LLNCS class is invoked by replacing ``article'' by ``llncs'' in the +first line of your document: +\begin{verbatim} +\documentclass{llncs} +% +\begin{document} + +\end{document} +\end{verbatim} +% +\subsection{Contributions Already Coded with \protect\LaTeX{} without +the LLNCS document class} +% +If your file is already coded with \LaTeX{} you can easily +adapt it a posteriori to the LLNCS document class. + +Please refrain from using any \LaTeX{} or \TeX{} commands +that affect the layout or formatting of your document (i.e. commands +like \verb|\textheight|, \verb|\vspace|, \verb|\headsep| etc.). +There may nevertheless be exceptional occasions on which to +use some of them. + +The LLNCS document class has been carefully designed to produce the +right layout from your \LaTeX{} input. If there is anything specific you +would like to do and for which the style file does not provide a +command, {\em please contact us}. Same holds for any error and bug you +discover (there is however no reward for this -- sorry). +% +\section{General Rules for Coding Formulas} +% +With mathematical formulas you may proceed as described +in Sect.\,3.3 of the {\em \LaTeX{} User's Guide \& Reference +Manual\/} by Leslie Lamport (2nd~ed. 1994), Addison-Wesley Publishing +Company, Inc. + +Equations are automatically numbered sequentially throughout your +contribution using arabic numerals in parentheses on the right-hand +side. + +When you are working in math mode everything is typeset in italics. +Sometimes you need to insert non-mathematical elements (e.g.\ +words or phrases). Such insertions should be coded in roman +(with \verb|\mbox|) as illustrated in the following example: +\begin{flushleft} +{\itshape Sample Input} +\end{flushleft} +\begin{verbatim} +\begin{equation} + \left(\frac{a^{2} + b^{2}}{c^{3}} \right) = 1 \quad + \mbox{ if } c\neq 0 \mbox{ and if } a,b,c\in \bbbr \enspace . +\end{equation} +\end{verbatim} +{\itshape Sample Output} +\begin{equation} + \left(\frac{a^{2} + b^{2}}{c^{3}} \right) = 1 \quad + \mbox{ if } c\neq 0 \mbox{ and if } a,b,c\in \bbbr \enspace . +\end{equation} + +If you wish to start a new paragraph immediately after a displayed +equation, insert a blank line so as to produce the required +indentation. If there is no new paragraph either do not insert +a blank line or code \verb|\noindent| immediately before +continuing the text. + +Please punctuate a displayed equation in the same way as other +ordinary text but with an \verb|\enspace| before end punctuation. + +Note that the sizes of the parentheses or other delimiter +symbols used in equations should ideally match the height of the +formulas being enclosed. This is automatically taken care of by +the following \LaTeX{} commands:\\[2mm] +\verb|\left(| or \verb|\left[| and +\verb|\right)| or \verb|\right]|. +% +\subsection{Italic and Roman Type in Math Mode} +% +\begin{alpherate} +\item +In math mode \LaTeX{} treats all letters as though they +were mathematical or physical variables, hence they are typeset as +characters of their own in +italics. However, for certain components of formulas, like short texts, +this would be incorrect and therefore coding in roman is required. +Roman should also be used for +subscripts and superscripts {\em in formulas\/} where these are +merely labels and not in themselves variables, +e.g. $T_{\mathrm{eff}}$ \emph{not} $T_{eff}$, +$T_{\mathrm K}$ \emph{not} $T_K$ (K = Kelvin), +$m_{\mathrm e}$ \emph{not} $m_e$ (e = electron). +However, do not code for roman +if the sub/superscripts represent variables, +e.g.\ $\sum_{i=1}^{n} a_{i}$. +\item +Please ensure that {\em physical units\/} (e.g.\ pc, erg s$^{-1}$ +K, cm$^{-3}$, W m$^{-2}$ Hz$^{-1}$, m kg s$^{-2}$ A$^{-2}$) and +{\em abbreviations\/} such as Ord, Var, GL, SL, sgn, const.\ +are always set in roman type. To ensure +this use the \verb|\mathrm| command: \verb|\mathrm{Hz}|. +On p.\ 44 of the {\em \LaTeX{} User's Guide \& Reference +Manual\/} by Leslie Lamport you will find the names of +common mathe\-matical functions, such as log, sin, exp, max and sup. +These should be coded as \verb|\log|, +\verb|\sin|, \verb|\exp|, \verb|\max|, \verb|\sup| +and will appear in roman automatically. +\item +Chemical symbols and formulas should be coded for roman, +e.g.\ Fe not $Fe$, H$_2$O not {\em H$_2$O}. +\item +Familiar foreign words and phrases, e.g.\ et al., +a priori, in situ, brems\-strah\-lung, eigenvalues should not be +italicized. +\end{alpherate} +% +\section{How to Edit Your Input (Source) File} +\label{refedit} +% +\subsection{Headings}\label{headings} +% +All words in headings should be capitalized except for conjunctions, +prepositions (e.g.\ on, of, by, and, or, but, from, with, without, +under) and definite and indefinite articles (the, a, an) unless they +appear at the beginning. Formula letters must be typeset as in the text. +% +\subsection{Capitalization and Non-capitalization} +% +\begin{alpherate} +\item +The following should always be capitalized: +\begin{itemize} +\item +Headings (see preceding Sect.\,\ref{headings}) +\item +Abbreviations and expressions +in the text such as Fig(s)., Table(s), Sect(s)., Chap(s)., +Theorem, Corollary, Definition etc. when used with numbers, e.g.\ +Fig.\,3, Table\,1, Theorem 2. +\end{itemize} +Please follow the special rules in Sect.\,\ref{abbrev} for referring to +equations. +\item +The following should {\em not\/} be capitalized: +\begin{itemize} +\item +The words figure(s), table(s), equation(s), theorem(s) in the text when +used without an accompanying number. +\item +Figure legends and table captions except for names and abbreviations. +\end{itemize} +\end{alpherate} +% +\subsection{Abbreviation of Words}\label{abbrev} +% +\begin{alpherate} +\item +The following {\em should} be abbreviated when they appear in running +text {\em unless\/} they come at the beginning of a sentence: Chap., +Sect., Fig.; e.g.\ The results are depicted in Fig.\,5. Figure 9 reveals +that \dots .\\ +{\em Please note\/}: Equations should usually be referred to solely by +their number in parentheses: e.g.\ (14). However, when the reference +comes at the beginning of a sentence, the unabbreviated word +``Equation'' should be used: e.g.\ Equation (14) is very important. +However, (15) makes it clear that \dots . +\item +If abbreviations of names or concepts are used +throughout the text, they should be defined at first occurrence, +e.g.\ Plurisubharmonic (PSH) Functions, Strong Optimization (SOPT) +Problem. +\end{alpherate} +% +\section{How to Code the Beginning of Your Contribution} +\label{contbegin} +% +The title of a single contribution (it is mandatory) should be coded as +follows: +\begin{verbatim} +\title{} +\end{verbatim} +All words in titles should be capitalized except for conjunctions, +prepositions (e.g.\ on, of, by, and, or, but, from, with, without, +under) and definite and indefinite articles (the, a, an) unless they +appear at the beginning. Formula letters must be typeset as in the text. +Titles have no end punctuation. + +If a long \verb|\title| must be divided please use the code \verb|\\| +(for new line). + +If you are to produce running heads for a specific volume the standard +(of no such running heads) is overwritten with the \verb|[runningheads]| +option in the \verb|\documentclass| line. For long titles that do not +fit in the single line of the running head a warning is generated. +You can specify an abbreviated title for the running head on odd pages +with the command +\begin{verbatim} +\titlerunning{} +\end{verbatim} + +There is also a possibility to change the text of the title that goes +into the table of contents (that's for volume editors only -- there is +no table of contents for a single contribution). For this use the +command +\begin{verbatim} +\toctitle{} +\end{verbatim} + +An optional subtitle may follow then: +\begin{verbatim} +\subtitle{} +\end{verbatim} + +Now the name(s) of the author(s) must be given: +\begin{verbatim} +\author{} +\end{verbatim} +Numbers referring to different addresses or affiliations are +to be attached to each author with the \verb|\inst{}| command. +If there is more than one author, the order is up to you; +the \verb|\and| command provides for the separation. + +If you have done this correctly, this entry now reads, for example: +\begin{verbatim} +\author{Ivar Ekeland\inst{1} \and Roger Temam\inst{2}} +\end{verbatim} +The first name\footnote{Other initials are optional +and may be inserted if this is the usual +way of writing your name, e.g.\ Alfred J.~Holmes, E.~Henry Green.} +is followed by the surname. + +As for the title there exist two additional commands (again for volume +editors only) for a different author list. One for the running head +(on odd pages) -- if there is any: +\begin{verbatim} +\authorrunning{} +\end{verbatim} +And one for the table of contents where the +affiliation of each author is simply added in braces. +\begin{verbatim} +\tocauthor{} +\end{verbatim} + +Next the address(es) of institute(s), company etc. is (are) required. +If there is more than one address, the entries are numbered +automatically with \verb|\and|, in the order in which you type them. +Please make sure that the numbers match those placed next to +to the authors' names to reflect the affiliation. +\begin{verbatim} +\institute{ +\and +\and } +\end{verbatim} + +In addition, you can use +\begin{verbatim} +\email{} +\end{verbatim} +to provide your email address within \verb|\institute|. If you need to +typeset the tilde character -- e.g. for your web page in your unix +system's home directory -- the \verb|\homedir| command will happily do +this. + +\medskip +If footnote like things are needed anywhere in the contribution heading +please code +(immediately after the word where the footnote indicator should be +placed): +\begin{verbatim} +\thanks{} +\end{verbatim} +\verb|\thanks| may only appear in \verb|\title|, \verb|\author| +and \verb|\institute| to footnote anything. If there are two or more +footnotes or affiliation marks to a specific item separate them with +\verb|\fnmsep| (i.e. {\itshape f}oot\emph note \emph mark +\emph{sep}arator). + +\medskip\noindent +The command +\begin{verbatim} +\maketitle +\end{verbatim} +then formats the complete heading of your article. If you leave +it out the work done so far will produce \emph{no} text. + +Then the abstract should follow. Simply code +\begin{verbatim} +\begin{abstract} + +\end{abstract} +\end{verbatim} +or refer to the demonstration file {\tt llncs.dem} for an example or +to the {\em Sample Input\/} on p.~\pageref{samppage}. + +\subsubsection{Remark to Running Heads and the Table of Contents} +\leavevmode\\[\medskipamount] +If you are the author of a single contribution you normally have no +running heads and no table of contents. Both are done only by the editor +of the volume or at the printers. +% +\section{Special Commands for the Volume Editor} +The volume editor can produce a complete camera ready output including +running heads, a table of contents, preliminary text (frontmatter), and +index or glossary. For activating the running heads there is the class +option \verb|[runningheads]|. + +The table of contents of the volume is printed wherever +\verb|\tableofcontents| is placed. A simple compilation of all +contributions (fields \verb|\title| and \verb|\author|) is done. If you +wish to change this automatically produced list use the commands +\begin{verbatim} +\titlerunning \toctitle +\authorrunning \tocauthor +\end{verbatim} +to enhance the information in the specific contributions. See the +demonstration file \verb|llncs.dem| for examples. + +An additional structure can be added to the table of contents with the +\verb|\addtocmark{}| command. It has an optional numerical +argument, a digit from 1 through 3. 3 (the default) makes an unnumbered +chapter like entry in the table of contents. If you code +\verb|\addtocmark[2]{text}| the corresponding page number is listed +also, \verb|\addtocmark[1]{text}| even introduces a chapter number +beyond it. +% +\section{How to Code Your Text} +% +The contribution title and all headings should be capitalized +except for conjunctions, prepositions (e.g.\ on, of, by, and, or, but, +from, with, without, under) and definite and indefinite articles (the, +a, an) unless they appear at the beginning. Formula letters must be +typeset as in the text. + +Headings will be automatically numbered by the following codes.\\[2mm] +{\itshape Sample Input} +\begin{verbatim} +\section{This is a First-Order Title} +\subsection{This is a Second-Order Title} +\subsubsection{This is a Third-Order Title.} +\paragraph{This is a Fourth-Order Title.} +\end{verbatim} +\verb|\section| and \verb|\subsection| have no end punctuation.\\ +\verb|\subsubsection| and \verb|\paragraph| +need to be punctuated at the end. + +In addition to the above-mentioned headings your text may be structured +by subsections indicated by run-in headings (theorem-like environments). +All the theorem-like environments are numbered automatically +throughout the sections of your document -- each with its own counter. +If you want the theorem-like environments to use the same counter +just specify the documentclass option \verb|envcountsame|: +\begin{verbatim} +\documentclass[envcountsame]{llncs} +\end{verbatim} +If your first call for a theorem-like environment then is e.g. +\verb|\begin{lemma}|, it will be numbered 1; if corollary follows, +this will be numbered 2; if you then call lemma again, this will be +numbered 3. + +But in case you want to reset such counters to 1 in each section, +please specify the documentclass option \verb|envcountreset|: +\begin{verbatim} +\documentclass[envcountreset]{llncs} +\end{verbatim} + +Even a numbering on section level (including the section counter) is +possible with the documentclass option \verb|envcountsect|. + +\section{Predefined Theorem like Environments}\label{builtintheo} +The following variety of run-in headings are at your disposal: +\begin{alpherate} +\item +{\bfseries Bold} run-in headings with italicized text +as built-in environments: +\begin{verbatim} +\begin{corollary} \end{corollary} +\begin{lemma} \end{lemma} +\begin{proposition} \end{proposition} +\begin{theorem} \end{theorem} +\end{verbatim} +\item +The following generally appears as {\itshape italic} run-in heading: +\begin{verbatim} +\begin{proof} \qed \end{proof} +\end{verbatim} +It is unnumbered and may contain an eye catching square (call for that +with \verb|\qed|) before the environment ends. +\item +Further {\itshape italic} or {\bfseries bold} run-in headings with roman +environment body may also occur: +\begin{verbatim} +\begin{definition} \end{definition} +\begin{example} \end{example} +\begin{exercise} \end{exercise} +\begin{note} \end{note} +\begin{problem} \end{problem} +\begin{question} \end{question} +\begin{remark} \end{remark} +\begin{solution} \end{solution} +\end{verbatim} +\end{alpherate} + +\section{Defining your Own Theorem like Environments} +We have enhanced the standard \verb|\newtheorem| command and slightly +changed its syntax to get two new commands \verb|\spnewtheorem| and +\verb|\spnewtheorem*| that now can be used to define additional +environments. They require two additional arguments namely the type +style in which the keyword of the environment appears and second the +style for the text of your new environment. + +\verb|\spnewtheorem| can be used in two ways. +\subsection{Method 1 {\itshape (preferred)}} +You may want to create an environment that shares its counter +with another environment, say {\em main theorem\/} to be numbered like +the predefined {\em theorem\/}. In this case, use the syntax +\begin{verbatim} +\spnewtheorem{}[]{} +{}{} +\end{verbatim} + +\noindent +Here the environment with which the new environment should share its +counter is specified with the optional argument \verb|[]|. + +\paragraph{Sample Input} +\begin{verbatim} +\spnewtheorem{mainth}[theorem]{Main Theorem}{\bfseries}{\itshape} +\begin{theorem} The early bird gets the worm. \end{theorem} +\begin{mainth} The early worm gets eaten. \end{mainth} +\end{verbatim} +\medskip\noindent +{\em Sample Output} + +\medskip\noindent +{\bfseries Theorem 3.}\enspace {\em The early bird gets the worm.} + +\medskip\noindent +{\bfseries Main Theorem 4.} The early worm gets eaten. + +\bigskip +The sharing of the default counter (\verb|[theorem]|) is desired. If you +omit the optional second argument of \verb|\spnewtheorem| a separate +counter for your new environment is used throughout your document. + +\subsection[Method 2]{Method 2 {\itshape (assumes {\tt[envcountsect]} +documentstyle option)}} +\begin{verbatim} +\spnewtheorem{}{}[] +{}{} +\end{verbatim} + +\noindent +This defines a new environment \verb|| which prints the caption +\verb|| in the font \verb|| and the text itself in +the font \verb||. The environment is numbered beginning anew +with every new sectioning element you specify with the optional +parameter \verb||. + +\medskip\noindent +\paragraph{Example} \leavevmode + +\medskip\noindent +\verb|\spnewtheorem{joke}{Joke}[subsection]{\bfseries}{\rmfamily}| + +\medskip +\noindent defines a new environment called \verb|joke| which prints the +caption {\bfseries Joke} in boldface and the text in roman. The jokes are +numbered starting from 1 at the beginning of every subsection with the +number of the subsection preceding the number of the joke e.g. 7.2.1 for +the first joke in subsection 7.2. + +\subsection{Unnumbered Environments} +If you wish to have an unnumbered environment, please +use the syntax +\begin{verbatim} +\spnewtheorem*{}{}{}{} +\end{verbatim} + +\section{Program Codes} +In case you want to show pieces of program code, just use the +\verb|verbatim| environment or the \verb|verbatim| package of \LaTeX. +(There also exist various pretty printers for some programming +languages.) +% +\noindent +\subsection*{Sample Input {\rmfamily(of a simple +contribution)}}\label{samppage} +\begin{verbatim} +\title{Hamiltonian Mechanics} + +\author{Ivar Ekeland\inst{1} \and Roger Temam\inst{2}} + +\institute{Princeton University, Princeton NJ 08544, USA +\and +Universit\'{e} de Paris-Sud, +Laboratoire d'Analyse Num\'{e}rique, B\^{a}timent 425,\\ +F-91405 Orsay Cedex, France} + +\maketitle +% +\begin{abstract} +This paragraph shall summarize the contents of the paper +in short terms. +\end{abstract} +% +\section{Fixed-Period Problems: The Sublinear Case} +% +With this chapter, the preliminaries are over, and we begin the +search for periodic solutions \dots +% +\subsection{Autonomous Systems} +% +In this section we will consider the case when the Hamiltonian +$H(x)$ \dots +% +\subsubsection*{The General Case: Nontriviality.} +% +We assume that $H$ is +$\left(A_{\infty}, B_{\infty}\right)$-subqua\-dra\-tic +at infinity, for some constant \dots +% +\paragraph{Notes and Comments.} +The first results on subharmonics were \dots +% +\begin{proposition} +Assume $H'(0)=0$ and $ H(0)=0$. Set \dots +\end{proposition} +\begin{proof}[of proposition] +Condition (8) means that, for every $\delta'>\delta$, there is +some $\varepsilon>0$ such that \dots \qed +\end{proof} +% +\begin{example}[\rmfamily (External forcing)] +Consider the system \dots +\end{example} +\begin{corollary} +Assume $H$ is $C^{2}$ and +$\left(a_{\infty}, b_{\infty}\right)$-subquadratic +at infinity. Let \dots +\end{corollary} +\begin{lemma} +Assume that $H$ is $C^{2}$ on $\bbbr^{2n}\backslash \{0\}$ +and that $H''(x)$ is \dots +\end{lemma} +\begin{theorem}[(Ghoussoub-Preiss)] +Let $X$ be a Banach Space and $\Phi:X\to\bbbr$ \dots +\end{theorem} +\begin{definition} +We shall say that a $C^{1}$ function $\Phi:X\to\bbbr$ +satisfies \dots +\end{definition} +\end{verbatim} +{\itshape Sample Output\/} (follows on the next page together with +examples of the above run-in headings) +\newcounter{save}\setcounter{save}{\value{section}} +{\def\addtocontents#1#2{}% +\def\addcontentsline#1#2#3{}% +\def\markboth#1#2{}% +% +\title{Hamiltonian Mechanics} + +\author{Ivar Ekeland\inst{1} \and Roger Temam\inst{2}} + +\institute{Princeton University, Princeton NJ 08544, USA +\and +Universit\'{e} de Paris-Sud, +Laboratoire d'Analyse Num\'{e}rique, B\^{a}timent 425,\\ +F-91405 Orsay Cedex, France} + +\maketitle +% +\begin{abstract} +This paragraph shall summarize the contents of the paper +in short terms. +\end{abstract} +% +\section{Fixed-Period Problems: The Sublinear Case} +% +With this chapter, the preliminaries are over, and we begin the search +for periodic solutions \dots +% +\subsection{Autonomous Systems} +% +In this section we will consider the case when the Hamiltonian +$H(x)$ \dots +% +\subsubsection{The General Case: Nontriviality.} +% +We assume that $H$ is +$\left(A_{\infty}, B_{\infty}\right)$-subqua\-dra\-tic at +infinity, for some constant \dots +% +\paragraph{Notes and Comments.} +The first results on subharmonics were \dots +% +\begin{proposition} +Assume $H'(0)=0$ and $ H(0)=0$. Set \dots +\end{proposition} +\begin{proof}[of proposition] +Condition (8) means that, for every $\delta'>\delta$, there is +some $\varepsilon>0$ such that \dots \qed +\end{proof} +% +\begin{example}[{{\rmfamily External forcing}}] +Consider the system \dots +\end{example} +\begin{corollary} +Assume $H$ is $C^{2}$ and +$\left(a_{\infty}, b_{\infty}\right)$-subquadratic +at infinity. Let \dots +\end{corollary} +\begin{lemma} +Assume that $H$ is $C^{2}$ on $\bbbr^{2n}\backslash \{0\}$ +and that $H''(x)$ is \dots +\end{lemma} +\begin{theorem}[Ghoussoub-Preiss] +Let $X$ be a Banach Space and $\Phi:X\to\bbbr$ \dots +\end{theorem} +\begin{definition} +We shall say that a $C^{1}$ function $\Phi:X\to\bbbr$ satisfies \dots +\end{definition} +% +}\setcounter{section}{\value{save}} +\section{Fine Tuning of the Text} +% +The following should be used to improve the readability of the text: +\begin{flushleft} +\begin{tabular}{@{}p{.19\textwidth}p{.79\textwidth}} +\verb|\,| & a thin space, e.g.\ between numbers or between units + and num\-bers; a line division will not be made + following this space\\ +\verb|--| & en dash; two strokes, without a space at either end\\ +\verb*| -- |& en dash; two strokes, with a space at either end\\ +\verb|-| & hyphen; one stroke, no space at either end\\ +\verb|$-$| & minus, in the text {\em only} \\[8mm] +{\em Input} & \verb|21\,$^{\circ}$C etc.,|\\ + & \verb|Dr h.\,c.\,Rockefellar-Smith \dots|\\ + & \verb|20,000\,km and Prof.\,Dr Mallory \dots|\\ + & \verb|1950--1985 \dots|\\ + & \verb|this -- written on a computer -- is now printed|\\ + & \verb|$-30$\,K \dots|\\[3mm] +{\em Output}& 21\,$^{\circ}$C etc., Dr h.\,c.\,Rockefellar-Smith \dots\\ + & 20,000\,km and Prof.\,Dr Mallory \dots\\ + & 1950--1985 \dots\\ + & this -- written on a computer -- is now printed\\ + & $-30$\,K \dots +\end{tabular} +\end{flushleft} +% +\section {Special Typefaces} +% +Normal type (roman text) need not be coded. {\itshape Italic} +(\verb|{\em }| better still \verb|\emph{}|) or, if +necessary, {\bfseries boldface} should be used for emphasis.\\[6pt] +\begin{minipage}[t]{\textwidth} +\begin{flushleft} +\begin{tabular}{@{}p{.25\textwidth}@{\hskip6pt}p{.73\textwidth}@{}} +\verb|{\itshape Text}| & {\itshape Italicized Text}\\[2pt] +\verb|{\em Text}| & {\em Emphasized Text -- + if you would like to emphasize a {\em definition} within an + italicized text (e.g.\ of a {\em theorem)} you should code the + expression to be emphasized by} \verb|\em|.\\[2pt] +\verb|{\bfseries Text}|& {\bfseries Important Text}\\[2pt] +\verb|\vec{Symbol}| & Vectors may only appear in math mode. The default + \LaTeX{} vector symbol has been adapted\footnotemark\ + to LLNCS conventions.\\[2pt] + & \verb|$\vec{A \times B\cdot C}| yields $\vec{A\times B\cdot C}$\\ + & \verb|$\vec{A}^{T} \otimes \vec{B} \otimes|\\ + & \verb|\vec{\hat{D}}$|yields $\vec{A}^{T} \otimes \vec{B} \otimes +\vec{\hat{D}}$ +\end{tabular} +\end{flushleft} +\end{minipage} + +\footnotetext{If you absolutely must revive the original \LaTeX{} +design of the vector symbol (as an arrow accent), please specify the +option \texttt{[orivec]} in the \texttt{documentclass} line.} +\newpage +% +\section {Footnotes} +% +Footnotes within the text should be coded: +\begin{verbatim} +\footnote{Text} +\end{verbatim} +{\itshape Sample Input} +\begin{flushleft} +Text with a footnote\verb|\footnote{The |{\tt footnote is automatically +numbered.}\verb|}| and text continues \dots +\end{flushleft} +{\itshape Sample Output} +\begin{flushleft} +Text with a footnote\footnote{The footnote is automatically numbered.} +and text continues \dots +\end{flushleft} +% +\section {Lists} +% +Please code lists as described below:\\[2mm] +{\itshape Sample Input} +\begin{verbatim} +\begin{enumerate} + \item First item + \item Second item + \begin{enumerate} + \item First nested item + \item Second nested item + \end{enumerate} + \item Third item +\end{enumerate} +\end{verbatim} +{\itshape Sample Output} + \begin{enumerate} +\item First item +\item Second item + \begin{enumerate} + \item First nested item + \item Second nested item + \end{enumerate} +\item Third item +\end{enumerate} +% +\section {Figures} +% +Figure environments should be inserted after (not in) +the paragraph in which the figure is first mentioned. +They will be numbered automatically. + +Preferably the images should be enclosed as PostScript files -- best as +EPS data using the epsfig package. + +If you cannot include them into your output this way and use other +techniques for a separate production, +the figures (line drawings and those containing halftone inserts +as well as halftone figures) {\em should not be pasted into your +laserprinter output}. They should be enclosed separately in camera-ready +form (original artwork, glossy prints, photographs and/or slides). The +lettering should be suitable for reproduction, and after a +probably necessary reduction the height of capital letters should be at +least 1.8\,mm and not more than 2.5\,mm. +Check that lines and other details are uniformly black and +that the lettering on figures is clearly legible. + +To leave the desired amount of space for the height of +your figures, please use the coding described below. +As can be seen in the output, we will automatically +provide 1\,cm space above and below the figure, +so that you should only leave the space equivalent to the size of the +figure itself. Please note that ``\verb|x|'' in the following +coding stands for the actual height of the figure: +\begin{verbatim} +\begin{figure} +\vspace{x cm} +\caption[ ]{...text of caption...} (Do type [ ]) +\end{figure} +\end{verbatim} +\begin{flushleft} +{\itshape Sample Input} +\end{flushleft} +\begin{verbatim} +\begin{figure} +\vspace{2.5cm} +\caption{This is the caption of the figure displaying a white +eagle and a white horse on a snow field} +\end{figure} +\end{verbatim} +\begin{flushleft} +{\itshape Sample Output} +\end{flushleft} +\begin{figure} +\vspace{2.5cm} +\caption{This is the caption of the figure displaying a white eagle and +a white horse on a snow field} +\end{figure} +% +\section{Tables} +% +Table captions should be treated +in the same way as figure legends, except that +the table captions appear {\itshape above} the tables. The tables +will be numbered automatically. +% +\subsection{Tables Coded with \protect\LaTeX{}} +% +Please use the following coding:\\[2mm] +{\itshape Sample Input} +\begin{verbatim} +\begin{table} +\caption{Critical $N$ values} +\begin{tabular}{llllll} +\hline\noalign{\smallskip} +${\mathrm M}_\odot$ & $\beta_{0}$ & $T_{\mathrm c6}$ & $\gamma$ + & $N_{\mathrm{crit}}^{\mathrm L}$ + & $N_{\mathrm{crit}}^{\mathrm{Te}}$\\ +\noalign{\smallskip} +\hline +\noalign{\smallskip} + 30 & 0.82 & 38.4 & 35.7 & 154 & 320 \\ + 60 & 0.67 & 42.1 & 34.7 & 138 & 340 \\ +120 & 0.52 & 45.1 & 34.0 & 124 & 370 \\ +\hline +\end{tabular} +\end{table} +\end{verbatim} + +\medskip\noindent{\itshape Sample Output} +\begin{table} +\caption{Critical $N$ values} +\begin{center} +\renewcommand{\arraystretch}{1.4} +\setlength\tabcolsep{3pt} +\begin{tabular}{llllll} +\hline\noalign{\smallskip} +${\mathrm M}_\odot$ & $\beta_{0}$ & $T_{\mathrm c6}$ & $\gamma$ + & $N_{\mathrm{crit}}^{\mathrm L}$ + & $N_{\mathrm{crit}}^{\mathrm{Te}}$\\ +\noalign{\smallskip} +\hline +\noalign{\smallskip} + 30 & 0.82 & 38.4 & 35.7 & 154 & 320 \\ + 60 & 0.67 & 42.1 & 34.7 & 138 & 340 \\ +120 & 0.52 & 45.1 & 34.0 & 124 & 370 \\ +\hline +\end{tabular} +\end{center} +\end{table} + +Before continuing your text you need an empty line. \dots + +\vspace{3mm} +For further information you will find a complete description of +the tabular environment +on p.~62~ff. and p.~204 of the {\em \LaTeX{} User's Guide \& Reference +Manual\/} by Leslie Lamport. +% +\subsection{Tables Not Coded with \protect\LaTeX{}} +% +If you do not wish to code your table using \LaTeX{} +but prefer to have it reproduced separately, +proceed as for figures and use the following coding:\\[2mm] +{\itshape Sample Input} +\begin{verbatim} +\begin{table} +\caption{text of your caption} +\vspace{x cm} % the actual height needed for your table +\end{table} +\end{verbatim} +% +\subsection{Signs and Characters} +% +\subsubsection*{Special Signs.} +% +You may need to use special signs. The available ones are listed in the +{\em \LaTeX{} User's Guide \& Reference Manual\/} by Leslie Lamport, +pp.~41\,ff. +We have created further symbols for math mode (enclosed in \$): +\begin{center} +\begin{tabular}{l@{\hspace{1em}yields\hspace{1em}} +c@{\hspace{3em}}l@{\hspace{1em}yields\hspace{1em}}c} +\verb|\grole| & $\grole$ & \verb|\getsto| & $\getsto$\\ +\verb|\lid| & $\lid$ & \verb|\gid| & $\gid$ +\end{tabular} +\end{center} +% +\subsubsection*{Gothic (Fraktur).} +% +If gothic letters are {\itshape necessary}, please use those of the +relevant \AmSTeX{} alphabet which are available using the amstex +package of the American Mathematical Society. + +In \LaTeX{} only the following gothic letters are available: +\verb|$\Re$| yields $\Re$ and \verb|$\Im$| yields $\Im$. These should +{\itshape not\/} be used when you need gothic letters for your contribution. +Use \AmSTeX{} gothic as explained above. For the real and the imaginary +parts of a complex number within math mode you should use instead: +\verb|$\mathrm{Re}$| (which yields Re) or \verb|$\mathrm{Im}$| (which +yields Im). +% +\subsubsection*{Script.} +% +For script capitals use the coding +\begin{center} +\begin{tabular}{l@{\hspace{1em}which yields\hspace{1em}}c} +\verb|$\mathcal{AB}$| & $\mathcal{AB}$ +\end{tabular} +\end{center} +(see p.~42 of the \LaTeX{} book). +% +\subsubsection*{Special Roman.} +% +If you need other symbols than those below, you could use +the blackboard bold characters of \AmSTeX{}, but there might arise +capacity problems +in loading additional \AmSTeX{} fonts. Therefore we created +the blackboard bold characters listed below. +Some of them are not esthetically +satisfactory. This need not deter you from using them: +in the final printed form they will be +replaced by the well-designed MT (monotype) characters of +the phototypesetting machine. +\begin{flushleft} +\begin{tabular}{@{}ll@{ yields } +c@{\hspace{1.em}}ll@{ yields }c} +\verb|\bbbc| & (complex numbers) & $\bbbc$ + & \verb|\bbbf| & (blackboard bold F) & $\bbbf$\\ +\verb|\bbbh| & (blackboard bold H) & $\bbbh$ + & \verb|\bbbk| & (blackboard bold K) & $\bbbk$\\ +\verb|\bbbm| & (blackboard bold M) & $\bbbm$ + & \verb|\bbbn| & (natural numbers N) & $\bbbn$\\ +\verb|\bbbp| & (blackboard bold P) & $\bbbp$ + & \verb|\bbbq| & (rational numbers) & $\bbbq$\\ +\verb|\bbbr| & (real numbers) & $\bbbr$ + & \verb|\bbbs| & (blackboard bold S) & $\bbbs$\\ +\verb|\bbbt| & (blackboard bold T) & $\bbbt$ + & \verb|\bbbz| & (whole numbers) & $\bbbz$\\ +\verb|\bbbone| & (symbol one) & $\bbbone$ +\end{tabular} +\end{flushleft} +\begin{displaymath} +\begin{array}{c} +\bbbc^{\bbbc^{\bbbc}} \otimes +\bbbf_{\bbbf_{\bbbf}} \otimes +\bbbh_{\bbbh_{\bbbh}} \otimes +\bbbk_{\bbbk_{\bbbk}} \otimes +\bbbm^{\bbbm^{\bbbm}} \otimes +\bbbn_{\bbbn_{\bbbn}} \otimes +\bbbp^{\bbbp^{\bbbp}}\\[2mm] +\otimes +\bbbq_{\bbbq_{\bbbq}} \otimes +\bbbr^{\bbbr^{\bbbr}} \otimes +\bbbs^{\bbbs_{\bbbs}} \otimes +\bbbt^{\bbbt^{\bbbt}} \otimes +\bbbz \otimes +\bbbone^{\bbbone_{\bbbone}} +\end{array} +\end{displaymath} +% +\section{References} +\label{refer} +% +There are three reference systems available; only one, of course, +should be used for your contribution. With each system (by +number only, by letter-number or by author-year) a reference list +containing all citations in the +text, should be included at the end of your contribution placing the +\LaTeX{} environment \verb|thebibliography| there. +For an overall information on that environment +see the {\em \LaTeX{} User's Guide \& Reference +Manual\/} by Leslie Lamport, p.~71. + +There is a special {\sc Bib}\TeX{} style for LLNCS that works along +with the class: \verb|splncs.bst| +-- call for it with a line \verb|\bibliographystyle{splncs}|. +If you plan to use another {\sc Bib}\TeX{} style you are customed to, +please specify the option \verb|[oribibl]| in the +\verb|documentclass| line, like: +\begin{verbatim} +\documentclass[oribibl]{llncs} +\end{verbatim} +This will retain the original \LaTeX{} code for the bibliographic +environment and the \verb|\cite| mechanism that many {\sc Bib}\TeX{} +applications rely on. +% +\subsection{References by Letter-Number or by Number Only} +% +References are cited in the text -- using the \verb|\cite| +command of \LaTeX{} -- by number or by letter-number in square +brackets, e.g.\ [1] or [E1, S2], [P1], according to your use of the +\verb|\bibitem| command in the \verb|thebibliography| environment. The +coding is as follows: if you choose your own label for the sources by +giving an optional argument to the \verb|\bibitem| command the citations +in the text are marked with the label you supplied. Otherwise a simple +numbering is done, which is preferred. +\begin{verbatim} +The results in this section are a refined version +of \cite{clar:eke}; the minimality result of Proposition~14 +was the first of its kind. +\end{verbatim} +The above input produces the citation: ``\dots\ refined version of +[CE1]; the min\-i\-mality\dots''. Then the \verb|\bibitem| entry of +the \verb|thebibliography| environment should read: +\begin{verbatim} +\begin{thebibliography}{[MT1]} +. +. +\bibitem[CE1]{clar:eke} +Clarke, F., Ekeland, I.: +Nonlinear oscillations and boundary-value problems for +Hamiltonian systems. +Arch. Rat. Mech. Anal. {\bfseries 78} (1982) 315--333 +. +. +\end{thebibliography} +\end{verbatim} +The complete bibliography looks like this: +% +\begin{thebibliography}{[MT1]} +% +\bibitem[CE1]{clar:eke} +Clarke, F., Ekeland, I.: +Nonlinear oscillations and +boundary-value problems for Hamiltonian systems. +Arch. Rat. Mech. Anal. {\bfseries 78} (1982) 315--333 +% +\bibitem[CE2]{clar:eke:2} +Clarke, F., Ekeland, I.: +Solutions p\'{e}riodiques, du +p\'{e}riode donn\'{e}e, des \'{e}quations hamiltoniennes. +Note CRAS Paris {\bfseries 287} (1978) 1013--1015 +% +\bibitem[MT1]{mich:tar} +Michalek, R., Tarantello, G.: +Subharmonic solutions with prescribed minimal +period for nonautonomous Hamiltonian systems. +J. Diff. Eq. {\bfseries 72} (1988) 28--55 +% +\bibitem[Ta1]{tar} +Tarantello, G.: +Subharmonic solutions for Hamiltonian +systems via a $\bbbz_{p}$ pseudoindex theory. +Annali di Matematica Pura (to appear) +% +\bibitem[Ra1]{rab} +Rabinowitz, P.: +On subharmonic solutions of a Hamiltonian system. +Comm. Pure Appl. Math. {\bfseries 33} (1980) 609--633 +\end{thebibliography} +% +\subsubsection*{Number-Only System.} +% +For this preferred system do not use the optional argument +in the \verb|\bibitem| command: then, only numbers will +appear for the citations in the text (enclosed in square brackets) +as well as for the marks in your +bibliography (here the number is only end-punctuated without +square brackets). + +Subsequent citation numbers in the text are collapsed to ranges. +Non-numeric and undefined labels are handled correctly but no sorting is +done. + +E.g., \verb|\cite{n1,n3,n2,n3,n4,n5,foo,n1,n2,n3,?,n4,n5}| -- where +\verb|n|$x$ is the key of the $x^{\mathrm{th}}$ \verb|\bibitem| +command in sequence, \verb|foo| is the key of a \verb|\bibitem| with an +optional argument, and \verb|?| is an undefined reference -- gives +1,3,2-5,foo,1-3,?,4,5 as the citation reference. + +\begin{verbatim} +\begin{thebibliography}{1} +\bibitem {clar:eke} +Clarke, F., Ekeland, I.: +Nonlinear oscillations and boundary-value problems for +Hamiltonian systems. +Arch. Rat. Mech. Anal. {\bfseries 78} (1982) 315--333 +\end{thebibliography} +\end{verbatim} +% +\subsection{Author-Year System} +% +References are cited in the text by name and year in parentheses +and should look as follows: +(Smith 1970, 1980), (Ekeland et al. 1985, Theorem 2), (Jones and Jaffe +1986; Farrow 1988, Chap.\,2). If the name is part of the sentence +only the year may appear in parentheses, +e.g.\ Ekeland et al. (1985, Sect.\,2.1) +The reference list should contain all citations occurring in the text, +ordered alphabetically by surname (with initials following). If there +are several works by the same author(s) the references should be listed +in the appropriate order indicated below: +\begin{alpherate} +\setlength{\hfuzz}{5pt} +\item +One author: list works chronologically; +\item +Author and same co-author(s): list works chronologically; +\item +Author and different co-authors: list works alphabetically +according to co-authors. +\end{alpherate} +If there are several works by the same author(s) and in the same year, +but which are cited separately, they should be distinguished by the use +of ``a'', ``b'' etc., e.g.\ (Smith 1982a), (Ekeland et al. 1982b). +% +\subsubsection*{How to Code Author-Year System.} +% +If you want to use this system you have to specify the option +\verb|[citeauthoryear]| in the \verb|documentclass|, like: +\begin{verbatim} +\documentclass[citeauthoryear]{llncs} +\end{verbatim} +Write your citations in the text explicitly except for the year, leaving +that up to \LaTeX{} with the \verb|\cite| command. Then give only the +appropriate year as the optional argument (i.e. the label in square +brackets) with the \verb|\bibitem| command(s).\\[2mm] +{\itshape Sample Input} +\begin{verbatim} +The results in this section are a refined version +of Clarke and Ekeland (\cite{clar:eke}); the minimality result of +Proposition~14 was the first of its kind. +\end{verbatim} +The above input produces the citation: ``\dots\ refined version of +Clarke and Ekeland (1982); the minimality\dots''. Then the +\verb|\bibitem| entry of \verb|clar:eke| in the \verb|thebibliography| +environment should read: +\begin{verbatim} +\begin{thebibliography}{} % (do not forget {}) +. +. +\bibitem[1982]{clar:eke} +Clarke, F., Ekeland, I.: +Nonlinear oscillations and boundary-value problems for +Hamiltonian systems. +Arch. Rat. Mech. Anal. {\bfseries 78} (1982) 315--333 +. +. +\end{thebibliography} +\end{verbatim} +{\itshape Sample Output} +\bibauthoryear +% +\end{document} diff --git a/executable_names/doc/common/llnlCoverPage.tex b/executable_names/doc/common/llnlCoverPage.tex new file mode 100644 index 0000000000000000000000000000000000000000..8e0a24cfbca4052a79b1bdc08a709cdb0cdf12d6 --- /dev/null +++ b/executable_names/doc/common/llnlCoverPage.tex @@ -0,0 +1,191 @@ +% ***************** llnlCoverPage.tex ******************************************************************************** +% This file defines the following commands for generating the +% front and back cover pages: +% +% \makeLLNLCover{UCRL}{Title}{Authors}{Journal}{Date}{hShift}{vShift} +% and +% \makeLLNLBackCover +% +% where +% +% UCRL: The UCRL (6 digit) number (which you probably won't know before the document +% is released so just make up a number) +% Title: title of the article +% Authors: Authors separated by \\ +% Journal: The journal name +% Date : the date +% hShift,vShift : horizontal and vertical shifts to apply to the title page to position it correctly (since +% the automatic positioning may not work) +% +% Here is an example: +% \makeLLNLCover{123456}{An adaptive numerical method for high-speed reactive flows}{William D. Henshaw\\% +% Donald W. Schwendeman}{Journal of Computational Physics}{January 1, 2003}{0in}{0in} +% +% ***************************************************************************************************************** +% +\newcommand{\setPageForLLNLCover}[2]{% +\newlength{\textwidthOld}% +\setlength{\textwidthOld}{\textwidth}% +\newlength{\textheightOld}% +\setlength{\textheightOld}{\textheight}% +\newlength{\topmarginOld}% +\setlength{\topmarginOld}{\topmargin}% +\newlength{\textwidthNew}% +\setlength{\textwidthNew}{6.5in}% +\newlength{\textheightNew}% +\setlength{\textheightNew}{9.5in}% +\newlength{\oddsidemarginNew}% +\newlength{\topmarginNew}% +\setlength{\oddsidemarginNew}{(\paperwidth-\textwidthNew)/2 - 1in + #1}% +\setlength{\topmarginNew}{(\paperheight-\textheightNew -\headheight-\headsep-\footskip)/2 - 1in +1.cm + #2}% +\newlength{\oddsidemarginOld}% +\setlength{\oddsidemarginOld}{\oddsidemargin}% +\changepage{\textheightNew-\textheightOld}{\textwidthNew-\textwidthOld}{\oddsidemarginNew-\oddsidemarginOld}{\oddsidemarginNew-\oddsidemarginOld}{}{\topmarginNew-\topmarginOld}{}{}{}% +}% +\newcommand{\setPageForLLNLBackCover}{% +\changepage{\textheightNew-\textheightOld}{\textwidthNew-\textwidthOld}{\oddsidemarginNew-\oddsidemarginOld}{\oddsidemarginNew-\oddsidemarginOld}{}{\topmarginNew-\topmarginOld}{}{}{}% +}% +\newcommand{\resetPageFromLLNLCover}{% +\changepage{-\textheightNew+\textheightOld}{-\textwidthNew+\textwidthOld}{-\oddsidemarginNew+\oddsidemarginOld}{-\oddsidemarginNew+\oddsidemarginOld}{}{-\topmarginNew+\topmarginOld}{}{}{}% +}% +% ************************************************************************************* + + +% ************************************************************************************* +\newcommand{\makeLLNLCover}[7]{% +\setPageForLLNLCover{#6}{#7}% +\thispagestyle{empty}% no number of this page +\newcommand{\logoWidth}{1.65in}% +\psset{xunit=1.cm,yunit=1.cm,runit=1.cm}% +\begin{pspicture}(0,0)(17,24.) +% turn on the grid for placement +% \psgrid[subgriddiv=2] +\rput(2.3,12.5){\epsfig{file=../common/Logo_for_papers.ps,width=\logoWidth}} +\rput(11.2,23.){\parbox{12.0cm}{\large\bf% +\begin{flushright} +% jg - just pass in full UCRL string +%Preprint \\ +%UCRL-JC-#1 +#1 +\end{flushright} +}} +\rput(10.5,18){\parbox{12.0cm}{%\sffamily\bfseries\Huge\noindent% +\fontsize{24.88}{30pt}\usefont{OT1}{cmss}{bx}{n} +\begin{flushleft} +#2 +\end{flushleft} +}} +\rput(10.5,13.){\parbox{12.0cm}{%\sffamily\LARGE\noindent% +\fontsize{17.28}{18pt}\usefont{OT1}{cmss}{m}{sl} +\begin{flushleft} +#3 +\end{flushleft} +}} +\rput(10.5,9.5){\parbox{12.0cm}{% \sffamily\large\noindent% +\fontsize{14}{16pt}\usefont{OT1}{cmss}{m}{n} +This article was submitted to #4 +}} +\rput(10.5,7.5){\parbox{12.0cm}{% \sffamily\bfseries\LARGE\noindent% +\fontsize{20.74}{22pt}\usefont{OT1}{cmss}{bx}{n} +\begin{flushleft} +#5 +\end{flushleft} +}} +% \rput[l](4,6.375){\psframebox{\parbox{2.5cm}{\bf% +% \begin{flushleft} +% Lawrence\\ +% Livermore\\ +% National\\ +% Laboratory +% \end{flushleft} +% }}} +\rput(10.5,-1.){\parbox{12.0cm}{% +Approved for public release; further dissemination unlimited}} +\end{pspicture} +% } +% +\clearpage +% -------------- back of front cover ------------------------- +\changetext{.625in}{}{}{}{} +\thispagestyle{empty}% no number of this page +\vglue5\baselineskip +\begin{center} +{\bf DISCLAIMER} +\end{center} +\noindent +% jg - updated disclaimer for report format +This document was prepared as an account of work sponsored by an +agency of the United States Government. Neither the United States +Government nor the University of California nor any of their +employees, makes any warranty, express or implied, or assumes any +legal liability or responsibility for the accuracy, completeness, or +usefulness of any information, apparatus, product, or process +disclosed, or represents that its use would not infringe privately +owned rights. Reference herein to any specific commercial product, +process, or service by trade name, trademark, manufacturer, or +otherwise, does not necessarily constitute or imply its endorsement, +recommendation, or favoring by the United States Government or the +University of California. The views and opinions of authors expressed +herein do not necessarily state or reflect those of the United States +Government or the University of California, and shall not be used for +advertising or product endorsement purposes. +\vskip2\baselineskip +\noindent +This work was performed under the auspices of the U. S. Department of +Energy by the University of California, Lawrence Livermore National +Laboratory under Contract No. W-7405-Eng-48. +\vskip1\baselineskip +\vfill +\clearpage +\changetext{-.625in}{}{}{}{} +\resetPageFromLLNLCover +\setcounter{page}{1} +% ----------------------------------------------------------------------------------- +} +% ************************************************************************************* + + +% ************************************************************************************* +\newcommand{\makeLLNLBackCover}{% +\clearpage +\setPageForLLNLBackCover +% jg - suppress printing of essentially blank page here +%\changetext{.625in}{}{}{}{} +%\thispagestyle{empty}% no number of this page +\ \ +%\vfill +%\begin{center} +%Approved for public release; further dissemination unlimited +%\end{center} +%\clearpage +%\clearpage +%\changetext{-.625in}{}{}{}{} +% --------------------------------------------------------------------------- +\thispagestyle{empty}% no number of this page +\renewcommand{\logoWidth}{10.in} +% \vglue\vShift +% \hglue\hShift +\begin{pspicture}(0,0)(17,24.) +% turn on the grid for placement +% \psgrid[subgriddiv=2] +\rput{90}(2.3,12.5){\epsfig{file=../common/Rule_and_address.ps,width=\logoWidth}} +% \rput*[l]{90}(5.5,0){\psframebox{\parbox{8.0cm}{\large% +% \begin{flushleft} +% University of California\\ +% Lawrence Livermore National Laboratory\\ +% Technical Information Department\\ +% Livermore, CA 94551 +% \end{flushleft} +% }}} +\end{pspicture} +% \setlength{\textwidth}{4.in} % page width +% \setlength{\textheight}{8.in} % page height +\clearpage +\resetPageFromLLNLCover +% ----------------------------------------------------------------------------------- +} +% ************************************************************************************* + + + + diff --git a/executable_names/doc/common/project.bib b/executable_names/doc/common/project.bib new file mode 100644 index 0000000000000000000000000000000000000000..f64a99aa9c551c60ed8b2af3cf8cbd29241dc23c --- /dev/null +++ b/executable_names/doc/common/project.bib @@ -0,0 +1,219 @@ +@MISC +{ + Authd2002, + AUTHOR = {Brad Chun}, + TITLE = {{Authd}}, + HOWPUBLISHED= {http://www.theether.org/authd/}, + YEAR = {2002}, +} + +@CONFERENCE +{ + BlueGeneL2002, + AUTHOR = {N. R. Adiga and others}, + TITLE = {{An Overview of the BlueGene/L Supercomputer}}, + BOOKTITLE = {Proceedings of Supercomputing 2002}, + ADDRESS = {Baltimore, MD}, + YEAR = {2002}, + NOTE = {Available from http://sc-2002.org/paperpdfs/pap.pap207.pdf}, +} + +@MISC +{ + BlueGene2002, + AUTHOR = {{{Lawrence Livermore National Laboratory}}}, + TITLE = {{Blue/GeneL}}, + HOWPUBLISHED= {http://www.llnl.gov/asci/platforms/bluegenel}, + YEAR = {2003}, +} + + +@MISC +{ + BlueGeneWeb, + AUTHOR = {{{IBM}}}, + TITLE = {{Blue Gene Home Page}}, + HOWPUBLISHED= {http://www.research.ibm.com/bluegene}, + YEAR = {2004}, +} + +@MISC +{ + DPCS2002, + AUTHOR = {{Lawrence Livermore National Laboratory}}, + TITLE = {{Distributed Production Control System (DPCS).}}, + HOWPUBLISHED= {http://www.llnl.gov/icc/lc/dpcs/dpcs\_overview.html}, + YEAR = {2002}, +} + +@MISC +{ + Etnus2002, + AUTHOR = {{Etnus, LLC.}}, + TITLE = {{Etnus Home Page}}, + HOWPUBLISHED= {http://www.etnus.com}, + YEAR = {2003}, +} + +@MISC +{ + Globus2002, + AUTHOR = {{The Globus Project}}, + TITLE = {{The Globus Project}}, + HOWPUBLISHED= {http://www.globus.org}, + YEAR = {2003}, +} + +@MISC +{ + GPL2002, + AUTHOR = {{The GNU Project}}, + TITLE = {{The GNU Public License}}, + HOWPUBLISHED= {http://www.gnu.org/licenses/licenses.html}, +} + +@CONFERENCE +{ + Jackson2001, + AUTHOR = {D. Jackson and Q. Snell and M. Clement}, + TITLE = {{Core Algorithms of the Maui Scheduler}}, + BOOKTITLE = {Job Scheduling Stategies for Parallel Processing}, + PUBLISHER = {Springer-Verlag}, + VOLUME = {2221}, + PAGES = {87-102}, + ADDRESS = {{7th International Workshop, JSSP 2001, Cambridge, MA}}, + YEAR = {2001}, +} + + +@MISC +{ + Jette2002, + AUTHOR = {M. Jette and others}, + TITLE = {{Survey of Batch/Resource Management Related System Software}}, + HOWPUBLISHED= {{Lawrence Livermore National Laboratory}}, + YEAR = {2002}, + NOTE = {(unpublished)}, +} + +@CONFERENCE +{ + Jones2003, + AUTHOR = {T. Jones and S. Dawson and R. Neely and W. Tuel and L. Brenner and J. Fier and R. Blackmore and P. Caffrey and B. Maskell and P. Tomlinson and M. Roberts}, + TITLE = {{Improving scalability of parallel jobs by adding parallel awareness to the operating system}}, + BOOKTITLE = {Proceedings of Supercomputing 2003}, + ADDRESS = {{Phoenix, AZ}}, + YEAR = {2003}, +} + +@CONFERENCE +{ + Kerbyson2001, + AUTHOR = {D. J. Kerbyson and J. J. Alme and A. Hoisie and F. Petrini and H. J. Wasserman and M. Gittings}, + TITLE = {{Predictive performance and scalability modeling of a large-scale application}}, + BOOKTITLE = {Proceedings of Supercomputing 2001}, + ADDRESS = {{Denver, CO}}, + YEAR = {2001}, + PAGES = {37}, +} + +@MISC +{ + LL2002, + AUTHOR = {{IBM}}, + TITLE = {{LoadLeveler -- Efficient job scheduling and management}}, + HOWPUBLISHED= {\linebreak http://www-1.ibm.com/servers/eserver/pseries/library/sp\_books/loadleveler.html}, + YEAR = {2003}, +} + +@MISC +{ + Maui2002, + AUTHOR = {{Maui Scheduler}}, + TITLE = {{Maui Scheduler}}, + HOWPUBLISHED= {http://supercluster.org/maui}, + YEAR = {2003}, +} + +@CONFERENCE +{ + Petrini2003, + AUTHOR = {F. Petrini and D. J. Kerbyson and S. Pakin}, + TITLE = {{The case of missing supercomputer performance: Achieving Optimal performance on the 8,192 processor ASCI Q}}, + BOOKTITLE = {Proceedings of Supercomputing 2003}, + ADDRESS = {{Phoenix, AZ}}, + YEAR = {2003}, +} + +@CONFERENCE +{ + Phillips2003, + AUTHOR = {J. C. Phillips and G. Zheng and S. Kumar and L. V. Kale}, + TITLE = {{NAMD - biomolecular simulation on thousands of processors}}, + BOOKTITLE = {Proceedings of Supercomputing 2002}, + ADDRESS = {{Baltimore, MD}}, + YEAR = {2003}, +} + +@MISC +{ + Quadrics2002, + AUTHOR = {{Quadrics Ltd.}}, + TITLE = {{Resource Management (RMS)}}, + HOWPUBLISHED= {http://www.quadrics.com/}, + YEAR = {2003}, +} + +@CONFERENCE +{ + SLURM2003, + AUTHOR = {M. Jette and M. Grondona}, + TITLE = {{SLURM: Simple Linux Utility for Resource Management}}, + BOOKTITLE = {Proceedings of ClusterWorld 2003}, + ADDRESS = {San Jose, CA}, + YEAR = {2003}, +} + +@MISC +{ + SlurmWeb, + AUTHOR = {M. Jette and M. Grondona}, + TITLE = {{SLURM Home Page}}, + HOWPUBLISHED= {http://www.llnl.gov/linux/slurm}, + YEAR = {2004}, +} + +@CONFERENCE +{ + STORM2001, + AUTHOR = {E. Frachtenberg and others}, + TITLE = {{STORM: Lightning-Fast Resource Management}}, + BOOKTITLE = {Proceedings of SuperComputing 2002}, + ADDRESS = {Baltimore, MD}, + YEAR = {2002}, + NOTE = {Available from http://www.cs.huji.ac.il/$\sim$etcs/papers/sc02.pdf}, +} + +@CONFERENCE +{ + Tsafrir2005, + AUTHOR = {D. Tsafrir and Y. Etsion and D. G. Feitelson and S Kirkpatric}, + TITLE = {{System Noise, OS Clock Ticks, and Fine-Grained Parallel Applications}}, + BOOKTITLE = {19th ACM International Conference on Supercomputing (ICS)}, + YEAR = {2005}, + PAGES = {303-312}, +} + +@CONFERENCE +{ + Yoo2003, + AUTHOR = {A. Yoo and M. A. Jette and M. Grondona}, + TITLE = {{SLURM: Simple Linux Utility for Resource Management}}, + BOOKTITLE = {Lecture Notes in Computer Science}, + PUBLISHER = {Springer-Verlag}, + VOLUME = {2862}, + PAGES = {44-60}, + ADDRESS = {{9th International Workshop, JSSP 2003, Seattle, WA}}, + YEAR = {2003}, +} + diff --git a/executable_names/doc/common/slurm.eps b/executable_names/doc/common/slurm.eps new file mode 100644 index 0000000000000000000000000000000000000000..da42db8a6aa9ced301ffc154f59ceee079f6caae --- /dev/null +++ b/executable_names/doc/common/slurm.eps @@ -0,0 +1,4115 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /home/dun/dvl/slurm-doc/slurm.eps +%%CreationDate: Fri Nov 2 14:10:19 2001 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 515 389 +%%EndComments +%%BeginPreview: 256 191 1 191 +% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +% fbefbdf7df7befbef7df7f7df7defbefefbefbdf7defbefbdf7df7befbfbefbf +% eebaebaebaeebaebaebaeaebaeb5d75d5d75d6baebbaebaeb5d75d6baeaebaeb +% fbefbf7df7ddefbefdf7dfbefbff7df7f7df7fefbeefbefbff7df7fefbfbefbf +% ef7b76efbefbbdedb7befb77aeabd75d5d75d57aebbb6dded5dbbdabdededdeb +% fbdeefdaebaf775bed6baeedfdfefefbfbefbfdfdf77fbb5ff776bfeb5b5bb7f +% eef7dd7fbefbeeff7ffefbdf5bb7addf6f7df6f5bbeeaf7fabdeff5bffffefd7 +% fbbd7bd6f7b6bdd6d5addf7bf77dfbb5ddd75dbf76bdfbeb7ef7d6f76b557afd +% ef6fdf7dddefefbdff7bb5debeef5f7f7bbdf7ebefefb6beedbd7ddefeffdfaf +% fbfaf5efbb7dbaf7adef7f77ebdbf5edef77bebebdbaefeddfefdbbbd7db75fb +% eeafbf7af7d777befbbdeded7efebf7bbbeeebedef77bdbbbabaf7777d77df5f +% fbfb6bdfbefdeeebb7777bbfd7abebdf76bddedfbbeef77777efbeeeefdef6f5 +% ef6efef5ebafbddeeeeedf75bdfedef5efefbbbaf6bdddeeeeddebdddafbbddf +% fbdddbbf7efaefbbddddf5ef775bbbbf7dbaf777bfefbbbdddfb7efbbfaeefbb +% defbbeebd7b7baf77bbbbf7deef7776bd777beeeeadaf777bbafd7af76fbdaf7 +% f7af77befdeef7beef776bd7bddeeefefdeeebdddfbfbeeef77afdfbefb77fbf +% edfbededaf7ddeebddeefefdefbbddd7afbddefbbb76ebdddeefaf5ebdeeeb6b +% df5ebf7bfbd7bbdefbbddbaf7af77bbdfaefbbaf77efbefbbbddfbf7ef7ddeff +% 7bf7ebdf6efdf77baf77befbdfbeef775fbaf77deebdedaf777b5ebd7bd7bbdb +% eebd7ef5ddaf5eef7beef7b6f5ebddeef5f7beef7def7bfbeeeff7efdefdf777 +% 7befdbbf7bfbf7ddeebdddefbf7efbbddf5eebdbd7bbdf6ebddd6d7af7af5eef +% ef7af76bef5ebd7bbdefbb7debd7af77bbf7befefdeef5ddefbbdfdfbdfbf7dd +% fbdfbefebbf7efdf77baf7d77efdfbeef6bdedabaf7bbf7bbaf77af5ef5ebd7b +% 6ef5ebd7eebd7af5eef7befdd7affebddfef7bfefbdeebef77beefbf7bf7efdf +% 7bbf7efd7defdfbf7ddeebaf7df807f7badbdf6ddef7bebbeeebddebdebd7af5 +% ef6bd7afd7baf5ebd7bbdefbdf00003ef7bef5dfb7bdedeebddefb7ef7efdfbf +% 7bfefdfafdefbf7efdf77bdef012a887def7bf7afdef7bbdefbbafd7bd7af5eb +% eeadaf5faf7b6bd7af5eef77c0400100f7ddebefaf7bdf77baf77afdefdfbf7f +% 7bfbfbf5fbdefefdfbf7dddf0a0912293d777ebb7bdef5eef7beefaf7af5ebd7 +% ef6f5ebf5ef7dbaf5ebd7bbc009020000fded7eeeef7bf7ddeebddfbdfbf7efd +% 7bddf7ebf7bd777bf7efdf7024024492437bfd7dddbdebd7bbdefb5ef5ebd7af +% eefbbd7ebdefdeeeddbb75e10090000009eeb7d7bbef7efdf77baff7bf7efdfb +% 7db777d7ef7b7bddfbf7df842402492490fbeefdf77bd7af5eef7addebd7af5f +% efeeeefd7bdeef7baf5ef7088090000002377daf5edefdfbfbddefbb7efdfbf5 +% 7b7dfdb7def7dddf7dfbbe2012024924905ed7fbfbf7af6edefbbdf7d7b76edf +% efdbafeef7bdbfbbef6f680240480000020ffdb6df5dfbdfb7af776efdeefdfb +% 7d7ffabdbdeff5f77bddf924090124924846b7efb6fb6efafdfbeefdaf7dd7af +% efed6ff7ef7b6f6edefbb00090240000010bfebdfddfffb7db5eddd7fbdbbefb +% 7b7ffdbd7bdffffff7af6248020092492423b7ef57bb5afef7f7bbfedef777b7 +% eed5afefdef5555addfdc1ffa09270000081fd7bfef7ffdbbeddf75bf7beedef +% 7bff7b7b77bffff7ff6f8bffc400f4924908d7deb7bedb7febbb5fff6eebdf7d +% ef5befdffdeb6dbeb5fb11f1c892f00000227ef7fdedf7d57f77fad5dddf7bdb +% 7dfedd76d77fffedefaf20f282200254948077bdb77bbeffdbfedfbf7bbdeeff +% efb7fbefbedb5b7fbdfe02f62ffcf8fe7ef93def7ddf6db6f6d7b6f7ef77bdab +% 7b7db77df7f7fedb776c48fe5ffdf9ff7e601f7beff6fbefbffdfddd7dfef7ff +% efef7fdb6eded7fffffc00fe9f7cfbcf1ee49bdedd5ddf7dedb76fbfdbabbdb7 +% 7dbbedbffdfbfdb6d55892f60f3cfbcf3fc00ef7bbfbf6db7ffffb75bf7f77fd +% effedff6dbb75ffdfff800f64f3cfbcf9fc92fbdff6f5fffd56d6ffff6edeeaf +% 7b6bfb6ffffef5afb6d124f0df3cfbef0fc006ef6bfdfb6dbffffdadbddfbdfb +% efff6ffdb6adfff058f401f1df7cfbef2f8927fbfedbb7fffb5b6fffeffb77b7 +% 7d5bfd5bffffad04826093ffdf7ef9fe078007aedbff7edadffffb6b7b6feeff +% effedbff6adb7f4910a403ffdf7ef8fc772491ffff56edfff6dadfffdffd7fdb +% 7b6dffb6fffff610452090000000f800f70003b5b6ffffb6bffff6ad76dbdaff +% efffb6ffdb6adc45102404491249f1223e4925ffffedadffffb6bfffffffffb7 +% 7db6ffdafffff8904560fc802001f2047c0000db6b7fff6c007fedb6d6b6b6fd +% efffd5bfb6db59051005861244920048009248ffffdb6df8ff06ffffffffffd7 +% 7b6afff6fffff051e564140000004900840002eadaffffacc1f8f56db6d5adbf +% efdfb6dfd5adb505f02aa649249200241092487fffb55b7c3f169ffffffffffb +% 7d7dfffb7ffff053baa80400000049012200006dadfffffe1fa9c7ab5ab6dadf +% efefadb7edb56505e832ad24924900240049257fff6db5b58fea31fffffffff7 +% 7b7b7ffedffff0517d5004000000248092000075b5fffff8e3daac76d6db56bd +% efdff56dfb6db204df8aa52e4925c712a0f2793fffb5ad6919c3c73fffffffef +% 7dbadfffb7ffe4a13a0c0c611f8228c633098436adfffff00e38119b5b6adb7b +% eff7fb6b7ed6d00a1e24a488904cb2488c4e2a7fff6db6da4b8f4a9fffffffdf +% 7b6f5fffedfff550aa440d52a14910b229148236dbffffe806f0ff8d6d5b6d7b +% effdf6db7fb5b80406054500aa52252488402a5ffed56dd895bf003fffffffef +% 7d5bbfffdb7fe951524c1455a05440202295411db7ffffe806d4fffb6b6dab7d +% effff5ad7fedba040504a680a5708aaa8800151ffdb6d5b12368037fffffffdb +% 7db6dfffeadffc5151940a2aa052203022aa813b57ffffd805b915badb5ab6ff +% f7fffb6dbffb6d04048545808a988ab28c022a1ffeadb6ea4b50437fffffffb7 +% 6edb6ffff76ffe51504414955049284824ad013d6dffffb405b9059b56db6dfd +% fffffedb6efdb6040554a88085480a4a8a05551fffdb6d5c96d0233fffffff6f +% 6db6dbffffdbfd51502408ab508aaec82a55011b6dbfff6805b2847b6d6adbfb +% ffffff6db6ff4784056549814488090a88892a3efff6dbb646d14edffffffedf +% 6d6db7ffffb695d150281095499958102d1102c01b6fff6c8b62209b5bb6d7fb +% fffffdb6dbffa3e40522a981408808950c4a5312a7fdb6da02a69a9ffefffdb7 +% 6dab57ffff6d05b150680a95958aa81054890444036fffb69106a93d77db6fff +% ffffff6db7ff2bf8052aa680204809328c2a511155fdb6db0248c33beefffdad +% 6d6d6dfffedb016aa06809950a4aa810254a044400dfff6d1012a837bddb6fff +% ffffffdb6ffe55fc0a29428050a80895140aa91154f6dcd6225492bef7bffdbb +% 76dbb6fffadb01b4a0c816aa824aa11054aa0044015ffcbb00606e3fdff6dbef +% ffff7fb6dfff28fc0a4aa48094c81412a412557f547b6c6d24cea075badfff7f +% 6db7f6fff6db0269508808ab4189505025528e9bc13ffc36004510fffffb6ded +% fffdbfdb6fffa89204955266770ea10fc2a2701ef46db895494ab376db6fffdf +% 76dff6fffdb682045184e010001008200905809bd13fe9060043427ffffedb7d +% fffb7fdb6fffd4a885110484484091002020041f785b78204be886edb6dbfff7 +% 6db7edbffdb6e00222020810820400250484489df2bfdd04025298ffffffb6df +% fffedffb6fffdaa88e4841277dfbfe804810801fd42dba209e4892edb6db7ffd +% 76ddfb6ffdb6fc022e010ae8000000be0122125db13ff784004d24fffffff6db +% fffbdffedfffdb50be487a02a5252401f000001fe476fd48998251db6db6dfff +% 6dbfbdbbfb6dfffffa0380a8084041540f49493b013fd6c00850c5fffffffb6f +% fff6fbf7bfffb6dfdebc2502a215140120ba003e546dfb449aa28bb6db6dbffd +% 777fefbf76dbfffb7b41082808a041544a02fff0017fb6c0f23125fffffff6db +% feedbef7ffff6dbfff245142a20a140100a80002aa6ded898a9249edb6db7fff +% 6ffffbfedb6dfff6d449041008a0a1545402aa9400ffa000991493bfffffedb7 +% fdb6efb7ffffdb7ff9005145420a040101500020aaede224c4b513fb6db6ffff +% 77ffdefedb6dbfeda255041014a0a9545405550a01ffc8434e6867b7ffffdb6d +% ff6dfdeffffffb7fc8005145400a000101500050abb6c14ca11247ff6db6ffff +% 6dffb7ddb6db6fed12aa8410157ffaa85405550207ffc8a4d5248f6effffdb6f +% ffdbff7ffffffefe200021454f0003c281500054af6dd124312897fdedb6fffd +% 7b7f6df6dbb6dbd88aaa8a1070200018280555003effa9552543076fdfffdb6f +% eff7ffdfff7ffff9200020878044940742a00055fbeda50b0e922ffdfdb6fffd +% 7ededb7db7f6db680aaa8a38048000a0e80aaa0befbfe75554a60edfb7ffdb6f +% fbfdfff7fedffff2a00020c0200922041d502fff7efb8ac4c5044ffbff6dfffd +% 6fb7db6f6ffdb6d00aaa8f128490082081ffa7fdedef822a29280edf6dffb6df +% feff7ffefdb7fff5500030001002410400000edbffdf3e11b2492ffbffdbfffb +% 7bedf6ddefff6db00555c4490248082094003fffb77d20548491ddbf6dbf6dbf +% efbfdffbddb6fffaa00600802401210401491db6fef75089cd137ff7fffbfff7 +% 7efb7dbfffffedbc0abe29124092042124007fffefef0fc48856bb7edb776dbf +% fbeff7f6db6ddff540ef00000800488400247b6dbdbf2035b225dfedffeffff7 +% 6fbedf7fffffbdbf5fbd9249212400109281f7fffbfb0a4b10a6bddfdb7edb7f +% fefbfdedb76dfbf7f7ff8000040124820010ff6db7b72088654dbbbdbfefffed +% 7befb7ffffffbfbedeedc924909000104905edffff7f4a24204b3ffbfb7db6ff +% efbeffbbeeedf6f7ffffe000020492420023dfdb6efe808cca8abb6fbfefffdb +% 7efbeeff7fffbffef6ddf24924200008490ffdbffdedd5209087bffef6feeeff +% fbefbfeffbb6f6dbdfffb80000849241002f7ffb6ffca00ac4957bdfffdbddef +% 77befbbddfffffffffbbfc9248100008249febbfff6cffd29106f77bb7ffffdd +% fffdf7ffbeedb6db76ff7e0002424921007dff76dbfca0248525fffffedb777f +% 76efdf6dfbdfffffefefefa49008000424ffbfffff78dec521036eeeefffeef7 +% fffffeffefff7df77fbdfd800241249081f7f6eddded73950b25fdddddbbbfff +% 77bb77f77edbefbffb7fb7e49008000213eefffffbfda4255001fffffffffddd +% feffefbfeffffdf6dff7fff00491249047bfdddf7fbf68890692edbb76eeefff +% 77eefefdfdbedffffefeeefc900000020ffdfbfbef76cc315200fffffffddedb +% ffbddfefbff7fbb7bbdfdfde024924907f77bfbf7dfda5630425dbeeeedffdff +% 76fffbbdf77eeffefffbfdffa4000004fefff777efecc3c12c81ff7dddfbbff7 +% ffedbf7fdeeffeefeedf77b7e0924923f7eefffeff7e48058813f7effffff7bf +% 77bff7f77ffdbbddfdfdeffefc00000fffdfdddfdbffb0117c81deffbbb6fefb +% feff7efefbdfffffbff7feefff92497fb6fdfbfbffb7da43d413ffdb7fffdfef +% 77f6efdfef7beedff7bfbffddffd17fefff7bfbf76fee60ab483b77ff6eefbbf +% ffbffdfbffff7ffb7efdf6dffbfffffbf7bff7f7eff7f9936c13fefeffdfef7d +% 76fddfbf6ddffbbfefeffffbbf7fffb7defdbefeffbfde62da87efedddfddff7 +% ffeffbf7fffb6ff77dff6efff7eddb7f7fefffdfddfdbf9f6c177dffffbffdff +% 77bf7f7eef7ffeffffbbffdb7effbffffbbf76fbffefffe3fb3fffbbbbf77fb7 +% fefbefeffdeefbdddbf7dbffefddfeeddffbffff777f76fc07feedffff7fedff +% 77fffdfdbfffdfffff7f7f77fdfff7fffeefdddbfff6fffff877ffeeefedffef +% ffb6dfbff76dfedb77effffedfb76fbb77fefbffdddfeedfffffbbbffdffbbbd +% 76fffbf77fffb7fffefddb6ffbfffeffffbbffbb7fbffffbdfeefffbbfbbf7ff +% fff7bf7feddfffbeefdffffddf7ddfeeedffb7fff7fb6dff7bbfeeeff7ff7f77 +% 77bef7edfffb7df7fdfb777fffeffbbfffeefeeefeffffb7fffbbffefeefefff +% fefffeffbbbfefffbfbfffedbb7f7ffbbbbff7ffdfdbbffeeeeffbbbdfddfddd +% 77eddfdffff77f6df7f7ddfffffbeeeffffbbfbbfbfff6effffeeffffbffbfff +% ffbffbfb6efffbfffefeffbbeeeffffeeeeffdff7f777fdddbbbfeeedf7bf777 +% 76fdbf7fffdddfdf6fdff7ff7dfedbbbfffeefefefefeeffffffbbffffef7fff +% fff7f7eefbfffefbfdfbbeefffdfffffbbbbff7dfdfefffbbeeeffbbbb7feddd +% 7fdffeffdf7777ffdfbf7fdddbfbbeeeffffbbffbfbfdbb7f7ffeefffffbffff +% f6fedfdbffffff6efbf4db3ef6df67fdee5bffb7f7f6ffff7fbbbfeeeeef6f77 +% 7ff7fbff76dd44aabf7ddedb7773df8d1eaf5b7d5cbec8cfedf7fbbffdfffdff +% f7bfff7ffffadaad575bad5ef577bd6eeb6bbe92adbdb75dffff7ffbbfdddfdd +% 7efedfedddff77dbdf7bbaedeb7aaf5d6b75ad7d6abadedfbbb7eefff7fffbfb +% fff7fbffffb6f5d5ed7ab5dd6eeabebdf77bbacefd7bbfdbfffeffdb7ef77f7f +% 76dfbf7f7bfdb7f7ff6bb5faeefafeb5f6eb7bfddbbaadbfb777fbffefdfefef +% fffdf7edfff5f7b776f757fdd6baf6bdb6bd55fd7b77bfb77fffdf77fefefdfd +% 77bfffffef6eedf7fedb77b5ddfbddbaeaf377b5f56b7b5ffeeefffeddfbffbf +% fef76edfbdfdd7f9eeab6a5b5d7bfdabeeef75fdf76f5f7df7fffb6fffdfdbf7 +% 7ffffffdfffbefbafd576abaadeadabdd5eb6ffbb7575377bfdddffddbff7fff +% f7defdfff7bad7cdddf76fb5bbfbfabbadaeebbaf55eaebffefffeffff7bff6f +% 7effefdbbffbded6fdeeaf57badbf5555daeeff5ef5afefef7fbbbdbbfefedff +% fffbfffffef5dfeafd6eed775ab777b6bd5eaf37eb5eff77dfdffffff6ff7ffd +% 77df7dbf77d7dbf5b5eaeab77557ebb57abd72f7af7e82fffeff77bf7ffdffb7 +% feffeffbfff7afbdfbff7577fff5efb5fafef575ef757edefbfbfffbffdfedff +% 7ffbffffeefeffffff7ffffeefffafbffffbfff7fdffdbfbdfdfeeffedfbffff +% f7df7db77fdffdf7b7eddffffedffdffb7dfefdfbfef7fffff7f7fdf7fbfbfb7 +% 7effeffffdfdefbefffffdb7dffdfff6ff7fbefff7bfff6f7bfbfdfbfffff6ff +% fffbfffeeffffffffedfbffefdffb7bffffbfffb7ffdedffffefefffedf6ffff +% 77df7db7ffb7bdf7dbfdfbffffdbfeffdbef7bdffef7bffdef7f7fb77fbfdfdb +% feffefffddfef7beffffffb7dbfffff6ff7fff7fefdfffb7bdfdfdfffffffdff +% 7ffbfffeffffffffff6fb7feffbf6dfffffdeffb7dff7bffffefeffeedf6ffbf +% f7df7db7fbb7def7dbfdff7ffffbffdfdbeffdeffffbff7ef7bfbfb7ffbfdbfb +% 7effefffdffefffefffffff7db7ffffb7f7fbfffefbfeff7fffdfdffdfffffff +% fffbfffeff7ffbdfff6fb6fefff76dbffffdf7bdbdf77dffdef7f7fefdf6ff6f +% 77df7db7fbf7df7bdbfdffefffffffffedeffff7ffffffdefbdfbfb7ffbfdbff +% feffefffdffeffffffffffffdb6efff6ffffbefff7beeffbfffffeffdbfffffd +% 7ffbfffeff6ffbef7f6fb6ddffffedbfdfbdf7dedff7fdbfdf7df7fefff6ff6f +% f7df7db7fbffdf7fedfdffffbffdfffffdf7fffffeffdfff7bf7bfdbff7fdbff +% 7effefffdffdfffdfffffffbfb6fdff6ffffbefbfbdefff7fffffeffdbeffffd +% fffbfffeff6fbbefbfb7b6dffffffdbfdbbef7df6ffffb7ef76f77ff7ffeff6f +% 77df7db7fbffff7ffbffffff6ffdbffffff7ffffff7bdfefffffffdbff7fdbff +% feffefffdffdf7fdff7efffbfdb7fbf6ff7fdefbfdff7fffdefdeeffededfffd +% 7ffbfffeff6fbfefb7f7db6fffffffbfdbfeffdf6feffb7dfbefbfff7fffff6f +% f7df7db7fbfffeffffffffff6ffedfffffeffbffffbdefefbffffddbffbfb7ff +% 7effefffdffdf7ddfedefffdfdb7fb76ff7ddf7bfdffffffff7df7ffedfbfefd +% fffbfffeff6fbfffb7fbdb6fffffffffdbffffff6ff7bdbdf7efbfbf7fff7fef +% 77df7db7fbfffefbffffffffb7fedfefffefbbefffbff7ffbefffefbffb7f7ff +% feffefffdffdf7dffedf7ffdff6ffb7eff7dff7dfdfefff7fffdf7ffedfffedd +% 7ffbfffeff6fbfff6ffbf6dffffdffffdbfff7ffdff7dedef7dfbfdf7ffedfff +% f7df7db7fbfffefbfdfffffbb6ffdfedffefbfeffbbffffffefbfefbffb7fbfb +% 7efff7ffdffef7dfffdf6fffffeffb7fff7dfefdbffefbfbdffff7ffedffffbf +% fffbfffeff6fffff6ffbfedffffdbfffb7fffbdfff77df6ffbdf7fdf7ffedff7 +% 77df6f6ffdffdefbfdbffffb6dbfffedfef7bffff7ffffff7ffbeefdffb7fb7f +% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +%%EndPreview +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 374.085208 translate +500.113915 -374.085208 scale +% Image geometry +500 374 8 +% Transformation matrix +[ 500 0 0 374 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 500 string def +/gstr 500 string def +/bstr 500 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 251367 ASCII Bytes +colorimage +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +!< +!< +!< +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +IK1Zr?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;s&a_W=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C;)1IU?2Z?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;s&a5I=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=C3?SJ,~> +IK10D69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qks#>Ho3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3(!X)IR6"R69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qks#=sa3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3'nD]J,~> +IK2-GFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_Js)id4F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`dY+IWT^TFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_Js)i:&F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`]A=J,~> +IfLd%=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=FOUZ=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?iO5W?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJr1=DV>H=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJr0=90]JJ,~> +IfL9O3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3.=1R3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa6N9#o69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j8)3,Co@3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j8(2usfqJ,~> +IfM6GF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKFaeFTF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFT6K4FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hg+F_l/BF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`hg*FTF5tJ,~> +!<=Es=FjSI=FOUZ=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?iO4=?W^E;=BJp4=C504?W\TSJ,~> +!< +!<=m+Fb+\.FaeFTF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFT6IoFEM_JF`heKF`_bKFEK>=J,~> +IfLd%=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4= +IfL9O3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3$^gM3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j8(3.=1R3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa6N9#' +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j7B3)r:) +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&h]SJ,~> +IfM6GF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKFX2'OF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hg*FaeFTF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFT6JA +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hfDF]EO+ +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`fG>J,~> +!<=Es=P['Z?iF/V?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJr1=DqPK=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C8sJ)IHTK?W^E;=BJp4=C504?W^E;=BJp4=C3?SJ,~> +!< +!<=m+Fkq0?FT-E3FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`hg+F`2AEF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`bND)K^+EFEM_JF`heKF`_bKFEM_JF`heKF`]A=J,~> +IfLcs=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?iO4O?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C:u.!+1:ZaB3Ii=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C:/l!@7_r~> +IfL9E3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa6N9"g69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3(!O&!()5ra>e3,3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'u^d!>b`d~> +IfM6HF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFT6J,FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`dP(!-Ed7aE;NFF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`c_f!AXY*~> +!<=F4=?Kqm=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJr0=FOUZ=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?iO4a?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;`)p#H=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^DV!.Y~> +!< +!<=mAFZabgF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`hg*FaeFTF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFT6J>FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_J`-#(%F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM^]!.Y~> +B`KG]?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJqK=9)_-=FOUZ=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?iO5H?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;`)mpb +=BJp4=C504?W^E;=BJp4=C504?W^E;,liG~> +B`Jr/69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j7C2ul;E3.=1R3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +6N9#`69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk`&JZ% +3&j5a3'oSa69$qk3&j5a3'oSa69$qk(BAs~> +B`Ko2FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hfEFT?O_FaeFTF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FT6K%FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J`,uu? +F`heKF`_bKFEM_JF`heKF`_bKFEM_J1&uh~> +!<=F2=>O;d=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C6V] +^K>M`=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C:2m +!@7_r~> +!<b`d~> +!<=m?FYe,^F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF``1W +^NFR=F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`cbg +!AXY*~> +!<=Es=JJuI?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJr1=9)^H=B&X0=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;==!rt~> +!< +!<=m+Fea).FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`hg+FT?O%F] +!<=Es=FjSX=@ce$=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJqK=;bIJ=C504?W^E;=BJp4=C504?W^E;=BHjLJ,~> +!< +!<=m+Fb+\=F\$UsF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`hfEFW#:DF`_bKFEM_JF`heKF`_bKFEM_JF`fG>J,~> +!<=Es=FjS*=Sc,p?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJqn=90]JJ,~> +!< +!<=m+Fb+[dFo$5UFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hfhFTF5tJ,~> +!<=Es=FjS*=MIrk?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C3?S +J,~> +!< +!<=m+Fb+[dFh`&PFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`]A= +J,~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d+TR#~> +!< +!<=^&Fb+[dFcgeI/HC;~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d+TR#~> +!< +!<=^&Fb+[dFcgeI/HC;~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=Kts?:dd,o,p=';%2'Hn+XJ]s3(/="JQVMG!?hGn~> +!<PTb~> +!<=^&Fg6'$DI?%$1+aUe&fMl8/M]R_>$uo(JT^R,!A+;%~> +!<=9o=LM<77PlD-%Jp,/'cnqQ*YnMO":Z.n1e*$uJQV_M!@7_r~> +!<b`d~> +!<=^&FgcDqAP"X"')MY4"pk_G#mU5+";2h48S*HqJT^d2!AXY*~> +!<=9o=LqT:6nfDdrW!-210eUXWOhoJ#Jm[:Jnn(9%/g/.(G/$OJQRJ*r`B1E!.Y~> +!<\JN/3?r\son!.Y~> +!<=^&Fh2\t?pGtMrW!--$lgB9/N3Df#<4Im-Qj36#Q4W)+@'=PJTZNdrcJ5n!.Y~> +!<=9o=M@lE:c'=)!!!EZ>`?8Zaoo;=A3CA#!!4<#:k;`"=90QFJ,~> +!< +!<=^&FhVu*DFlDm!!!65*$dH-4TmYh*YJ_W!!4`DDLlq]FTF&oJ,~> +!<=9o=M\)@:c'!f!!=f`R`+1-!hjZprW!!91f/a*KNJ6u!.Y~> +!< +!<=^&Fhr2%DFl,Q!! +!<=9o=Mn5A3$J8$!^2.Hg<'Z:N(49V!$O=Q=GBoY+TR#~> +!<d!#7):3/0Bn'``a~> +!<=^&Fi/>&=tT^R!YQk=g-#[#,SgUb!%hB*FbY#>/HC;~> +!<=9o=N4GJ:bW=Y!'#SHeB/$4N'..@%5:V0=G^,\+TR#~> +!< +!<=^&FiJP/DEng7!"^M;e3+$r,SC(W&jU>cFbt5A/HC;~> +!<=9o=NFSK7Nha3'kFSpap,Fm'`\4[7Y+["=90QFJ,~> +!< +!<=^&Fi\\0AM!l^"s,PF4U*ee"onWYAV"u^FTF&oJ,~> +!<=9o=NX_L6m2O115s;s"cP#5!$t*c=H-D`+TR#~> +!< +!<=^&Finh1?nD?Y$m`nW"XFNW!&A,:FcCME/HC;~> +!<=9o=NjkN6m2O14e]g:"e%CN!$tHm=H?Pb+TR#~> +!<c/en?d6*/#W"f+6\!#IMD30-$"'``a~> +!<=^&Fj+t3?nD?Y&i% +!<=9o=O("P:a#f=8$'MK"eIIL!&.6#=HQ\d+TR#~> +!< +!<=^&Fj>+5DCkhg(,EZg"Y^>b!'kFQFcgeI/HC;~> +!<=9o=O:.R:bVkL32+"-"Hk&2%6/o@P#q`.!.Y~> +!< +!<=^&FjP77DEn1%&2Cg\"=4BT&mBj/P'$dW!.Y~> +!<=9o=OC4R6k',BP.8X;Esr$b:k;`5=90QFJ,~> +!< +!<=^&FjY=7?kNGH-+H)@+pS)nDLlqpFTF&oJ,~> +!<=9o=OU@T:aH)MCUM:f\jl`#1kAbo=90QFJ,~> +!<2us`oJ,~> +!<=^&FjkI9DDD1s+LO?82AQ8m8V)#LFTF&oJ,~> +-3,2k=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*rJQV_M">gPf33fd3"I^&*(JoZb +QWO83!.Y~> +-3+c?3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQJN3Hb"="3Q4MA&Q"Jch6&iG5" +QT,!\!.Y~> +-3,W?F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>JT^d2"A'4+&2LOS"=OHS,]80U +QZW<\!.Y~> +!<=:u=?98\:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:psI/:a#fRH`tQp_+an=3.Y2!=90QFJ,~> +!<II2&-*-KWj#2bu+NJ/V,mK2us`oJ,~> +!<=_,FZOD_DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DROZjDCkhm-*KH73#;Q->(Lg`FTF&oJ,~> +,lf)j=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJD==?98\:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr;"@]k6k',d_5tc^N!o\<:k;`; +=90QFJ,~> +,leZ>3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&ie73'&oV2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2=`^0/dVMJc)fP#PS*s;21[`U +2us`oJ,~> +,lfN>F`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hT@FZOD_DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DXqoQ?kNGT3357G,R4<7DLlr! +FTF&oJ,~> +!<=;B=9)1q=9)1q=9)1q=9)1q=9)1q=9)1s=?02[=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr`E3^K=AW*r=AW*r=AW*r=>U!XH`>-lYq5ql:fpPF +=IiOp+TR#~> +!< +!<=_NFT?=WFT?=WFT?=WFT?=WFT?=WFT?=YFZF>^F`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>`H;c1F`)>>F`)>>F`)>>F\)Q5-)j$31(=4+DKTiJ +Fe*XU/HC;~> +!<=;A=9DB%=A]!!!)WVr"&N*%;#XPs;#OJu:fpgrr`B.sr)`qqr)`qqr)`qqr)`qqr)`qqr)`qq +r)`qqr)`qqr)`qqr)bsU=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%;"@]j/H?NZVTK*G!"D=u=AXQNT3)+;!.Y~> +!<oK:2)mQQr\sm8r&=[6r&=[6r&=[6r&=[6r&=[6r&=[6 +r&=[6r&=[6r&=[6r&?\o3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT +2)mQQ3&icT3&NZT2=`^/*WR"XVUu)O!!t8;3&Q7HT/Zid!.Y~> +!<=_MFTZN(F`.2$!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3Yr,i!Wr,i!Wr,i!Wr,i!Wr,i!Wr,i!W +r,i!Wr,i!Wr,i!Wr,k#;F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>EDXqoP5QD!CVEG,!!"r[^F`)bQT61/d!.Y~> +"99TI=A\ot!)WYs!)WVr!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr"&N*%;#XPs;#OJu:fpgrr`B.s +rE'.u=BJE!=9)1r=9DB%=A]!!!)WVr"&N*%;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq +;#FDq;#FE-:fpgr=BJC%=AW+%:fnk@/\7b#"+("W3:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:k;a%=90QFJ,~> +"99/r3&UUn!&aa8!&a^7!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7"#W%t2?#Q82>oK:2)mQQr\sm8 +rAXm:3&iep2uki73!2#t3&U[p!&a^7"#W%t2>fE62>fE62>fE62>fE62>fE62>fE62>fE62>fE6 +2>fE62>fEG2)mQQ3&icT3&NZT2)l +"9:#rF`.,"!,hdY!,haX!,hdY!,hdY!,hdY!,hdY!,hdY!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3Y +rH/3[F`hU$FT?=XFTZN(F`.2$!,haX")`7(DZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VW +DZ"VWDZ"VhDKU)>F`hSEF`)>EDKRN2%5t"F"!mp[>5iY(DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DLlr`FTF&oJ,~> +!<=;B=9;<$;#XPs;#XQ#:fpOr=A]!!!)WYs!)WYs!)WYs!)WYs!)WVr!)WYs!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr"&N*%;#XPs;#OJu:fpgrr`B.s +rE'.u=BJE!=9)1r=9DB%=A]!!!)WVr"&N*%;#FDq;#FE":fpO1!'S/maoe4D!&V\t1f.:N=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AY#[!?hGn~> +!<oK:2)mQQr\sm8 +rAXm:3&iep2uki73!2#t3&U[p!&a^7"#W%t2>fE62>fE<2)mH+!("l(fE8)c!$fKC1c76M3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&Q^U!>PTb~> +!<=_NFTQH'DZ4bYDZ4b^DKTi>F`.2$!,hdY!,hdY!,hdY!,hdY!,haX!,hdY!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3Y +rH/3[F`hU$FT?=XFTZN(F`.2$!,haX")`7(DZ"VWDZ"V]DKThB!"q8c4TdAC!(k1Q1i@GRF`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`*4^!A+;%~> +!rsKH;#OK":fpOr=A\ru$W'r-:fpgr=AW+%;#XPs;#XPs;#XQ#:fpOr=A]!!!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr!)WYs!)WYs!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr#uF`+:fpgr(B@1%aulaH!&.MW:fpgr +=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJDC=?98\:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:ruf?+TR#~> +!rs&q2>oK<2)mHQ3&UXo$T0n'2)mQQ3&NZT2?#Q82?#Q82?#Q=2)mHQ3&U[p!&aa8!&aa8!&aa8 +!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7!&aa8!&aa8!&aa8!&aa8!&aa8 +!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7#rO\%2)mQQ%ffM"fK?Vc!$4*Z2)mQQ +3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&ie=3'&oV2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ29@fY'``a~> +!rsoqDZ+\]DKTi>F`./#$Z:*0DKU)>F`)>EDZ4bYDZ4bYDZ4b^DKTi>F`.2$!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX!,hdY!,hdY!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX$#Xm.DKU)>+934M4ZkJ+!'k[LDKU)> +F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hTFFZOD_DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DTR#%/HC;~> +(B>U\:fpOr:fpOr:fpOr:fpOr=AW+%;#XQZ:fpgr=BJC%:fpgr=BJC%=AW+%:fpgr=AW+%:fpgr +=AW+%:fpgr=AW+%:fpgr=AW+%:fpgr=AW+%;#XPs;#XPs;#XQ#:fpOr=A]!!!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr!)WYs"&Kd6>b0"?YpBB%;#OJr +;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#XQQ:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr`E5,s=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*C!.Y~> +(B>102)mHQ2)mHQ2)mHQ2)mHQ3&NZT2?#Qt2)mQQ3&icT2)mQQ3&icT3&NZT2)mQQ3&NZT2)mQQ +3&NZT2)mQQ3&NZT2)mQQ3&NZT2)mQQ3&NZT2?#Q82?#Q82?#Q=2)mHQ3&U[p!&aa8!&aa8!&aa8 +!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7!&aa8"#UShA"D6T]dEe$2>oK7 +2>fE62>fE62>fE62>fE62>fE62>fE62>fE62>fE62?#Qk2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT +2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ`Afk83&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZ1!.Y~> +(B?%0DKTi>DKTi>DKTi>DKTi>F`)>EDZ4c@DKU)>F`hSEDKU)>F`hSEF`)>EDKU)>F`)>EDKU)> +F`)>EDKU)>F`)>EDKU)>F`)>EDKU)>F`)>EDZ4bYDZ4bYDZ4b^DKTi>F`.2$!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX!,hdY")]4]*1]4q1(""HDZ+\X +DZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ4c7DKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>`H=1YF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=R!.Y~> +8,sf8:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr=A\ru"&N*%;#OKY:fpgr=BJC%:fpgr=BJC%=AW+%:fpgr=AW+%:fpgr=AW+% +:fpgr=AW+%:fpgr=AW+%:fpgr=AW+%;#XPs;#XPs;#XQ(:fpOr=AW*r(BA!8ap,[.!%h;T;#XPs +;#OJu:fpgrr`B.srE'.u=BJE!=9)1r=9DB%=A]!!!)WVr"&N*%;#XPs;#FDq;#FDq;#FDq;#FDq +;#FDq;#FDq;#FDq;#FDq;#FEU:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr +=BJC%=AW+%:fpgr=BJC%=A[(@!`1$?J,~> +8,sAa2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ3&UXo"#W%t2>oKs2)mQQ3&icT2)mQQ3&icT3&NZT2)mQQ3&NZT2)mQQ3&NZT +2)mQQ3&NZT2)mQQ3&NZT2)mQQ3&NZT2?#Q82?#Q82?#QB2)mHQ3&NZQ%fgC7fETSJ!$4*Z2?#Q8 +2>oK:2)mQQr\sm8rAXm:3&iep2uki73!2#t3&U[p!&a^7"#W%t2?#Q82>fE62>fE62>fE62>fE6 +2>fE62>fE62>fE62>fE62>fEo2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ +3&icT3&NZT2)mQQ3&icT3&Sc:!]:\mJ,~> +8,t5aDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>F`./#")`7(DZ+]?DKU)>F`hSEDKU)>F`hSEF`)>EDKU)>F`)>EDKU)>F`)>E +DKU)>F`)>EDKU)>F`)>EDKU)>F`)>EDZ4bYDZ4bYDZ4bcDKTi>F`)>>+93IP4U*kQ!'k[LDZ4bY +DZ+\[DKU)>rcJ3YrH/3[F`hU$FT?=XFTZN(F`.2$!,haX")`7(DZ4bYDZ"VWDZ"VWDZ"VWDZ"VW +DZ"VWDZ"VWDZ"VWDZ"VWDZ"W;DKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)> +F`hSEF`)>EDKU)>F`hSEF`,9C!cBRiJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:]XZpr)a%t=BJDu=;Oe9=AW+%:fpOr=AW+%:fpgr=BJB9!,J"F#/N%p/Qc+Or`B.s +rE'%rr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.srE'.u=BJE!=9)1r +=9DB%=A]!!!)WVr"&N*%;#XPs;#OJu:fpgrr`B.srE'%rr)`qqr)`qqr)`qqr)`qqr)`qqr)`qq +r)`qqr)`qqr)`qqr`D3X=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%+TR#~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2$#Zor&=d93&ieo3#=G33&NZT2)mHQ3&NZT2)mQQ3&ic+!-=R\#0f"**]Q,:r\sm8 +rAXd7r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8rAXm:3&iep2uki7 +3!2#t3&U[p!&a^7"#W%t2?#Q82>oK:2)mQQr\sm8rAXd7r&=[6r&=[6r&=[6r&=[6r&=[6r&=[6 +r&=[6r&=[6r&=[6r\uqr3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT +2)mQQ3&icT3&NZT'``a~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>D?4ltr,i*ZF`hU#FVeqEDKTi>F`)>EDKU)>F`hRE!$I[m"um"k5]q3ercJ3Y +rH/*XrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrH/3[F`hU$FT?=X +FTZN(F`.2$!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3YrH/*Xr,i!Wr,i!Wr,i!Wr,i!Wr,i!Wr,i!W +r,i!Wr,i!Wr,i!WrcL8>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>E/HC;~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:aK4?=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r:_s+:Qc]ND,lfW$=A]!! +"]/;t=BJE!=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1r=9)1s=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9DB%=A]!!!)WVr"&N*%;#XPs +;#OJu:fpgrr`B.srE'.u=BJE!=9)1r=9DB%=A]!!!)WSq!)WSq!)WSq!)WSq!)WSq!)WSq!)WSq +!)WSq!)WSq!)WYs!`1$?J,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'k4>3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ2%fn!Qe2M^-NG2I3&U[p +"Z87s3&iep2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki72uki82uki8 +2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki83!2#t3&U[p!&a^7"#W%t2?#Q8 +2>oK:2)mQQr\sm8rAXm:3&iep2uki73!2#t3&U[p!&a[6!&a[6!&a[6!&a[6!&a[6!&a[6!&a[6 +!&a[6!&a[6!&aa8!]:\mJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DC'FCF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>DBo3%QTYO2$33>6F`.2$ +"`AI#F`hU$FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=XFT?=YFT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFTZN(F`.2$!,haX")`7(DZ4bY +DZ+\[DKU)>rcJ3YrH/3[F`hU$FT?=XFTZN(F`.2$!,h^W!,h^W!,h^W!,h^W!,h^W!,h^W!,h^W +!,h^W!,h^W!,hdY!cBRiJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:aB.>=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r+TPZ1atLRW!&Re[:fpgr +=BJC%=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=A]!!!)WYs!)WYs"]/;t=BJE!=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1r=9DB%=A]!!!)WVr"&N*%;#XPs +;#OJu:fpgrr`B.srE'.u=BJE!=9)1r=9)1s=90QFJ,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'b.=3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ'`_0tfItJs!$aH_2)mQQ +3&icT3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&U[p!&aa8!&aa8"Z87s3&iep2uki8 +2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki8 +2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki73!2#t3&U[p!&a^7"#W%t2?#Q8 +2>oK:2)mQQr\sm8rAXm:3&iep2uki72uki82us`oJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBs@BF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>/H?QO4YJc%!(h +F`hSEF`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`.2$!,hdY!,hdY"`AI#F`hU$FT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=XFTZN(F`.2$!,haX")`7(DZ4bY +DZ+\[DKU)>rcJ3YrH/3[F`hU$FT?=XFT?=YFTF&oJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a9(==AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*G!(W6q+0cje6r6u^=AW*r +=AW*r=AW*r=AW*r=AW*r=AW+%;#OJu:fpgrrE(mQ=BJC%=AW*r=BJC%=AW+%:fpgr=BJC%:fpgr +=BJC%:fpgr=BJC%:fpgr=BJC%:fpgrr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.s +r`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.srE'%rr`B.sr`B.sr`B.sr`B.sr`B.s +r`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B;"=BH^HJ,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'Y(<3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZ3!(W7*+2&cs/i>UG3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZT2>oK:2)mQQrAZVk3&icT3&NZQ3&icT3&NZT2)mQQ3&icT2)mQQ +3&icT2)mQQ3&icT2)mQQ3&icT2)mQQr\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8 +r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8rAXd7r\sm8r\sm8r\sm8r\sm8r\sm8 +r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\t$<3&hWQJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBj:AF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=W!#Cb]+#4-&?uC+)F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>EDZ+\[DKU)>rH0r7F`hSEF`)>>F`hSEF`)>EDKU)>F`hSEDKU)> +F`hSEDKU)>F`hSEDKU)>F`hSEDKU)>rcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3Y +rcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrH/*XrcJ3YrcJ3YrcJ3YrcJ3YrcJ3Y +rcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ?]F`f89J,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a9(==AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AUgS1;T-r=f`#37T`bh=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=BJE!=?B>]=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=AW+% +:fpOr=AW+%:fpOr=AW+%:fpOr=A]!!!)WYs!)WYs!)WYs"]/;t=BJE!=9)1s=9)1s=9)1s=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9DB%+TR#~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'Y(<3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&Mo\29h<:=go"D0fV-M3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&iep3'/uW3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&NZT +2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&U[p!&aa8!&aa8!&aa8"Z87s3&iep2uki82uki82uki82uki8 +2uki82uki82uki82uki82uki82uki82uki83!2#t'``a~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBj:AF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`'bN$ojD5=Y^3^AT`-5F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`hU$FZXJ`F`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`)>E +DKTi>F`)>EDKTi>F`)>EDKTi>F`.2$!,hdY!,hdY!,hdY"`AI#F`hU$FT?=YFT?=YFT?=YFT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFTZN(/HC;~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a0"<=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=?$:%_2ufhOoQ+k=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r&Qhk3 +:fpOr:fpOr:fpgr=BJE!=:e;2=AW+%:fpOr=AW+%:fpQm==[3M=AW+%:fpOr=AW+%:fpOr=AW+% +:fpOr=AW+%:fpOr=AW+%:fpOr=A]!!!)WYs!`1$?J,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'P";3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3%Y+Qc&gS-RfEjS3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ&NDX- +2)mHQ2)mHQ2)mQQ3&iep3"Rr,3&NZT2)mHQ3&NZT2)mJl3%HjG3&NZT2)mHQ3&NZT2)mHQ3&NZT +2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&U[p!&aa8!]:\mJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBa4@F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F]nbO306:Q,lej$F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>&Tqu6 +DKTi>DKTi>DKU)>F`hU$FV&G5F`)>EDKTi>F`)>EDKTjqFXq?PF`)>EDKTi>F`)>EDKTi>F`)>E +DKTi>F`)>EDKTi>F`)>EDKTi>F`.2$!,hdY!cBRiJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a&q;=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r7K +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'Fq:3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ0`ViqNnAi&!#7IN3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZ`2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2>fE92)mQQrAY3C3&icT3&NZQ3&hWQJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBX.?F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>AH2rjN]hk7!%i>2F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=iDKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DZ"VZDKU)>rH/NdF`hSEF`)>>F`f89J,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:`rk:=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r%02j]aoeo#F2=ftIm!cg=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=C"a*:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fnk@J,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'=k93&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ#lpdcfE8gFHd/MAImF&Z3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3*eC$2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)l +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBO(>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>&ca?E4TdGe+ulMaIhD`QF`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F^8m-DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKRN2J,~> +IfLWg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r= +IfL3@3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3$1";2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mH.!.4Rp!k1ZSoI'YOrVusRc/dL] +[rXh_-W6qgfRLm`!%p5g3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&Ou$2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mH.!.Y~> +IfM'>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>FWYLDDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKThK!$_8&!\tN#oEtU'rVus.3934, +1*@2:$5YD@4b#?r!+9qeF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`(K-DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKThK!.Y~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:``_8=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AUgS8,::-3:$VFHfiHOX>9VP!3FGf +J"ZiO:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:g@+!=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r= +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'+_73&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&Mo\8,:d;4R<%JK]^nf[l+!^!4U5* +J#iVV2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2-`*u3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3#)FD~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DB>F`)>>F`)>>F`)>>F`)>>F`)>>F`'bN(AU)n&F9As-0@>k1(=!Z!&De^ +Ik^p9DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DHq=%F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>FY*TD~> +IfLWg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=<::@:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:db:)_>24R8*g3U/a(7W_%lbG!0#.E +IsV/=:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:g7$u=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r+TR#~> +IfL3@3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3$'q:2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2(ekOc2#ul8*g3U1$@0ibnp0U!0k^[ +ItRe:2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2-W$t3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ'``a~> +IfM'>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>FWPFCDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DIDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DHh7$F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>/HC;~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:`WY7=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r:^mE(prWZSJee(]"Um@\7lVRf!!!Gj +aoJ%/!!*hGbK><)!&ReS=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW+':fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:a#gh~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'"Y63&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ2$j8hpt,YmM\l0h"VNpf7m%pl!!!Yp +fDqoH!!*nUbLh;7!$aH\3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&N[!2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2&-+A~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DB3k;F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>D@uq$pcS[<-O0AH"U>SS((^fM!!!8e +4TI23!!*9^b<:=j!(h>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>*DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DCkj=~> +IfLWg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=<(.>:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr+TQl^aoHeb!!*MEr5o&O8,WGNaoT=" +qZ$XVXNJ\8\ePZD=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r>$+U':fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fnk@J,~> +IfL3@3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3#je82)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ'``p[fDpU$!!*_Wr7D%i8,WGNfE'5> +qZ$XZ\'!?Q`YSq93&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ=u\B!2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)l +IfM'>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>FW>:ADKTi>DKTi>DKTi>DKTi>DKTi>DKTi>/H@*i4THf)!!*>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>>'4_*DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKRN2J,~> +!<=:n:i0<2=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=>U";oZ@0= +q>^LNq8re&!!")&ap,F^4ZH/WXN/J5OoQ:p=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=]eL&:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:a#gh~> +!<^LQq:Gd8!!"/(fET?*5s/%l\&[-NRfEsV3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ=ZA8u2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2&-+A~> +!<=_%DJaN6F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F\)QEoK<10 +q>^L(q)nfm!!!>f4U*ea&eGj'1<2P-,lf'*F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>=`nV)DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DCkj=~> +/-$hq:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:ftk:2crmY:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOj=ATG8](=)@!!#"Wb5Z#Paof4, +'o_q1!jS?8rQ55IR\%@faofS`R_e^?"g!Z7N1n)]ap#AUR[ThQqoT&QSsl7ep<%kf!&RMS:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*C!.Y~> +/-$DE2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)r`92`NZS2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHN3&M!T`q.jZ!!#.[f`,aefE9,J +(R4^I!kkS]rR_4cUoDW2fE9R2Us8Vc"h0_SPcW.'fEK:$Unk!'qq)%kWMHN +/-%8EDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKX*>2g'"\DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi7F`%fs2Y0*.!!!T/4oZT'4TdSO +"sit,!\uGsrB16<-nmXQ4Te&,-ogo`"Yq>N,V_:P4U!_q-n$c)q`P'?0ISV7p-!m@!(h'NDKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi! +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=R!.Y~> +@fRZK=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=O9kJ=AVg;!.sda!#>A2!''u# +"+("JC\PsY_2M)'!!#a9b)@D?!!,TkqT8oOHVGgc!!#ahao[_h%/U#*8"TY$!kMnoq>^[6K$)6) +-2[`C8,(./_%crH:k)SD=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AVpu:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:a#gh~> +@fR6$3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ37'Md3&NQ.!/pF#!#PM4!'L85 +",$XSF8+;oc'2*B!!#pLfT[NW!!,U!qUbniKMj2s!!#pmfE.O.')MY08#cF=!lf"1q>^[8MqH[X +-i +@fS)uF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>FjP"0F`)(K!%7>#!!`<#!"f,m +"!mpI+SS#+3$]:E!!!fu4X:@4!!*ijqE4p=,o6pf!!!i24TZoB#Q"K%(,5YL!]D)/q>^['-TsU@ +$N'l((ABrp3!KA#DLZeHF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`(-#DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DCkj=~> +!<=:n:hs00=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*Z!'Tkp!%n'J +!''u#"&/aq/c!NjSkTXk!!4puK),HJ%%dF?!M2IN!!#"UaoSS!p&G8$_90p=*qfU6aoDkH!!'+p +b(#QS+])9;=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW($:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:a#gh~> +!<0/3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZI!($/-!&=?N +!'L85"&]+!1&9H'WDXB,!!5%1Mu!DS&uki^!NAB]!!#.YfE&H=p&G8+c.L[s+SGg8fDlQ\!!'M& +fRK@j'f@s.3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&Obs2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2&-+A~> +!<=_%DJOB4F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>*!#"fb!"Jf* +!"f,m!uCq;%J`-g0Gaul!!3Ql-i*fD#;H*>!AG/_!!!T-4TR;Hp&G793'BDl$2+B!4TG``!!"eK +4b"aX/T,]KF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`(9'DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DCkj=~> +/-$hq:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fth9/m(qP:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOrr_NY*%(buO!%n'J!$;-^!$;+>qT8e. +q#CF(AG?--*l6"AN;*AQ3;go"Opps_"$OTF](Q++*m2VbqZ$UOou_bS!'!eW:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOp=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r= +/-$DE2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)r]8/iY^J2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQr\X``'#sIo!&=?N!$M9n!$M7@qUbd< +q#CF.C\Rl4+O/QkPkY4Y4T*h4RhG>n"$tAf`qBB7+P>=/qZ$URp"4aa!%g&f2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHo3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3#)FD~> +/-%8EDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKX'=/p2&SDKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>rb_cM#<)*8!"Jf*!"&Wf!"&W)qE4fo +q#CF#*r#^<#rk(2,kq?>&H"Zl,mX&B!tmsa2YI+Q#sCE_qZ$U)of[d?!*X8_DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKThtF`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>FY*TD~> +!<=:n:c2?O:fpOj=AVgr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +d80sJ:aH*_nB(_oq#CF:%/g/+])9\N]'KD!R``c)p](:RrQ5,/qZ$X<1ALnQ=j"m.%/9f)HcjL9 +r;ZjERe4`(\dT&!:k)SD=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AUDJ:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:f(7j +=AU.@J,~> +!<nCR_,q#CF<')_e1`r+Hh`p<[-UtF2>I4T;qT`L')2G/K\4qj +r;ZjGV"E:@`Y&U/21ISC3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&N*D2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)R?N +3&MENJ,~> +!<=_%DDcQSDKTi7F`))>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +d;B)0DDD29n3$aaq#CF%#Q4W&2Z,]<2XCDG-p9^&p](:*rB1-/qZ$X'%/Bl+(-Of)#P\9$,s=CH +r;Zj*..fY(2?slGDLZeHF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`&UMDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DJjT7 +F`&c2J,~> +.KCVg=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgrrD3Jrr(mAqdSM]$:f(7j +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpO^!%mZ^!'ToR!3uFD!,M +.KC2@3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQrA=R7r&"I6dPWd>2)R?N +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHG!&p92)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)l +.KD&DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>rGDUXr,)LWdV^g_DJjT7 +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi)!"JB[!#"l'!&FF7!$M"9 +!=8u+!!=E.4X0Y$!"f,m!B(/[!!Du%2@]H^!%%V-":"o,#<)-9/0Y'ZDKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKX-?Ecl8BDKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKRN2J,~> +!<=;@:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:b#RD:fpOj=AVgr:f(7j:fpOj=AVgr +:f(7j:fpOj=AVgr:f(7j:fpOj=T)%r=OU(J(BC/taoFTr!!';#aoICr!!@hqb!#S$!*oNG!O3C9 +!!#"XaoGuL!!$:'aoEaa!!#OgaoJ.2!!=Oib-CpG!,M)H?lf;;=AVgr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:ft\52crmY:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpO;!.Y~> +!< +!<=_LD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWDCTdHDKTi7F`))>DJjT7DKTi7F`))> +DJjT7DKTi7F`))>DJjT7DKTi7Fo?1XFjk40+94.b4TH,d!!"eN4THc'!!=T34VISk!$(u$!AXlU +!!!T04THQ#!!"#<4TGic!!!f64TI54!!DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKWp92g'"\DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKThK!.Y~> +!<=;,:]OVq:]OVq:]OVr:]jfr:g!]n"'AAr=T)%r=Sttq=Sttq=Sttq=Sttq=Sttq=Sttq=T2+s +=T)&K=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j2ul\@aoFU$!!4H@ +*rQ*7aoK9R!<1+@T)&Ee:&W37>l"F#3<%&#(&It2>lMkGAGH6(aoFU#!!\%tA,lT<_=5SMOoQY% +=P6Mg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW,B:]V^> +J,~> +!<Ic1'?gRfF0\ +38$0,3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&N\<2$"El +J,~> +!<=_8D?+hWD?+hWD?+hXD?G$!DKYqr"*JL!Fo?1XFo6+WFo6+WFo6+WFo6+WFo6+WFo6+WFoH7Y +Fo?21F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7=o]B,4TH,k!!3KD +$2jl"4TIJ;!<,+]0_tbL(]?Js*;TX8&H4fm#5\B#*<&)$*r,g74TH,j!!Xf6*WQ0F3:K'6,lfN7 +FkLYMF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)?ED?2 +!<=:K:]OVs:]OVq:]OVq:]OVs:]OVs:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVp:]_(7]'d]@ +4o,-_]#r/I!!")9aoK9S!!")>aoK9S!!#OfaoG]C!!>4'b-CdC!'U>(!1rud!29D7!1rud!=WN< +!!#a]aso@N6r6u^=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=NaN]=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r= +!<@9fY.+]!($V:!3,bo!3H1P!3,bo!>92I +!!#pbfIAu`/i>UG3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ36O1"3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3#)FD~> +!<=^WD?+hYD?+hWD?+hWD?+hYD?+hYD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWD?+hVD?:FU2XW^. +')DS42Ea24!!!?$4TIJ>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>Fj"ZCF`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>FY*TD~> +!<=9o;"RQg=AVgr0E>nUaoF$j!!!c5aoctj!*oKF"L5nfb/*oS!$;*]!"A`)!'U;'!*o@#"$"HG +Red!a(&l>U`;'B5P5WN'3;!7OT'j`&W;mae:c)9N:fpOj=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW,>:cDKQ=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r+TR#~> +!<4S8[SWUAC?ZN(Wj2)I9M2)mHN3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&N\82)dKP3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ'``a~> +!<=^&DY.fNF`))>5QDqo4TGrg!!!6&4Tcu1!$(r#">W>-4ZN9>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)?ADDu]UF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>/HC;~> +!<=9o;#O2m84cBDpeV#$'uB:[!%%LB!#>LU"0;J2Z2VlL>Q>h]b/*oS!$;*]!"A`)!&FMq!*o@# +"$"HGP5,(XZ2VlG*r5j:T)He3P4ekU*ph#t7fYqR=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr +:f(7j:fpOj=T2+s=NsZ%=AVgr:f(7j:fpOj=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=NXG@+TR#~> +!<f?34SL]7#oCkRfDm;r!!!i7fE8S_'#":s"_.NTc.L;;!!"/?fDlQ]!!"nTfDoFX!!>@9 +fUM[:!58Ba!$M+PTb~> +!<=^&DZ+GT;E-X6phg-G"uu!5!"/T'!!`Ec"#9i]1B'E?)up:)4ZN9DJjT7DKTi7F`))>DJjT7DKTi7F`))> +DJjT7DKTi7FoH7YFj4e`F`))>DJjT7DKTi7F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>FinS&/HC;~> +!<=:':]a0Z8c26_8P&bU#Y@le:J=PX7nEPS!\FD!m)f;:q>gK:!O9K?aoJF?!!7bp](uC,*rX4]% +/U#)1B#>q>l"F&36KC;q#CDArlP4#q>^N3r5o!cpAb2(m)fL:!#JI.=Sttq=Sttq=Sttq=Sttq= +Sttq=Sttq=T)&M=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj= +T2+s=Sttq=O0f&=AVgr:f(7j:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr: +fpOr:fnk@J,~> +!<pm+;:Nq>gKH!PQbWfDr8W!!8)2`qfZ8+T9pm')MY/ +2>u/-A,60-4P8;fq#CDJrn%35q>^N?r7CuspAb2/m+;KT!"q.H3;bW63;bW63;bW63;bW63;bW6 +3;bW63;k]g3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3;tc8 +3;bW636sH@3&NQQ2)R?N2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)l +!<=^3D?<]q3;b6,3)]Zl#WN(i!<<-#(/k'J!^H`3lob=Rq>gIW!AZY64TI)5!!4N22YmCR$2m!e +#Q"K$%/i^LTr&k#epAb17lobM-!$lH"Fo6+WFo6+WFo6+WFo6+W +Fo6+WFo6+WFo?23F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7 +FoH7YFo6+WFjFqaF`))>DJjT7DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKRN2J,~> +!<=:+:^0Ha7nc]P:]4-&9M\>U;+sPQ:Mm8Ta1IU6:JC^`!<=2-aoK9R!!'k2aoF3r!!7MiXSMns +*rX7X!!">DaoG]C!!>4'b/*lR!''u#!'U2Z!''ku!0$XP!3tk4!_iY_lqd[ar(mAqr(mAqrD3Su +:f(9m:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVs:]OVs:]OVq:b>dG:fpOj=AVgr:f(7j +:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgrrD3Jrr(mAqdng&g!.Y~> +!<'GRMHu)PS7/\tD!$LX\!6t<>!6t>l!&a`U!ef48q>^L< +rRgrH!%7`t!+Yj*"$G5gc1q>>4TUF3&NQQ2)R?N2)mHN +3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)RAl2#oW62#oVb2$"ElJ,~> +!<=^7D?`ug('"@8!W<99!!*'"#V%en!AT\D[A7XF!@n%c!<DJjT7 +DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>rGDUXr,)LWdr#1 +!<=:-:^BW_:J>ATZcD&'m0M\&]9RG79M]9tm0M[*9MA8Z/HCChaoJ.2!!&_iaoTFTr;Znfb+AG0 +!$;-^!4r",!$;*]!*o@#!''u#!'U,X".mZX(&It2T)-S0*r,d91@!!`X8j'C:]OVq:]OVq:]OVs +:]OVs:]jfr:g!Zm!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q/m(qH=AVgr:f(7j +:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f&;8J,~> +!< +!<=^9D?r3;!<=KIR'k]Im0MIjUhr-u!!+JEm0MHH!%Ml(5QE1u4TI54!!"bN4TRndr;ZmI4YZ^4 +!"&Wf!&jZR!"&Te!$(h8!"f,m!##)-"#)l$#5\B#0`!p4$2FQ$%-ftW1&rT+D?+hWD?+hWD?+hY +D?+hYD?G$!DKYnq!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W/p2&LF`))>DJjT7 +DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJh$+J,~> +!<=:/:^'B[:KaCCoBcY=]6gm[m0/5<8PfC.lcK3l"F#3<%&#U%nZi$p>p6!!$g1aoHea!!%B1aoY'57"J26:]OVq:]OVq:]OVr:]jfr:g!]n +"'AAr=T)%r=Sttq=Sttq=Sttq=Sttq=Sttq=Sttq=T)%s+TR#~> +!<^LXrn%4Pq#CI/5puO0!-@tg!/1.J!/0Uh!_35CJMmEa!''m6!''m6!''p7"#r.q3;tc; +3&NQQrA=R7r&"I6r&"I6r&"I6r&"I6r&"I6r&"I6rA=Tj!.Y~> +!<=^;D?WoR!>^+-oBcY7UdpgJm0-Ji3,S^&lTG4hq#CX/+seW`,od-f!!04TZB!@"E4pD?+hWD?+hWD?+hXD?G$!DKYqr +"*JL!Fo?1XFo6+WFo6+WFo6+WFo6+WFo6+WFo6+WFo?1Y/HC;~> +!<=:0;#a2i;5*%;"D1=Z!.sU\!P2"l!!>sl"F#3;pu"C[qH*AGF:J +`"i+K!5[pB!hKB +!<:3#&!''p7!''m6"?87r'``a~> +!<=^ +!<=:1:]j3]He79E"1q5Q($s'C=mH%hXND:P!!0ofpAb;:b0!uc!!#"VaoH5M!!*gdpJ,~> +!<X!-"+3`h([TcS;sODb\(DMk!!1?&pAb;Bf[s^1!!#.ZfDp!c!!*mop=K@dqZ$Ud +kL]em!.d#82$"ElJ,~> +!<=^=D?CXS8'Ku["/Go(#4+JQ(@(r%1-Gj9!!,&,pAb:>4Zse]!!!T.4THVt!!*9Op,rBuqZ$U3 +k +!<=:2:]aKfU#55==ZCKhaoI%[!!>s!_:D)p](F*WQN@gq>^LTqoSr21ALnO'kFoQap*G4 +!&Ch%_>=34RchfpMuYG\:ps1$+TR#~> +!<^LXqq(qK2>I4R(Mh%ffER6M +!&_IBc2.J@V!$A3PQ2bU27>@C'``a~> +!<=^>D?:(DIGaDn((_\V4THkr!!=$#4Vmem!Z!pQp](F%/Nl6:q>^L,q`Os6%/Bl)"s,]"4U*8< +!":VG3;W[U.-E_p,QL)\DROE`/HC;~> +!<=:3;#aAmZek'NL.oGLaoT)Fnt?2LF%ofRrlPMl"F# +3;L]%XE.W07nmcjq8r]+r;ZpOb/u^B!!"V4aoN4dJP`dO!?hGn~> +!<PTb~> +!<=^?DZ9tBR,733<<,#E4TRGpnhC7n+r;"Sr]LN@+;YY+(*"GOr]LQB*Z#S)()J#>2Z>i>*;TX8 +&G\Ho1*R\N()J)Iq)n^+r;Zp/4ZsAT!!!Ji4TPa"JSqo6!A+;%~> +!<=:4:]a-\]A;iUZV7@/aoG]C!!#ORaoG06!!9FJ3;igWRcVZnCB-2B:q'7%+TR#~> +!< +!<=^@D?:RRUttD>QiJ_K4THJu!!!f!4TH;r!!4o=&H)S/.-3Sn+94uaDRXKa/HC;~> +!<=:5;#a2hW8-bAf1_.6aoHeb!!$9gaoFs0!!,T#r;ZgljN7P8!#N%>!(QiRs$hrD!?hGn~> +!<!!,T*r;ZgqjOaOR!"u[s!&=@'s"THi!>PTb~> +!<=^AD?;9fLYV7ubQ&p!4THf)!!"#'4TH8q!!*iVr;Zg6j?3Q&!$nsi!+l%8s(..,!A+;%~> +!<=:6:]a0]HeRif;09Fm!hl&Qq>^MIl,j!IpAb4?_;iZ>7fZ#g:]VjOo`,4+&f2];1c.Ue:]V^> +J,~> +!<c(8!!`f=%i#m*,;,PTb~> +!<=^BD?<]98)!>2#SXg5!\l)=q>^LCkrf"jpAb4$39*.'('%pUD?2L*o`,40)B^Ue8P* +!<=:6:]aKsiS*Z"AnCVW#J-X`CgLFr_9pC*U%eTg'u]@Z!Pp)X!!+jdilV=c!%k`X&Ie^c=D;nl +F_Pu$=BJ0W1aEP-!!E`I,rA)^:]V^>J,~> +!<Bb46 +Fa%t@>?aca3@5(0!!ET=(F(Z*2$"ElJ,~> +!<=^BD?:(ZgY2#q-OfW1#<""M%gWFW370kh1&(_L#".Wh!'n)4&J>'lA9`EF +H?aaJA7SV*3[bX +!<=:7:]a3^Y1`1CHWKm`!jRGcr_*JuF)=TW]$e_$Z2"A#'qsg5!l8+Mr;Zj>Hf)sH$k9dE![Rhh +n\GIDWg8-I8h(;L!! +!<^%hX/(TcfP!mP3fr;Zj@K\tD_&dc-,!Z(iZ +n](mPYaL8V9J?eP!!PTb~> +!<=^CD?;ctOP0"%7g8WM!\t]#rW!*;3\^U?2UX_g1ALnN"u5:(!]V/)r;Zj)-/Uid#84Uc!\sb% +n^e#p^8@-/;_Jd_!! +!<=:7:]XF$f^/]o:\r3>_3/+u9P0R%iVr3G]1dq+aoRYHr;Zm?CV&TL"MpdjP-Nic!aG^n]2/M; +)uIGPWeLFp"+QW3^%]>FWde,&rW!!98j]=M!?hGn~> +!<I;#8fMc'r*6935qWNrG4DHqTCFfE%Har;ZmAF2m:n"O4$4S%[Y1!b23_]/9Tq +,5]C]Y_i@%",E;C_tV1RY_QF>rW!!49Lkm9!>PTb~> +!<=^CD?1"af^/]>!W"qb3$eh1!%2WZg]$RAU];@]4TQi8r;Zm*+?&:D"?8+],r4:>!ZV2J]5@W^ +./VTs^6S\D"-f[ke+_Gr^6E.crW!!F;eVtE!A+;%~> +!<=:8:]a0]W7^J=Pt]$lap!r/9OO.;q<\2pA^AL$Z'q8q\B4lE!%#6R!j1`J#33rg'RVbdC;!.Y~> +!< +!<=^DD?<]9LY1tqD#cQn4U!,8!$6"$q<\21%*q'=1+4h7\30mI!&D0(!n;4X`0]8H:#-VeuMe!.Y~> +!<=:8:]a-aiU#q8Tk7G8L=c%a!gQHqrlPAK?;+t;p?_m- +!<PTb~> +!<=^DD?:RZg[+;2I4#dO#QQ6>p?_lN"bAf;#njmg!bD@Br7:ue!)3BN"at8o +8M:qZ!#$2BF/I(2dsXnqNiT%%(]XOK11dJ'!A+;%~> +!<=:8:]X7Em-Ogp9`@Q^9E;6fm0JtN_90oh9Mqb\m/_Q7J]\%!!(=Ir!<>Lb_#ou4$uYm0"dXF: +6R3*>!!=K.5[sY[#=r!2)ZTj]7''2c+TR#~> +!<Xf`rh_9&q]qa"fd;i +7j\lJ!!=Q2;fqrB#?PPO+ohTX0!$o2'``a~> +!<=^DD?0`;m-Og7!<*c6!!&,Qm0IP/3'BDQ!!nAPm/]]\JNX&S!+djf)ql_#CZEK"f@&e +9.1&E!!=W99Q'd/#?5;V-ia6!@'"5H/HC;~> +!<=:9:]a3^ZgI,]L.k;?:]j6Y9ZQhn#DQ$sb*#G1fCSA1D.S:@!hfT?]MJVA'`5]TQ4s=5R[T4] +DJQ@2mt$k6\CRL*+p_829r!!!g'Y##-B!.Y~> +!<o902YBS"e;X8j'L2$"+#qo9,5'``H_Z)!,+ +GB\Y$ril[-O_72t$$?'L$"m_fa,<(\!"poe2$"ElJ,~> +!<=^ED?;ctR-j8B<<+NJD?EcP!4DLe#?:df4XC(Ubk(3&0arUr!\j[1]P[`g)#MnnVAK;XX/heH +I<^!bN;fj^VMo+Y#81qOWsNBDf@Q +!<=:9;#a2hiU6(7^e@H!:]X7%p$Ds1 +!<)r0;!EX5kfE0\A%)"M#/dVN7qo8i<'`_]_qGRB< +r36Wn;eNA2G@G$*Uh=08`s&D3!!!WaYVcFr!.Y~> +!<=^ED?;9fg[=G1WW4OGD?0_bp$DrR"[+F;1#)9d!@JD/4T[bN)SL"j?kNI)qpttZ(][iWqFgm6 +r2U3c9P1>rG[4U"SRu1+f*/TU!!"9PY\jIn!.Y~> +!<=:9:]X'umHjt09LenU!_H)+p?`#qA\hDMiUQ:9=`f5;"3O=<7__b'1]RLb%$LM(%&tQQ)_D^6 +$47;#5_f9,%@0OUQ@MLk;Gob_5T>LV_$-T$!!"<7Z;:QF!.Y~> +!< +!<=^ED?1M#mHjsT!+l%F!]U1fp?`#2$oeD+g[XY3())6^"$IG#A\W*d8H8`'#F>8=%)++i-oDt\ +&eZ!D9UGaZ%Am*(VN+VL?!U-99IPhsf*/TU!!"ccZ>K[p!.Y~> +!<=:9:]X7:mHjq$;>O)j7SImtm02HBI>gk3nEg6RFFhR:b)? +!<Js8oUn<3lJH%FTMfTZ@\^bl?A!!uCq#lo,F`rin5!!)p6 +(*Q4MUp71E;j4"Y=-p1sUmFFK!$Za,rPo&.0E;D(ZS_au!.Y~> +!<=^ED?0`-mHjpE#l8E?AH4dcm025E(F0!VnEg5^'7i:K4X:#!^hsBK!"s9k&cd7Tf)s,U!!)p0 +()KPASZAf,9TGZC<0sYdSX2J>!% +!<=:::]a*[Q0mr?L.k)5;#a2h]D1arZV7*0=mt_Y9SJ&?"3SF[(VroT2ujC_<)c3t!'@4Y_#qAQ +!!)p($55ZiJ;-J,~> +!< +!<=^FD?=ALD=-]l<<-V,D?;9fV"j<[QiJQG(@UVk!#pJP"$JUD,f+@*=o]1fN/V`p!(+R#f)sK4 +!!)p0$62`5NgEFWX(G%lrMp0i9RU(L!% +!<=:::]a0`W9rsRa%T2&:]a-QA.Y=r0dq05`M4u;@NUOP5W3"[7UE.1q$3]+TR#~> +!< +!<=^FD?<]:L[FI1[/_]PD?9eRg\L4>3WVAL1%=Q3gAi1D4o[YG$kgEp"(`)FEW(h!DAN9cK_s@' +PQq0nr=TAU8PE)_VO'u$r2U-P9V&5]>nR,cQMoD +!<=:::]a0]Zg@&\L.k28:]a0]F8G8-^eB1!Cgcc"!nU,)J]e#8!b;:!_b^CX!'U9[#@tcqOraTK +QMeQ$UFH6Dr<`c?1dGrI@R,JARK8_"rL*nU8.5JTU]&"2KbOM5[nm)K!.Y~> +!<PTb~> +!<=^FD?<]9R-a2A<<,#TD?<]93r84IWW3hu%j(6-!mCWiJNa#r!Zh>L_eoN-!+c%e#D#6*,maQ" +VYo$J[P%U\r=T>O4\U:)DG6)gWr])QrMp+! +!<=:::]a0`Zg@&]iGD7^qG78c9QSham0BspO/!lmutJ]e#8!h'*@`)$M!!#ti8!3uOG +"i4^L!'?tS_%OFo!!!E7$55KlQC;)E5Y,@4NVJqGNC*[GB>+;\"KF$R(Ikr3!?hGn~> +!<"_9[2$5s6?&AND#C0'F`n5l9Nq&;7JkMSaf`0S*U];IS2$,H3,5bmM^Acag +c"d:Z4fJ>"'#S2Z!"p+c,tM+;Z#N]@=*0S#pot!u7fWO!_u@[Z[57jr0tB.B'``a~> +!<=^FD?<]:R-a2BgG&[XqJHBp!'8@&m0B!a"ZAL[!8I&2!jr"SJNa#r![n%6`,5W_!%@c(!)*;S +"ZRP'!(+-mf+QPH!!!6:&faJBVQ4K+9N5ngSbT5hSP&q_C"*(5"N!"r,\=N(!A+;%~> +!<=:::]a0]Zg6u]iHn6g7f-!l8PE!9Y+]H$?EqYqRS9mSm/k=%Ra9+YU4n<;qT8rGP(f@@cH64" +Z,-1W!lP'T`)$LY!(6]a!-nC`"gLc%!(s$b_$?_e!!"K65_/j&!etSqr]gTW?#G1PqjIY9,QJdL +rkS]M8cT[<:]V^>J,~> +!<e@^"Cu596]oi!eO(@ce&?#Mi5jVfEAmWMknVCfE0(+ +c1fildJsou2$+Km:AnW%LATU,]i"h19W7p1#H0HZ!&.>MPQ%fgQ\&lL;Zp0AJs3#-Ylp19!$[j1 +`rj4Q!"ZUt!>PTb~> +!<=^FD?<]9R-X,BgID5ZAc$?T2uj4aOF8JV#VnP+-ifA!m/jZq.*k$Y.2s3cqE4s:,o\6lc924e +1-#"k!^cr5`,5W.!-.sr!-J*$"Ypko!)p?)f*A`A!!"ZG9TK+Q!ge=Ir_*GoCOM56ql9jY-ibZm +rmq8$;ZIrND?2 +!<=:::]a0`Zg$iZThJj;rN)opO!EQf1 +aoSJQrCd5mP4cs&_5rfYKoDbBq8s#^RWMS+9M]5R](jDLRVc+)9EJ7K](sJL/IfWp!< +!<:?!'L6R!EP-VfE,)PM=Qi3HqUO8fE/CDK)T]iH)orW!L-Xa9*&)5rR_.W +B`1R)BDb[.FSiPTb~> +!<=^FD?<]:R-Eu?I/jONqecF4&H2Y1"WRA&!X0@`o'HLS!%I\+!\GZ6rXT#C.H3Jk,R+/I! +!<=:::]a0]W9EUNZVaRjr(mMc!)9`0qT8o7:LLO#m/jUfWVagH\qO0Y9Mo20?r9U(Z2)NIZ%[%+ +ASd(%p<",T?;,4=iO_rn_90oK9NdY$iO`r#FSNuZU2Ba#!`+6\r5oD1<_QA;L6[L*9M^WEapXA5 +9Mp/1W0M3n:SR^.!aG^n`_Z^n!%e%Ip +!<KmS]uKp$"056tH1R4$GtYL@fF5cX<_H(\<**$o945I/fE]*JEG0$) +MmrE4'tn!J>'H!S:12?!fRcapCk@[p>"a/9fE&$mqF^ldK$F5G$_(0i:17^MAQMN$Pl')@RoW0W +@<$C*>"_\mqUbjZ!%u8K![@\$r*oBP#-:)j!'-Ibrl54h-3+$"GH1JD"Jh03FHQF)"IC;49Z-kM +!^-N)]/9U(!.Y~> +!<=^FD?<]9LZn+-Qj2B)f"!!jVn*XD`O1AO'<1)gc5 +$kF:4p,s-G#QQT@gS>)\3'BD@!#BFZgS?P('DO]k.1l=U!Wa)sr&kE6"TSfu +!!l)CLM\aG!@dk.!ZV2J`bkiL!)!0Jp,rU7&c_nmVUPOr#)"B)!&&Soq5XXhN.#T&qPsac-id2p +rmq3 +!<=:::]a*^Q07N:a&u),rD3PT!-@nW"/8gi@.`gfY"Z+uap!`"9Pp`[rTsaHW)6U#r5oDYFA,A2 +D/EEL9PqWAaoeA6;5jH\#I@*Xb&g=(iV`'EL.m +!<>?2$,?0HhZ.pX&_kmoTK?#9>18U"dDhV>',W"P6?nf:0,(+fF,]E91r2e +>#S'eER"=3"056nFT%C.GtX(JGtVS+r0%1n98i]"%C9G8:1\X$M3EdD@7tS=fEB3-936E9P66D? +99fG."NG+J<-eA)"+jKFX8CNNPQ2rJ2$+Qo:AnW%L@s1([SA4N!%*$0rl5529E5&*7u$H:$E?)d +8&NBf_]f(5]JT^)!.Y~> +!<=^FD?=AMD9j?WsY^b +!)(emf@),J@(^@X/HC;~> +!<=:9:]X7Ek3W9&=\MBc:]`R4aodf#@+Y;C"ER@m9SWB1!ddV8rlPD\FA,i2iVDjGPt[XhWD?Bbp[&3,9WZC2<_T4^m/u +!<NJ>>u6GPAbhMk@8![#fEKNF92fhjq3)&"9;L4H:el$)P6YAd\(I`^96'`j"--;\ +c2?2q]`8kg2$"*lr*fYmo[jFi@Tt5e!#8_Grl5;UFYEdq'hEqVn?E$c!,);O!gs$$]JT^)!.Y~> +!<=^ED?0`;k3W8p('%83D?<''-2'J'3"-)bm/h\92Z>iB3"H!D[J9+j[0R3>4TmYH!*.8Am0(XM +!!kR]4Tcu1*mFNK"?HQ&!*/j^!_35>r]LEE'*&erg\L4AD#btI/HH-*p[&2H!&?\d"TWuGm/u)Y +"ZZEC!\sa2`bkeq')[[gB_4FnJW,4@&c`bZ_Z&-maa,T?!#S:UVXUVf8H +!<=:9:]X'ujmhjn"]9-*:Kba3m0;0>D5'g/a7em%]1e1\aoMne`_Z[9)uNY8 +S+Oi'S,Q@l:b3:\!'?L[rkSo@B-[HW$n>/#QLpUJQ6ZI1rkSY.!(=Ls!?hGn~> +!<)rHC"+3a7>549fN`0?P6Qk=EN;o7K(bB0HqT_$fDuTq`\dbs,5bmM +WV"gCWW$?3>r*2q!'Qafrl5>L@jV0U&hmdLWqPTb~> +!<=^ED?1M#jm<>t*WT)UDDD2IofW!8tI/kku4oYcfV"sBZLB&:k4Tcu1 +1#)Ql"/Gns1&1,BgD1&X4Z3QG`*:m0:c?&1IVq[J&thU];\;4TPd1`bkeW./]#( +>kC/Z>lKZeL.W9_!(*R3rmqIjBd`r]#;9A +!<=:9;#a2hiT9G3f3h9C:a#hWou[;HD=m3#Pt]?C_.?_RZRS7SW +q<\:C;,#%)m09L_R_`<-Y4V)aHV[FFfC\G5L.kBTfC\G2?s``Q!B:)":]`TV/GrHIWV"=5`; +!<p"0:Y>4e!`CeNF5c"KaqoTKN?98hHTMbA9gP6,#dc2Q>tUe=mO +q3(o@:.p35P6Q,%Us3:BGP%(%@8Kd"M=cu7AP5j$M=cu4<+,UU!B^A&2$,?01]1\^[e/2PdedJX +7j7p5,&"C_`riPg4UM)f&0aJNFG?-^Z*C=6Um#m\!/CKn!gs$0]eog*!.Y~> +!<=^ED?;9fgZ@f-bT6a^DCkiUofW#7OD?r_]l!j&!.Y~> +!<=:9:]a3^^uXkdf3(d<(DZSb!EOR>m08;@b0#-+W:KM"%_#h:M+h^\Q+TR#~> +!<VL2`ra-Y'tlI*'``a~> +!<=^ED?;ctWoWONbSC1V+9qI$!r9Ef)jD$/\Q$&/HC;~> +!<=:9:]a*[Q/h67f3(cU/bI0d:PSN/"aa:mWD&':m0.?bb5;uiohaoJ.0 +!<(VM[,'``a~> +!<=^ED?=ALD<(!dbSC0`%J2da!EJdZ"\/_Z/HAf@m0,3Q4Y6Yqp?`+>!$j]c!>`oQmJkE'm/q2* +!*/UW!]gUpo'HM5MuZfJ4TJXZN!ElK!!!X)KXUd0%F_bOH?37n +92f#)Ga6#@f)iA\1;.Q+/HC;~> +!<=:8:]X'oip?ig;+rtAaoP2$o^)g'?HQSWiUQ:=D.UkD9\8t)"\a?eAPpM2m/ts6;;q*5s2X$a +!j54ur5o)7!%l8g!< +!<%lQH98W>*"\XI"BMO0BP66Y7:6+n/s+9-l +!d@;Hr7D(P!$93=!< +!<=^DD?1Loip?iU#QPG.4TPP"o^)fC#X&G/g[XY70ap2a!6k-'"TT?%$ja9(m/tQ4#i"q;s0^bO +!g!C;r&k*9!'nVC!<=DBMuZfJ4TJ%GMunW(,lRcI&isQ][aX]s"2Z\k>.neS/HC;~> +!<=:8:]a3^a5ZIg]1cPIp+AFib':e5+V(&\+H'JrEpFao.7URIsQR[0+^B1!+./\Fm\+TR#~> +!<utf((]==J'fertFbc<\W2?MlVO +!<=^DD?;ct[GpQUU]:Z[p,rI8!,_Aq">L<5!.FA("[E7m/iXT/c7a5 +2ukPPD?=,E9)FPI=n4]UJb+g'L/]3*#5nN+(ckT0HBacn[Ki[qKP='l!'n27!A+;%~> +!<=:8:]a0]Q/V*3PtZ;nao\hAW:]H[?u9^WiUH4;9RY'"B(bNpa%VYb9YfcW!DJ6mm/k'sUAN(6 +$l@#^!\FC8qc!Q[o#^rWnl,U'rlPDLP&!cI(%;2'/\=g[+TR#~> +!< +!<=^DD?<]9D;jj`D#b7C4T[A=L\0s:*Y8hfg[OS5!#Id/-hZj1[/_L$!35/J! +!<=:7:]a-aiSj/*L.mR#ao\P9Zh3Ve=_19]nEgD29T7,#F7no(]1erQ9]>+#!DJd'm/k=%Ret5. +/Iffu!Z(i5qc!QHo#^r`nl,U6pW<]FTot"KF$opX"unb47md8"]2/MO!.Y~> +!</V#/dF +0aYrZ!YPK=qdKPco%3r&nmVTRpXf\`XIG,pHUn&k"t`24>##&4]/9U(!.Y~> +!<=^CD?:RZgYqN$<<+<=4T[28R.TbJ((:1CnEgD'!$j]53q_kDU];h_!8HW&! +,lf)b:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'Wu:]a0]W8R%ED,7/+ao\;2_"@!r +;.WG(nEgCk9VT[1HhHb/W(aI<=lo#Pa%Uj)m/km5P5EB&7f^\.!_*V3qG[H4o#^rsnl,UGn]Ci: +q,@A-%D,F;+TR#~> +,leZ;2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,)2$$?li0+4G:p]rL!intDoTKAP +BM3R=P6H>,X4UH]oofN#9>,ULjc]at94?)/!f9R>qq(p>!6R/#0aS9b@K;#NfDqZ:@K;bbfDo^_ +@K?lD]/9U(!.Y~> +,lfN7DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%&D?<]9LZ%P$0``m$4T[&4Wq>Z\ +#Rg]pnEgCT!%C&78+l6PLB'(C(?Oob[/`_Am/kK3-2Th+(')Kp!bDu_qMYE&niZt]nr*Q^nN?l9 +q2>=m'"`#^/HC;~> +!<=:u:cV!A:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X +7SloNrD3Pb;./>L"4p[V_>24TP"`pgm/p%!9VLtC"fP,"b"RQ_m0&\J_/3TAm/t-t;;ogf!oZh3 +qoStF!(P..!^m#6q,Hq-!1WOY!1WQ%!4hl(!?D0P:]V^>J,~> +!<\pc#H_EP66;-:6*V`!ffp< +qq(s[!&;YS!\OI$q-rpI!3,Nu!3,PA!6=kD!?qNU2$"ElJ,~> +!<=_,DE29GDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsrGD[J#Thpk"3_Ma3;G]=,lk@Fm/m>"!.FA("c!(54TJLTm0%8+3"R.mm/s?g#i!Yl!o!]# +q`P!#!+j>k!al!fq2Fl-!*o)R!*o(X!(cmD!AXYeD?2 +,QJua7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e&B"!(Qra!_H(ai9^T]9PsUJ!fTh) +p$Dn@9SH/pnEgCE9YnP=Q1aMJHWJ:;;;p[)"0P +,QJQ:0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)3$,!&=I1!^'+ti0+4l96'd[!gH?7 +oofN=98cGSn<4#l9?k^SD"Wtq@92$4:6+J#"*[C2A^6J@N_><-fE-C"/^$!Q*WSS'@K=I?fDqoA +@K +,QKE6ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIpb(!+l.I!]U18i9^TG!"erh![Ici +p$Dn:!#ko!9"7g2$l#i"M/"-0Cdb5QG?jMuZE?4TJaX +MuZfI4TJX[MulTO?G(.V/HC;~> ++oic_:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloNr_PUE:f'VX:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7f?-e7SlQO=lJ<+!gQH[3 +#1lP3FA.t8o'HU- ++oi?82)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCr\Z\j2)R*G2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG1&Ws50f:[\;i]e"!c1MoqUbk-99/\/ +#)Q!BGtVt'nrj5c%lQa95KWFk`Z-c95mOJhNIqrnrj)IK)=1%PQ2rO2$+Km>PV_. +WUnaBYOZ-&ddl#jUA87#?9J95]JT^)!.Y~> ++oj34DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsrba`-DJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'Ac6KMASu&b(>Id7!c7o_qE4m!!8I26 +#0[&n'*)mLo'HTN"[+U@L\:$>0ap2n!,^K7kj8Li!"T'khX(s,QLEZD?;BiKDCH+ +>k:)Y=n7LO6h3A?@JPiaGsVL&]P[a%!.Y~> +,6/lV:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7fH4B7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X\:]Nu_:]a3^Q/Cs1Al#]/aoQofo^)q9 +9Tltu9MB'Mo^)fiCs&_NZh<\j=`)=(CeRN"kj8OpA3Jpf%6 +,6/H52)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG1&a$g0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,f2#oB/2$,m5Cu:EX=&?U-fE$S!oTKQ; +9:Nq791r?CoTKGXE7hKiH1d@+;fUIBE(`i!k`Z0U#FGOgq!EF!t_P6,;g@IoZ`97m&n!i,f@ +b;K;+pgO5Xo@O&Bo3q]?n^mi9r*fk9=&M[K!$8d1!>PTb~> +,60<,DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'Ac?R*ASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%bD?+8GD?;ctD;X^^-NQ""4TQ?)o^)q. +!$sN3!!"Cjo^)f'%m;KER.]hO((`Vl%fcS8kj8O7"ZQbfORhc?I6+1pm/g8f8+Z*K!#PMq![n%? +bAR=mpl#2po0!(Yo8E[#nN?k\r/:i79,@R:!'n27!A+;%~> +-3,2c7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8NrD5:>:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X\:^BNe:e"8X7o@mrm/km:Ac'UND-?Mu +#ffW-b0%;S:ODa$"]'QhU.iAqm/]n7rlP;2APr*e!nVMFq!A8_FNV1+9Wn$T"6!*N=nD"`Y"W.q +_"@!p=`jP`)Q<]g:f'VX:e"8X7SloN:f'VX:e"8X7SloNjA5nG!$q>=!*o- +-3+c<0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sCrA?Ac2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,f2$boo2)-sG7o"p!P6-S9B`$E_EDuLn +#_G^Ff\"3.:gs!["]0g'X%Rs8P6"=7rn%:JBMS2`!f:3>plbnWH.^,M96^#l"--,L;tH1UG=u=: +J+Sp*;gJ8m)RBDb2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCj>?uk!%@VO!,M2Y!1EFf!/C$r!3,p+ +#?OYn<,?OS*kX?2'``a~> +-3,W8ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm]srGFE&DJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%bD?sfkDIm^'('r.Bm/kK;%/W0g&/Op* +#djX\4Zt\K!CueL"T]E&.0-C@m/[2+r]L<2$jcLm!mE^Lq!A7k'0S5^!0Hj?"5=(](A$nrO8oOd +Wq>ZZ()-R.)D(qSDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsjDG$,!''b4!0d";!+b\[!-I`o!*oJ] +#?1s/*c6<*5eLt8/HC;~> ++oic_:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloNrD5jN:e"8X7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:e"8X7SloN85+*^m/itTL&B'oAS1T% +!kV.#rQ5._;>';\f1_.GP"`pim/km5N;^m"FA_\t!kV-Qq<\En9Ua,HYtV+gm0($p?;/uCm0$Qu +\kJC]m/^@3qoSuO!%$i**_&t&7SloN:f'VX:e"8X7SloN:f'VX:e"8X7Pk*JpJ_-loZ@/Yo2G^Z +n]D9N<)c[g9P1WumD],P]MJVP!.Y~> ++oi?82)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCrA?qs2)-sG0f:gC2)R*G2)-sG0f:gC +2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG0f:gC2+q64P6,_sMu;3.BNOhi +!dmYArR_-r:A'eTM+a)cRnJA,P6-S6Pl958Gu"!q!dmXLq3)&/9;L4m]hP6?8+?qZ@KP6=fl +`_1.?P6"U-qq(ti!#OiV*\fN00f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0d?[2pL4-2o[j.uo3q^! +n^n8j@U`V@936D&PC!9G]JT^)!.Y~> ++oj34DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsrGFu6DIm^'ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'ASuBs;?/c8m/h\9)uMi"$n(]7 +!i,fFrB1/p#kdQhbQ&nO,lk@Hm/kK3,lKk,'+"6t!i,fdq<\ES!%9un1'!+%m0'3b#QW*@m0"11 +2?7Udm/[t9q`P!=!&EbU*bB5,ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'AOul6pP])NoK<1ro8EZS +nN@:ON/WK-!%40$mD],]]P[a%!.Y~> +,lf)X:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SlSQ:btR;:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e(C["%H*`7fH6a9E;$Km/h?&Z2MfG??>c+ +!jbS"rQ5._=nV.d^eCKFN(hjsm/k=%Rf1A0FC=b."0P +,leZ72)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:]a2)?sE2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)5%e"#2Yj1&a$36q_XZP6,#_^&?Ra?sWDg +!dRGFrR_-r;tZ=YInQipPY6l,P6->/V#ApHGuXF""*[C2H2<^0>u8eufW.YpoTKDo99`)$oofQ' +9;L3@@J#`a;gJ8m)U/6s2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCj>@#U!2b);@K;G\fDp-e@K=I< +fEHk9=%d@irf[eJ!$4!P2)R*G2)-sG0ul-P'``a~> +,lfN.DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASu)XDDPjADIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIrca"(c@fAc?QK.KG7]m/frB1/p(A7&!WW4J2,QQ'^m/jZq./c:0'-?f5"- ++TNZ^7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X[:e!oN7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX7SloN:f'VX:e!rPfAQ#tf1^;baoPOi +o^)^Y9X4Q=!Gl0:m09L_Z-%boiV)X?ZV7@saoQ ++TN670f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,e2+B;X0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G0f:gC2)R*G2).TrM;XR!M+`-mfE##] +oTK>u9>1;V!H;$2P6Q,%^"A69NqSY ++TO*3ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%aDFS2TASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'ASuBsDJj$'DIjRhbi%jibQ&=T4TP^V +o^)^8!&FL9!=p7Em08=G1-HQVg\1"9QiJ`:4TQ'@o^)dC!!*@mr9XQ]!#to#![Icio^)cB#UobR +p$DoQ!BiRO3qVe?()-O-'EB^rDJj$'DIm^'ASuBsDJj$'DIr]_+(]>-ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'AJuE0^A*WfJOB)n!0d&6!-mrq"&!/tOT"PKgMHpGoklg%DJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'/HC;~> +9)p,):e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:e"8X7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7f?-l7SloN:f'VX:e"8X7fH3g7S-9D7nH2L:]a0]B&DtWL.oG_aoP1j +o^)^R9Y12F!G--@m0/bK_9-jsp$DgS9Y12F!G--?m0o[^XBnSA]A__O;-(O4aoQT]oBcZXFIGnD +p$Do[FNVa4F7ei#;18;`3rgF#7SloN:f'VX:e"8X7SloN:f'VX7SlQN:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8N!'@HjB_YO,U%QS";ui0\aofJKKpqeZ!bG'3rTt,o;+psA:e"8X7SloN:f'X& +:]a*0!.Y~> +9)o\]2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG1&Ws<0f:gC2)R*G2)-sG1&a$70g%io7m&O)2$$?Ohie+Q9?mIg!D@"r +P6,_s`r4NjBNk(m"`-iVfQg6bP6,_s`r4NjBNk%l$unqL?qXdQNfJ +9)pPTDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'ASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'Ac6KTASuBsDJj$'DIm^'Ac?QOAN2.T(-#n)D?<]9-f=:m<<,#X4TPO_ +o^)^.!&jd=!=U^Um0.>,3'@o\p$Dg/!&jd=!=U^Tm0nCC1'dk@UtaXc#R*3e4TQ3%oBcYd'.#3rgjMASuBsDJj$'DIm^'ASuBsDJj$'ASu'sDIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm]s!(kDYS+qpB=nOrLMu[;a4TdYl)^tJE!Xo'rrTt,N#QOiiDIm^'ASuBsDJj%, +D?=B$!.Y~> +D#b_U7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SlQN:e"8X7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SloN:f'VX:e"8N:f'VX:e"8X7SloN:f'VX85W&XD.$%785McP8PFlsm0C6sU<:Wp +9U58;!gQHqrQ5.IF7no(HWJ;3D.*&(!JXDJaoPgio^)gI9YnQ!:]3rf?Fp*X!G,m8m02HBN06ld +p?`()9TmQ@ATRM2!DIq_f!-n1Z!*o.q!6"iY!NB-!9EBRXqoSto9VMFP%YdYgHN5Wo:e"8X7SloN +r_PXF:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X ++TR#~> +D#b;.0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC +2)R*G2)-sG0f:gC2)R*G2)-sC2)R*G2)-sG0f:gC2)R*G2,6e>>#\-i2)R*G4A08DP6ZJ.X4Z(L +95O6a!c1NSrR_-Y?1jBb@92%5EE)Up!G,+*fE#AcoTKGp9?k_>;#O#f@)i/t!GGR,P6Ht>Pab=& +p6,]49:OSdBO17o!DA%@fEM +D#c/*ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASuBsDJj$'DIm]sDJj$'DIm^'ASuBsDJj$';@!7.0cg<#;Jp&`2ult:m0BEe.6TgR +!,_Aq!c7osrB1/e3q_kD7g2%=&0CN3!EB0u4TPgLo^)g!!&uqW!WN!-Ils!0d&6!(6]J!A+KS!!*lqq`P!"!.Fh5%TNK;,lg2JDIm^'ASuBs +rbac.DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^' +/HC;~> +@/qH?:f'VX7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8N:f'VX:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX7SloN:f'VX:e"8X7SloP9Ne_$m0UC-9LquL:eXQ]iU$m/9RY(+ +\kJgim/`JGr5o%9L@sp;=`)=(ASq,-!IIlFaoPOio^)[E9`E0;_4$(3Ret5.:PSN/"i*g#N(i4( +m09mjWQN@iF7no%f1_/$apOSZ!$t<4;.+6D;>s6?;+sPX:e"8X7SlQN7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SloN:f&G<6hF=X`:h=RAG&n%Jc3^sYtnc6f7lt1_>VLXYtT6;m1>OVFNTaH1e(;< +7SloN:f'X\:bY@8:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'XY +:]a*0!.Y~> +>6#Bm2)R*G0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sC2)R*G2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G0f:gC2)R*G2)-sG1&a$392g-8P6lV89/SR]2+1)ZiKFM,97kgK +`_1=DP6#Jmr7D$HAbD5j;fUIBBNk(m!F]%,fE##]oTK;l9E*QHc(p8UV#/dF:hB9_"b01@PY7&1 +P6Q;*Ze3o +@/qljDJj$'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm]sDJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'ASuBsDJj$'DIm^'ASuB`!#Ct$m0TR(!)d]GDCPXAiU$m)!#Id] +2?80tm/_&(r&k&]__((`Vl$o.GB!Cm=k4TP^Vo^)Zr!<,+a3%,^b./Q..!EJdZ"f_PN,QQTm +m08pX/Nl6&3q_kAbQ&pd4UNSN!"&]+#Tb]9#lXfT#V%fODIm^'ASu'sASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASuBsDJh30EV,1i6hWYCJb=s%D>cU'1'&G`bZ+WO3;kuA1&sB6m1=+7'0RWA8S)dW +ASuBsDJj%bDD5X>DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%_ +D?=B$!.Y~> +?iV?H7SloN:f'VX7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:e"8X7SloN:f'VX:e!oO;:ka5$.i$O7SlQD7o-qZm06s8b0$t_ +Y4V)^L/7`i!DeIDm0;NCL!%P=HhHb,D.WXf!DeIBm/_r8oZ@6H9U58;"KkG'I8'>$#,+`%b0!b3 +p$E4(9Ua,H\qNpR;1#7^iV`'KiP;..:J=VW7f#q&7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN +:_s-';uiWcaoH>P;ujl8aoZEWfDb.>ThJe(rlP:R;:kg7#J3ZHb0#;92#U5V7SloN:f'VX7f?.; +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7fH3b+TR#~> +?iUp!0f:gC2)R*G0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG0f:gC2)R*G2)-g\:5Sn4$&MDP0f:[?7o4]oP6P!+f\!l1 +GP%("APi%mid!DmA"P6#5fo[j5b95O6a"F!MPJkPd##'!;Uf[s55 +oofi79;L4m`f!Yd:186rNr5(HNdl%S:eOPG1&i\@ED']Zrn%9c:5St6#CK0af[u)^,Q0J*0f:gC2)R*G1&Ws` +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG1&a$2'``a~> +?iVcrASuBsDJj$'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'ASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'ASuBsDJj$'DImAb#gE56$-WY\ASu'j('1Gom04UC4ZtP# +OS%o@<<<"\!24Zt.m8c +?N;6=:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:f'VX:e"8X7SloN:f'VX:e"8X7SlQN:e"8X7SloN:f'hZ]DCmrY"VFd:]j6c=i]Oh#'4+nb+_SA +o^)[+i9iUlLeiM^?^9M%]M7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7K=D! +;uh1:aoI\";ui0]ao]CTLA^EDZV4]Ab,J("rp:-Q=]WA]b%guF:e"8NrD3J`rD5LD:e"8X7SloN +:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SlPt!.Y~> +?N:fq2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)R*G2)-sG0f:gC2)R*G2)-sG0f:[C2)-sG0f:gC2)RcpI/9$.G=t's2$-NOK&Vsu?!u=;X%Rj4 +P6#)mrR_1r95O(^!2.*93lh'oTLbbFB;+.4>A]J2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC!$_#D +!/C4"!2B0r!2BGE!mOPQr0%A2946#sZV,-6P73IM +?N;ZhDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DJj$'DIm^'ASuBsDJj$'DIm^'ASu'sDIm^'ASuBsDJgp(V#'H[O8q9>D?EcB(:E/h#!*#Q4XgB, +o^)ZL"oURc2umghm09ru-p9NiD>!8s()-U/!0Jg[sk_gP7-V!'"P-ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'AH4.M +Mu[tn4TJpaMu[;b4T[SD +?2u-<:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e497q!AB"9L_iJ:e48ffAl6&HWJ;3RS:co +m/_97rQ52Q9VM1I#.%"&b*l#9p?_q59SNGf!l7R(o^)[+b%52Xm08hLb0%Oo +Q1aMKL/3t59QS8Bm3f\d9Mn>W7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VF!%d\?pb%4H/rp9cP9VVO/!_iYarD3_g:e"8X7SlSQ:bY@8:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X[:]V^>J,~> +?2t]p2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)S$GnfP"@ZP6Phrf\"GA +D"WtrAPejs93m/;P:(i`927?%0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*B!&O1Tp=KAc +pL4,Wr7D(j96'im#'ij\fP"$?rf[D"9<8'E!`B"QrA=g72)-sG0f:]a2)$aB2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,e2$"ElJ,~> +?2uQgDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDGgI7q!AA8!+g%ZDGgHUbiA'p7g2%=-ig[I +m/]6RrB13?!.FS.#+,BB4X^<+p?_q*!#tl"!]U1.o^)ZL"nXqZ,lk@Fm0$Di4U`_2m07D-4Ztb) +D>!9#<<4BL!'7OUm3eng!!lJ?ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj#l!(ug@p,rCH +pP])or&k*>!.Fb3#+,B$4U_VNrp9c(!%In1!Z(iJrGDjODIm^'ASu)XDD5X>DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%aD?2 +?2u-<:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e+CAq!AEk9M&&W7SlWLB%Q,2#('\!b*#HM +o^)ZrAc9aQYtV=om09L_]#o+liV)X?ZV7@sao].JU%I^QD.W@^!ej>,o^)d&?HQ;qp$DsK9Ynl_ +9VM.H"Dph+@)2'p-*p`J9L_iJ:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X/HA0/;uiokaoIY$ +;upmTr5o)G9W7gT"I2Yt9U5VE!nU:crQ59q%8]Mj7f?-`7f?.E7SlQN:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8N:a#gh~> +?2t]p2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2+LE%plc&/90>'h0f:g]=,H"%#%:olfUGNj +oTK;ZB`6Qb]h%mQ\!fK^3oTKD`@+\LgoofSr9?l,/ +96'Wg"BnGk<.F1s-$`E^6npPR2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG*WSt+@K +?2uQgDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDAEN4q!AEM!'"k6AStBG-d:Z=#"Jq^4XC*P +o^)Z6%/i]p$Ds#!'!," +!.FP-">KlV*ieMm-(#GJ.V3L/DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'5QGfpMuZfM4TK$g +Mue>or&k*:!/LF<"Dn,M!,_`&!mCo\rB1;n&oM8uAc6KHAc6L-ASu'sDIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm]sDCkj=~> +>lZ$;:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N85,`Om0hlM9Me2T7SlZMB&Vk=#('Cnb(WOJ +o^)ZeD#MKXWD'Ylm00F^Z*?uWp$Dg`9X4Q=!jPFto^)ZkAb=+GD-?Jt"CQ&^9U5;<#*hlub,J(@ +p$DiY9U4T#m3LYF9Mn>W:e"8N:e"8X7SloN:f'VX:e"8X7SloN:f'VX(B@;&;ui-TaoI:q;uhLG +ao]CQQ20eLHV@,brp9cP9W\38%La.M:e"8X7SlQN:e"8Nr_P:<:f'VX:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloNrD3Pb+TR#~> +>lYTo2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2+qr`P7*CG6o?\V0f;'d=,uC+#%:QbfS`C_ +oTK;TE;eDjZV,T;P6H&$]tI'MoofH$9>1;V!kh6KoTK;WB_9pXEDuIm"B9?b95O9b#&HrWfX"4r +oofJQ95KXPP66hV92>ID*AKE+2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G%ffo+@K;hhfDq98@K;Gb +fE0;jD#'7s@7s7Mrf[D"9=OlP%MB:02)-sG0f:[C2)-sCr\ZAa2)R*G2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCrA=X2'``a~> +>lZHfDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s;?2.>m0hYS.W/g8ASsI--embM#"Jh[4W=CU +o^)Z#&,eWm/HD13m0/7F1,8i0p$DgB!&FL9!\sb2o^)Z,%.l[`&/Om)"EQ$7fWP5rp9c(!&FL9%L4+oDIm^'ASu'sDIm]srbaE$DJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsrGD[J/HC;~> +>lZ$;:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8X7oA7=m0e87:e"8N:f'\V@+XQ."`7hnb(WO\ +m/gZkP5`T*U.iArm01*qI9'4sp$Dh$9RZl^!jPG%o^)ZeD=ksO??>`*"As9G9W7XO#*hlub*l#E +p$DdY^uXl+ZVaCe:f'VX:e"8N:e"8X7SloN:f'VX:e"8X7SloN%2\P6!,hGO"gNVmDMbq$apG%h +<_Rl-m<`6mrp9dG;/Q="!o[9nrQ7a6!$tH2:e"8X7SlQN:e"8N:e"8N:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:e"8X+TR#~> +>lYTo2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sG7o#*,JlYX'oofH/97m,p!kh6NoTK;TEV.la?sWAf"AX6U96Bij#&HrWfVD/l +oofDuJ)ldpGtq$32&e8-2)-sC2)-sG0f:gC2)R*G2)-sG0f:gC#nlc;!.sjq"hp"@JsXOTfEnm0 +<_HkbP@7FIrf[DD:0RX\!fg2mrRa`O!#ILI2)-sG0f:[C2)-sC2)-sC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG'``a~> +>lZHfDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm^'('r[gm0cDaDIm]sDJi>P*mEd6"YgEK4W=Cm +m/e=0-2p%/.0-CAm009c(Bk)gp$Dgg!#PSs!\sb;o^)Z#&G/*d#WhSE":,Yr!/L77#&O?"4X^<< +p$Dd8WoWOjQj<[iDJj$'DIm]sDIm^'ASuBsDJj$'DIm^'ASuBs&g["+!.FK&"\W]WI:u1K4UE\R +"TV'[m7/5Arp9dA#Vl>G!o"J!rB3b.!&AG'DIm^'ASu'sDIm]sDIm]sDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'/HC;~> +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N9RHI"%&$?c:e"8N:e!uL=i]^m"^,]bb&geX +m0LL>9Q\G"RS:cpm/p`i=hsXr#^]6V_90p"9Y9ra!EjO:aoP1joBcZVI@ +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC94@LW$unot2)-sC2)-s];hF1r"]KEnfQgEe +P6cY>96o1BUe?=4P64cW;h+D&#[pA>c.L[T976Aq!E4:9fE"WVo90;RJtu%hoofSr9A%mT99.Pd ++G*Qc2)-sC2)-sC2)-sC2)-sG0f:gC2)R*G2)-sB!&O+RlIZNiGtUn +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s!(Z_L%"/+RDIm]sDIl]G(:E>m"VqY44VJV& +m0K^>!#%LY-ig[Jm/nC0(96un#Y+k'3'BDV!2T8S!>Z@@4TPO_oBcY](FT9`p$Ds#!'NIa!8H&k ++LN6j;Is`WDIm]sDIm]sDIm^'ASuBsDJj$'DIm]l!(ua>l9,P8'*&;! +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8P9Wn'U%D,;)7SlQN7SlQF9OQK:m0;NCIEK]K +@.EUgL.m$[3"bogqb'd.9m2sqf +9L_iT7SlQN7SlQN7SlQN7SlQN7SlQN7SlQ.!'TgN!4hF<"*@4kiVi-HL/3LsHhm%1HV_KVb">A. +7SlQN:e"8N:f'VX7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SlPt!.Y~> +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sG96^&m%=Cf+0f:[C0f:[C92pc4P6R%?K%S^p +<:Q.VAP7X-RnJV1P5pI/P6YnsK%S_V97QSt!D\7>fE/`ZFS(b#N_>:g99/\/"_CN_fRclIP95W\ +9//:]0f:[C0f:[C0f:[C0f:[C0f:[C0f:[,!(66b!6=EX"*mONNr>.EAPe:X@JQ)g@8P5IfLf$A +0f:[C2)-sC2)R*G0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC +2)R*G2)-sG0f:[#!.Y~> +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]`!0Hm@%AWu%ASu'sASu'W!$9AKm0;;F(Hjnl +*qAV%<<*gu,ll0]m/YB"m0@J.(Hjo1!35\Y!=0M74T[A=L\0s;gAi03!8I26"]YRd4VnCQm2sOn +!+g%cASu'sASu'sASu'sASu'sASu'sASu'E!+bSX!(cE=!ttZ7g\pLB<<4$=8,;NR7fbUJ4\?Lj +ASu'sDIm]sDJj$'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASu'2!.Y~> +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8Q9\8t)%G+9I:e"8N:e"8N85*mbm0:U)P01pY +D=HorHVC]'9]=st#('%Tb*l#Eo^)ZQL%WRiP"`pgm0)$7P&4@om0.i;b0":-dd8*k9M@oP7SlQN +7SlQN7SlQN7SlQN7SlQN7SlPt!)E#_!28c%!i\kJqs=Q6?HR[iQ2BqMiDF^pb" +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sN98W>*%>d_G2)-sC2)-sC2+q-;P6QV3S(QA, +>4@^Z@8":u99.tp#%:0EfVD/loTK;KMtP^(RnJA*P6?_8RrMC!P6GAqf[sk=dZY`%911Kl0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[#!*er%!3bbA!jbO2qi_1l@+^'(D#9CtN_XltfLcqg0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G +2)-s'!.Y~> +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]F!6k-'%Enf%DIm]sDIm]s;?/H9m09ru,s=C" +1%=Q67fY:i!8HK"#"JYO4X^<q,lk@Fm0(W5,nLjam0,u`4Zs3$dd8*U!%MPtASu's +ASu'sASu'sASu'sASu'sASu'2!/'d"!*SYO!\FCPqs=PW#X&t(D>W]%gB\Jj4\>nsASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$' +DIm];!.Y~> +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8T:\3r_?q4$_:e"8N:e"8Q9U4o1#,k5#b0!b3 +nEgD"9Tk*'iSj/.^eC3>P"aL#m/l6?L%WRhI8'8""M7@%?>]?%"_M>gb"mB3m2UjS85McP7SlQN +7SlQN7SlQN7SlQN7SlQN7L^(#;uhdAaoZubiVW!HL/5Y.D+po+m/jmnRf1B%\c +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sV;"Kk[<(Af#2)-sC2)-sN95NmW#' +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]8!V>[f*YrX)DIm]sDIm]F!,_#g#)<164Zrs= +nEgCe!$rQagYqN(WW4G1,ll0^m/l#B)tc>p(BF'o"Jc#H#Vku="Xa^A4TS(#m2T++;Jp&`ASu's +ASu'sASu'sASu'sASu'sAJ,jKMu[PX4TZE"g\^@B<<5'B&-.L`m/j'`./c;%2?5=HASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASs("J,~> +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8O@.WaqPtXSB7SlQN7SlQD7oA72m/_Q0rlP7; +L@FR5f1_-O9]5:BiCnsJN(hjrm/km5N:kNW)^eBI)_.? +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sY<:c:`CeHB<0f:[C0f:[?7o#*1P6#)grn%6J +AakldM+a(b9Al!;_PY6l+P6-S6PkEZ0BNOeh"E@)S:hB9_"]0g'`_1-qP9#KT7l<"Y0f:[C +0f:[C0f:[C0f:[C0f:[C/c]CUn6uBXm+;>H>5FEfInP^Pc"KatrK@:o:sJsk98`cp2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-s$!.Y~> +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]$*qSb/D#ds]ASu'sASu'j('r[\m/]]Xr]L8_ + +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8OD=d-)^e@6r6?L7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN+TR#~> +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sY>4[pfInMm]0f:[C0f:[C2+qcOP6Od%f\"GA +D"*VkED*W`:>h;_MbB*'P6-S6S+YD7@@0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C'``a~> +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]$1%XcBWW5"rASu'sASu's;?1S"m03h-4Ztb) +D=HoqI/ki4#iP(SgAi0U)Z\Xcm/kK3-1sD%"\81O"?H]L!,_Dr#0[&m4Y6Z$d-Vij!)d]GDIm]s +DIm]sDIm]sDIm]sDIm]s8H:,$FRb:iII00!3!DhJm0l#U.6TQm#ds'egB\>f4\Hap?uBOnASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu's/HC;~> +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e!oE@.N[o?r9Bi7SlQN7SlQN7r@V[#Ja#rb0%:h +U%%FP?s_!(9]5:AThMH.KhV.+!ln!'ou[;2L@jj:iDF^>9U5;<#,k4sb*#H=d-Vn5;+FGP:e"8N +:e"8N:e"8N:e"8N:e"8N+TT*r`+edA!+bQ@"GKlM9QU$s%+el\L!$Z$=kE%f9W@s49.^TB:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"7t!.Y~> +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-gU<:Z4^<),/*0f:[C0f:[C7p>8C#CfC9f\"2: +EU].p<++@19Al!;ED*XjMbE]+!eO(@p"0:AAb;/iN_XlP95O9b#' +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDImAp*qJ\-*XH=pASu'sASu's(,>1C#H@bM4Zt\' +IIQV,*XFnF!9!5JI/ki^)Z]Nt!jr"VofW +>6#g97SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQJ;=a)`ThJ$S7Rg3D:e"8N9Ng`L#DQ$cb0%Or +L@OX8ZV6>#KhUIam0-X!b0"g'o^)_#9VV4&!DeIBm00XdU<6/pp$Ds1:Wgh69]==b)3mld:e"8N +:e"8N:e"8N:e"8N:e"8N:^nKFaoT%`o2G^#nB(oV:MlA^ZhWnpiH%\@b+_R;D+oBUb"TVO(JmRt +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7Nhb^~> +>6#Bm0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[R:@aSXED&DO0ekO?2)-sC6rWH9#A$`Of\"GF +AatrgGtXCSMbB)hP6Flmf[tIEoTK?.9<7a^)/Mr'2)-sC +2)-sC2)-sC2)-sC2)-sC2$kE)fE'$5o3q]?nCRni:g.[OH2*R1Na5;0fW.YE>"aJFfM'Ni&iDC$ +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0bj\=~> +>6$6dASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'/#kI?lI/l6EAS#ajDIm]s.MhC<#?:d_4Ztb* + +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8T9]>U1%H1G[7SlQN7SlQN7RpVJm/^(#rQ5.7 +Q1=5G?rk+dP"`pfm/bhFo'HXH9Ua,HFBS8'!l.L(ou[;9L@jj:Alcaj +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sV99/V-%?=@W0f:[C0f:[C0h51/P6"EtrR_-D +D"3\n<*%8rRnJA)P6$Mcnrj8o9;L4mGuO@!!e3kDp"0:GAb;/i='!Su +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]8!8I,4%GMX6ASu'sASu'sAJQ'Jm/[J'rB1/] +D=Qut*X+Md,lk@Em/bFuo'HWu!%9un',L6-!ic5LofW +"99T77Ss(R!)WYa!)WYa!)WYa!)WYa!)WYa!)WYa!)WYa!)WYa1f-Y<7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQG9Y9l_%'E8t7SlQN7SlQF9SVs%!jbRhrlP;Y +9U529#F.uOb0$t_Q1XGGiE9%:o^)_#;.]aL!G,m8m/j4[XS'^:ARP2u#.%!^b0"O.p?`*M9WZCZ +N(hjnm02IaTn[VkqFh#hAp^K.nEh'69L_iJ:e"8N:e"8N:e"8N:e"8N:c&0!r5o#=oMbg$n]Co] +9]>m9"(4erU&43YHVBn'b"]]8!'!GE7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7Sjm$J,~> +"99/k0fAqb!&aa1!&aa1!&aa1!&aa1!&aa1!&aa1!&aa1!&aa11c7!F0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[J976;o%!P?40f:[C0f:[C94dLS!dRG7rn%:s +95O0_#Ad&/f\!l1D"NnnN`/]5oTK?.:2'XZ!GGR,P6,i!\+SASBN4Yg#'ik+f[t.Bp6,_t9=NR+ +PY6l'P6HtrEFiESqF^rd=(-3-n<4\p9//:Y2)-sC2)-sC2)-sC2)-sC2'W*Sr7D"XoO7f@n^mnp +99/n5"&qodEVkq$@8!EkfM0UV!%fo_0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f9RDJ,~> +"9:#bAT%KY!,hdI!,hdI!,hdI!,hdI!,hdI!,hdI!,hdI!,hdI1i?lBASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'=!2T2Q%$1H=ASu'sASu'W!*/FR!gis9r]L^X(-V&s9nEh&R!+g%ZDIm]sDIm]sDIm]sDIm]sDFjgSr&k$YoS`d$nN?pi +!8ID<"!.FBIJ`C57fXt44\[mK!*WrOASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASranJ,~> +-NG;Z:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N;#Woa;#Woa;#Woa;#Woa;#Woa +;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Wof:e"8L9U5/8!ddU4r^I&f7RfmDa6i6qF&0XNaoP:m +oBcUk9Pj[M!FB1,m0)Bb9MD/Qm/um/_9(oZ@5h9ZQnp#hN3[_90oS9\9(,!nU4Z +rlP;29ZQhn"6$D;@/`h':L7md4XL)!s%ED_r_*?0Y4CrsY"VAU:e"8N:e"8N:e"8N:e"8N:du`2 +Z2;ZDWV'3jAF[eCAS1i,"lW./APBo;m/u +-NFl92)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2?#<12?#<12?#<12?#<12?#<1 +2?#<12?#<12?#<12?#<12?#<12?#<12?#<62)-s@95O-^!b"_ar\4R60el0pK'ea'>u8fEfE"f[ +o906'95sj^!FSn"P6?nL91s9tP66hD:r`Le!ENY$P6"rco[j5'97lo%#`2J\c.L[,98WG-!f9`e +rn%:J97li#"-.S:<;oMo:ge9p5puXos$QiWr_!8qGOgq7G=seJ2)-sC2)-sC2)-sC2)-sC2),mI +^&-F^[e4)0Eq.c_BNP(p"cc66BM3jQP66hE +-NG`0DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDZ42IDZ42IDZ42IDZ42IDZ42I +DZ42IDZ42IDZ42IDZ42IDZ42IDZ42IDZ42NDIm]n!,_8n!_35Mrac7NARuVX[I*>_3WV5=4TPR` +oBcUT!"]#k!=0b>m0)/u!!%H?m/u)Y!B0p?!"ks"r$im=*m/u)a"ZZ?A:,iXd!,c@cASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASs("J,~> +]?% +"348>_>VLXRS9"@m0;0S9T3O[fD"Y7f3h:HrQ5.AF7no%W(_p;ao].MF85,)f4IgXrlP;I9RHU& +"6!ifZ2VlIWD'Jim0UguAkYloAVHSXrQ5U?!)Q-]7SlQD85)lS@)2F%(ZA%]7SlQN7SlQN7SlQN +7SlQN7SlPe(&>uPWV09kC%9=H9SWE2"\a$L +OuP6QkF99a*bM>*29M,[-KrR_-O?1jB_FA%PafE0&h?20TcM-!N[rn%:c94@X[ +"--GZ^&HXcZV,N;P6lhW=%c1_BT&\"rR_TM!&ZJg0f:[?2+124<.FP((QM-V0f:[C0f:[C0f:[C +0f:[C0f:Zo(\u\`[e=/1GOa;d94ds`"\X-\<`=kQP6,r$X8COFc"K`M%l#pr2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2),gG +J,~> +1(1B'EASu'sASu'sASu's +ASu'sASu&t#5LC^;tc.MGk!ot!*/m_"TT2o"W#>[m/i@L.Jl8(3",ce+D#G%DIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIkC" +J,~> +>lZ$;:e"8N:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D7SlQD:e"8N7SlQD:e"8N7SlQD +:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N:e"8N8PHJ[m0AnP9MA;W=hF%f!esCRr5o(h9]>^4 +"1qE2])0VOCeUf'm0KC_:R]G-:LMfMm/s:a:R_4(!e!bFq!A49L.l0po?%/h9QSh`m0)CH=\PRf +aoZubU&43Za(A#6rQ52X:OE!+#fi359MAcHU;?ZJ%o!$n:e"8N:e!oN7S-HNQ1XGZD,Ec!7SlQN +7SlQN7SlQN7SlQN7K>sRaoJ^@;uhL?ao]CQQ29kPL.nSJ:M/Sam/km5P5EBtAP@%C,u@'-7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7Sjm$J,~> +>lYTo2)-sC2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?0f:[?2)-sC0f:[?2)-sC0f:[? +2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC2)-sC4A0thP6Yo#91r#Q;gdqq!bG$#$e00f:[C +0f:[C0f:[C0f:[C0`X`=fDrY[@K;GZfE0;jD#0>"AP9A=:fi\UP6-S6S,:i6BM2V2(H!p)0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f9RDJ,~> +>lZHfDIm]sDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajASu'jDIm]sASu'jDIm]sASu'j +DIm]sASu'jDIm]sASu'jDIm]sASu'jDIm]sDIm]s2uo?8m0@J/!!!9)(8UNW(<<+U+!@QY#m/kK3-2Ti$$iim"12^Z@ASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASranJ,~> +"99T77Ss(R<_u7T:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:e!oN7Rg3D7SlQN7Rg3D7SlQN7Rg3D +7SlQN7Rg3D7SlQN7Rg3D7SlQN7Rg3D7SlQD:e!oN7T!RPnEgD2W.oYmiU#q5f26D^ao\;2U%n!X +iJ($4Z22TP_.?;e_!UOJ^m/%rA[26W%AHWqL9A=p];UHe9O>"$aq),fL2BUXFM[Li +$\_8MF-W#FHVmICXS^-J_.?;]W4T4+D,3rrqoT=h9Yg&_f:cSG9P'0fou[h?!)Q-]7SlQN7Rg3D +7Rp.,p$EN[9LqWL7SlQN7SlQN7SlQN7SlQ2!-@nW!P)b:;ui0Rao]CQQ29kWf3).cP"]8qmHqr8 +9X4N<:i&h!M?#J07SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN+TR#~> +"99/k0fAqb<])Td2)-gC0f:[?2)-gC0f:[?2)-gC0f:[?2)-gC0ekO?0f:[C0ekO?0f:[C0ekO? +0f:[C0ekO?0f:[C0ekO?0f:[C0ekO?0f:[?2)-gC0ht].n<4$4FCem#NpMr2M,&'ffE/*HEVP_# +Nb(jk^&$@jc"KaYJ!6(VIr&%VBYFDt%BE<#ATrWJHurpu945I1fFQ5792oJ=EHHDEAQh`"H-Pm3 +$]@YS?#4=g@89I'\,4ecc"KaUFF8:P>#8%kqq)=&97N.hM/cKf95'R'p"0gR!&ZJg0f:[C0ekO? +0h4lJoog/-9/SF]0f:[C0f:[C0f:[C0f:[1!.4Im!QT6V@K<.nfE0;jD#0>)M,RHpRnH_.PEUT( +9>18U:iK'I<<+7$0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C'``a~> +"9:#bAT%KYNW/bSC@?,lf!^mHq;B +!&FI8:_*PSM?$4cASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu's/HC;~> +!<=;A7Ku[Y7SlQD;#Nic:e!oNrC-lc7Rg5Q7QjR;7SlQD:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D +:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D7SlQD:e=?8ea3Em9X4H:!bG6Eqs=RGQ!$e&_>).R_1h_Z +!G._saoSbhqb.&eAX`D:"2Tq-:]*lg:L8ISm`GU9I9->@!`jE3pW[!/:?n;/Apkm774H7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7Nhb^~> +!<o632)-gCr@nC30ekQa0g.BK0f:[?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO? +2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?0f:[?2*=NCeWU&G9>12S!bb>Yqi_2DCfS3InMm]0f:[C0f:[C0f:[C0f:[C(BCQ1fE'EeqI0HF +n^mk=@JQ)jIo'OmUfRCd!/pd-;/f0EP;N=p0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0bj\=~> +!<=_MAHm$`ASu'jDZ+,KDImBsrFH(KAS#cXANapBASu'jDImBsAS#ajDImBsAS#ajDImBsAS#aj +DImBsAS#ajDImBsAS#ajDImBsAS#ajASu'jDE%Vrea3EW;3#h\o +!=UCR4TR;OqZ$Zu$n1m6"#qP7!W2p"!=0JsmQCV,(BsdDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s/HC;~> +"99T77SrkL!)WYa),Ndl:e"8N7SlQD:e"8N7SlQD:e!oN7Rg5Q7KZIV7Ss%Q"&MHV;#Nic:e!oN +rC-lc7Rg5Q7Lrc19aoSblr_ro/WUn79]#r0D9ZQtr$+iu6_82RgI>kH/b#3=TQ0mrT +&k5\e:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"7t!.Y~> +"99/k0fA_\!&aa1))X-'2)-sC0f:[?2)-sC0f:[?2)-gC0ekQa0`s9f0fAna"#Vef2>o632)-gC +r@nC30ekQa0b6,r0f:[?2)-gC0ekOR96]!O!eO'jq:H+h<`!U[JpD0991rZno[jAfRt?6MUrN/] +#0jKT\#[3en^mua]tMG1f%:)6X1cOHfEK97<`XLTn(7b/!&ZJgr\4a;0f:[?2)-gU98WD,"HH,; +0fAqb!&aa1!&aa1!&aa1!=oh7fE&^@raGnK[e&,T`n8pq97lu'$%,QMc-<&9Js +"9:#bAT%9S!,hdI)/a"sDIm]sASu'jDIm]sASu'jDImBsAS#cXAHQg]AT%HX")_[]DZ+,KDImBs +rFH(KAS#cXAIiZiASu'jDImBsAS#a/!0Gh"!jr"Aq)o-A"T`J9[?tec!!!9RoK!4DXi$)@S*3&i<&(F1d64]2pnD=-^9 +)J*etDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]2!.Y~> +!<=;A7Ku[Y7SlQD;#Woa:ut.H;#3W];#3W];#3W];#3W];#Woj:e!oN7Rg3D7Ss(R!_6&,f^/`J +:V->D!P3+F9EJOKWI`4`ap0L-7SlQN7Ss(R#>dlZ:e!uLHhQh@=[u:X:e"8N:e"8N:e"8N:e!nS +3:Y,m`3HT=ap=G39M]c!:LMfMm/jmnD"l'ZI8#C_mFM=]7Rg5R7K?9a7K?9a7QjR;:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:duT.J,~> +!<T$-2>T$-2>T$-2>T$-2?#<:2)-gC0ekO?0fAqb!_6(=fTQA9 +:r`:_!QK*V9*/LQZ[pd#fEX,;0f:[C0fAqb#;n4j2)-s]@J5m!;b&]"2)-sC2)-sC2)-sC2)-fc +4Rq&*d_ +!<=_MAHm$`ASu'jDZ42IDWPF0DYdoEDYdoEDYdoEDYdoEDZ42RDImBsAS#ajAT%KY!YtgEf^/_] +!B0^9!B(Jd!!3EB/V-(V4U2E/ASu'sAT%KY#B"*aDIl]G8+u?M((tLrDIm]sDIm]sDIm]sDImAZ +&Fhmb6VC)D4UP^AS#cYAH6WIAH6WIANapBDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIkC"J,~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss%Q"&MHV;#Nic:e!oNrC-lc7Rg5Q +7KZIV7Ss%Q!)W8V"%Z9lf@oTnL.n'/aoo;ER]3lLb4*Od*YLq3:e"8N:e"8N:e!oN7RpVTm1aD- +7SlQN7Rg3D7SlQN7Rg3D2umaQapPCIAtaQK9QWs2W;5f^Pt[qJao[8jLApQOVZ8PC:e"8N:e"8N +:e"8N;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa +;#Woc:_s+^~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAna"#Vef2>o632)-gCr@nC30ekQa +0`s9f0fAna!&a@&"#WhPM;"-pAP8ilfEB3iUpJ'lf^RN++:KtZ2)-sC2)-sC2)-gC0h519P8%1j +0f:[C0ekO?0f:[C0ekO?/HBkNfF#;b=)hYD96j0/FSV+%CeLi)fE-t(Ac@l)D#be82)-sC2)-sC +2)-sC2?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<1 +2?#<32%fn>~> +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%HX")_[]DZ+,KDImBsrFH(KAS#cX +AHQg]AT%HX!,hC>"&]C?bhDFc<<+H?4TmYk-nR?.4n(TI#o[AdDIm]sDIm]sDImBsAJQ'Tm1_8j +ASu'sAS#ajASu'sAS#aj=o]](4UNqE-[eJj!##>JL\^<=D#c$\4TZQ& +!<=;A7Ku[Y7SlQD;#Woa;!(4I;#3W];#3W];#3W];#3W];#Niq:e!oN7Rg3D7SlQD:e!uL@,]o. +!hi;0J]cil&e#RQ7Rg3D7SlQD:e"8N7SlcUp?`WB;+=#O7SlQD:e!oN7SlQD:b;Z6PJlM(%#%C, +mHrM5:RYT`@+Y;C!oZq'qT8ku9QU1":0R]d7Rg3D:e!oN7Rg3D:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:duT.J,~> +!<T$-2>T$-2>T$-2>T$-2>o6A2)-gC0ekO?0f:[?2)-s]<0#at +!c^kYJ_8i3&eY^40ekO?0f:[?2)-sC0f;?op6-8#:,+I\0f:[?2)-gC0f:[?2')`fRF:-J%#[c8 +PEUi&:o%Jl +!<=_MAHm$`ASu'jDZ42IDWYL1DYdoEDYdoEDYdoEDYdoEDZ+,YDImBsAS#ajASu'jDIl]G*o#K; +!dt%^JN_jQ&dKOsAS#ajASu'jDIm]sASrt'p?`Vc#\@RbASu'jDImBsASu'jDEn28A4,B?$l]2j +mHr+=!@S3R*mFNK!o!_lqE4m*!':)G:2Ku=AS#ajDImBsAS#ajDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIkC"J,~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss(R"&MHV;#Nic:e!oNrC-lc7Rg5Q +7KZIV7Ss%Q!)W/S"%Z*niSNr'ZV4q]b218B_#PYV7KZIV7Ss(R"AhQW7pu&X",9K=;#Woq:e!oN +7Rg3D:e!nj!)QX*WTM>*_9-S%rTsg09Q\F?9QU't!G5p?ao\#*D>`cr3"8>R7Rg3D:e!oN7Rg3D +7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD +:_s+^~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAqb"#Vef2>o632)-gCr@nC30ekQa +0`s9f0fAna!&a7#"#W_NNo#s$GtVh%f\Y6^blALV0`s9f0fAqb">qng7o]2G"(b+[2?#5XRZ,7-(^0ekO?2)-gC0ekO? +0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[? +2%fn>~> +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%KY")_[]DZ+,KDImBsrFH(KAS#cX +AHQg]AT%HX!,h:;"&]+?gYV4DZ42YDImBs +AS#ajDImB)!/?G`;s$4F3'@cnrTsfs!#%LA!'9uD!@J +!<=;A7Ku[Y7SlQD;#Woa;!(4I;#<]^;#3W];#3W];#3W];#Nil:e!oN7Rg3D7SlQD;#Nic8PE:= +i9^WL9ME$Kb218EX8jPC7Ss%Q#uF)\:e!oN7SJ1&m0&/;7Rg5R7KZIV7Ss%Q"&MGr'`Cu3M8\]% +"gMB-:JYj*m08;=_9.I*Q2BqLAo.Cf"/8J$iVi.>i;aZ`7SlQD:e"8N7SlQD:e!oN7Rg3D:e!oN +7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7ReO$J,~> +!<]*.2>T$-2>T$-2>T$-2>o6<2)-gC0ekO?0f:[?2>o634A/V0 +i0+7e92!9Uf\Y6a[f@4%0fAna#rOFl2)-gC0hYsKP6>Gi0ekQb0`s9f0fAna"#Ve>(&_SBQdY0O +"he;::f(?nP6PSkc.IqID#9Cs=)e)i"05'rNr>/;NW9\H0f:[?2)-sC0f:[?2)-gC0ekO?2)-gC +0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ejCCJ,~> +!<=_MAHm$`ASu'jDZ42IDWYL1DYmuFDYdoEDYdoEDYdoEDZ+,TDImBsAS#ajASu'jDZ+,K2uj`< +i9^W.!!"p.4l/=*1&s(IAT%HX$#X`!W]$-P-,<""=3tg\pM8gAiL1ASu'jDIm]sASu'jDImBsAS#ajDImBs +AS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS!FnJ,~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss(R"&MHV;#Wod:e!oNrC-lc7Rg5Q +7KZIV7Ss%Q!)W2T#>dlZ:e48W]Ai2\ThIEG_:m$:_6K_tN.#eirac14?=$\2?N"F8D>nYOIIqX\ +I0PCaP+&,H]"uMjMuY^57K?9[7fQ-^]CtUmL.qS9!)WM]!)WYa!^6T8r)<]7`9YPL?;Zu/9Ps^p +#I@+'b0"No]D_*uf1^nsaoe_@@+Y>D!l+dfr^HlarC01O7Rg3D7SlQD:e!oN7SlQD:e!oN7SlQD +:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:duT.J,~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAqb"#Vef2?#<42)-gCr@nC30ekQa +0`s9f0fAna!&a:$#;n4j2)S$%I,^=mED&Coc.^eTc+U0IP_+1+rb)C7?sm%6@/Xa=EW17XK(O?f +Jd.-tS#!*o`kg:/PQ2s,0`X*+0`ja9I.ia)AP<"W!&aU-!&aa1!\aU1r*f\Ydd,Nh?qtND93V7W +#C/tKf[t.9I/T61M+`d*fE8TZ +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%KY")_[]DZ42LDImBsrFH(KAS#cX +AHQg]AT%HX!,h=<#B"*aDGgH?UuLbEI/jfY38-M#3&2p/,Sq+-rX8l4#RCV4#lP/3&H3@;(\AC? +(Btg(,q(2t2ShNX,QLF7AH6WCAHF=]V"X0V<<3#0!,hXE!,hdI!aYk!r/:Z)6gHo8#Qnp)!&=E= +#FGKC4Zs;UV#BZ^bQ&U\4TdG?*mFQL!ic5crac(IrFJB7AS#ajASu'jDImBsASu'jDImBsASu'j +DImBsASu'jDImBsASu'jDImBsASu'jDImBsASu'jDImBsASu'jDIkC"J,~> +!<=;A7Ku[Y7SlQD;#Woa;!(4I;#<]^;#<]^;#3W];#3W];#Nil:e!oN7Rg3D7SlQD;#3Wa85W'G +iTBM3iHn6g,lk%)ap#V\N.#8!8sHVs]1"&MHV;#Nid:e!,=4o81ZA@_*M#/NuumHq^0r9Xcr +9W?1W_,a^trp9c69X4T>"0km(fDFqMC]HFa:e!oN7SlQD:e!oN7Rg3D7Ss%Q"&MHV;#Nic:e!oN +rC-lc7Rg5Q7KZIV7Ss%Q"&MHV;#Nim:e!oN7Rg3D:e!oN(BAs~> +!<]*.2>]*.2>T$-2>T$-2>o6<2)-gC0ekO?0f:[?2>T$12,6e\ +NolN0NaYRN(BCr&fEKO+P_*RLqb%Jq;cd.+@:4n'[@8?_T"#Vef2>o642)--P6i11>W"2.`1M>NJO;#i1&2)-gC0f:[?2)-gC0ekO?0fAna"#Vef2>o632)-gC +r@nC30ekQa0`s9f0fAna"#Vef2>o6=2)-gC0ekO?2)-gC&cdF~> +!<=_MAHm$`ASu'jDZ42IDWYL1DYmuFDYmuFDYdoEDYdoEDZ+,TDImBsAS#ajASu'jDYdoI;@!8> +gZIl-gID5Z1&s)f4U!es,SpjmqZ%05(+1gk7n5U17lj.$-SZtrrY>J>pAjh$!!r%M8_racCRAS#ajAStBG1%jo77gT$(")_[]DZ+,LDIl'5AG_;dJOo/k"ulU"mHpp]r9XcW +!%g>s3!C)Prp9bW!&FO:"#:#cbkpcBM#^^jDImBsASu'jDImBsAS#ajAT%HX")_[]DZ+,KDImBs +rFH(KAS#cXAHQg]AT%HX")_[]DZ+,UDImBsAS#ajDImBs,QN>~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss(R"&MHV;#Wod:e!oNr^Hud7Rg5Q +7KZIV7Ss%Q!)W2T"&MHV;#Nic7ndO8kj8V]=\MLY/-).#aooP[N,;Vp9F"F,H^1bGa5PG5s5=78 +a2"jOL3m<*r_*GqCk\Upc,p&W!;o:d;#3W`85*1N7K?9`7KO_5:ARojAAmoY!j#(u +q!A,p:Vm%Q#GOn(fAVHXIK%@k_,aFRqX";S!:3/T;#3W];#3W];#3W];#3W];#Wol:e!oN7SlQD +:e!oNrC-od7ReO$J,~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAqb"#Vef2?#<42)-gCr\4L40ekQa +0`s9f0fAna!&a:$"#Vef2>o637nZp8k`Z6s;bKM5+onG#fEBI*P]9b'9*\3n@;L.8Jr\6Bs,IAA +Jq%uaARSP5r_!ApE/Ud:c.E%e!;nPO2>T$02+pl)oofJ`7klms0`X*00`i'i>P_e0EmjC.!k1gH +plbb\:sK!l#HLL!M2l.?K)XC)buRSkqNCq;!:2E?2>T$-2>T$-2>T$-2>T$-2?#<<2)-gC0f:[? +2)-gCr@nF40ejCCJ,~> +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%KY")_[]DZ42LDImBsrac1LAS#cX +AHQg]AT%HX!,h=<")_[]DZ+,K('#_ikj8VB('#gq63&Fq4Tm_r,S1.Y!!`cW7r=?`[G0*rs4[h' +[Ao=: +!<=:b7K?9^7K?9]7K?9`7LW*_7SlQD:e!oN7Rg5N7K?9a7Kc:V9RGCXm0UgM9Mn>M7Pk*sl,j+> +P'p[99E\L>Q*])Vm0)%ITmKrA9ES=;N3(FL!u2G<;#Ecg:e!oN7S-9Na7Sa"=\&H\"&MHV;#Ecc +:e!n`')5E+DXPXKYtV=sm/tCG9To=r!Kp7X9E926aofIk9Y:,f'+GRD7SlQD:e!oN7Rg3D7SlQD +;#Ecb:e!oNrC-lc7Rg5Q7KZIV7Ss%Q"&MHV;#Ni`;"I-V;#Ec`+TR#~> +!<&I9*A1!CjClOP6?_fEFDfF9*84?Pdf&m!uDA#2>f072)-gC0g&*(K(P6-;b-gA"#Vef2>f03 +2)-fl%/=93K'q7m]hf022)-gCr@nC30ekQa0`s9f0fAna"#Vef2>o602=iO&2>f00'``a~> +!<=^nAH6WFAH6WEAH6WHAINHfASu'jDImBsAS#cUAH6WIAHXsm!(Y9"m0U0T!!lJ6AOukLkrf,, +,o6jd!!F&uD4&P]m0(Y#I7G(P!!p"#p\hV"sBk&fP=mDImBsAS#ajASu'jDImBs +r+,tJAS#cXAHQg]AT%HX")_[]DZ+,KDImBsrFGtHo47o>r+,m\!.Y~> +!< +!<"_LNr@n@-!-@P["211L%Mu9[$(lXHu*(`91r)pMmL[[fE/M^ +(]H,h2>T$06q^L2oTKE<911Klq_8(.r%S7*!%@SN!2Ar7!ldlQqi_,B:eR&LfE8gFJuek&!c^kT +q3(l,!#P&X!&aR,!&aU-!&aU-!&aU-!&a^0#rOFl2)-gC0ekQ`0`X*10``!hJ,~> +!<=C7AHXI_!(WjTm027"0`V25rFH%:!$LYl"#;/9"o\K(0iaUb[-\7UUhr-u!!!$.)_F&$4T[A= +1B(hbDYdoH.KCNto^)e9!%MPtqdfbFr+,q;!''_3!+G=Z!]C%,qs=L?!<=DA4TdGY(Ff;G!Y>?e +q<\7'!&EtR!,hUD!,hXE!,hXE!,hXE!,haH$#X +!<=:37K?!Y9ESFPZe,$?#hQ\RF%f8)8P&_J!<>jaapPD4D,s>(;0/GHiN)>Ja/F_qr_*E*IA4=- +aolbc1e(=@7K?9a7fH'^L>hak!lmu+r^Hud7Rg5R7K?9a7KPCH4n_hT`:(hL9SWE2!gQH-o?%,_ +9U5D?'8ccH7SlQD:e!oN7Rg3D7SlQD;#Nic:e!oNr'gcb7Rg5Q7KZIV7Ss%Q"&MHV;#Ni`;"R3W +;#Ecb:duT.J,~> +!<t[gc4>m!j!/4T7&;2)-gCr\4C1r\4I!!(6Hh!7L>g!D@##P6,PnK(IUr +JkKqTP7ppr,;D&10f:[?2)-gC0ekO?0fAna"#Vef2>f022)-gCr@nC30ekQa0`s9f0fAna!&aC' +!&a[/"#VeJ!.Y~> +!<=^?AHu*_!!!d7R*>Bn#gB)]3WK-c3)]Wb!<.`trW!$/(F_8s +4Tlr/8S)f=AH6WIAHXI_!*.eFm/jZq3 +!<=:17KPtL8,Z*]=oD_.=oD"q;+sRV7KErEou[TBN,;Th9Mp/1a.hr'f<^3Dr_*GqD2"^hi5u'[ +!<#@h:e!oFr_*?0_"$doPtX_FqF1H]r^I#e7Nhb,p/D$KnB(gD9VM:L!ddV"ou[>p9RHO$!B:)I +7K?9]7K?9\7K?9]7K?9]7K?9`7L;m\7SlQD:e!oNrC-c`r'g]1!.Y~> +!<j:..5>0`_S.p"0S[P]9_s928o8JteG2M0WZ6r_!ApEJpm2i7J&m +!<"VX2)-gC6q^0VJ+8^)CeHWCqCqt-r\4O50bj[mp0n#gnCRf^96'ck!b"`dp"0>194@RY!@%U4 +0`X*-0`X*,0`X*-0`X*-0`X*00aT]l0f:[?2)-gCr@n:0r%S3e!.Y~> +!<=^=AHH7!(B"45(B#9S(B"47#V%h/AH +!<k/:kK47F!#J+$ +7Rfp?7ncTt]C5+fD,L:%"&MHV;#Ni`;#Wra%J<[#AFR_C\kJgmm/h,uReOr,U.fF_q!Ac:$k5Zq +:e!oN7Rg3D7SlQD:e!oNr^Hud7Rg5Q7KZIV7Ss"P"&MHV;#Nic:e!oNrC-c`oL8gWrC-c`r^Ho3 +!.Y~> +!<&[)&cha[$+HCD:eOG[@<$mfP6?nnCgC!=9*J.*Js#,&O"#Vef2>o602?#?1$2%a-Eq%]_`_1=HP6+o\V"`LDX%QWVplcCt&d^9I +2)-gC0ekO?0f:[?2)-gCr\4L40ekQa0`s9f0fAk`"#Vef2>o632)-gCr@n:0oJ$>'r@n:0r\4Eg +!.Y~> +!<=C0AHGah.f:(^.fVI.;Y=T%,QRX'#r3eD)rI3!!NB3(F1Rjk<084!$l,n +AS"b!('"=qV!m[O0aRbi")_[]DZ+,HDZ45I'(q1`Jabf(2?81#m/f!B./,k,.0)*Wq!AbV#81TZ +DImBsAS#ajASu'jDImBsrac1LAS#cXAHQg]AT%EW")_[]DZ+,KDImBsrFGtHoOS#?rFGtHrac*^ +!.Y~> +!<=9o7f,XV/HD7S#:J=GbH_JKBm02+WTn[/Tr_*MlATWWpXLdiB$Yo`!7RTg<9MATSfC&#- +a%T2&7K?9`7KZIT!$1]2!6"BL"BJ[.a4L4U"6!W`WVO[=Ytncdq!A0)9E67(7K?9^7K?9]7K?9\ +7K?9]7K?9`7L;m\7SlQD:e!oNrC-c`rC-lc7Nhb^~> +!<WZh`5U]hh[gplbec9)o^p0`X*.0`X*-0`X*, +0`X*-0`X*00aT]l0f:[?2)-gCr@n:0r@nC30bj\=~> +!<=^&Ac$$?5QE524U +!<=9o7f,X_2umL3b.<:&9QR/QL[>8sZ_<+c;>j/r:L7jZKp%n(XLc!ZrQ5Ma\u[Y59LhcM;23-W +m/i#98Fo:P1]T*!;ujK%ap,G2FG7Q1 +!<E3M,%*kqq)"q<_eMHP8.M!9)p.j2)-gC0ekO? +0f:[?2)-gCr@nC30ekQb0`s9f0fAna"#Vef2>f022)-gCr@n:0oJ$>'r@n:0r@n +!<=^&Ac$$H=o]U,4Z45[!'5nCL[>8hR!hs^#lO`2!=02L)^Qma1,_$MrB1NJ2DP[J.M`!a#Z\:u +m/g8f;Y+H$8H;BTMuZEA4U*e`',rn_"o\K%Wr)/cbQnA1q`P$@"UN?Im/TZU!"hP/DImBsAS#aj +ASu'jDImBsrFH(KAS#cYAHQg]AT%HX")_[]DZ"&JDImBsrFGtHoOS#?rFGtHrFH!]!.Y~> +!<:J>iMJaNI(#M7#!Tn[Vr;=I6]:M,m(l0SQ2;+L1H![Rh:oMbh/p +!<T$-2>Js,2>o692)-gC0ekO?0fAna!&a^0 +">qng'``a~> +!<=BrAbosC&d^N:!<>0gJaNI(#L'T;I8r +!<=9o7f#US,m-q:F2rk!o^)kAf>,#$TqVIN#)8D.Tru#Zjm<,C9M"_D!>5k6;uhLCap5LR=i]pA +9O@_@!i\t-qX"?X9VVL.!e!b9q!A9Z9Q\E/%7IQm!?hGn~> +!<M19nsEH1to#%_UeEHceejc]ac9/Z8p!=T;,@K;G^fE]Dm;hC3\ +947bO!jb^)qNCu#9<8$D!eO'bplbo%96o/E#qiS>!>PTb~> +!<=^&AbosA1("$^3jjP+o^)k;bc7J#I=;*3#$#MWI?:8Kjm<+t!)iB!!?)UCMu[_g4U3kG(:EP* +!!rQe!\FF#qX"?4!%Ik0!Z(ibq!A96!#%L)&n&(X!A+;%~> +!<=9o7f,XX8PDfpa+iCnt)ao[`" +LA:-?ZV4rQ_#P:X7KFY4J,~> +!<8+A;8!%)a[@K;hhfE/*HI/]<2G>!knfE.O8Ac%YmN_><0fE.O8 +Ab_GnGtVi'blAB_0``!hJ,~> +!<=^&Ac$$A2uiq5[=R_bm/l#J(@br;!% +!<dZ8Pr/u]7K@fm/i#98Ff4Z2un$Bb.4L@P_k6\S#Q#%!g67/rTsZ59W\69!d%,7r9XaJ +9SLX3WD@.$m0C[-?GXdU!%kNH!?hGn~> +!<rK@:k9=OoQ!dRF\r0%AG +98hHTZVX`uP6Z\9@*R?'!$8I$!>PTb~> +!<=BrAc60C3!]L=Uk.pOm/g8f;Y"B.=o]a04\/LV@;'=b>Z:5W![RijrTsYV!&FO:!YYQhr9XaD +!#n'a/HI6om0C$"#WOt$!'ml%!A+;%~> +!<=9o7fPp\85W&gZ[qM]m/k=*8+B%M,ljP#ao\;2]D_*uf25lQaoZ-Ja8PB1]1eC1\lMtcq<\I> +=]W,Vb%gu:ZUOs=!.Y~> +!<28+A;8(BCGufE/*HI/T61M,%IWfE,_ZK)Ll +!<=^&AcH +!< +!<PTb~> +!<=BrAHYmH!#C?@mD8/k*WTU1( +/cIm6&cf4K!A+;%~> +!<=9q7Kl1R9Mq)6JaL;@!esB?n4!EY39nWjWKNFUD,Jp_m/hW.WW($JWD$0SQ!$eTb'csWq!A-0 +9Ubq&!=TUH7KFY4J,~> +!<5gH0``!hJ,~> +!<=^(AHcHk!!mGrJaL;@!`]4[n7;V#&F)C_/L;]$&.$MXm/fcX/cIm@/H?&nD&*+#4Vn*Hq!A,Q +!%@e/!='OKAH=@_J,~> +!<m33:QeLciVi-Tf3(dCKu(p:AP>d(U<8ouHhct0 +ThL1=ao\XE-*fu@+TR#~> +!<.QM,R&DMp9nfBM2!+X4X4@@JH#f +ED)5gfE/M^(U>ar'``a~> +!<=BuAHXsu!(Y7amD/)jO8pd"AHH$8*pYrh&H2Y4!@7aog\pLNbSC0Z)`Tu9$ig85.6T'Z8,2HQ +I/k5b4T[A=19tHl/HC;~> +!<=9t7Kc7P9OPJ`mD&#j^e[Hgn4!I2!1N8s$B.Z5f>g`pP"]KHrTsa.TlWn=rlY8Ps2kGT:LN/W +m/k'sAc0[PHN5n.7KFY4J,~> +!< +!<=^+AHYmH!$7qemD&#jWWs#gHB!?U"k +m/j9f%/`6i,lgNBAH=@_J,~> +!< +!< +!<=C#AHXsm#]8=ImD&#j[0R%9mpuPG!''[8""b#o/c.[3"Yp#D#)<0t-ik^Mqs=H%!%%M*rs/V4 +q<\:.('Q\q4TZE"@'X>E/HC;~> +!<=:!7KZ.SB#h(A!o`P*PjJRg;+sOK7KErMp_NX +I8$U7m/h?&WVag=,n7+K!?hGn~> +!<PTb~> +!<=^-AHN\J-ag,E!o*+sPjJRQ#QRcjAHYq@./c:11&ub$m0,NN1*lojqX";!&H"Zm +(BB6cm/f +!<rm.m/s[j;+U+E!^6Thp +!< +!<=C&AHYm:!,^Jtm00nZD)s$Mr;cd%%2L!4-TX:Y +!<=:$7KZ4U;7j=)"4sl6D>d-0S +!<5_(qbtqi4PDN%Bc.L[<98WS1"a!CqbuS$FP6"`urn%=m<`>%SP6->/E;J2gRfFM70``!hJ,~> +!<=^0AHOml#c+rs"3d-41&V(R"V2:F)[d;q',M2k%h&^L"TeQ%"p"]>3c18=XmH4-!#AK"AHG*s +,kjG22uuP:mE>hA3'BDN!6kB."c!'s3!D&6m/\RCr]L?A"W#kgm/jZq&,JEj,lg38AH=@_J,~> +!<1f4I]H7-mAI+TT*r\tZe5 +ao\#*Zi9=sY"X8db(WOJqs=Q.9WWY9iV`'D;0;f[!c1QNq<\:C?rjl8aoYfJ33bpR+TR#~> +!<?0'k:s'`c8+`iI,V +fE.jAH2a!4G>!P?fS`C_qi_1h9=KLGNr5(A:3lik!cUeaq3(o@<*%$8fE,O_/[7#2'``a~> +!<=C(AHOml-d90h$eq%K*WQ0@#T"dB3:/j52DQj1)\<;S!!4NbWj;!pbU3B+@-hG//H@[l2CUQ] +4T[#3R/ZIXO8p([4W=CUqs=PJ!&>>jg\gF>#S[2#!Y5:=q<\:=*X+Iu4TZT'>-VW>/HC;~> +!< +!<.G@8!rZMbB*-P6He< +!<=C)AHOml-el<$!k!G2rW!$/)_F&.4UF(s)[HED(0.0b\*X97#QQjLAI&nT4XgC3!#mor4TZ0# +g\pLD7fY,()Z\Xim01]>"W%0_rTsj6!#n'a,QM]Vm/g8f.JZ+.$kcsQAH=@_J,~> +!<=:'7KZ1T@,\lf$/rLN=\MLqIA4R2ap5M@Cem`-L;:Fg"Kl-+7nDo7%n$Clb#Vo^F%fWGb0%:h +LA^ECiE93tN(hk"m/tC+9Mt`T#,+_ib-=`Zq!A-p9Q^'P!< +!<t\5DK#'!;BfY(*bplbc,96p +!<=^3AHPg1*o"Hs$/;7U('"=?(F_>s4U3kk%flYG +!<!.pq=Y3kVg;-(NUN(h:h +m0L +!<<>;N`0!'q:GbJ!#Mjo!>PTb~> +!<=C*AHEVQ[DD59gR(J:!!*KR1=A;j3$f(8!#BFq_!M8d-NFE3k[b8r!%02qOR;G2#R*1N,QP7L +m0KKf'/BPBR!m3Vm1.?g[I*?O +!< +!<,eO"Vh$NJkM.'P6QM0ES-1B +Nr"qEAP8h`:eOG_pQPSL"`_Q7PY6#kP6,;gX8( +!<=C+AHGa0D8Y`HgQ4o*!!*`]36XMj3$\n4!&8oV`pEuSD&**W3+1o\"YB^0(BE4hm09Qj&3Us4 +g\U:B<<+Em!<<*Ip[.q["V +!<=:(7KQ(WiPt6jiN@N$9M]c)_8aV%Z%Z4P:OB^sm0D7:D+mVn8OVZ0";2HlD.*;/"dMcUN(h:g +m0MZY +!<"_LY4>,_M":Q+!EE)k""`-i4PY6W) +P6d1J +!<=^4AHEVQgW&UdgQ4o*!!*`^36")c1)gAs!Crs/m0Cj`0`V1h3+1iZ"<%J-&0Cc:"`45g,QP7K +m0MGf"ZA=l,QM]Wm/l#B)u_u%1''-)m/j9f'DFWk&cc=DAH=@_J,~> +!<Gap+S^:J=oVa3s>\f<0j99MA;W8E3/C6i\fT:NQI$#2rEj\kHu" +qX"@)9Pj^N!c1QNqX"@99ToCt!c1Q^q!A,jQ6N7KF;*J,~> +!<c0J0`_meJ,~> +!<=C,AHGa0?os4U*>K!< +!<Bap5bGAP>m@Y2S=+rSdds"LFeVF&Dp1"%Q$U7,^T=1]Sh)AsN8\ +#aJ)bN(dB>^t8MO#aJ)Hb0%:r=lK8F#I@*ub0$/HQ2'_JThLXDao\gJ-*Kc=+TR#~> +!<u(Al"%Pa:0&\Mg,60)i=)@bt +#]*/CPY4qkIu4)e#]*/'f\"2E;i^a=#C/tCf[uumD"s1qED)eqfE/_d(U#Oo'``a~> +!<=C,AHFgkWlj]5Uf@[#!>?on4U3qm$ig;hOPA^\rS.@["IOU;3XG]b!u<@a@,YZ#8H9)5-Z/bJ +#]0Ps,QJTsWm(D.#]0Pf4Zt\,(>J`R#FGK?4Zt1nD> +!<>f>kM+Q%j?l-2:167fl7D7,:<6,ljk< +m02*8IEJ9jr_*b`d~> +!<&8J@mZRs;M1U,!Ch6mR-hp@77fke90&85`(BA=I +P6He9K%R,3r_!6&r0%Cf:qbN6X&)u[r0%=r9?l,6<`JjX!f9Zcp=KG)!$e[%!>5B_~> +!<=C,AHF=]gWf*j[;?ZZ!"^P<[64dN(Bjd=0l<<%md1>8bdF7.D,iVE$MXW$('6H^@,5Aq1'!a; +m01]6(Hj2QrVupur9Xb;!AZf$.020Xr9X\g!'!,$"WmI+!mCoYp,rI)!(jA*!@.Yq~> +!< +!<e+BUd8MfE/+*@/W_1;d*U@;bm3_"]/S]!%(,44T@:j +0`_[hp6,M\1&O!`B"PY;$%m!.Y~> +!<=C,AcEOlm0Cj`-NF,T,ri(k!\"okr;[EF0h4`N0Ts&.H[ +!?)UEm/\pFr]LBB-kHBYrTs[1!"Aii![Ib9rTsjE((<>h(BCK1m/fcX1A3j4(B@dFAH=@_J,~> +!<D1.+sR\I('b.7uj7*nC(!(chN!hi +!<t[guMoMaK#KF*7JpD$1 +!<=C,AH&/Q92-n-o24Z3NX@*iHc!)iOX!dt&, +rB13A!@Rg4!dt%fr]LZ/!(Yf2m;2hO4Z3:1q!A-j!#P;k!=BIBAH=%VJ,~> +!<b`d~> +!<t_6Cf[u*T +=*\4IES/o_98WG-!`rFBp=KGk!#;Xk!>5B_~> +!<=C,AH +!< +!<`VLM,$]?Ph=Wa +:eOH5c.JLYD"s1qGtXCpfE.NB*j.3u'``a~> +!<=C,AH=7\fBigeI3&@g&1BMo4TdD=+CNQ-!\sbUrp9f9!!*,u!!!]/4TZ#tbl-o?bQn1L,X":= +!<<*93'APfD> +!< +!<]hho,P6"T_qq)4qWM6iLf[ss>/Zpf/&cdF~> +!<=C,AHFgk[G(!PUdkCb#UD<^4TYrj>0ga]+;3H.m0G'F6Tm"H)]L7%4T[A=3rJ@T[?**C.6TgP +-oO4O1''-(m/[t+q`P6V>[^Pu4Zshd>-;E;,QN>~> +!<Y--es\!''rE!FTa6ao[8jY5@SfiDF^naoYmHfD+_7W(`ZY +aoT%jr) +!<389FA&G. +fE'$Er*fbrdPV$,0`_meJ,~> +!<=C,AHGa0D;FR`b\\*q!>d>?4TZ`+1 +!<q,@E0$l?$8!>b`d~> +!<5B_~> +!<=C+AHEVQgYhH'O>-_8$mdlb4T[28'$b%i=o`^Dm/\pFnN?t6#Su1lm/\pMq`P!"!/L@:!o"Ir +rB1-Zq2>B"#9^-[!@.Yq~> +!<b`d~> +!<5B_~> +!<=C+AHG0uD<(!fbZ+oK"W&qF4U!u9$347;cXd/C!1EfQ".0'!2Y'!4/HA< +!<Q?(p7KOA+iV`'OPtXkfKqbQO]!8?A_>D@VI8%!Fm/^@, +r5o(P;:kU1!o[9grlP8[AGB+*/-%N/7KF;*J,~> +!< +!<=C*AHEVI[H?i\bZ+ZD&.(%A4oRSG)uqb=AHF+Wg\gFED#aPH)_!?o2Z>H33;Yi?(BBj#m/[t6 +r&k)i#gE)2!o"Irr]L9LJbY0*8cVGbAH=%VJ,~> +!< +!<"b2fDps+@KI_R0!-i/&cdF~> +!<=C*AHPg1*o#rH#c]oc!%Ll70am/kL3(AIk2#T#8q4TdYL#gE87!?MgN +4TZo0IJ<+1O8p^.4TK?nMuka7@'*u@,QN>~> +!<b0$eZ +F8bJ,AnCta!l7oLp?_lg +!< +!<=C)AHFgkE'!,XF,QN>~> +!<b`d~> +!<5B_~> +!<=C(AHF=] +!rs-,7#j_>5>4a_]CkOnf;O$nr_*AT7R[,C"$\=:9nURi9`QK_7KXG,9ZQMe&]\9QR``ch9U459 +9T7-:YtTNb`d~> +!rrrg/rhXh018H7I.`[0M0*0$91qZ90eW>X""thu;M3U';?.NV0`r$g97lMo&V5B_~> +!rsTX@#ee$?n).(V"O*]b_J[o!!"K8ARPCH"(4Fq(P=jP(B?56AHO1X!4D1\&[`Y[-p9^(!,]rI +!$j]j1&si +2ujaa7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R+d[ +s$R&_9MATSY/gOn"Mh@/HWg;@"A)!N7R[#@!Z(iqKusIZ4Y3YHZf4Ig[b/%Zg9EnP6 +b0"QsfD"Y6a%V3daoJ./ +2ujRG0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770e^F! +s"4L<91r3"GCogN"Fk]5@8m.u"[kI*0ek5B_~> +2uk48ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARNDe +s'Q$j!!!dOOL>)3"KIi+7i)(("Y)K>AS#9EAHEtS,_\A_+oib.AHNPM!0HO6#0\Fq1-IT*rW!-+ +3'BD9!R1<*!jr"Ir]L6ap5B&4!+)a +Er["G6q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R6 +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5PmnO +5"S9>9E\3_8Ou&97KYgS%(_5:"cNEj5=S&c7KbmT*DD4Qm/km:?N/(QWJm"Ob0$\WQ1jSHL.o2X +aoI\$)\#3:7KF;*J,~> +ErZh-/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70DdI* +0K_l#9*A![4>eh`0`s*0'#o^Z"dAun0/5*(0a'01,"lM4P6-S9@/edaZ]ps!f\!N'D"a%oAP:&B +fDqZ@@K_"b+pfm'0`_meJ,~> +Er[Is?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W@/FL: +?8r_q!!EQC3)X)RAHQ6=#<%?#"XF'\?tE`jAHZ<>1&t>>m/kK;#lZsm/L2W#4Zt@sD>*>u<<+rV +4TJpcN!,rn-k]phAH=%VJ,~> +IK10R7Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"0 +7RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^1 +7R'@17RTF2r(6oZ(I(AW7RT^17R'@,7R'@,7R'@,7Rf3715O'VTaUo\7RYHi"=sO99j-`J!j54[ +q8rbM;:kR0!oZgprQ5+kq,@K?Z)[j@X%!++!.Y~> +!<"G$fE,_]M>*28N_=ZrfDps-@K_S0_Z1=M0`_meJ,~> +IK1X)ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnW +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARJhBr&F^S(LUf^ARK(WARK(WARK(WARK(WAS"F5%#@%M0a@\^ARN_n"@<*!(Dc9&!g!C. +q)ncf#gE&1!o!\grB1-tq2>HWbfBc0X(;;W!.Y~> +IK10R5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,6q0R66q0R66q0R66q0R66q0C1 +7Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7Rfd8 +6q0X07Rfd6+%AIa5=Rk,7R'@35"7q06q0R66q0R66q0R65=QdrA;\M4Ym^Ul7*7t&+TP#/9Yfo[ +!FSt)ao\P9Q1jSHThMHaaoH\^-J,h/hX@<4,!.Y~> +3<0[H0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7/hnt5/hnt5/hnt5/hnt5/ho$! +0`is^0)RI(/dO0b0eY770ek?[0bQ)n/hnt5/hnt5/hnt50/41ACPpaI]b1;s0$5mP'`_E=97Q2i +!E<+rfE/BPD"a%oED*Y:fDp[%@KjZjP5lXVX>'_g!.Y~> +IK1X)?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ +?tEnWAS#7W+(\hk?tE_WARK(\?tE_W?tE_W?tE_W?tE_W?tCni*f<)`1'[e_@*3$a/HBfa!35;N +!?MF@4T[28D>*>uI/kkt4TKU"N!7;HNW;=PXCVDX!.Y~> +FoW=J7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@+7Qs:*7Qs:*7Qs:*7Qs:*7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@17RT^67RT^67RT^67RT^67R'@3 +-pC*g7RT^07RT^67RT^67RT^67RT^07RfR27Qs:25"8"07RTHR!/ulZ$G%8Y1djet7R'@,cUJ'N% +9-5!Hg0o!W(`r_aoZBViV)X>AmYDX!-n?>#$eF<=TCELX@<4,!.Y~> +,QJH30eY770eY770eY770eY770eY770eY770eY770eY770e_rL4>/EB0eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY760eP150eP150eP150eP150e`J[!\Q2[r\4g60eP150eP15 +0eP15oJ$P&0eP*f!0iGp$H=1g,;(](0eY77cS5S3$"@46@HisWFA&\3fE-"eNqSY;=((sY!/C>Z +#&D<$B)jM9X>'_g!.Y~> +FoWe!ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(\ +-t$UoARK(WARK(WARK(WARK(WARK(WAS#7\ARK(\?tEnWARJma!$mLd$8r1j8RQ+;ARK(WcXd7u +&r_)98*TCBLB&e#4TZ-"g\1"8-OBW5!-J'r#*[9TAcQ"BXCVDX!.Y~> +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rh+5"7_*5"7_*5"7_*5"7_*5=Rk, +5=Rh+5"7b+4s3d:Oc!3/Kh(BAs~> +?N:]n0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70CCOt0/5+70DmO)0Cgh)0/5+70/5+7 +0/5-X0`s!6'!.,G7)gSS*\K0"0eP150eP160eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY0[,%>"L:kItr!fg*/r7D([95O +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?m'#gARK(WARK(WARK(WARK(WARK(WARK(WARK(Q&dL.O4[_18!'jq'?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_R!&BLl.KQsBm/l#C +(]6Dt1&u1bm/jZq,lBe*D>K1oPK_6.!30T2,QN>~> +!rs-,7XmWl5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=QYX7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Pk)d\rb''_(>X57RfR27Qs:2 +5"7q06q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0!5/6#SH9Ps%] +!HV<>aoZZ\fCnS5Pt\deaoI:o<<'!"%2,[1!>b`d~> +!rrrg0n1i20/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/4J#0eY770eY770eY770eY770eY770eY770d?Z@`fSgTbqT27pG"TZ0eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP1*!&J(n?;"JdP6"rir7D'r +:l4n0!c1NLr7D"9q-sBA!=9170`_meJ,~> +!rsTXAUe*!?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tC?dARK(WARK(WARK(WARK(WARK(WARK(WAOuk.2NU'j3"5jCAS#7\ARK(\ +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tDn08rS^S!& +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,59`Q]7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@35:cd\_32r,_(l!:7Rfd86q0R6 +6q0R65"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs9f!(6`b!`2RU +lKnY<9Y15G!l7QWp$Dc_Ac'UMPke99RZ@Fp7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R,Zt!>b`d~> +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70-W,(0eY770eY770eY770eY770eY770eY770eY790-UBDc'$]hbr#J;0ek:8/hnt5 +/ho!+0`i-k:B"](=%dApP6,Pn`r=TlbtDL +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?m9/iARK(WARK(WARK(WARK(WARK(WARK(WARK(\?pXi#30HEj3",dBAS#7\?tE_W +?tE_W?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK()!-/!s!_WN1 +lKnXi!&jg>!]U0Mp$Dbq%/W0f@JPj>[\a$[ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARO;)!@.Yq~> +!rs-,7XmWl5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Q\Y7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'?g!'$1b6,>;V,sFd_7Qs:* +7Qs:*7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7RT^67RT^67M5_! +!rrrg0n1i20/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/4M$0eY770eY770eY770eY770eY770eY770eY6t!'HIt#0f"*(GRWtpb=KV +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY760eP150eP0h!;p:-6r7^cP6-#& +Zi8SYPY6W%P6->/Pl')5[eXB;H$9650eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP160eY770eY770eY770eY770eY770eY770eY770eY770eY6o!.Y~> +!rsTXAUe*!?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tCBeARK(WARK(WARK(WARK(WARK(WARK(WARK()!"b>W5r]8Q114[$ARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WAJtRHMukI0 +D +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,59iW^7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7RfQb!'QUi9YiIa+[8F\7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Qs:*7Qs:*7Qpf/S#UX2 +<)?:_L>hOe!ln!'rlP7J@.imgPt\ddaoK!I<*M0Z5=S%15"8"*7RfR27Qs:25"8"*7RfR27Qs:2 +5"8"*7RfR27Qs:25"8"*7RfR27Qs:07RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^8 +(BAs~> +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70-)c#0eY770eY770eY770eY770eY770eY770eY77r\4Hh!'un&2U+)Z'e_9p0eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77pb<12!'.!FSn"P6,Pn`r"Bga7s*H3<1]e0$uC#/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt50bOJ:~> +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?mB5jARK(WARK(WARK(WARK(WARK(WARK(WARK(WAS#7$!"tP[9K3F\/RW-tARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WAR5?t^;?q0 +N.r,K~> +IfL9Q7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7O12f5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk*(B?Ubb!W`l!$sj!5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rjo!,;G; +!-\?@"ADToW8[44#M2Y.b0$t_U%RdRF'e[b!+bn)rs`+#5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=S%16q0R66q0R66q0R66q0R66q0@07Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"* +7RT]^!.Y~> +IfL*60eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770dJD,0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+4&cb4afL*Y5!#I:C0/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+)!-eF` +!/gbb"@Q'bFH5gR#Dl* +IfLa%ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WAL(Yp?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_R,QJID4[V+:!&@qn?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_;!-nLe +!3?*X"=aEfLYM:b#L!/n4ZtP#IJ)t.3XGOE!.js)rt8IG?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_WARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnW +ARK'p!.Y~> +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5:&c`7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@358O;_RE@q/,lf5\5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5:$;q +rilL)>lI\5;FaDmH`49EL3muRD0qu8qs=X?9T7-:KhU+km/^")q8r\gqG^]p!$OQr5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5"7_*5"7_*5"7_*5"7_*5"7_*5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5"6=gJ,~> +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70-r>+0eY770eY770eY770eY770eY770eY770eY770eY790+n7NRFjpI-NFr;0/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70,FVg +rl>,XC].]P7nZoqFEqk;@9lr<@<%>)P6Zq;Ph=WH98W>*!Dn(;fDps.@NSeS'e_9p0eY770eY77 +0eY770eY770eY770eY770e_lJ+tkZ(0eY770eY770eY770eY770eY770eY770eY770eY77r\4Ed +!.Y~> +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?mTAlARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(\?mG^bR6o!DfKSPqC +IfL9Q5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7OLDi5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=?:f4i*Z27'Rd5/O)]o +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +&e4cD!-\9>!`i2sr_*Sn +IfL*60eP150eP150eP150eP150eP150eP150eP150eP150eP150eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770deV/0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.mk;6-YqP7(j]C*\T6& +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +$jljQ!/g\`!`r]7r_!MnF99e)]?s!#b!eO(7q:G\UqI3\s!$X-N0eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770ej:@J,~> +!<=D#@!lNnARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARJmJ,QJH:S397q#lm4uAS#7\?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tC5hr6,/Ar/:\\H$TAh#QY)7%h&I=(\!h$ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(\,QN>~> +IfL9S5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5:Auc7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Qs3`!&D-Wb!i!4!%gE) +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=>r1r366UqG[QJZ)P#*ao\P9LA^ECa%VZ=\kJC^m/itTZ1uHAAG]>2,QKen5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rj\!.Y~> +!< +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?moSoARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARJmt!":cW4[h(1!'jq' +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?sjU#r6,/>qMYMn1+b9Y4T[28 +-3+iM5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_#ImuUi5=Rh)5=Rh)5=Rh)5=Rh) +5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@t*+T_WbZ(T6/Oph=I +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,4oe.OYlJ_=;uiWeao].JLA^ECZV7@@P"`phm/_9/pW +>Q>Bh0.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn20ek:60ek:60ek:60ek:60ek:6 +0ek:60ek:60ek:60ek:60ek:60ek:60ek:60ek:60el?S0/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nt4'`]AiT\)`'&ca.0 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY78!*B*>!.+KN!3c1M!ldlEr0%>19=*9?97li#!F8b#fDq98@U'WS/ho"60/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70+n88~> +!<=D#?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?qP! +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@_*5=@_*5=@_*5=@_*5=@_* +5=@\)5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%V)5"%V)5"%V)5"%V)5"%V)5"%V) +5"%V)5"%V)4t8rb7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7R'@,7R'@,7R'@,7Qs%+4tQaCSta@tHN4%& +7Qs405=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5<&XGr366,r)D@VFA0aQm0/bK]#o+lo^)ZTFSEoX\boE4:]M;$5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,(BAs~> +49-!K0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nn40.nn40.nn40.nn40.nn4 +0/!5Y!&"7*!&"7*!&"7*!&"7*!&"7*!&"7*!&"7*!&"7*8hMbO0eP+60eP+60eP+60eP+60eP+6 +0eP+60eP+60eP+60eP+60eP+60eP+60eP+60eP+60/5+70/5+70/5+70eY79*WQhPU=_th!!"5u +0eP160eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY77/HBG]a8g#R@Kg%HH]+]Eqq(sq97m)*"`-iOfQg6aP6"L*pXfJdr*ir;!"q">0eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY6o!.Y~> +-3,<&?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_Wra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra6FO?tE_W?tE_W?tE_W?smPR5QD$CU-2!m!!#T% +?smPRARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(W=o`14bQ*k)N!4rp+r_piq`Ouo!4Dal"`45t4VJ+nm/[5$pH8LIr/=p9!$l,`ARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK'p!.Y~> +IfL9Q5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rh$7Qs:*6n:Gj5"%S(5"%S(5"%S(5"%S(5"%S(5"%V)5"%V)5"%V)5"%k(6pEL.!.1Na86c-( +3(-/(5"%k)7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@!!,;D:!1Ngb"'A5o;>s5oCm)'7XE7-jqs=Q(?HUDsD>!8t^eC3jaoI"k<*_fj/O)]h +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Re0oJ,~> +H2nR10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10/5+40/5+40/5+40/5+40/5+4 +0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+4 +0/517r@n:)r\4C*r\4C*r\4C*r\4C*r\4C*r\5*>0/5160/5160/5160ek:6,6.^sUtA4J!!t50 +/ho(50eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770d?[BrQ"u9r*fb49287]9*]F*]uIO,94e!a"^5 +!<=D"?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?j1+L?tE_Wra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5h>?smRF?irt#!%"F(8/qUB>$t`L?smPRARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(@!-nId!4Mfa"(VB;#lXf/%j`th1(sXfqs=PA +#X( +GlSXM5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@_*5=@_*5=@_*5=@_*5=@_* +5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_* +5=@mq5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rjs%00,@W6.`K +4TH*Y6p=()7Qs4(6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p=". +5=Rk,5=Rk,5=Rgn!,;G;!NKE&q>t4 +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Mc&T~> +GlSI30/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nn40.nn40.nn40.nn40.nn4 +0.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn4 +0.nk50.nn10/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+3#lmlOW7X_e +5l_%I>r)I* +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770bOJ:~> +-3,<&?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_Wra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +q-X26ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5qA?s40C(IP,a#riOt)I?fZ +ARK)q?k-aUARK(WARK(WARJ(0GlGnf_NXnV#>5'@mG"F:(An.4~> +IfL9Q5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk,5=@_*5;#>g7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R'+,5=@_(4q[iAZ)YrB +Xp:"Mgt0W7Un5#*hleb-=X=p$DcfAb=+FM>gI[)ZW>l +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@3(BAs~> +IfL*60.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10/5+40/5+40/5+40/5+40/5+4 +0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+4 +0/5+70.nn40.nk10eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY170.nn10FRq/]rK]l +[jM.g0/"q40eP-*0bQ)n/hnt5/hnt5/hnpXB?7uVC\qQB=%eSOP6?AWEHI'6P6Phr^"C"kFS1gu +<+tpV!13[o>p98'0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70bOJ:~> +!<=D"?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?ijnIAc?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?'; +Ac?';Ac?'>ARJnWrEob7)?:+"W]^G>$32@N?iXd;?nc/"ARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK*B?jC7H!+sHr[$1BG!_WOJr9XWeLOFs%qX"K(!&?\m!/L77 +!?M[A4TK0pN*Rh3ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WAS!+eJ,~> +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@_*5=@_*5=@_*5=@_*5=@_* +5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_* +5=@_(5=Rk*5;,Jj6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF((6pDst%"bS' +9Tfea/O)Wm5=@_*5=@n(6ps7-6pF(-5=@n(6ps7-5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_( +5 +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nn40.nn40.nn40.nn40.nn4 +0.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn4 +0.nn10/5+40/#%5/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\h1/h\"@&rWjD +4IZr`*\T-#0.nn40.nk1/hSe0/h\h00.nk1/hSe00.nn10.nn10.nn10.nn10.nn10.nn10.nn1 +0/)uQs"=BQ,55OJ?:8o*P6Zq>E7igL96p5p!eO(0o[mU#EaiJX%kfXj0eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY-l!.Y~> +-3,<&?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_Wra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +r*TM9ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;qHsC\!!amQ4U*2;!'jq" +Ac?';A^=`kARK(WARK(WARK*K?i^6UpP]0!.YmQ]#L!Ga4Zt@sR.fnK[/_KE4^g^/N/R`Z?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?sk5[J,~> +IfL9Q5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk,5=@_*5;>Pj7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R'@,7R'@!%0/o0 +YKBUN!!"i?6pF((7R':*7R':*7R'@,6pF.*7R':*7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R':/5=@n(6ps7-6pF'U!)E8f!`2\5o'H[/9WZCZU.iArm/iPHZ1H+GWDl4b,sOU`5"%V) +5"%V)5"%V)5"%V)5"%V)5"%V)5"%V)5"%V)5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=RgQ!.Y~> +IfL*60.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10/5+40/5+40/5+40/5+40/5+4 +0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+4 +0/5+70.nn40/5(40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY770eY7+#lmK8 +YLlTc!!"5s/h\h10eY.40eY.40eY77/h\q40eY.40eY770eY770eY770eY770eY770eY770eY77 +0eY770eY.30.nk1/hSe0/h\gf!*f2,!`r3Mnrj;e9=NR+X%Rs9P6,Pn^%9la[UMu3(G@Er0eP+6 +0eP+60eP+60eP+60eP+60eP+60eP+60eP+60/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/50o!.Y~> +!<=D"?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?ijnIAc?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?'; +Ac?';Ac?';Ac?'FARK(WARK(@&c`\*Y<;t/!!#Ug?iXd;?iXd;?ijnIAc?'=ARK*K?m'#gARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK*@?ihGNKD1<+9*)Hkm0?,]1-IcL!35b[!c7omo0!=W +N,\hQ?smRF?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?o_e+ARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARHb`J,~> +IfL9L6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF((6o$tp5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_#4r426 +N3^T'\i9[&3(,u#5=Rk*5=Rk*5=Rk*5=@_*5=@_(5=Rk*5=@_(5=@_(5=@_(5=@_(5=@_(5=@_( +5=@_(5=@_(5=Rk*5=Rk,5=@_*5=RI0'LVXp"0km0fC\G3ThL1>ao\#*a7em$?s`BG?\p<61d4Am +6p=((6p=((6p=((6p=((6p=((6p=((6p=((6q0@)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4) +7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7R'9W!.Y~> +IfL*7/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/i#(40.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn20Fn." +Pd8q=`]O50/M8\20/5+40/5+40/5+40.nn40.nn10/5+40.nn10.nn10.nn10.nn10.nn10.nn1 +0.nn10.nn10/5+40/5+70.nn40/4[O'i+O5"2.`6M=cu5ED)5hfE.jAK(bB/<+,7K".(eD,Q9Ct +0)dR*0)dR*0)dR*0)dR*0)dR*0)dR*0)dRf/ho(60ek:60ek:60ek:60ek:60ek:60ek:60ek:6 +0ek:60ek:60ek:60ek:60ek:60ek:60eY-l!.Y~> +!<=Br@+AWf?6B4P,dKQ>2@oj,>$t`L?tK=F!+l.;!+l(9!+l(9!+k"p!+l.;!bGbNra5qA?tDn0 +(if>0"#:#qbk19(I/k5c4T[#3[J&tg*XM:!"_^L.8RQ-/?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?j:1M?tE_RAc?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?'? +ARJmk!.Y~> +!rs-%5CZ'b6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="& +6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF.*6pF.*6pE@p5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_(5=@_(7R'9l +!!#O#[E;F>'`]C@6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF.*7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R':*6pF((7R':*6pF.*6pF'U!"D^"ao\#*_"[3ta%VH] +b$IR<5=@_(7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':15=@_*5=@_*5=@_*5=@_*5=@_* +5=Rh+5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%k(5=RgQ!.Y~> +!rrre07PT//hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\q4/h\q4/h\n50.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn10.nn10eY.' +!!#O/[FeEW(B>1(/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\q40eY770eY770eY770eY77 +0eY770eY770eY.4/h\h10eY.4/h\q4/h\gi!!um+@KheEZVX_`p6,T&95)TLfE.jAJ+o-.JkM?t +fK)M&0.nn10eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.60.nn40.nn40.nn40.nn40.nn4 +0E!U*0)dR*0)dR*0)dR*0)dR*0)dR*0)dR1/ho(60ej:@J,~> +!<=C#?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd6?jC7N?pXhn(,iQ` +">C#[/RIIF)J*;f?tE_W?tE_W?tE_W?tE_W?tE_W?tE_WqHs;7r*TM9rEo^Q!"sq\N!4&]/HI6R +p?_sD!":jd4T[#3WqYl^[/_KA4TQ;urEoV:ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5h>?smRF +?iXd;?iXd;?iXd;?iXd;?j(%KARK*K?iXd;?iXd;?iXd;?iXd;?iXd;?jUCP?tE_RARHb`J,~> +!<6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="& +6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6pAj[+@JF^5=@_(5=@_(5=@_(5=@_( +5=@_(5=@_#7Q;1a%!/o#R6 +ao\P9]D([oL.o2Jb$H+u5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_(5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*7R'9W!.Y~> +!<,<"0.nn10.nn10.nn10.nn1 +0.nn10.nn20eF"<&pq+? +!<=Br@+/KeAQg>Z#9pW?"!.FB6N(:1ARK(WARK(WARK(WARK(WARK(WARK(WARK*1?j(%KARK*K +?ijnIAc?'BARK'^!!":!qht\O4Zt(k8,)BQLB%T>rB136!2TAV!`]4Yn3$dY')l8=Ac?';Ac?'; +Ac?';Ac?';Ac?';Ac?';Ac?';Ac,p9Ac?';Ac?';Ac?';Ac?';Abod7Ac?';Ac?';Ac?';Ac?'; +Ac?';Ac?'BARJnW?sk5[J,~> +!WX$)r]bQo5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5",B7!(?fN!(?fN!(?fN!(?fN!(?fN&O\fI5=@\"5=@\"5=@\"5=@^257'_A6pEme%0.]C +]?43[/H?5>6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF((6pF((6pF((6pF((6pF((6p:TCB)inK;ugY2ao[8jQ29kNiJ($;])9\PYtUkdm/l6B +D=G\T\c +!WWicr\&FI0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eWGY!&"7(!&"7(!&"7(!&"7(!&"7(&M>dk0.nt40.nt40.nt40.o!T0*s6c/h\k%#ll?K +]@^2u0`VM3/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/hd9!@fR_N@K:WNfE-t(D#0=uNb(js`r+Hj]h +!<=Br@*i9a64s8*.(_VF1(=3r>-qZ@?3!o +!<;:T +:PSZ3!gQQ\nB,*s!%^?&5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=@_*5=@_*5=@_* +5=@_*5=@_*5=@_(5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*58O +!<nCV*4!$X'K0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40.nn40.nn40.nn4 +0.nn40.nn40.nn10.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40+n88~> +!<=Br@*`3a?8;K\(,ETe"!n0P/_j_NARK(WARK(WARK(WARK(WARK(WARK(WAbod7Ac,p9Ac?'B +?3"Nf;ZJS-reph^r&k)m!0I-G"O%ne(HD7S!~> +!<f?Q_"2S;;U&OE]a&u*)prWV?D>EQ#iE9a\b$SBR3(,u#5=@_(5=@_( +5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_( +5=@_(5=@_(5=@_(5=@_(5=@_((BAs~> +!<=5=?`N`0W[fO&+g/M8\20.nn10.nn10 +.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10 +.nn10.nn10.nn10.nn10.nn1&cdF~> +!<=Br@*N'_=s*eF(,j#m">USi&kT<8$33-=f1Q*!L5_<`r&k-A#QT;Pm/sa3!%@V*!G4(^m/l#X% +.?=_)us/M?tH +!WX$)q`fQu5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5"%S&5"%S&5"%Rk6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&5 +!WWicq_*FO0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP1;/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt50/"q2 +/h\k&$ig9;]uAV0EtSHc0J>(31&`gc/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h10)@4%/i!;X%PBIh0.mk;RE*3=!"rS(qUc(nBM2<9>"_\mpt,\_ +@TS'UP6,PnX7+\J0aTKc0.nn40/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/4(>J,~> +!<=Br@*;p]8K%R/*&>Jr"<[pL,[RZ^#p]MJf@*Xu,_g"/4UARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK'p!.Y~> +!< +!<BFRRi`blACT0*!X(0*!X( +0*!X(0*!X(0*!X(0*!X(0*!X(00Lp@/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h1/h[h;J,~> +!<=Br@*)d[8K%R/*&>W!"=4?S&kT35$!I!=0W&pH8UhN#,"]m/j\@DXT^i +2uk5#?i_MQJ,~> +!<ss66p="&6p="&6p="&6p="&6p="&6p="&6p="& +6pEn(5"%S&5"%S&5"%S&5"%S&5"%S&5!MG!6p="&6p="&6p="&6p="'/-$BQ_80gc'qX[4"DLh3 +9ZR,!"6!WiAFIYIScC'$6p="&5=GK8!(?fN!(?fN!(?fN!(?fN!(?fN!(?cM3^c/"5"%S&5"%S& +5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%V'5=?:fJ,~> +!<M8#abc%AYi]!#I=B0.nn2/ho!W02jJX/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +/h\k10eP150eP150eP150eP150eP150eY.6/hnt5/hnt5/hnt5/hnt3+oi@Ta2`B((THZO"F"bEpqWeW;m_f/hnt50/!5W!&"7(!&"7(!&"7(!&"7(!&"7(!&"4'3\E->0eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP+30.mk;J,~> +!<=Br@)lXY8J2"'(,3ur"XjcZ!&@l]?jT."(q/&JGQ7q%krf/oN(X/YrTs^A*b9ij4T[;;18S@Z +,QN>~> +!<K6p="&6p="&6p="&6p="&6p="&6p="& +6p="&6p="&5=@\'5"%S&5"%S&5"%S&5"%S&5"%V"6p="&6p="&6p="&6p="&5=@%&!-uDsOpqD4 +lcK^U<)cam@,^M?iFYbc<4VM@#BKl%5L6p +!< +!<=Br@)ZLX8K\!5%4=-`4U!,?!!"TSW*fou!!%](f9R$L,3qB%6]?tL#ThafmFrugA;j(K4TZf- +8Yoeq,QN>~> +!< +9`R@A6p="&5 +!<'Fd]935S3[d_oY +;?/C(/hnt50/"q40/!5W!&"7(!&"7(!&"7(!&"7(!&"7(4"`0>/hnt5/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnsk!.Y~> +!<=Br@)H@V=sO(J#8T&G4U*kl#ljrN>,>U68J2#6f@RGZ!#@K[4TJF[N!`_g0p$5f!)&90;t)pO +(B@d +!<0/!,T!&"4'!\Q2[r@]0D0eP150eP150eP150eP150eP150eP150eP151&`g=/hnt5/hnt5 +/hnt5/hnt5/ho!W0+BNg/hnt5/hnt5/hnt5r\"X6/IVVB]#V]^!#M-mfDq9:@K9L/9*%ppraGko +nCRsg#qmnc/ho!X0,cGr0.nt30eP150eP150eP150eP150eP151&`gb/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hmt=J,~> +!<=Br@)64U?9f,'!"'i(gcYif('ag>10UG\$Y +!<6p="&7/]=O6p=$;59*'T6p="&6p="&6p="&6p="&6p="&6p="& +6p=$;58$@J6p="&6p="&6p="&6p="&7/]=Y6p="&6p="&6p="&7/]=Y6p;Ce)kb$`IglBP](!iB +DZ!H8:f:3h;uh15apbi](IUGT5"%S&5"%U658HXN6p="&6p="&6p="&6p="&6p="&7/]>.6p="& +6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6l,iR~> +!< +!<=Br@(p"R8M(PT!"'c$j#mW*,Sp[c!#e+o?jg9d!%=o"f9?mJ(H1bG!.Fd(!etuGr/:VtnN?q3 +!$n@J!@.Yq~> +!<S5"%S&5"%S&5"%S& +5"%S&5"%S&rBE/-5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%RN!.Y~> +!<B.L0eY77,8(:_!"qeCUs88Y"1O1u-iO)I$l:Mo0*!a*0*X-a0eY771&Wa,0eY9Z0,uT! +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/ho!W0+oll/hnt5/hnt5/hnt5/hnt50)[FD/hnt5/hnt5 +/hnt5/h\k10eP+#!!%/^a0e&1&qof-nm_.A%"nU)0.nt30eP150eWDX(+q +!<=Br@(TeQ8L+oK!!a8^-ogQV"#;5D$N:#,)DYKb?j].!!.*8K_En5--1O.hN:B%4,lg9-?i_MQ +J,~> +!<!%jZ3aoK!C;uj2oapg<15!M8"5"%S&5"%S&rBD&c5"%S&5"%S&5"%S&5"%S& +5"%S&5",?61djMq5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +(BAs~> +!<(30eP150eP15r@\p=0eP150eP150eP150eP15 +0eP150eWDX1bLL80eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +&cdF~> +!<=Br@(9SG8MV4_!#,VK(*FtQ0etLD2E3HI-mTuX(((!))lG!Y>? +!<S5"%S&5"%S&5"%S&5"%S&5"%S& +rBE)+5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&4r43L~> +!<_r@\[90/5+70/5+70/5+70/#'Y0+9NI!""D# +a2;*f!(!^[fDrAN@K +!<=Br@'sAF?:cmt)XdY0&g/bm>$dA"$sk1Z&r5)jdps'k&i')C!)rHI!*o+Y!]C$(UL4*J!.Y~> +!< +!<(6N@t\a#lm,ma2bDX!!#r0eY770eY770eY770eY140eP150eWDX1+k:60eP150eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eO(=J,~> +!<=Br@' +!<c&ddDJ"u.bc +0/5+7r@]o\0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/"q4/hnt5&cdF~> +!<=Br@"D^_?k$9b!"s"pf@RH(!!!HUqE4glnr*U#6hNSD2?skh?i_MQJ,~> +$31l+5<_:q5<_:qJNn]MXZlqF%0.)frkSf=cdnH!.jZ>!3u4>!a,LSW':MN5<_:q58O +$31\n0/5+70/5+7JM2R-XY0f%#lk]drl55I +!<=Br@"D^]?j'%6!#UCgf*8rm&c`+U1As?9D=NPb9D(FL('$[q?i_MQJ,~> +!<brJ,[7j[<3_p!$uE^b(9(^!/^El!g3NrTg&Po!.Y~> +!<"!%2isfT,K2!13E3!h0/uTe?EZ!.Y~> +!<=Br@"D^\?j0k%!!"F3rmqIuH7/an$6V)eD=NPbB_FRj,lejW?i_MQJ,~> +!< +!<87,<+?;epo3q]?pXfVX&caL;U+ZN[!.Y~> +!<=DA?@cL8@&RH;?7c-W.#6:Nf*JEf(]XOB3b4!:Mu\G'4TmMF!*W^'?i_MQJ,~> +!< +!<31#=Pf0eY170/#'Z0*!a+0*!_X0B=bk0eF+?!#91Yrl5,YR9Lm7!!a!5A9] +".Ko',G6[j&cdF~> +!<=C[?@cL8@,YJt=tK^S(j!guf)sL!A17EW!uO".EV>=k9DL^Q,mOEATO7dG!.Y~> +,QJWF5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!Q,4X$6YL5b`d~> +,QJH10J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50JBL]X"ON/0/;68!&9]k"u$i"!"qe[ +r5SoDH:J_K!"'Gb-o44c>$GHFLATU,Ud4t\,;GiE!>5B_~> +,QK)t?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=9j@JRFaN#$s%t!!c/_r7;%bKM*0\ +!"'Pu3(d_$EeB=0FSe3(-kZL[8Y9Ak,QN>~> +?iV!-5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!Q/5Zp+UU5b`d~> +?iUfm0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50JBO^ZnDJ80/_i\(?f0/:R% +$8F1f+q+GO'j$g@r5SuKM.fC+$2FQ(#o=3j(]==7&hT\.!>5B_~> +?iVH[?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=9mAJRHc2#[Th9!!!j>VUPIp"i?OG +9.1GK!!Eo=#6kD2!!+?KSmVRE!.Y~> +IfL9L5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q4rQXL5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5HI&O56=#554:]954q,?55[VN3$f"6 +!"D;@WqjI9Wh>&gBNRl!r&Y#]%4*ttSNd,k!.Y~> +IfL*70J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50H)Su0/,%50/,%50/,%50/,%50/,%50/,%500ISM(!V!.Y~> +IfLa%?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?5d3X?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I@'![h?jKpk&c_nE98(1Xf*B0nQ$RL^ +;cET\"99&i>$db-!@.Yq~> +IfL9L5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5#=I-5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_<55.j)`5!M4j+VObS"<0^NQF6;""b-Lu5!M7+ +56*nA56=#55.!NT(BAs~> +IfL*70J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50MjDV0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,&\0YB%B0J>.4'b('A" +IfLa%?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?;P$9?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[6B?G'YL?=7/E/K4Tg"=QohVTJD\"dB!B?sm<3 +?i_MQJ,~> +IfL9L5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5(>d\5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<]K?5!M4q5!M4q5!M4qXZlDB!'^BH"#qhJ%K-8?'J2[SFann,QA($Y +UP2_K%6-R9ffoI#q*+pE5b`d~> +IfL*70J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50Rk`00/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/*ef0J>+50J>+50J>+5XYBE$!&4C*""b]0$2ji;'f8EbFbba?R>Hcg +W/4RU#q[eafe3=[q(De(0/:g,!>5B_~> +IfLa%?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?@Q?h?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?sX7L?=7)I?=7)I?=7)IX^:[.!+,Y4"'S#:')_eD(c=rsHBaYkVNmFD +[Zt"r&mA[LS6u@C!.Y~> +!rs-$5Nb4[5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:qIm6+]5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q4t&WZ5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_ +!rrrf0BY$=0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%5IkNK/0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50ISS.0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,'30FBHe0/#"5,8Ut$$1n3!$mRLr0X<>31&EU)&cdF~> +!rsTQ@-:jG?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5IIpcSj?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?792f?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[6n?4((H?sm;I8MVP0'(c/*)G+?+?E7H7,QN>~> +!rs-$5I!D%5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:qIm6+]5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q4s<-S5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +rBL +!rrrf0+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50Hi)'0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +r@e1)""b`A,5rVf+r;%>,;Cp`0]=Yc&cdF~> +!rsTQ@'O$f?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5IIpcSj?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?6N]_?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +rF#Y3"'S8_6N04S68C;_8RPr:?K#8m,QN>~> +!rs-$5Cl#l5(>d\5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<`pK5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q55meH4p4)65 +!rrrf07bhN0Rk`00/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/.5r0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50`Ea*0Ea$_0/#$Y0.ek20J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+5a"RN,!.Y~> +!rsTQ@"DYX?@Q?h?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[\X?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?N+@4?3FYB?sm=??nG\m?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)Ia'Jcl!.Y~> +!rs-$5Cl#15(>d\5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5 +!rrrf07bgh0Rk`00/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/.l/0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+/0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%4&cdF~> +!rsTQ@"DXr?@Q?h?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s\=j?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7(g?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5K,QN>~> +!< +!<+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>*m!.Y~> +!<=D#?3"Aa?E%7\?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5IF'r<^?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7(b!.Y~> +!< +!<+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+5&cdF~> +!<=C=?3"Aa?E%7\?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I3+-'#?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I,QN>~> +!<$/5Cl"t5(,XZ5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<]k`J,~> +!< +!<=Br?KPPo@"DX`?@?3f?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?sY)YJ,~> +!< +!< +!<=Br?Ed`9@"DX`?:SC0?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I,QN>~> +!< +!< +!<=Br?@cGU?3"Aa?E%6>?s[5I?s[5I?s[4d!.Y~> +!< +!< +!<=Br?@cF6?BSUr?mG`&~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BSUr?mG`&~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +)ZU[<3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3/'Ns6:KKi!^0%:JNeWKeij*N!.Y~> +)ZUL)/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/VPk[7oM.p0EOUF6g-6(0nD$00_$gt&cdF~> +)ZV-i>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>(p8aBPh/0?34YXAE[A"@"DX8?L_>&,QN>~> +"996%4uiO*!''sA!''sA!''sA!''sA!''sA1cRZY4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c +4ub_c4ub_c4ub_c4ub_c4ub_c4ug/<"%u]s;"-XN7nu]?mQLV6r`9(_l95;C='%hA5(Pog4olH" +J,~> +"99&g0J38X!%n1(!%n1(!%n1(!%n1(!%n1(1bCC50J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J0mj")!d[Hgrcm0j8X26gcW.6iN5K6g??-B9JEVJM;X/nh:(W +!.Y~> +"99]R?<[>7!*]A.!*]A.!*]A.!*]A.!*]A.1g43h?AFB +!.Y~> +)ZU[<3'KMc5!Cqi3'KMc5!Cqi3'KMc5!Cqi3;u)A3;u)A3;u)A3;u)A3;u)A3;u)A3;u)A3;u)A +3;u)A3;u)A3;u)A3;u)A3;u*(3'KMc4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c78#s2 +3'K;c3'K;c3'K;c3'K;c3'K;c3;,N9<;ots4p"P[7J]1J8,QEg8,>CO6;UKFqE=mPr`9(ipHAXF +91AV>!([#i!)W)Ir_!;_69Y$+!([#f"&MWZ4b5eg4olH"J,~> +)ZUL)/MJk10JG(4/MJk10JG(4/MJk10JG(4/cIF(/cIF(/cIF(/cIF(/cIF(/cIF(/cIF(/cIF( +/cIF(/cIF(/cIF(/cIF(/cIFd/MJk10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1;eJTS +/MJb1/MJb1/MJb1/MJb1/MJb1/bUjuM#NP;1&`j/0m8@OqChnQr/q%`qCi"AH[A9Z0E>bbOoS\[ +0EOaW;tr$H>5jZbHg`Wg1&bee>":sR0E>;UL]_g5;a^.1!&:c5!&9$Yr@e6b!.Y~> +)ZV-i>$bN=?=$fA>$bN=?=$fA>$bN=?=$fA>5hh.>5hh.>5hh.>5hh.>5hh.>5hh.>5hh.>5hh. +>5hh.>5hh.>5hh.>5hh.>5hhj>$bN=?$bB=>$bB=>$bB=>$bB=>$bB=>4u8&L]354@/aI7@"3rKqHa/Br/:VrqHa8;JUqM2?3#3KMu[nm +?34eaD>7E;ErM!tJaZnF@/b?OEbK"W?3#$FLBE$MD.N6E!+<*=!+:@arE]LM!.Y~> +&-*M14ub_i3'KMc5!Cqi4uiO*5<(hj3'KMc5!Cqi4ub_c5!Cqi4ub_c5!Cqi4ub_c5!Cqi4ub_c +5!Cqi4ub_c5!Cqi4ub_c5!Cqi4ub_i3;u)A3;l#V7nZ$06;UWX<)?Oj<)?Oj<)?Oj6U!s<-36;'Z;4p+,J:d+b@#XqBV7n#j569Y30"%#sg97];+4olH"J,~> +&-*=s0J+t4/MJk10JG(40J38X5:nQC/MJk10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t1 +0JG(40J+t10JG(40J+t10JG(40J+t4/cIF(/c@@=>%]QD7sg&=LjOr)LjOr)LjOr):,#WGOpj]3 +0J,"XB4kC&0JG*X0E<^(0FTNe0J+t10J+t10J,$XOp!Hj0JISIOp3Wp0J+t4F8D%4;_TdW/MJc4 +P*1VT/MJb1/MN"[OoS#O0EtI&F"o@&6iN5K;u/0J8,\SNG5*cg7ftJ"0R!>V!f1nfqChn:q2tf+ +=u#e+"%SN;>50cR>%_J8kqE0/B1MSJ"%R]]6iA\G;eK9;;c?1V6SU=o0EXh$P%T>"r\+?c!.Y~> +&-*t^?$bN=?=$fA?<[>75?_B">$bN=?=$fA?5hh.>5_bCEd(ntBRtqiLOk53LOk53LOk53EF*M]N!s6' +?$bBf +N/WNu>$bB=>$d!`Mu[Pj?3Y7tI:-AfAH%MfD>IQ=B`3kiJ,!@IBEMXK?@Vj2!f)2;qHa/4q2>B+ +Ea\ZK")*XPEqirCEd)_ +-NFrH3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_i3;u)M3'KMc5!Cqi4ub_i3;u)M +3'KMc5!Cqi4ub_i3;u)U3'KMc5!Cqi4ub_c5!Cqi9351o54DVS5#D5["@YL679'1d&k>,L3'K;c +4ub_i3'Ku37m9*rr]U7K-?o:-LX$3'K;b<;or+<'<3)3'K;c3'L18:@7m6Z3##nZ*:d.'3oiD,gr]U +-NFc5/MJk10JG(40J+t4/MJk10JG(40J+t4/MJk10JG(40J+t4/cIF4/MJk10JG(40J+t4/cIF4 +/MJk10JG(40J+t4/cIF,0RNe^"B.!+;i(@7&m?tC/MJb1 +0J+t4/MLga=thW^r\+=NrfRG.0JG(4M#NP@6SL)G0PC3E#)Fre/MJk5rfRA>0JG*X0E=WBOp$Rp +0J,$YOoobW0N7t6#]h[O0J+t16\t`)$A_&$0J+t10J+u%qN:nI0SoLe!II?70E=K7Oo^A;q(Mf) +rf[+3!CM\AOoS\b0E=K37fYpU0E=K>Op"9/;d)Qa0F!>rP'\l:;tZ:RF8dinHiB0.0nD%Y0EDdd +J,~> +-NGDu>$bN=?=$fA?$bN=?=$fA?$bN=?=$fA?5hh:>$bN=?=$fA?5hh: +>$bN=?=$fA?5hhB>$bN=?=$fA?$bB= +?$cE(EaE'Ura#SAreq#1?=$fAL]359A6rGG??c4(#)?Mk>$bNCrepr7?=$h7?3"[]\##^p#_? +;ZIUt4ub_c4ub_c4ub_c4ub_i3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_c5!Cqi4ub_i3'KMc5!Cqi +4ub_i3'KMc5!Cqi4ub_c5!Cqi4ub_i3;u)E3'KMc<;or!4n)MQ6N(!c4oe+K!^](7rE"P6r]U?!!.Y~> +;ZIFa0J+t10J+t10J+t10J+t4/MJk10JG(40J+t4/MJk10JG(40J+t10JG(40J+t4/MJk10JG(4 +0J+t4/MJk10JG(40J+t10JG(40J+t4/cIF,/MJk1M#NP;6h$6=8,\SP0ecf,Opc=b/MJk10JG(4 +0N7t6#"L@$/MJbhrfRCf0JG(GrfRG@0JG(4;uMj[Lg'b?"]I*,0JHH)Op?.a/MJk10PCBJ!,)9b +!*]Ab"*Q@M6iN5RLbLM70JG5;rK77Q0JG*X0ENg[8,8;LB/!ulOp5PN0J+t4BD.JnB.tnk/MJb2 +rK@17"YDD[0LLZnOoe--;t6"QB.u#PrfRCfB9JF6qChnQrfR>=0JN*]!_4q!rK7.8JM@*X!>5B_~> +;ZJ(L?$bN=?=$fA?$bN=?=$fA?$bN=?=$fA +?$bN=?=$fA?5hh2>$bN=L]354AFPNXB`3kk?s[mLN!k&?>$bN=?=$fA +?>]\##&%=L>$bBVrepu#?=$fGreq#9?=$fAD>fCoLN$bN=??cC-!-eEK +!-8't"+OW\AH%MmLL+:j?=%#prJUhl?=$h7?34;:B_dSgG@#LeN!=K0?$bB? +rJ^b_"^559?=\igMum[!D=NPeG@"U"repu#GDqK9qHa/Brepo6?=*5^!bbnJrJU_aJR8@_!@.Yq~> +7fX>h3'KMc5!Cqi4ub_i3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc4ub_c5!Cqi3'K;c3'K;c +3'K;c3'K;c3'K;c3;u)P3'KMc5!Cqi4ub_c5!Cqhr`9/#5"kHJs%E>m!`2'LpK%\p5!Cqi4ub_i +3)9HS!_#:4r]U_4ub`!r`9=p5!Cqi4ucO@C56N'sc<;T`$90P=!3'Ke1 +r`9(rJNj&s!>b`d~> +7fX/U/MJk10JG(40J+t4/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10J+t10JG(4/MJb1/MJb1 +/MJb1/MJb1/MJb1/cIF7/MJk10JG(40J+t10JG(GrfR>=0PBs>s(D=o!d67rpQ>kr0JG(40J+t4 +/T^oS!`Ld)r\+>!rfRCS0J+tWrfRD*0J+t5rK78=0ed8>Op,n\0J+tkrfRLi0JG(40J/+[Op"9/ +/MMAIOp"rB0J/+[Op+3,0J+u%rK7Lk0J+t4/MJb10Q[&Q"&gm*8,\SNM#3>>B.tnk/ML-&Oo^A[ +qiUq_r\+C*0Lu,*!dcUQr\+@-M#*89HSBg9Ood3hHiB0/7sk5u#=C0s0J+t4M#NP==tiJ +7fXf@>$bN=?=$fA?$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?$bB=>$bB= +>$bB=>$bB=>$bB=>5hh=>$bN=?=$fA?(-C/!c;7Ira#SUreptn?$c^XN!+0-?$bB=?@DX.")V@JB`3kiL\m#7G@"HZ>$c(FMue]^ +qhtMqra#Y0?>0=s!eFZ]ra#V5L\cr2JR3osMum0hJc:T/BS$/A#@q.E?oIoJUq/,?3);OJ,~> +=o]@&3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc4ub_i3'KMc5!Cqi +4ub_i3'KMc5!Cqi4ub_c4ub_c4ub_c5!Cqi3'KMrr`9.r4uiL)!([#i!)WMU!*&r!!_#:PrE'"h +!*&nu#t7$;4ub_i3'L=@ +=o]0h/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10J+t4/MJk10JG(4 +0J+t4/MJk10JG(40J+t10J+t10J+t10JG(4/MJk^rfR>(0J35X!*]Ab!-\5o!AK?/OoeQ:M#EM: +=oaBWOpP&@/MJb10J+u7rfRFP0JG(41&[:80ENg[F8h=*=thW^F8_7(6SL)ZrfRG@0J+t4M#NPA +7kcMK0J,foOoU=;0E +0LodROoS#O0EEbHrfR@e0JQc/Op+3,/MJkkrfRIu0J+t10PC?I!-A+%!CpemOofta1&[790RNe^ +#"('u/MJk^rfRA>0ed8>OpuS5B_~> +=o]gS>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?$bN=?=$fA +?$bN=?=$fA?$bNUrepo,?<[;8!-8't!.XlR!FCQ\Mumj(L]*23 +EWCmnN!X?->$bB=?$cFON!4E3>$bN=ra#V/AGhAkLOFSf?+Q\Mu[Pj?3+5Xrepr"?=7gON!3`u>$bNZreq&*?$bNUrepr7?s\'VN"(8WGB\I`It +=o]@&3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;sr`9=p3'K;c4uc=:Y5!D,/r`98"5!Cqi<;or&69[Rm4]MD^"\q6@4ucC<l +r`9)!rD!Jl90GI-r`9.t5#D5[#!G.63'KN*r`91l5!DgB$4p3i/3'KP) +=o]0h/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJbtrfRLi/MJb10J.AFOoS\`0EEaqrK718Hi9*1 +7kcMLM#NPCLbUS80J+t16iN5QLbLD70J,foOp-1d/MJc4rfR@N0JH#qOp+c<0J+u7rfR@N0J,$X +Op3Tl0JG(4BE"%sF"f1";uVp`HS@-*0O"I="*6.M;uMjZHi>](/MJk10J+tkr/q:t0J+t10JH]0 +Op,nY0JGkMrfRG30JG(4M#NP@7kcVK6\t`)"`l@L0J.JIOp+c+0RNe^#"('u/MJl7rfR@e0JIkQOp"];/MJdU0E`s]/MJmWOon'*0J38X +!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(3\<$;0J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1o.U1X!.Y~> +=o]gS>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB\req)&>$bB=?$bBfrepqi?=%=DN!4')?oItJR2Yd??6%("+=K^D>fCnJc8s\>$bN=?$bNKrJUf%?@Dg3!dA$rrI"[$ +repi4rI"fuG@Y#srepo.?@i*7#%V%H>$bNjrepr"?=&3^N!+!(>$bD3?3FG<>$bP6N!!Ts?<[>7 +!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.3a,in? +=o]@&3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'KN*r`9=f4ub_c4ucO@l[ +dTD4ub_c<;or%69[Rm:B";u7m8mr3'I7B!`V?HrDsA+5!Cqi3'K;c4ubb' +=o]0h/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJl7rfRLR0J+t10J/+[Op=?+0J+t10PCBJ!G>@0 +Op,#@0J+tGrK7Ch/MJb1/MLB-Op5tZ0J+t4BE"%sB.Yeh1&d==LbLM7HiB04HS@$*0J.AFOonW: +0N7t6#BhdQ0J+t1M#NP?7kcVKF8h=+=thN^/OTN#!f/NtrK7PE0eb15/MJb10J,$VOp>VR0J+t4 +/U%,V"]I*//MKQjOon'*0JWNh"YDD[0JH#qOp!Hj0JJ=^Op*Qo0J+u*rfRA10JH#rOp?dp0J+t1 +0R!GY#u`N00J+t4/MM8FOoef@M#NP@0eb150O"I=",JZc1&[7D0eb:50JG(40J+t48,eZ5Lb1;7 +/MJb10J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t1r\+=( +r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+j70J+t1 +0J+t10J+t10G4A9~> +=o]gS>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bNjreq(m?$bB=>$c7KN!=]6?]\##Cg&`?%IVk!f()mrJV,>?s[#C>$bB=?(?O1"`7RP>$bb$cXVMun$+L]359?s[#C??6%(",C8j@/Z#m?s[/C?=$fA?$bB=? +=TB6t4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c +4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ubn.76?4ub_i +<;ou!4p3i/4uc=:dTJ3'K;c<;or$4[(hgr`98&4ub_c6N'sf69[@mr`92$5!Ct* +55eR^4pEu14ub_i<;or#4[)jE=8kAb3'L=@ +=TB'd0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J,foOp?ds/MJb1/OTN##`(/d0J+t10PCBJ!CqM9 +Op?.^0J+t10O"I=#?*3./MJb1F8h=,;_TdW/MMPNOp"9//ML-&Oook]/P#c&#"('r0J+t^rfR@R +0J-r:Op5)D0J+t18,\SQ0J+t4rK7@P0J+t10So^k!CqtEOpaW2/MJk10JG(40O"@:#A5_B0J+t4 +M#NPA0eb150J.AFOonlA/Q;Y3#BhdT/MJb1M#NP>6SL)ZrfRG@0J+t18,\SQ7kcMKrfRJA0JG(4 +0JWNh#r++f/MJk10JJ=^Ooe!)M#NP@0eb:50So^k"'RB48,eY\HS@-*0JG(40J+t4/SG'G#\PhC +0JG(40J38X$nX.e/MJk10JG(40J38X$nX.e/MJk10JG(40J38X$nX.e/MJk10JG(40J38X3\<$; +0JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t1r\+=( +r\+=(r\+I,0JF+>J,~> +=TB^N?$bB=>%IVk#_u_i?$bB=IK#00D-gCP>$cdZN!*g#>$c(FN!"Q9>%mkn#%V%D?$bN=?=$fA??5q%#BsKX?&F7t#Cg&d>$bB=L]357A6rGMreq#9?$bN=?=&EdMumNrL]359?s[/C?AJN="*.^SB`'Kt)#^9TY +?=$fA?<[>7$sHtD>$bN=?=$fA?<[>7$sHtD>$bN=?=$fA?<[>7$sHtD>$bN=?=$fA?<[>73a,in +?=$fA?(3'K;c3'L+5 +=TB'g/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MLB-Op>VR/MJb1/R&.:%!+*S0J+t1/OP>WF$onh +&hu'l0J+t10P>`90J+t10J+u7rfRFP0J+t10`@.;0eb15BE"%r=thOTrfRb40J+t10J+tkHWi*T +0RNe^#"L@!0J+tkrfRD*/MJbTrfRMB/MJb1/MM8AOpk8@0J+t10J+t10J/+XOp5PQ/MJk18,eYV +LbLD7/MJkWrfR@r0J.AFOp>/E/MJb1/T^oS"%P%!;uVp`F"K("/T^oS%Wa +=TB^R>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$c7KN!FQ5>$bB=>&sV$%"2Gc?%EDII:W;8 +&n#$L?8?(# +?@i*7#&%=H?$bBLreq);>$bB=>$cXQN!sQ,?$bN=B`$bNPrepr'?$bB=>(-C/"))"ID>oItI9Kr`>(-C/%XhYe?$bN=AH%MiLL+/>reptf>$bBQrepu8?s[#\req;1?$bN=?=$fA?$bN=?=$fA?$bN=?=$fA?$bN=ra$":?=$fA?$bN=ra$":?=$fA?$bN=ra$":?=$fA?$bN=ra$+=?$bN=? +!<3'K;c3'K;c3(NsL +&l(VM4ub_c4ubMc3&j)]4ub_hr`9;'3'K;c3(!UG"]RHF3&jn: +!<5jZi +B.tnk/MJbTrfR@r0J/+[Op=?./MJb1/T^oS"%P$sF8h=*=thN^1&[7F6SL)G/MK[b0JG(4/MLi: +OpPbQ0J+t10J+t^rfR>(/MR-d">DD]0So^k"BmK20RNe^$qE!*/MJk10JG(4/OTK"IP!6*0J+t4 +/MJk10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t4/MJb1/MJk10JG(40J+t4/MJk10JG(4 +0J+t10JG(40J+t4/MJk10JG(40J+t4/MJk10JG(40J+t10JG(40J+t4/MJk10JG(40J+t4/MJk1 +r\+I,0JF+>J,~> +!<=DE>#\g3?$bB=>$bB?>&sV$ +&q+(i?$>69?$bB=>%mno"c$8f>$?^\MumZrB`3l!A6N;C?$bB= +>%%;f#$tJ>>$bBfreptn?$bB=ErM"& +G@"HZ>$bBLrepr'?$bB=>(-C/"))"EIK#0.EaDpU@/Z#oA6rGG>$blU?=$fA>$cFP +N!X]3?$h/d"C>8$bN=?=$fA>%ISjITg&]?$bN=?$bB=>$bN=?=$fA?$bN=?=$fA +?$bN=?=$fA?$bN=?=$fA?$bN=?=$fA?$bN= +ra#_2?="lWJ,~> +=9'.$3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'R:Bs#pTG4ub_c<;or-4ZGVb3'K;c3'K;c9E%um +8,bIX4ub_c4ubMc3&j)]4uc(34ubMu +r`9=n4ub_c4uc(3:-LX$ +3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_i3'K;c3'K;c3'K;c3'K;c +3'K;c3'KMc4ub_c5!Cqi3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc4ub_c5!Cqi4ub_i3'KMc5!Cqi +4ub_i#<4n,5!CqB!.Y~> +=9&sf/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MR-d#;Ina0J+t1M#NPG6S0uD/MJb1/MJb1BE"%o +>5g)`0J+t10J+k1/M/Y.0J-K-Op5PQ/MJb1>5jZfB.Y\h1&[7:0J.AFOq)Ob0J+t10J+t1/MJb1 +8,eYUHS$p'0J,ZjOomBi0JNHg#=C's/MJb16i3#UF"f1"/MJb1/MJb1/URJ[!/UW;#%oVA0J+l' +rfRLb0J+t10J-K-Oof8M6iN5SLbLD7/MJb1HiB016SL*JrfRCS/MJb[rfRe=0J+t10J+t10J+t1 +0J/+[OpOW10J+t10J+u%rfR=]0J36d""c2Y>5jZfLbUS81&[7D0J+t4/MJb1/MJb1>5j\7F"f1" +/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10JG(40J+t4/MJk10JG(40J+t4/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJk10J+t10JG(4/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10J+t10JG(40J+t4/MJk10JG(4 +0J+t4#;%V]0JG'k!.Y~> +=9'UQ>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$h/d#@LkA?$bB=>$bB=GQ*O$ +ErK5P?$>69?$bB=ErM"#G?S0V@/Z#c??$bB= +B`$bB=AG_;pI9p)`>$bB=>$bB=>(Q[3!/LQ4#'XBW?$bB=Jc:T1A6rGpreptn>$bBQreqA=?$bB=>$bB=ErM#II9p)` +>$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?=$fA?$bN=?=$fA?$bB=>$bB=>$bB=>$bB= +>$bB=>$bN=?$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?$bN=?=$fA +? +=9'-s4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c +4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c5!o6M!*&nV!^8S,r`9P.4ubMc3&j)]4ub_c9E&!* +76W[p3'K;c3'K;]4ubMc3'L1< +=9&sc0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10Lu,*!/US*!\c2nrfR_H0J+k1/M/Y.0J+t1BE"&, +;_TdW/MJb1/MJb.0J+k1/MMAIOp4i:0J+t1G5dX-;_TdT;uVp]HS$uNOq'u6/MJb1/MJb1/M/Y. +BE"%uB.Y\h/MLB-Op#hX0J,foOpQpr0J+t10J+l4rK7V:0eG(20J+t10J+t18,\SN>5jZgB.Yeh +0J36d#;Iea/MJb1F8h=(=tN\POp?.^0J+t10JWNh!\c2\rK7:;/MJc'rfRap/MJb1/MJb1/MJb1 +/OTN#$&C8e0J+t10J,!WOod?l/cCh7/MJl7rfRCf0J+tWrfR_;/MJb1/MJb1/MJb1HiB1X;_TdW +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb10J+t4/MJk10JG(40J+t4/MJb10J+t4/MJk10J+t10J+t10J+t1 +0J+t1s"FU.0J+sk!.Y~> +=9'UM?0=s!/LMV!a]&@req;A?$>69?$bB=>$bB9?$c^XN!=-&?oIqJQcI[N"0N)>$bB=>$bB=>$>69 +GQ*O*G?S0V>$c7KN!+Q4?$bB=IK#0,Ea!>ZN!Fi9?$bB`req>->$bB=>$bB=>$bB= +>%IVk$&;hj?5aB^>$bNjrepu#?$bB=>$bB=>$bB=Jc:UXD-gCP +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=?$bN=?=$fA?$bB=?$bN=?k4? +=9'.$3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3(s6P#>76?4ubMc8,cR!:,kEs3'K;]4ub_c5"klV +&P##E3'K;c3'K;c3&j)]3'K>#=8tGe3'K;c<;ou!4p!]-9E%uo9/oH@ +=9&sf/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/SG'G#A5_B0J+k1>5jZoF"K't/MJb.0J+t10PCBJ +&R$k?/MJb1/MJb1/M/Y./MJdTOp3Wp/MJb1M#NP?0eb15BE"%qB.[5jZgLbUJ8/T^oS$sG>:0J+t10J+t10JWNh +Ik`W/0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10F'0`/MJb1&cdF~> +=9'UQ>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>'Kt)#BsKX?$bB9?$bB=>$bB=>$>69>$bD2N!$bB=L]358?s[#CGQ*O&G?T%dN":JG>$bB=>$bB=>$bB9 +?@i*7#&%=H>$bBfrepts>$>6\req/->$>69?$bB=>$bB=>$cXVMue?Dreq#) +?(-C/#BF-S?$bBCrJV4m>$>69?$bB=>$bnAN!"W;>%%>g",C&dErM"$LL=:l>(-C/%!#ZX?$bB=,QN>~> +!<76?4ub_c9E%up<&d'@r`9:e3'K;c3'I4A"%>C59E%uq9/nmp8,cR#:-LX$3'K;c3'K;c +3'K;ur`9Cp4ub_c4ub_c9E%up9/o+!r`92$3'L=@ +!<T0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10RNe^#=gI"/MJb.G5dX6;_9RT/M/Y./MJb1/Q;Y3 +&Vr"m/M/Y.0J+t10J+k1/M0KlOoU=:/HIOmrfRG@/MJb.HiB007kf;hOq(YI0J+t10J+t10J+t1 +0`@.<0eG(2/OTK"">DD]/VsCh#tHR$/MJb1/MMPNOpt>A0J+t10J+t10J+t5rK71O;uVp`B.Yeh +0O"I=#A5_B0J+t1BE"%rLb1<:rfRIQ/MJb1/OTK""&gm*BE"%sB.Y\h>5jZqF"f1"/MJb1/MJb1 +/MJc'rfRRd0J+t10J+t1BE"%rB.YelrfRA>/MN"[Op,#C/M/Z4rfR[[/MJb1/MJb1/MJbTrfVbX +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJa^0J+t10J+sk!.Y~> +!<=DE>#Sa2?$bB9J,YB9D-C+L>$>69>$bB=>&F7t +&VjOr>$>69?$>V=Mu\Y3=ohr?req#9>$bB9Jc:T0BO68hN"0l3?%ISj"C>8<>)3*9$#!LK>$bB=>$cdZN"'W-?oItG?Sreq%l>$bB=>%ISj")V@JGQ*O(G?S0VErM".I9p)`>$bB=>$bB= +>$bB`req/#?$d!`N!46.>$>6freq8!>$bB=>$bB=>$bBLreu>X +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bA +#=8tJa3!hc.3'K;]4ub_irDsP' +3'K;]4ub_c4ub_c3'K;pr`9(rr'p`^r`94t3&j)crE'"_rDsIm3&j)]4ub_c4ub_c5!o6M##IKC +3'K;lr`94t3'K;gr`9D*3'K;c3'K;c3;lnf4ubMc3'K;c3'K;c3(s6P!`1jFr`97r4ub_c;#XN# +76!Ij4ub_( +0eG(2/MJdTOps-"/M/Y./MJb.0J+t5rK7_) +/MJb.0J+t10J+t1/MJbhrfR8.r)s)ArfRD*/M/Y1rK@18rK7XF/M/Y.0J+t10J+t10Lu,*#(&$U +/MJb[rfRD*/MJbHrfRSD/MJb1/MJb1/cChA0eFt2/MJb1/MJb1/SG'G!dcLtrfRFt0J+t1HiB04 +;_9[T0J,ZjOoeQ66iN5RLbLD40J+u"rfRD?/M/Z"rfRCZ/MJc'rfRai/MJb1/MJb1/MJb1/M[3e +#r+"c/MJb1/MN"[Oon3./M[6f!f/F3rfRG@0eG(26iE/V/MJb1/MJb1/MJb1F8h>P=thN^/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +#V@_^0J+t1&cdF~> +$bB9?$>69>$bB9?$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=@/Z#g?s6l?>$bD2N"'0$>$>69>$bB9?$bB9?$bBVrepi.r,Mdcrepu.>$>6=rJ^barJV4o>$>69?0=s#(^)a +>$bBQrepu.>$bBGreq/=>$bB=>$bB=>5aBh?s6`?>$bB=>$bB=>'Kt)!eFNlreq#)?$>6^repu">$bB`req>(>$bB=>$bB=>$bB=>%%;f +$"-qC>$bB=>$d!`N!!a">%%>g!f's"req#9?s6l?AGqGq>$bB=>$bB=>$bB=IK#1TEaDpU>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +#[1P~> +!<dTD3'K;c6N1$s<&d'$4ub_c3'K;]4ubMprDsLu3'K;]4ub_c4ub_c +3'L12 +!<0J+t10RNe^"+)^R>5jZhF"K't/MK]n +OonW70J36d"#2AZ1&[7F0eFt2/MJb1/MJb1/ML-&OpQIh/M/Y.0J+t5rK@14!AHn?OoftaM#NP@ +=thN[0N7t6%!F?m6UsXF>#R")0J36dImYeA/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/I4$^0J+t10G4A9~> +!<=D6>!lV">$bB9?$>69>$bB9?$>69>$bB9?$>69>$bB9?$>69>$bB= +>$bB=>$bB=>$bB=>&F7t#D$2b>$bB=B`$bB9?$bB9?$c^NN!+!(>$>V=MunQ:D>oIpIs:[C"Fjf_>'Kt)!/LPt!e#9Jrepts?$bB=>$bB=>%%;f!c;+Xrepu(>$bB=rJUqg?$bn@ +N!!p#?<[;d"(5;9@/Z#o?s6`?>$bB=>$bB=>$c(FN!Y&A>$>69?]\#%"DYqA8#XnEc"u`?<[;dIq2_h>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB==pSG +!< +!<0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J*Sb/MJb1/MJah!.Y~> +!<=CQ=p\M=>$bB9?$>69>$c7KN"C2>>$>69>$bB9?%!-aN"'<$>$bB=>$>69 +>$bB?o8Ef_>$bBQrepo&?@Dg3!-e-q"*.^OJb4m(?]\#%=MDd>$bB= +>$bB=>$c7KN!"i=?>]\#"F"0U?>0=s!J+SV=ohrHrJUhl>$cXVN!=<+>$bB?L]358Ip-/^AH%Mj +LK\"fB`$bB=>$bB=>$bB\req/(?oIsIp-/^AH%MgJTCaK#)?Si?$bB=>$bAX!.Y~> +!< +!<=thO,rfRCs/MJbhrfRFt/MJb1 +1&[7 +!<=CH=oa?WMu[Pg=oa-QMu[_c=oi/hrepl/?M7P&B_75eLL+.f?@Vs5!c;+rrephop5B&n>$gi[ +"FXH[>%mno$AVqk>$bB=>$bBVreq;,?$bBVreq#)>$bB= +@/Z#eI9Kr\L]359A6N;C??c@,"Ct\B>&sV$"FXHW??cC-%sM2`>$bB=>$bB=>$bB=L]35=A6rGC +?$>69L\6T.LK\#.reu>N?$bB=>$bB=,QN>~> +!<3&j)]4ub_c4ub_h +r`9G+4ub_c3'K;c3)olY"?e_.3(!IC##mcG4ubMboN),i3&jn:=+ +!< +!<=CI=o_t/N;HcY?N#f_@/!h+D0KOi=o`F5aB\?sE2?$?.LN!ac4?$>69Jc:T:BNe_G>$bB9?fFmG6!'jN!+?2>$cdZ +N!4'%?fCsEaDpU>(-C/"EI[P>(-C/%WPZY>$>69??$bB=>)3*9"Ct\B>%mbk#)?Si?$?^\N.5ME?$bB=>$bAX +!.Y~> +!<C54oJH33'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c#rk+. +4ub_c4r43L~> +!<= +/M[6f!/UP)!\c3IrfR@e/M10*OoTk-;ZL#"OoR69/HCV+OoS#I/cCh41&!7#0SoFc"(s2;0`@.; +0eFt2BDmtr;_TdT>5jZgF"Jst6\t`)#(&$U0J+l4rfRCO/MJc4rfRaY/M/Y./MJb.0J+k1/SG'G +$"kqD/MJb.0J,foOp-Xq/M/YHqN;%d0J+k1/R&+9s+p]%s)\3Q"&gm*6iE0t/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1#q[h_ +0J+t10G4A9~> +!<=CI=o`F=Mu\A)=o`78Mu\Y-=o`UBMu[Df=o`dGMue]ApK@QJrephjr)s)Erephtr`T;4repo6 +>%%>g!/LJU!a]&Yrepr">$>tGMu\G-D#eVTMu[8b=oa?WMu[Pd>5aB[@/!h*?AJ65"*[pP?N#fc +?s6`?GQ!I'D-gCLErM"$I9Kf\A;C/C#(^)a?$bBfreq=t>$>69>$bB9?'Kt) +$$T]Z>$bB9?$>6GqMYW!?&sS#s+gW*s*aok")V@JAGqI:>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=$!LY= +? +!< +!<5jZfF"K't/UoH+0J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J*G^/MJah!.Y~> +!<=CI=oa!MMu[nq=o`dGMu\(r=oa!MN!4uI>$>oIq +I9L1\Mu\G-=or#6?N#fbA6N/drephorE92Arepi,r`T;4repl5?MRb)AH%MfL\=mOB_@;dG?S0` +repi.r`T;=rJU`)rE92Lrepts>$>$bB9??6%( +"a=-V>$>e?N!G,G>$bB=>(?O1!,_^=!+,V-"(#/;ErM"#I9Kr\>(9j^?$bAX!.Y~> +!< +!< +!<=CI=oa?WMu[Dc=oa-QMu[Pc=o`F$>tGMu\G(=o`F=Mu\G,=o_t/N;Zo[GQ*O&E`ulM +Mu\Y1=o`F=N!"i=>$h/d!+>b/!.k-.!,_^=!-eF$!.FWG!,_^o!.FQE!.FO!"*[pPGQ*O'G?S0e +rJUc4?N"(+N!!To@#+]>!,_X;!,_^o!.k)Prepi4qHEo,rE92/rJU__q-!cLrephorE92$>69>$bB9?$>69>$bB9?$>69>$bB9?$>69>$bB9 +?$>69>#\g3? +!< +!<";(]7oNS]/M1W7OoS\[/HA0:OoS\a;ZLJ0 +Ooo>K/URJ[!_4hGr/q%Ir@J">rfRA>/OtWqOoT.l/HBG_OoT.o/H@L'P5?g5B9JE]r[e+KrfR8. +q(2S#rK7.8r@J"Jr/q):0`3L&8,eYOM"N>"G5dX)0uY_=0J+k1/M/Y./MJb.0J+k1/M/Y./MJb. +0J+k1/M/Y./MJb.0J+k1/M/Y./MJb.0J+k1/M/Y.0J+t10J+t10J+t10J+t10J+t1&cdF~> +!<=CJ=o`+4Mu\Y1=o_t/Mu[8Z=o`U@MumZr@/Z&Z=o`dGMu\)"=o`F=Mu\A+=oa?WMumNn?N#f_ +?N"%.?AJN="*.RKAH%MfL](BV@/Z#a@/a=0L]35>EbK-'BPhd'>$?.LMu[nm=o`+3Mu[nsD#eeZ +N!"9->(Q[3!bbbXr/:VdrE927repr7>%i]iMu\)!=o`dGMu\)$=o_n-N;Hc\GDqK$r`T;=repi. +q-!c)rJU_arE92$>69>$bB9?$>69>$bB9 +?$>69>$bB9?$>69>$bB9?$>69?~> +!<!)*;m!)WSQ!(Hlg!_YL:rDs"_ +:Ae/n6MreC8,cQj:.tLd!)*/J!)WYr!(-WDrDrt_rAXdGr`9)!r\smQr`9(iq)A@Cr`9(rr&=[H +r)Wkgq`"RKr`9(mof*%B=&_\F3"S853'K;]4ubMc3&j)]3#;RF~> +!<5^#Q>5aTd0eFt\rfR7or@J"QrfR8.r[e+;oo]Ah/URJ[!(Zc8!,):o!.4Vq!)rl[!bX)>rK71K +F8V1$8,Oq=>5jZcF(bE6!,)-[!.4^.!(Zu>rK7.7r@J"JrfR8;r[e+krfR7bq(2SFrfR8.r%.nP +r/q%`q^he\rfR7oodp8EP)*:s/J'Tf/MJb.0J+k1/M/Y./J8&6~> +!<=CJ=o`UBMu\;'=o`78Mu\G$=o`dEMue-5rJ^MT!.k-.!,2:6!-eF$!-eEG!+,V_"(#/7L]354 +ErB/AErCq!?s6`Srepi$rE92Arepi.r`T;4oo&rr>(Q[3!,2+1!-eF$!.k&O!,_^o!d@gUrJUbf +IJf$(B`)$6ErM!uI$bB9?$>69=sO)u~> +!<Z3'L=@H6(BAs~> +!<SsBDmtq7kH;k +rK7.nr[e+nrfR7[r@J"rrfR7br[e+Roo]B'0So^k!&=7#!&=G8##d**0J+kTrfR=q/Q;V2!/UQ9 +!(Zo +!<=CJ=oa!MMu[nq=o`dGMu\(n=o`dAMu\G)=o_t/N;HcYJc:T.B`;08B`S*!+>ba#&ROI?&F4s!/LK2 +!,275!.Xd&!-e9C!FCQ\Mu[8a=oa-QMu[nt=o`UAN!+W6>$d!`Mu[Da=o`dGMu\)"=o`UAMue]? +qcWuNrephorE9S8A8#Xa>$>TuN/(el>528%,QN>~> +!<TT +!<a!*]7O!&4A7 +s)S6gLku"m",JZ`BE"%p7kfKGq(2U[!.Y~> +!<=CJ=oa?WMu[Dc=oa-QMu[P^=o`U=Mu[np=ohrHrepi.qcWuJreph`r`T;Brepi$r`T;0r/:Z- +L]*/4LLC*b!/LQ4!FT75=oa-QMu[8b=o`F4Mue-5repi4pK@Q;repi4qcWu:repo&>'Ke$!Jb@c +=o_n(Mun$'?Mdn+AH%MfL\t%mno!/L>Q!/LQ4!,2:6!-8$s!-7s?!+,V_ +s*Xs"LPPhe",C8fGQ*O%BO66nq-!eE!.Y~> +!<2ul;E:dY+?!([#i!(ZuI!(HW`!(-ZE +!'U<_!*&kU"%#sg8,P=H9DhTk:.n>T91;$5r`9(ppc&:<<;or!8,G7G7K-?i9/ocE +!<5TrRB7#")FpE)$F(],a0N7t6!-@oe!AK?/OoS\_/HA`KOof8JHhrm+HUIW] +!(6UG!Jj8@/HA5B_~> +!<=CK=o`78Mu\Y1=o_t/N::!OBSZME!Jb(Y=o`dGMu[nq=p&/\JS>!c!-8't!-8$A!,_Ih!,2@8 +!+c(f!/LJU")*IKEr9)BGCb>EIg:CGI]\#!.FWG!FCQ\Mu[nq=o`F=Mun3,Jbk<+JRnU\ +!+bqb!Jb@`=o`78Mu\;(=o_t(Mu[_o=o`dGMu\(t=o`+3N;HcYGQ*O%LL0j]!,_=d!c;+lrephj +JQhhP!@.Yq~> +!<2ul;E4]GKa4o@8>8,63d6N&kD55nU` +:AQpM55@/<55.#:6N1$d8,,%D7K$9f55R;>7K-?i9/ocGb`d~> +!<5=<]8,Y">1&d=9 +F8@Hg0_m:#0_[.!8,eYO>50ZL;uMjZ0`*F%;uVp]B.\K.Oo^ABpalM#M#EJ5B_~> +!<=CK=o`78Mu\)!=o_n.Mu\Ft=pA;RLQ%1IAGB=.Jc:T.B_,C1A;?,&AGfU2EqtXoB`2*7@/c)b +IJR+I?MRb)?M@V'B`fCn?Mdn+D>oIqG?TRqMue]Spf[])L]*/5LN6_q=p/5gN/VHI +=o`F8Mue]IrE92Prephjq-!c/repi,qcWu?rephtqH(Q[3JQheO!@.Yq~> +!<7$>:fL7d7J/VC4\&.84nCW75".X12uu0=rDs&"90W85"A;ft<'L(:"&;os +6Mi_F5#bT[55I5=7JKpk<)?Ca69$qf:f'T33;5B5(BAs~> +!<*>&)nLXf0;_e,#!CLr,Oo]VYq^hnRLiY<4/H]XAB/'*4 +!,):o!,)-[!([$O#A5VUH\d#i;tV^F6X",+6h;l20iLI8/HJ4^rK750`!@$;tuL_LjO;X7kH;[H[A\B/b^gt&cdF~> +!<=CJ=p'>7LLg6b")WU?AF*M"AG01/Ef>s4nQH!)D.*3D!G$WWMue?7qcX)BLOERl=p&u(G@(&J +!-eF$!-e9C!,2@j#Bs?^JVSf)D=q'8A9)m7AFit+?u9HM=oi/`rJUf5G@:>P"F#f`LL0aZ"+?,` +B_ts9@#'\l?M[h*D>9%sLOjr!BNeSMJUqZh>5)2$,QN>~> +!<[6*4Zu!Q2ul;E5"eO3p,E(955R;A4ubMb +pG`LM91qcD69RLl3'R0u!'Yrnp,E'h!.Y~> +!< +!<=CI=o`*\=oi;RjB;XnA7T#j=o`78Mu[8]=p&u(I:1?("(#MOAGKC2@!?g*p0%K-?Mdn.?$h&/!+(4[p0%JB!.Y~> +!< +!< +!<=Br>,,7&A9)43>(KlJ=oflKJ,~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +*rm*:/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/:fd33.X&m2usfqJ,~> +*rlp*1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1P%-//V,LW/HH@^J,~> +*rmQi8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8qC/s>(Kk\=of`GJ,~> +!< +!< +!<=8%=u])W8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei +8m4f;>(Kk.>3T2k+96o~> +*WR!9/3#1?3&ETG3&i`S/3#UG3%R$K1cR$G3&ETG`Af\*3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG +3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETGJN/3?T/Zif!.Y~> +*WQg)1G(C7/L)i'/M/2!1G(1'/Met1,:t]'/L)i'`@Wo&/L)i'/L)i'/L)i'/L)i'/L)i'/L)i' +/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'JLuF)T.L'S!.Y~> +*WRHh8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi`EG)j>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"MmiJQdV.T3;7 +!< +!<1G(C71G(C71G(C71G(C71G(C71G(C71G(C7/L)i' +/M/2!1G(1'/Met1,:t]'/L)i'/M/2!1Wh:1,:t]',:t]',:t]',:t]',:t]',:t]',:t]',:t]' +,:t]',:t]',:t]',:t]',:t]',:t]',:t^&/V,M./HH@^J,~> +!<=DD=o_1n=o_1n=o_1n=o_1n=o_1n=uo8Z8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi +>$=L$8m5Ci>"Vt%8Qn_i>"Mmi>$=L$9$1(Kl3=of`GJ,~> +#QPZ#/3#IG3%Y"f!%e(.!%e(.!%e(.!%d+h!%e(.!%e(.!%e(.!%e(.!%e(.!%e%-2(U^<3%R$? +3%R$?3%R$?3%R$?3%R$?3%R$?3%R$K1cR$G3&ETG3&i`S/3#UG3%R$K1cR&*3&i`S/3#IG/3#IG +/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#J;30cH((BAs~> +#QPJh1G'h'/Mm>W!&OR*!&OR*!&OR*!&NUd!&OR*!&OR*!&OR*!&OR*!&OR*!&OO)2)?g?/Met7 +/Met7/Met7/Met7/Met7/Met7/Met1,:t]'/L)i'/M/2!1G(1'/Met1,:t^j/N=t,1G'h'1G'h' +1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'i&/X7mg%fh+~> +#QQ,R8m4ei>"\`s!)!2n!)!2n!)!2n!(u6S!)!2n!)!2n!)!2n!)!2n!)!2n!)!/m2+h%E>"Vsj +>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>"Vt%8Qn_i>"Mmi>$=L$8m5Ci>"Vt%8Qna*=u])W8m4ei8m4ei +8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4f;>*W7l+96o~> +!<b`d~> +!< +!<=DD=u/cS>"Vsj>$=O%8m5Cj>"Vt%8m4hj>"Vsj>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"Vsj>"SZr +!)!2n!)!2n!)!2n!)!2n!)!2n!_QWgj&uFTrE91nrE91nrE91nrE91nr)u'O>"Vt%8Qn_i8m4hj +8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi`EG)j>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"MmiJQg6#!?_Am~> +!rs,s/H%O.2#TB62#TB62#TB62#TB61upV8/3#1?3%R$?3&iHK/3#U?3%R$K/3#1?3%R$?r&>TG +3&ETG3%R$G3%R$?3&ETG3%R$G3%R$?3&LRn!%e(.!%e(.!%e(.!%e(.!\?;^rAXd.jZ!5krAXd. +rAXd.rAXd.rAXd.rAZhh3%R$?3%R$?3%R$?3%R$?3%R$?3%R$?3%R$?3&i`S/3#UG3%R$K1cR$G +3&ETG3&i`S/3#UG3%W333]&fI3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG +3&ETG3&ETG3&ETG3&ETGLH#;N!.Y~> +!rrrc1]8m*,Q01o,Q01o,Q01o,Q01o,NLEq1G(C7/Met7/M/b11G(17/Met11G(C7/Met7r%/gC +/L)i'/Met'/Met7/L)i'/Met'/Met7/L13G!&OR*!&OR*!&OR*!&OR*!])Dar@J"*jXgHgr@J"* +r@J"*r@J"*r@J"*r@L&d/Met7/Met7/Met7/Met7/Met7/Met7/Met7/M/2!1G(1'/Met1,:t]' +/L)i'/M/2!1G(1'/MkO$3[644/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i' +/L)i'/L)i'/L)i'/L)i'LFiN;!.Y~> +!rsTM9)Von8c;fm8c;fm8c;fm8c;fm8`X%o8m4hj>"Vsj>$=O%8m5Cj>"Vt%8m4hj>"Vsjr)t"2 +>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"Vsj>"SZr!)!2n!)!2n!)!2n!)!2n!_QWgrE91nj]VXVrE91n +rE91nrE91nrE91nrE;6S>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>$=L$8m5Ci>"Vt%8Qn_i +>"Mmi>$=L$8m5Ci>"Zq@3_
  • "Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"MmiLKX^$!.Y~> +"ooH!3%R$?r\sm/rAXd.rAXd.rAXd.rAY]H3%R$?3&ETG3%R$G3%R$?3&ETG3%R$G3%Xte!&XX6 +!&XX6!&XX6!&XX6!&XX6!\?;fjZ"#,3%R$K/3#1?3%R$?3&iHK/3#U?3%Xte!%e(.*@s0$3&ETG +3%R$G3%R$?3&ETG3%R$G3%R$G3&iJf2ukN.2ukN.2ukN.2ukMh2ukN.2ukN.2ukN.2ukN.2ukN. +2ukN-3&N6H/3#1?/3#1?/3#1?/3#1?/3#1?/3#1?/3#1?3&ETG3&i`S/3#UG3%R$K1cR$G3&ETG +`Afn83%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G +3%Vs,!>b`d~> +"oo8f/Met7r[e++r@J"*r@J"*r@J"*r@JpD/Met7/L)i'/Met'/Met7/L)i'/Met'/Mm;V!$hFo +!$hFo!$hFo!$hFo!$hFo!])DQjXh6(/Met11G(C7/Met7/M/b11G(17/Mm;V!&OR**A]9'/L)i' +/Met'/Met7/L)i'/Met'/Met'/M/dW/H@U*/H@U*/H@U*/H@Td/H@U*/H@U*/H@U*/H@U*/H@U* +/H@U)/N#=91G(C71G(C71G(C71G(C71G(C71G(C71G(C7/L)i'/M/2!1G(1'/Met1,:t]'/L)i' +`@X+q/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met' +/Mk9r!=o0\~> +"oooP>"Vsjr`T:orE91nrE91nrE91nrE:+3>"Vsj>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"\]r!(m,m +!(m,m!(m,m!(m,m!(m,m!_QWfj]WEl>"Vt%8m4hj>"Vsj>$=O%8m5Cj>"\]r!)!2n*D0L->"Mmi +>"Vsi>"Vsj>"Mmi>"Vsi>"Vsi>$=Ps=o_1n=o_1n=o_1n=o_1S=o_1n=o_1n=o_1n=o_1n=o_1n +=o_1m=uAoU8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi +`EG;o>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi +>"Z\9!?_Am~> +!< +!< +!<=DB=qjS4>"Vsj>$=O%8m5Cj>"Vt%8m4jJ=oq<"8cDln9)Von9)Von9)Von9)Von9)Dd18m4hj +8m4ei8m4hj8Qn_i8m4ei8m4hj8Qnab=o_.m=o_.m=o_.m=o_.m=pIZ'8Qo:i>"[m[1J1hS8m4hj +>"Vsj>$=O%8m5Cj>"Vt%8m4hj8Qn_i8m4ei8m4hj8Qn_i8m4ei8m4hj8c;fm9)Von9)Von9)Von +9)Von9)Vop8m4jI=o_1n=o_1n=o_1n=o_1n=o_1m=u])W8m5Ci>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj +>"Vsj>"Vt%8Qn_i>"Mmi>$=L$8m5Ci>"Vt%8Qna(=u&ZQ8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei +8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei9(uKi+96o~> +!WWZBJJWkRJJXIc!=]$Z~> +!rrW9')iCA')iCR&e>Tc%h]Bc%hB9`&e>Kc%hdt7#8.O[&e>Tc')iCA')`=@')`=@')`=@')N1H +&e>Tc&e>Tf%h]EP&crRV&,m1C%h]EP&ciLUrX]#ArX]#ArX]#ArX]#ArXT>K%h]Kc&e>Tc%he(: +!##8A'bV#i%hB9`&e>Kc%h]B`&e>Tc%h]EP&crRV&,m1C%h]EP&crRV&,m1C%h]EP')iCA')`=@ +')`=@')`=@')`=@')`=E&e>Tc%hdt7;A'KQ%hB9`&e>Kc%h]B`&e>Tc%h]Bc%hB9c%h]Bc&e>Tc +&e>Tc&e>Tc&e>Tc&e>Tc&e>Tc&e>Tc&eY]f%h]Kc&e>Tf%h]Bc&e>Tc&eY]f`"2k\0b4m-&eY]f +&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>WL%flt:J,~> +!rrrP,lSnd,lSnu,Tn?T+=&'T+ +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/slides/job-initiation/Makefile b/executable_names/doc/slides/job-initiation/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..47ab91891640ad97aec5c6d86db7b1725a6cbc4b --- /dev/null +++ b/executable_names/doc/slides/job-initiation/Makefile @@ -0,0 +1,22 @@ +all: slides.dvi + +# -paper usr +view: slides.dvi + xdvi -paper usr -expert -s 0 slides +viewps: slides.ps + ghostview -seascape slides.ps + +clean: + rm -f slides.dvi slides.aux slides.log slides.ps + +slides.dvi: slides.tex penguin.eps + latex slides +slides.ps: slides.dvi + dvips -O 0.75in,0 -f $@ # slides 1-per page + +%.eps: %.obj + tgif -print -eps $< + +%.pdf: %.dvi + dvipdf $< $@ + diff --git a/executable_names/doc/slides/job-initiation/llnl.gif b/executable_names/doc/slides/job-initiation/llnl.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b0b97feb3bb36bdc92bd8a5e6cd8cfd013bcfd1 Binary files /dev/null and b/executable_names/doc/slides/job-initiation/llnl.gif differ diff --git a/executable_names/doc/slides/job-initiation/llnl.ps b/executable_names/doc/slides/job-initiation/llnl.ps new file mode 100644 index 0000000000000000000000000000000000000000..589a9e0fc2b062f304979756eac33d123e99be5c --- /dev/null +++ b/executable_names/doc/slides/job-initiation/llnl.ps @@ -0,0 +1,577 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/garlick/projects/project-slides/llnl.ps +%%Creator: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) - by John Bradley +%%BoundingBox: 270 362 342 430 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 216 string def + +% define space for color conversions +/grays 72 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +270 362 translate + +% size of image (on paper, in 1/72inch coords) +72.00000 67.96800 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +72 68 8 % dimensions of data +[72 0 0 -68 0 68] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff0909090c0c0c5d5d5dfafafafffffffcfcfcfffffff8f8f8fffffffcfcfcf5f5f5 +dedede0000000a0a0a000000010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010101010000000f0f0f0202020000000c0c0c050505000000050505 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +eaeaea4c4c4c000000535353f7f7f7ffffffffffffffffffffffffffffffffffffffffff +dedede000000010101010101000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000c0c0c000000000000060606000000000000060606000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffffd2d2d2030303646464fffffffffffffdfdfdfbfbfbfcfcfcfffffffdfdfdffffff +dbdbdb000000000000040404000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000010101000000010101050505030303000000010101080808 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fffffffcfcfc000000616161fffffffefefefffffffdfdfdfffffffffffffbfbfbfefefe +cbcbcb0f0f0f000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000050505040404000000000000020202000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fafafaececec0000005d5d5dfcfcfcfbfbfbffffffffffffffffffffffffffffffffffff +e6e6e67d7d7d787878737373757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +7575757575757575757575757b7b7b6c6c6c7878787373736565658282826e6e6e111111 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffffededed0f0f0f676767fefefefcfcfcfffffffdfdfdfcfcfcfffffffefefeffffff +fffffff0f0f0fffffffcfcfcfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfffffff9f9f9fafafafffffffffffff8f8f8939393181818 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fcfcfce7e7e7000000606060f8f8f8fffffffffffffffffffffffffffffffcfcfcfefefe +fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff7f7f7fffffffdfdfdfffffffafafa9595951a1a1a000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fefefeffffff000000636363f9f9f9fffffffcfcfcfffffffdfdfdfafafafefefeffffff +fdfdfdfffffffffffff9f9f9ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff6f6f6fffffffafafa979797141414000000111111 + +000000010101000000000000020202212121fffffffffffffffffffefefefdfdfdffffff +f7f7f7ffffff383838040404404040f8f8f8fffffffffffffffffff6f6f6fffffffefefe +fffffff3f3f3000000787878edededfefefefffffffffffffefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefffffffbfbfbffffffffffff +fafafafffffffffffff9f9f9fefefefffffffafafa949494070707000000131313000000 + +000000010101000000000000020202212121fffffffffffffdfdfdfafafafffffffcfcfc +ffffffffffff2e2e2e000000464646fafafafffffffdfdfdfafafafefefefcfcfcffffff +fafafaebebeb0d0d0d333333cdcdcdfffffff6f6f6f8f8f8fefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefffffffffffffffffffefefe +f5f5f5f2f2f2f7f7f7ffffffffffffffffff919191151515020202050505000000030303 + +000000010101000000000000020202212121fffffffffffffdfdfdf9f9f9fffffff5f5f5 +ffffffffffff505050010101434343fefefefffffffcfcfcfafafafffffff9f9f9ffffff +fffffff0f0f0000000000000949494fffffffbfbfbffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffff9f9f9fffffffbfbfbfefefe +fffffffffffffffffffffffffcfcfc9494941d1d1d000000000000000000000000070707 + +000000010101000000000000020202212121fffffffffffffffffffefefefffffff7f7f7 +ffffffffffffababab1717173a3a3afffffffcfcfcffffffffffffffffffffffffffffff +fffffffdfdfd0000001717177d7d7df7f7f7fffffffdfdfdffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8 +ebebebf7f7f7fffffff7f7f79898981616160000000f0f0f0000000000000f0f0f000000 + +000000010101000000000000020202212121fffffffffffffefefefffffffefefeffffff +fcfcfcfdfdfdffffff1616163e3e3efffffff7f7f7fffffffffffffafafafffffffafafa +f7f7f7eeeeee1818180000000d0d0db5b5b5fffffffffffffcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfffffff0f0f0ffffffffffff +fffffffffffff7f7f79c9c9c101010000000000000020202030303010101000000000000 + +000000010101000000000000020202212121fffffffffffffafafafffffffdfdfdffffff +f6f6f6f8f8f8ffffff030303474747fbfbfbfffffffffffffffffff2f2f2fffffffdfdfd +ffffffffffffc3c3c31b1b1b0505058b8b8bc9c9c9b6b6b6c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d5d5d5bcbcbcc7c7c7cecece +c4c4c4c7c7c78989890e0e0e000000040404000000000000060606000000000000060606 + +000000010101000000000000020202212121fffffffffffffafafafffffffcfcfcffffff +f8f8f8fcfcfcffffff0707072a2a2abebebefffffffefefefffffffafafaffffffffffff +fcfcfcf9f9f9e2e2e2313131000000000000070707030303000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000101010b0b0b010101 +0000000000000606060000000e0e0e0000000000000a0a0a000000000000030303080808 + +000000010101000000000000020202212121fffffffffffffdfdfdfefefefafafafcfcfc +fefefefffffff1f1f11c1c1c000000777777fffffff4f4f4fffffffffffff9f9f9ffffff +fffffffffffff7f7f7d4d4d4979797292929000000020202000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000202020d0d0d000000000000 +0d0d0d0707070000000404040000000000000505050000000000000606060c0c0c000000 + +0202020000000101010000000000002c2c2cf6f6f6fffffffffffffffffff9f9f9fafafa +fefefefffffff6f6f6adadad070707676767fffffff9f9f9fffffff4f4f4fcfcfcffffff +fefefefcfcfcfffffffefefeefefefd3d3d3bbbbbbb0b0b0b2b2b2b2b2b2b2b2b2b2b2b2 +b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2 +b1b1b1b0b0b0b8b8b8b3b3b3a7a7a7b2b2b2bcbcbcafafafacacacc0c0c0b2b2b2535353 +0000000000000d0d0d000000000000000000000000000000000000000000000000000000 + +0000000000000f0f0f000000000000040404727272f9f9f9fcfcfcfcfcfcffffffffffff +fdfdfdf4f4f4fafafae4e4e40000002222229e9e9efafafaefefefffffffffffffffffff +fffffffffffffffffffffffffffffffefefef9f9f9fafafaffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffefefefffffff6f6f6ffffff8c8c8c111111 +0a0a0a090909000000101010000000000000000000000000000000000000000000000000 + +0404040000000a0a0a000000010101000000444444fffffffffffffefefefafafaffffff +fffffff5f5f5fefefef4f4f43131310000007d7d7df3f3f3fbfbfbf9f9f9e7e7e7ffffff +fdfdfdf9f9f9f8f8f8fbfbfbfdfdfdfffffffffffffffffffbfbfbfbfbfbfbfbfbfbfbfb +fbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfb +fefefefffffff4f4f4f9f9f9fffffff8f8f8efefefffffffffffff929292171717000000 +010101000000000000020202000000000000000000000000000000000000000000000000 + +070707000000000000090909000000040404595959f6f6f6fcfcfcfffffff9f9f9fafafa +fefefeffffffffffffedededb5b5b5171717000000c9c9c9fffffffbfbfbffffffffffff +fffffffffffffffffffffffffdfdfdfbfbfbfbfbfbfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffbfbfbffffffffffffffffffffffff9b9b9b0909090000000d0d0d +000000000000101010000000000000000000000000000000000000000000000000000000 + +0000000101010000000606060000000202022a2a2aabababf3f3f3fffffffefefefafafa +fbfbfbfdfdfdffffffffffffe4e4e42d2d2d0e0e0e555555e2e2e2fcfcfcffffffffffff +fffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fbfbfbfafafafffffffbfbfbfdfdfdffffffeeeeeea7a7a70a0a0a020202080808090909 +000000010101070707000000000000000000000000000000000000000000000000000000 + +000000000000060606000000020202080808000000919191fffffffffffff7f7f7fdfdfd +fffffffafafaffffffffffffffffff8b8b8b0404040000005c5c5cfffffff4f4f4f0f0f0 +fcfcfcfefefefdfdfdf9f9f9fafafaffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffbfbfbffffffffffffffffffefefef959595242424000000090909040404000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +0606060000000606060000000505050a0a0a000000666666f3f3f3fffffff5f5f5fcfcfc +fffffffffffffcfcfcfafafaf6f6f6fcfcfc555555000000060606545454ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffbfbfbffffffffffffa9a9a92b2b2b000000101010000000000000000000 +090909040404000000030303000000000000000000000000000000000000000000000000 + +0202020000000000000f0f0f0000000000000c0c0c010101acacacf4f4f4fffffffefefe +fdfdfdfdfdfdfffffffffffffffffffafafaf9f9f95f5f5f000000000000646464cecece +f5f5f5fdfdfdfffffffffffffffffffffffffffffff7f7f7ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f9f9f9fffffffafafafffffffcfcfc7878780000000b0b0b000000030303000000000000 +030303030303000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000717171f0f0f0ffffffffffff +fffffff4f4f4fffffffbfbfbf9f9f9fffffffffffffcfcfc646464363636010101000000 +7b7b7bb0b0b0b8b8b8fffffffbfbfbfbfbfbffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff9f9f9fffffffcfcfcf4f4f4fffffffffffffdfdfdfbfbfb +ffffffecececffffffb4b4b4898989000000000000090909000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +0000000000000000000000000000000000000000000000000202026d6d6df2f2f2ffffff +f8f8f8fffffffffffffffffffffffff4f4f4f4f4f4fffffff3f3f3dcdcdc8585852e2e2e +0000001a1a1a1e1e1e787878888888919191848484707070888888888888888888888888 +8888888888888888888888889393938181818686869292928585857b7b7b888888949494 +9090908d8d8d7d7d7d090909000000000000111111000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000030303646464ffffff +fffffff1f1f1fffffffffffffffffff7f7f7fffffffefefefffffffffffffbfbfbc7c7c7 +adadad7d7d7d1313130707070000000000000c0c0c0d0d0d000000000000000000000000 +000000000000000000000000020202000000000000010101000000000000000000000000 +0000000000000d0d0d0202020000000c0c0c060606000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000020202000000252525ffffff +fafafafffffffffffff9f9f9fefefef6f6f6fffffff2f2f2fffffffbfbfbfffffff9f9f9 +fffffff8f8f8cacacad5d5d5c7c7c7c7c7c7c2c2c2bcbcbccccccccccccccccccccccccc +ccccccccccccccccccccccccc9c9c9d5d5d5c8c8c8c2c2c2d5d5d5d2d2d2c6c6c6cfcfcf +d5d5d54a4a4a0000000a0a0a0000000000000000000c0c0c000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000060606000000000000272727 +686868fffffffffffff8f8f8fffffffbfbfbfffffffffffffffffffbfbfbfffffff8f8f8 +fffffffffffff4f4f4fffffff9f9f9fefefefffffffffffffcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcfffffffbfbfbfafafafbfbfbf9f9f9fcfcfcfcfcfcf3f3f3 +818181131313000000000000030303020202000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000030303010101000000 +4e4e4eb5b5b5eaeaeafffffffffffffffffffffffffffffffbfbfbf6f6f6fcfcfcffffff +fffffffffffffcfcfcfefefefdfdfdffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff2f2f2fffffffffffff6f6f6fffffff6f6f67d7d7d +0000000000000f0f0f050505040404000000060606050505000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +0000000000000000000000000000000000000000000000000000000c0c0c000000000000 +1010100000006f6f6ff7f7f7fbfbfbf9f9f9f8f8f8fbfbfbfffffffffffffefefef2f2f2 +fafafaf8f8f8fefefefffffffffffffffffffdfdfdf8f8f8fefefefefefefefefefefefe +fefefefefefefefefefefefefbfbfbfbfbfbfffffffffffffdfdfdeeeeee8d8d8d060606 +0c0c0c000000040404000000080808040404000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000040404000000000000070707 +0000000707070000006e6e6efefefeffffffffffffefefeffdfdfdf9f9f9ffffffffffff +fffffffffffffffffffbfbfbfbfbfbffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffff6f6f6ffffffffffff868686020202010101 +000000010101040404000000000000020202000000070707000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000737373f7f7f7fffffffffffffffffffefefeffffffffffff +fffffffdfdfdfffffffffffff7f7f7fafafafffffffefefeffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffbfbfb898989090909000000040404 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000404041e1e1e878787f8f8f8d9d9d9ffffffffffffffffff +fffffffafafafbfbfbfffffffffffffffffffdfdfdfffffffefefefefefefefefefefefe +fefefefefefefefefefefefef4f4f4f5f5f5ffffff8282820101010a0a0a0a0a0a000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000606060404040707070000000e0e0ebdbdbdc8c8c8d5d5d5 +fcfcfcfffffffffffff5f5f5fafafaf9f9f9f8f8f8ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff828282060606000000000000000000050505 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000030303161616000000656565 +979797eaeaeafffffffafafaffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff9f9f98585850202020000000c0c0c0000000b0b0b000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000808080000000808080000000000000b0b0b000000000000 +0606065858587979796969697171717a7a7a7070706e6e6e6f6f6f6f6f6f6f6f6f6f6f6f +6f6f6f6f6f6f6f6f6f6f6f6f767676050505000000000000000000090909000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000001010100e0e0e000000000000121212040404 +0000000d0d0d040404000000000000000000000000080808020202020202020202020202 +020202020202020202020202030303000000000000000000000000000000000000060606 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000707070000000000000000000e0e0e060606000000000000 +0000000000000000000505050a0a0a010101000000000000000000000000000000000000 +0000000000000000000000000505050000000000001d1d1d0000000000001c1c1c000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000606060505050000000000000a0a0a000000060606 +010101000000030303010101000000000000030303000000020202020202020202020202 +0202020202020202020202020000000606060404040000000303030e0e0e000000080808 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer diff --git a/executable_names/doc/slides/job-initiation/penguin.eps b/executable_names/doc/slides/job-initiation/penguin.eps new file mode 100644 index 0000000000000000000000000000000000000000..46819fc95ef19371934999910391bd01a47c0eee --- /dev/null +++ b/executable_names/doc/slides/job-initiation/penguin.eps @@ -0,0 +1,1041 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(TM) 3.2 +%%For: (Neal Tucker) (ntucker@adobe.com) +%%Title: (penguin.eps) +%%CreationDate: (4/29/96) (8:20 AM) +%%BoundingBox: 4 2 221 258 +%%DocumentProcessColors: Black +%%DocumentSuppliedResources: procset Adobe_packedarray 2.0 0 +%%+ procset Adobe_cshow 1.1 0 +%%+ procset Adobe_customcolor 1.0 0 +%%+ procset Adobe_IllustratorA_AI3 1.0 1 +%AI3_ColorUsage: Black&White +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 31 31 583 761 +%AI3_DocumentPreview: Header +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_packedarray 2.0 0 +%%Title: (Packed Array Operators) +%%Version: 2.0 +%%CreationDate: (8/2/90) () +%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_packedarray 5 dict dup begin put +/initialize +{ +/packedarray where + { + pop + } + { + Adobe_packedarray begin + Adobe_packedarray + { + dup xcheck + { + bind + } if + userdict 3 1 roll put + } forall + end + } ifelse +} def +/terminate +{ +} def +/packedarray +{ +array astore readonly +} def +/setpacking +{ +pop +} def +/currentpacking +{ +false +} def +currentdict readonly pop end +%%EndResource +Adobe_packedarray /initialize get exec +%%BeginResource: procset Adobe_cshow 1.1 0 +%%Title: (cshow Operator) +%%Version: 1.1 +%%CreationDate: (1/23/89) () +%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_cshow 3 dict dup begin put +/initialize +{ +/cshow where + { + pop + } + { + userdict /Adobe_cshow_vars 1 dict dup begin put + /_cshow + {} def + Adobe_cshow begin + Adobe_cshow + { + dup xcheck + { + bind + } if + userdict 3 1 roll put + } forall + end + end + } ifelse +} def +/terminate +{ +} def +/cshow +{ +exch +Adobe_cshow_vars + exch /_cshow + exch put + { + 0 0 Adobe_cshow_vars /_cshow get exec + } forall +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_customcolor 1.0 0 +%%Title: (Custom Color Operators) +%%Version: 1.0 +%%CreationDate: (5/9/88) () +%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_customcolor 5 dict dup begin put +/initialize +{ +/setcustomcolor where + { + pop + } + { + Adobe_customcolor begin + Adobe_customcolor + { + dup xcheck + { + bind + } if + pop pop + } forall + end + Adobe_customcolor begin + } ifelse +} def +/terminate +{ +currentdict Adobe_customcolor eq + { + end + } if +} def +/findcmykcustomcolor +{ +5 packedarray +} def +/setcustomcolor +{ +exch +aload pop pop +4 + { + 4 index mul 4 1 roll + } repeat +5 -1 roll pop +setcmykcolor +} def +/setoverprint +{ +pop +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_IllustratorA_AI3 1.1 3 +%%Title: (Adobe Illustrator (R) Version 3.0 Abbreviated Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_IllustratorA_AI3 61 dict dup begin put +/initialize +{ +userdict /Adobe_IllustratorA_AI3_vars 58 dict dup begin put +/_lp /none def +/_pf {} def +/_ps {} def +/_psf {} def +/_pss {} def +/_pjsf {} def +/_pjss {} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart [/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0] def +/_renderEnd [null null null null /i1 /i1 /i1 /i1] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading [0 0] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx {} def +/Tj {} def +/CRender {} def +/_AI3_savepage {} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc {} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc {} def +/_i null def +Adobe_IllustratorA_AI3 begin +Adobe_IllustratorA_AI3 + { + dup xcheck + { + bind + } if + pop pop + } forall +end +end +Adobe_IllustratorA_AI3 begin +Adobe_IllustratorA_AI3_vars begin +newpath +} def +/terminate +{ +end +end +} def +/_ +null def +/ddef +{ +Adobe_IllustratorA_AI3_vars 3 1 roll put +} def +/xput +{ +dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if +load begin def end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ +dup length exch stringwidth +exch 5 -1 roll 3 index mul add +4 1 roll 3 1 roll mul add +} def +/swj +{ +dup 4 1 roll +dup length exch stringwidth +exch 5 -1 roll 3 index mul add +4 1 roll 3 1 roll mul add +6 2 roll /_cnt 0 ddef +{1 index eq {/_cnt _cnt 1 add ddef} if} forall pop +exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ +4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow +3 npop +} def +/jss +{ +4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + }ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow +6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow +2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + }ifelse + 2 copy rmoveto + } exch cshow +5 npop +} def +/pl +{ +transform +0.25 sub round 0.25 add exch +0.25 sub round 0.25 add exch +itransform +} def +/setstrokeadjust where + { + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def + } + { + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def + }ifelse +/d +{ +setdash +} def +/cf {} def +/i +{ +dup 0 eq + { + pop cf + } if +setflat +} def +/j +{ +setlinejoin +} def +/J +{ +setlinecap +} def +/M +{ +setmiterlimit +} def +/w +{ +setlinewidth +} def +/H +{} def +/h +{ +closepath +} def +/N +{ +_pola 0 eq + { + _doClip 1 eq {clip /_doClip 0 ddef} if + newpath + } + { + /CRender {N} ddef + }ifelse +} def +/n +{N} def +/F +{ +_pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore clip newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + }ifelse + } + { + /CRender {F} ddef + }ifelse +} def +/f +{ +closepath +F +} def +/S +{ +_pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore clip newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + }ifelse + } + { + /CRender {S} ddef + }ifelse +} def +/s +{ +closepath +S +} def +/B +{ +_pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore clip newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + }ifelse + } + { + /CRender {B} ddef + }ifelse +} def +/b +{ +closepath +B +} def +/W +{ +/_doClip 1 ddef +} def +/* +{ +count 0 ne + { + dup type (stringtype) eq {pop} if + } if +_pola 0 eq {newpath} if +} def +/u +{} def +/U +{} def +/q +{ +_pola 0 eq {gsave} if +} def +/Q +{ +_pola 0 eq {grestore} if +} def +/*u +{ +_pola 1 add /_pola exch ddef +} def +/*U +{ +_pola 1 sub /_pola exch ddef +_pola 0 eq {CRender} if +} def +/D +{pop} def +/*w +{} def +/*W +{} def +/` +{ +/_i save ddef +6 1 roll 4 npop +concat pop +userdict begin +/showpage {} def +0 setgray +0 setlinecap +1 setlinewidth +0 setlinejoin +10 setmiterlimit +[] 0 setdash +/setstrokeadjust where {pop false setstrokeadjust} if +newpath +0 setgray +false setoverprint +} def +/~ +{ +end +_i restore +} def +/O +{ +0 ne +/_of exch ddef +/_lp /none ddef +} def +/R +{ +0 ne +/_os exch ddef +/_lp /none ddef +} def +/g +{ +/_gf exch ddef +/_fc +{ +_lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if +} ddef +/_pf +{ +_fc +fill +} ddef +/_psf +{ +_fc +ashow +} ddef +/_pjsf +{ +_fc +awidthshow +} ddef +/_lp /none ddef +} def +/G +{ +/_gs exch ddef +/_sc +{ +_lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if +} ddef +/_ps +{ +_sc +stroke +} ddef +/_pss +{ +_sc +ss +} ddef +/_pjss +{ +_sc +jss +} ddef +/_lp /none ddef +} def +/k +{ +_cf astore pop +/_fc +{ +_lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if +} ddef +/_pf +{ +_fc +fill +} ddef +/_psf +{ +_fc +ashow +} ddef +/_pjsf +{ +_fc +awidthshow +} ddef +/_lp /none ddef +} def +/K +{ +_cs astore pop +/_sc +{ +_lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if +} ddef +/_ps +{ +_sc +stroke +} ddef +/_pss +{ +_sc +ss +} ddef +/_pjss +{ +_sc +jss +} ddef +/_lp /none ddef +} def +/x +{ +/_gf exch ddef +findcmykcustomcolor +/_if exch ddef +/_fc +{ +_lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if +} ddef +/_pf +{ +_fc +fill +} ddef +/_psf +{ +_fc +ashow +} ddef +/_pjsf +{ +_fc +awidthshow +} ddef +/_lp /none ddef +} def +/X +{ +/_gs exch ddef +findcmykcustomcolor +/_is exch ddef +/_sc +{ +_lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if +} ddef +/_ps +{ +_sc +stroke +} ddef +/_pss +{ +_sc +ss +} ddef +/_pjss +{ +_sc +jss +} ddef +/_lp /none ddef +} def +/A +{ +pop +} def +currentdict readonly pop end +setpacking +/annotatepage +{ +} def +%%EndResource +%%EndProlog +%%BeginSetup +Adobe_cshow /initialize get exec +Adobe_customcolor /initialize get exec +Adobe_IllustratorA_AI3 /initialize get exec +%%EndSetup +0 A +u +*u +0 O +0 g +0 i +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +74.8907 215.0693 m +74.041 243.9622 85.304 256.7226 108.6809 257.1476 c +132.0577 257.5727 146.7214 245.2467 149.6966 229.0954 c +152.6719 212.9441 150.9717 191.6925 156.9222 180.6416 c +162.8727 169.5907 166.698 161.09 176.8988 148.339 c +187.0996 135.588 193.4751 122.6245 196.4503 106.8983 c +199.4255 91.172 201.1257 83.7339 193.4751 75.6583 c +185.8245 67.5827 172.2234 54.4066 162.0226 69.2828 c +156.9158 76.7302 156.362 85.9914 164.9978 87.9843 c +170.5233 89.2594 174.4902 88.8343 178.5989 86.7092 c +182.7076 84.584 183.6993 85.5757 178.7406 89.2594 c +173.7819 92.943 172.7901 89.5427 174.4902 95.4932 c +176.1904 101.4437 178.4436 112.1015 173.7682 123.8608 c +171.6149 129.2767 164.3121 144.122 157.4349 147.7774 C +156.799 148.1155 154.9871 148.8579 156.2138 147.3473 c +158.0807 145.0483 167.9587 130.4785 170.7682 121.7774 c +173.7716 112.4762 174.2069 103.5688 172.6484 97.9017 c +171.09 92.2346 168.3981 89.9678 165.1395 89.9678 c +161.8809 89.9678 158.9057 88.4093 158.9057 95.9182 c +158.9057 103.4272 159.6849 114.7614 155.6471 124.3246 c +151.6093 133.8879 146.7214 140.4759 145.6588 144.5137 c +144.5962 148.5515 142.2585 159.3899 137.3706 165.5529 c +132.4828 171.7159 130.3576 175.7537 132.9078 182.7667 c +135.458 189.7798 133.5453 191.6925 128.4449 193.1801 c +123.3445 194.6677 116.544 196.7929 114.8439 200.1931 c +113.1437 203.5934 114.2063 210.3939 118.0316 212.0941 c +121.8569 213.7942 128.2324 211.4565 128.4449 206.5686 c +128.6575 201.6807 126.3198 199.1305 126.9573 198.068 c +127.5949 197.0054 130.9951 195.3052 132.6953 197.2179 c +134.3954 199.1305 134.8204 205.081 133.1203 210.6064 c +131.4202 216.1319 130.5701 219.9572 124.4071 221.2323 c +118.2441 222.5074 115.4814 222.0823 112.5062 218.257 c +109.531 214.4317 108.2559 208.2688 109.1059 203.8059 c +109.956 199.3431 108.2559 201.8933 105.2806 202.1058 c +102.3054 202.3183 103.1555 202.5308 100.1802 202.3183 c +97.205 202.1058 98.2676 204.0184 98.055 207.2062 c +97.8425 210.3939 97.4175 216.9819 92.9546 219.5321 c +88.4918 222.0823 80.8412 219.1071 81.0537 208.4813 c +81.2662 197.8554 84.879 192.755 87.0042 196.5803 c +89.1293 200.4056 88.0668 198.493 85.9416 200.1931 c +83.8164 201.8933 82.3288 208.9063 84.6665 211.0315 c +87.0042 213.1566 89.7669 213.1566 91.2545 211.8815 c +92.7421 210.6064 95.0798 206.3561 94.6548 203.5934 c +94.2297 200.8307 94.0172 200.6182 91.2545 198.7055 c +88.4918 196.7929 87.4292 195.0927 84.2415 192.9676 c +81.0537 190.8424 79.7786 185.9545 82.3288 184.6794 c +84.879 183.4043 85.0915 183.6168 87.2167 180.4291 c +89.3419 177.2413 92.9546 175.7537 101.8804 177.2413 c +110.8061 178.7289 114.472 180.8449 121.2194 183.1918 c +126.1073 184.8919 124.4071 184.6794 126.1073 186.5921 c +127.8074 188.5047 130.5701 185.742 128.0199 184.0419 c +125.4697 182.3417 119.7318 180.6416 115.4814 179.154 c +111.2311 177.6663 106.3432 173.416 97.4175 173.841 c +88.4918 174.2661 94.6548 174.0536 91.8921 174.2661 c +89.1293 174.4786 87.8542 174.0536 90.8295 171.9284 c +93.8047 169.8032 93.5922 169.1657 96.1424 168.3156 c +98.6926 167.4655 102.0929 167.4655 106.1307 168.9532 c +110.1685 170.4408 120.3693 174.9036 123.5571 177.0288 c +126.7448 179.154 129.295 176.3912 126.1073 174.2661 c +122.9195 172.1409 122.0694 172.7785 119.0942 170.8658 c +116.119 168.9532 110.5935 165.7654 106.9808 162.3651 c +103.368 158.9649 102.5179 158.7523 98.055 158.5398 c +93.5922 158.3273 90.8295 163.0027 88.9168 165.1278 c +87.0042 167.253 87.2167 168.5281 84.879 171.0783 c +82.5413 173.6285 82.3288 172.991 81.9038 170.2283 c +81.4787 167.4655 78.291 160.4525 75.5283 155.7771 c +72.7655 151.1017 72.553 145.3638 72.9781 141.326 c +73.4031 137.2882 72.3405 136.8631 69.1528 132.1878 c +65.965 127.5124 60.6521 113.6988 59.802 109.2359 c +58.952 104.7731 57.8894 95.6349 58.3144 90.3219 c +58.7394 85.009 57.2518 83.9464 53.4265 87.5592 c +49.6012 91.172 48.3261 95.2098 48.5386 100.5227 c +48.7204 105.068 49.3516 108.2774 49.9349 109.9441 c +50.5182 111.6108 49.9557 112.7983 48.7512 110.7236 c +46.1324 106.2131 45.9884 98.3976 46.626 95.6349 c +47.2635 92.8721 47.4761 87.9843 54.4891 81.3962 c +61.5022 74.8082 71.703 65.67 80.2036 59.507 c +88.7043 53.344 91.6795 45.6934 79.141 40.168 C +87.0042 29.5421 91.2545 24.0167 87.8542 17.0037 C +94.8673 21.0415 92.1685 30.5606 88.7682 33.1108 c +85.368 35.661 87.4292 37.6178 90.4044 35.7051 c +93.3797 33.7925 94.4423 29.9672 106.1307 30.1797 c +117.8191 30.3922 130.4218 31.5766 137.4349 41.7774 c +144.4479 51.9783 145.8017 43.3946 144.1016 37.4441 c +142.4014 31.4936 138.2207 18.0662 144.8087 19.3413 C +145.6588 27.2045 147.5715 34.005 147.5715 42.5057 c +147.5715 51.0063 148.4349 55.1108 147.7682 67.4441 c +147.1259 79.3277 152.2468 80.1211 157.5597 80.1211 c +162.8727 80.1211 161.1725 76.7209 157.7723 76.9334 c +154.372 77.1459 150.7592 75.8708 150.5467 67.1576 c +150.3342 58.4444 150.5467 59.2945 152.0343 51.4314 c +153.5219 43.5682 153.7344 41.2306 152.4593 32.5174 c +151.1842 23.8042 150.1217 19.1288 155.8596 13.8159 c +161.5976 8.503 170.3108 9.9906 174.7736 13.3909 c +179.2365 16.7911 187.7371 24.6543 195.3877 27.2045 c +203.0383 29.7547 211.114 31.6673 215.3643 35.9176 c +219.6147 40.168 218.5521 43.1432 214.0892 45.4809 c +209.6264 47.8186 205.376 46.756 201.9757 50.5813 c +198.5755 54.4066 196.8753 62.9073 198.1504 67.3701 c +199.4255 71.833 200.9132 69.9203 200.9132 66.7326 c +200.9132 63.5448 201.1257 60.5696 204.3134 56.5318 c +207.5012 52.494 210.4764 50.5813 215.5768 47.3936 c +220.6772 44.2058 223.865 39.1054 217.4895 34.6425 c +211.114 30.1797 207.5012 27.6295 202.1883 25.5043 c +196.8753 23.3792 188.1622 18.2788 182.8492 12.9658 c +177.5363 7.6529 174.5611 2.9776 164.1478 2.9776 c +153.7344 2.9776 148.9787 5.4759 145.8713 11.6907 c +143.7462 15.9411 142.6836 15.3035 137.7957 15.516 c +132.9078 15.7286 116.544 15.9411 103.793 15.7286 c +91.042 15.516 86.7917 13.3909 81.0537 8.7155 c +75.3157 4.0401 73.1906 0.4273 62.3522 4.0401 c +51.5139 7.6529 45.7759 11.6907 29.6246 14.8785 c +13.4734 18.0662 22.1865 16.5786 12.4108 18.7038 c +2.635 20.829 3.2726 25.5043 4.5477 29.3296 c +5.8228 33.1549 9.0105 39.1054 6.2478 46.9685 c +3.4851 54.8316 4.5477 62.9073 11.9857 62.9073 c +19.4238 62.9073 26.4369 61.4197 29.4121 71.1954 c +32.3874 80.9712 33.2374 73.3206 32.3874 70.7704 c +31.5373 68.2202 31.1123 61.2071 24.5242 60.1446 c +17.9362 59.082 16.4486 60.5696 12.4108 60.5696 c +8.373 60.5696 6.6728 57.8069 8.798 53.1315 c +10.9232 48.4561 13.2608 43.5682 12.8358 39.5304 c +12.4108 35.4926 11.9857 34.005 9.0105 30.1797 c +6.0353 26.3544 6.4603 24.4417 11.7732 23.1666 c +17.0861 21.8915 26.6494 19.3413 35.5751 17.2162 c +44.5008 15.091 45.1384 15.091 60.6521 11.0532 c +76.1658 7.0154 80.4161 14.2409 81.6912 22.9541 c +82.9664 31.6673 77.0159 39.9555 71.4904 48.2436 c +65.965 56.5318 60.0145 66.095 52.789 74.8082 c +45.5634 83.5214 41.3131 84.159 37.7003 82.2463 c +34.0875 80.3337 33.4499 80.7587 33.2374 85.6466 c +33.0249 90.5345 32.5999 93.7222 36.6377 100.9478 c +40.6755 108.1734 44.2883 116.0365 48.5386 128.1499 c +52.789 140.2634 56.6143 142.6011 63.8398 153.0144 c +71.0654 163.4277 67.8777 159.3899 72.9781 166.4029 c +78.0785 173.416 76.5908 172.1409 76.1658 183.1918 c +75.7408 194.2427 75.3157 200.6182 74.8907 215.0693 c +f +1 D +54.5971 128.6793 m +55.6961 127.3382 57.2428 130.4814 58.871 131.6548 c +60.3363 132.9959 60.9469 134.8818 60.6213 136.7258 c +60.4584 137.7316 58.8303 137.3963 58.5046 137.0611 c +57.5278 136.0552 57.7262 134.4523 57.0393 133.0378 c +56.2252 131.3615 53.498 130.0204 54.5971 128.6793 c +f +145.951 173.0707 m +148.2714 171.137 149.6701 169.4579 150.9452 172.3269 c +152.2203 175.1958 152.2203 176.3647 149.1388 177.5335 c +146.0573 178.7024 144.6759 179.9775 143.2946 181.5713 c +141.9132 183.1652 141.4224 180.4368 142.5507 177.746 c +143.9321 174.452 144.7375 174.0819 145.951 173.0707 c +f +98.0873 199.4234 m +96.4935 199.7421 94.5808 199.6359 93.5182 198.3608 c +93.0932 197.9357 93.3057 196.7669 94.0495 196.4481 c +95.0058 196.0231 95.6434 196.9794 95.8559 197.7232 c +95.9622 198.042 96.0684 198.467 96.3872 198.5733 c +96.8122 198.7858 97.4336 198.6093 97.8748 198.7858 c +98.4061 198.9983 98.1936 199.4234 98.0873 199.4234 c +f +105.5994 199.1305 m +106.2369 198.1742 107.4058 198.1742 108.3621 197.7492 c +108.8934 197.5367 109.956 197.2179 110.2748 197.9617 c +111.0186 200.2994 107.8346 199.5556 106.3432 199.5556 c +106.0244 199.5556 105.2806 199.6618 105.5994 199.1305 c +f +121.1016 209.4441 m +122.5269 209.3691 124.5182 206.7774 124.7124 203.8036 c +124.7431 203.3336 125.9489 203.3623 126.2015 203.838 c +126.8964 205.0116 126.4187 206.3414 126.0992 207.7666 c +125.8436 208.9067 124.4549 210.1084 123.2792 210.6309 c +122.4954 211.0229 121.7116 211.1535 120.6665 211.0229 c +120.4052 210.8922 119.5182 209.5274 121.1016 209.4441 c +f +89.4377 210.1679 m +88.1053 210.0672 88.5823 209.0454 88.6441 208.2274 C +90.4855 207.1912 90.6621 204.8539 91.0372 203.0018 c +91.0901 202.3005 92.1243 202.6138 92.2235 202.8563 c +93.0524 204.3294 92.0434 206.0161 91.6772 207.7514 c +91.3728 208.6687 90.7674 209.6807 89.8964 210.3201 c +89.7707 210.4281 89.5546 210.1767 89.4377 210.1679 c +f +130.0182 242.7358 m +128.7024 243.8124 126.6432 244.2358 126.0182 242.4858 c +125.3932 240.9858 125.6432 239.4858 125.2682 237.8608 c +125.2682 237.3608 124.6432 237.2358 124.2682 236.7358 c +123.7682 236.1108 123.8932 235.3608 124.1432 235.1108 c +125.3932 233.8608 127.6432 236.3608 129.2682 237.2358 c +130.5182 237.9858 132.2682 236.9858 133.6432 237.8608 c +134.0182 238.1108 134.1432 238.7358 133.7682 239.2358 c +132.8932 240.7358 131.3932 241.6108 130.0182 242.7358 c +f +*U +0 D +168.2848 73.7743 m +168.5016 74.6532 168.9399 76.3409 169.7682 76.6108 c +170.0768 76.7112 170.3298 76.5961 170.4302 76.2876 c +170.6103 75.7354 170.0485 72.6062 170.2761 71.9079 c +170.5247 71.1445 171.3895 71.2465 172.023 71.4529 c +173.4685 71.9237 174.2959 73.6304 174.2429 73.7927 c +174.2219 73.8576 174.1949 73.8848 174.1464 73.869 c +173.9189 73.7949 173.7245 73.013 173.0585 72.7962 c +172.6525 72.6638 172.3397 72.7417 172.2023 73.164 c +172.0594 73.6024 172.6218 76.8395 172.3784 77.5868 c +172.1352 78.3338 171.3801 78.5011 170.698 78.2789 c +169.1062 77.7604 168.4145 75.3615 168.0211 73.922 C +167.9833 73.9276 L +168.1952 77.2482 L +166.2463 76.6135 L +166.145 69.7539 L +167.9804 70.3516 L +168.0209 71.5506 168.0627 72.9115 168.2848 73.7743 c +f +176.8278 73.0178 m +178.4034 73.5309 179.1132 75.4328 179.0445 75.644 c +179.0232 75.709 178.9751 75.7472 178.9263 75.7312 c +178.7964 75.6889 178.4863 74.6 177.593 74.309 c +177.2032 74.182 176.8475 74.2816 176.7627 74.5416 c +176.6359 74.9313 176.7162 75.6223 176.7309 76.1839 C +176.7792 79.2896 L +178.9394 79.993 L +178.9284 80.7439 L +176.7519 80.0351 L +176.8533 82.9783 L +174.9009 81.8573 L +174.8182 75.3274 L +174.8024 74.6037 174.7658 73.9989 174.8716 73.6741 c +175.1466 72.8296 176.0159 72.7535 176.8278 73.0178 c +f +U +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_IllustratorA_AI3 /terminate get exec +Adobe_customcolor /terminate get exec +Adobe_cshow /terminate get exec +Adobe_packedarray /terminate get exec +%%EOF diff --git a/executable_names/doc/slides/job-initiation/slides.tex b/executable_names/doc/slides/job-initiation/slides.tex new file mode 100644 index 0000000000000000000000000000000000000000..5b03a84b80cdee45f776842dd09736a27a7bd153 --- /dev/null +++ b/executable_names/doc/slides/job-initiation/slides.tex @@ -0,0 +1,441 @@ +% +% $Id$ +% + +% slides documenting job startup design +% not to detailed, but some basic info... + +\documentclass[article,letter,landscape]{seminar} + + +\usepackage{pstcol} +\usepackage{slidesec} +\usepackage{semcolor} + +\input{seminar.bug} +\input{seminar.bg2} + +\usepackage{graphics} +\usepackage{fancybox} +\usepackage{fancyhdr} +\usepackage{epsfig} +\usepackage{epsf} + +\pagestyle{empty} +\twoup[1] + +\newcommand{\slurmd}{{\tt slurmd}} +\newcommand{\slurmctld}{{\tt slurmctld}} +\newcommand{\srun}{{\tt srun}} +\newcommand{\sq}{{\tt squeue}} + +\newcommand{\entrylabel}[1]{\mbox{{\tt #1:}}\hfil} +\newenvironment{entry} +{\begin{list}{}% + {\renewcommand{\makelabel}{\entrylabel}% + \setlength{\labelwidth}{50pt}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + }% +}% +{\end{list}} + +\newlength{\Mylen} +\newcommand{\Lentrylabel}[1]{% + \settowidth{\Mylen}{{\tt #1:}}% + \ifthenelse{\lengthtest{\Mylen > \labelwidth}}% + {\parbox[b]{\labelwidth}% term > labelwidth + {\makebox[0pt][l]{{\tt #1:}}\\}}% + {{\tt #1:}}% term < labelwidth + \hfil\relax} + \newenvironment{Lentry} +{\renewcommand{\entrylabel}{\Lentrylabel}% + \begin{entry}} +{\end{entry}} + + + +% Headers and footers personalization using the `fancyhdr' package +\fancyhf{} % Clear all fields +\renewcommand{\headrulewidth}{0.2mm} +\renewcommand{\footrulewidth}{0.2mm} +\fancyhead[C]{\Large\textbf{SLURM Design - Job Initiation}} +\fancyfoot[L]{\includegraphics[scale=0.075]{penguin.eps}\\\tiny LINUX} +\fancyfoot[R]{\includegraphics[scale=0.2]{llnl.ps}\\\tiny LLNL} +\fancyfoot[C]{\tiny Page \theslide} + + +% Create room for headers and footers +\renewcommand{\slidetopmargin}{2cm} +\renewcommand{\slidebottommargin}{3cm} + +% Center horizontally the headers and footers (see seminar.bug) +\renewcommand{\headwidth}{\textwidth} + +% To adjust the frame length to the header and footer ones +\autoslidemarginstrue + +% Hook to tell dvips to print in landscape mode +\def\printlandscape{\special{landscape}} + +% Possibilities: shadow, oval, double, none, plain +\slideframe{none} + +\definecolor{Blue}{rgb}{0.,0.,1.} +\definecolor{Gold}{rgb}{1.,0.84,0.} +\definecolor{Pink}{rgb}{1.,0.75,0.8} +\begin{document} + +\slidepagestyle{fancy} + +% The presentation begins here. + +\begin{slide} + \slideheading{Design Constraints} + \mbox{}\\ + \begin{center} + Overall Design Goals\\ + \begin{itemize} + \item Scalable + \item Fault Tolerant + \item Simplified + \item Administrator Friendly + \item Secure + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Design Constraints} + \mbox{}\\ + \begin{center} + Job Initiation Design Goals\\ + \begin{itemize} + \item Run jobs in several different ``modes'': + \begin{itemize} + \item interactive + \item batch + \item allocate only (then run under allocation) + \end{itemize} + \item Support multiple runs under a single allocation + \item Ability to attach and detach from running jobs + \begin{itemize} + \item for job control and fault tolerance + \end{itemize} + \item Specification of partial or full nodelists + \item Support for prolog/epilog + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Security} + \begin{center} + \begin{itemize} + \item Link Encryption + \begin{itemize} + \item mongo encrypts all communication with a cluster-wide + shared key. + \item access to shared key will be group-limited. + \end{itemize} + \item Job Credential + \begin{itemize} + \item \slurmctld\ will have private keys for every \slurmd\ + and will hash Job Credential against this private key. + \item \slurmd 's will verify \srun\ connections using these + job credentials. + \end{itemize} + \item \slurmd\ and \slurmctld\ will utilize PAM for configurable authentication + over the encrypted link. + \begin{itemize} + \item \slurmd\ will fall through to PAM if credential is null. + \end{itemize} + \end{itemize} + \end{center} +\end{slide} + + +\begin{slide} + \slideheading{\slurmd\ Initialization} + \begin{center} + \begin{itemize} + \item On startup, \slurmd\ will generate a private key and + attempt to contact slurm controller to join the cluster. + \item If slurm controller is not up at time of \slurmd\ intialization, + \slurmd\ will sleep and listen on a well-defined mongo-port for status + requests from controller, or other entity. + \item On first contact with controller, \slurmd\ will exchange secret key + by setting flag {\tt REFRESH\_KEY} in the corresponding message. + \item After private key has been exchanged, \slurmd\ will wait for + further work + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{ Interactive Job Initiation } + \begin{center} + \begin{itemize} + \item For an interactive job, \srun\ will build an allocate request + to send to the controller, based upon user options. + \item the {\tt MSG\_ALLOCATE\_REQ} message will contain the + following information: + \begin{itemize} + \item immediate or block (flag) + \item partition + \item user info (username and/or uid) + \item nprocs, nnodes, ncpus\_per\_task + \item task distribution flag (block$|$cyclic) + \end{itemize} + optional: + \begin{itemize} + \item requested time limit + \item constraint and requested feature list + \end{itemize} + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Interactive Job Initiation, contd ...} + \begin{center} + \begin{itemize} + \item \srun\ initializes mongo with shared mongo-key and + sends allocate request to controller. + \item controller replies with an allocate reply message: + \item message type MSG\_ALLOCATE\_REPLY contains: + \begin{itemize} + \item return and error code + \item node list + \item credential list (1 per node) + \item cpus per node + \end{itemize} + \item if return code indicates an error, \srun\ will print + text representation of error code on stderr and exit + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Interactive Job Initiation, contd ...} + \begin{center} + \begin{itemize} + \item If stdout/err is to be copied to user's terminal, \srun\ initializes + two mongo-ports for every task and begins listening on these ports + \item \srun\ similarly initializes mongo-ports for stdin. + \item \srun\ formulates the list of nodes, credentials, and task + assignments into a MSG\_JOB\_RUN\_REQ message. + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Interactive Job Initiation: job\_run\_request} + \begin{center} + \begin{itemize} + \item MSG\_JOB\_RUN\_REQ contents: + \begin{itemize} + \item job credential + \item jobid + \item command line + \item user info (username and/or uid) + \item ntasks (number of tasks to initiate on this node) + \item stdin, stdout, stderr locations (mongo-ports or files) + (per task) + \end{itemize} + Optional contents (prefixed by id): + \begin{itemize} + \item cwd + \item environment + \item stop time + \item signal handling + \end{itemize} + \end{itemize} + \end{center} +\end{slide} + + +\begin{slide} + \slideheading{Interactive Job Initiation: cont'd ... } + \begin{center} + \begin{itemize} + \item One job run request message is built per node - \srun\ + sends these messages to all nodes using a {\tt mongo\_sendto:}\\ + \begin{verbatim} md = mongo_sendto :, &addr + \end{verbatim} + \item \srun\ then waits for reply messages from all \slurmd 's + with {\tt mongo\_recvfrom} or {\tt mongo\_select} + \item After a timeout, \srun\ sends status update to \slurmctld\ + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Interactive Job Initiation: \slurmd} + \begin{center} + \begin{itemize} + \item \slurmd\ receives a message from \srun\ and spawns a + request thread ({\tt req\_thr}) + \item {\tt req\_thr} reads message header, sees that the message is + of type MSG\_JOB\_RUN\_REQUEST and executes the {\tt job\_thr()} + function. + \item {\tt job\_thr} unpacks message body, then: + \begin{itemize} + \item if credential is non-null, decrypt credential to authorize job + \item null credential: fall through to PAM + \item if job and user are authorized, instantiate a task thread for + each task requested and send MSG\_JOB\_RUN\_REPLY. + \end{itemize} + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Interactive Job Initiation: \slurmd } + \begin{center} + \begin{itemize} + \item {\tt task\_thr} examines std\{in,err,out\} locations for + this task and opens appropriately + \begin{itemize} + \item {\tt /dev/null} + \item host:mongo port + \item filename + \end{itemize} + \item {\tt task\_thr} dups stdout/err/in fds as appropriate. + \item Each {\tt task\_thr } then does fork(), setuid(), chdir() + (if req'd), setup environment, and exec() of the user's executable. + \item {\tt task\_thr} will then wait() for its child. + \item {\tt job\_thr} continues to listen for job control information + over original connection (signals, cancel, etc.) + \item {\tt job\_thr} on node 0 of job will monitor connection to + \srun\ and will initiate a new \srun\ on local node if + necessary. + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Interactive Job Initiation, cont'd ...} + \begin{center} + \begin{itemize} + \item \srun\ remains attached to user's terminal, copying stderr + and stdout (optionally prepending task no) and forwarding signals + \item \srun\ transparently forwards signals generated on the + users terminal to remote tasks (MSG\_SIGNAL) + \item \srun\ also recieves status information on original channel: + \begin{itemize} + \item MSG\_TASK\_EXITED + \end{itemize} + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Batch Job Initiation} + \begin{center} + \begin{itemize} + \item a batch submission consists of a script that will be invoked + on only one node in the allocation + \item \srun\ sends MSG\_BATCH\_SUBMIT\_REQ to \slurmctld , which contains + \begin{itemize} + \item user info + \item nnodes, nprocs, cpus\_per\_task + \item script path, environment, cwd + \end{itemize} + Optional parameters: + \begin{itemize} + \item requested timelimit (default set by config) + \item filenames for stdout/err (default jobid.o,e) + \item stdin location (default {\tt /dev/null}) + \item signal handling + \end{itemize} + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Batch Job Initiation, cont'd ...} + \begin{center} + \begin{itemize} + \item \slurmctld\ sends MSG\_JOB\_RUN\_REQ to first node in job + when it has allocated nodes + \item Job run request contents: + \begin{itemize} + \item credential, jobid, userinfo + \item stdin/out/err locations (always files) + \item ntasks $=1$ + \item command line $=$ ``{\tt /path/to/script args}'' + \item stop time + \end{itemize} + \item \slurmd\ handles job run request as previously explained + \item \slurmctld\ will keep connection open for this job, waiting + for task exit message, at which point job is complete. + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Batch Job Initiation, cont'd ...} + \begin{center} + \begin{itemize} + \item Presence of SLURM\_JOBID env var indicates to \srun\ that it + is running under an allocation (has access to resources). + \item SLURM\_HOSTLIST will also be set to the list of nodes allocated + \item \srun\ must query \slurmctld , however, for two reasons: + \begin{itemize} + \item \srun\ doesn't know number of cpus for each node + \item safer for \srun\ to obtain switch resources from controller + \end{itemize} + \item Therefore, \srun\ will first query \slurmctld\ for details of + its allocation + \item \srun\ will then process command line options relative to this + allocation. If a subset of nodes is specified, \srun\ will need + to requery the controller for switch resources. (We may be + able to get away without doing this $2^{nd}$ query) + \end{itemize} + \end{center} +\end{slide} + +\begin{slide} + \slideheading{Allocate Mode} + \begin{center} + \begin{itemize} + \item Allocates a set of resources to the + user then spawns a shell with access to those resources. + (SLURM\_JOBID and SLURM\_HOSTLIST are set) + \item initiating \srun\ will need to {\tt wait()} for exit + of the shell to notify \slurmctld\ that job is complete. + \item subsequent invocations of \srun\ behave as in the batch run + case + \end{itemize} + \end{center} +\end{slide} + +%\begin{slide} +% \slideheading{Attaching to a Job} +% \begin{center} +% \begin{itemize} +% \item User specifies job name or jobid on command line +% \item \srun\ connects to \slurmctld\ and sends a MSG\_JOB\_ATTACH\_REQ: +% \begin{itemize} +% \item job id +% \item job name +% \end{itemize} +% \item MSG\_JOB\_ATTACH\_REPLY contains similar information as +% MSG\_ALLOCATE\_REPLY +% \item \srun\ now has credentials to contact \slurmds\ in job +% \end{itemize} +% \end{center} +%\end{slide} + +%\begin{slide} +% \slideheading{} +% \begin{center} +% \begin{itemize} +% \end{itemize} +% \end{center} +%\end{slide} + +\end{document} + + diff --git a/executable_names/doc/slides/qsnet/Makefile b/executable_names/doc/slides/qsnet/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..c4b9d96e61e04702ac245a42cc76ce7f9e3869be --- /dev/null +++ b/executable_names/doc/slides/qsnet/Makefile @@ -0,0 +1,22 @@ +all: slides.dvi + +# -paper usr +view: slides.dvi + xdvi -paper usr -expert -s 0 slides +viewps: slides.ps + ghostview -seascape slides.ps + +clean: + rm -f slides.dvi slides.aux slides.log slides.ps + +slides.dvi: slides.tex llnl.ps penguin.eps slurm.eps + latex slides +slides.ps: slides.dvi + dvips -O 0.75in,0 -f $@ # slides 1-per page + +%.eps: %.obj + tgif -print -eps $< + +%.pdf: %.dvi + dvipdf $< $@ + diff --git a/executable_names/doc/slides/qsnet/llnl.gif b/executable_names/doc/slides/qsnet/llnl.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b0b97feb3bb36bdc92bd8a5e6cd8cfd013bcfd1 Binary files /dev/null and b/executable_names/doc/slides/qsnet/llnl.gif differ diff --git a/executable_names/doc/slides/qsnet/llnl.ps b/executable_names/doc/slides/qsnet/llnl.ps new file mode 100644 index 0000000000000000000000000000000000000000..589a9e0fc2b062f304979756eac33d123e99be5c --- /dev/null +++ b/executable_names/doc/slides/qsnet/llnl.ps @@ -0,0 +1,577 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/garlick/projects/project-slides/llnl.ps +%%Creator: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) - by John Bradley +%%BoundingBox: 270 362 342 430 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 216 string def + +% define space for color conversions +/grays 72 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +270 362 translate + +% size of image (on paper, in 1/72inch coords) +72.00000 67.96800 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +72 68 8 % dimensions of data +[72 0 0 -68 0 68] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff0909090c0c0c5d5d5dfafafafffffffcfcfcfffffff8f8f8fffffffcfcfcf5f5f5 +dedede0000000a0a0a000000010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010101010000000f0f0f0202020000000c0c0c050505000000050505 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +eaeaea4c4c4c000000535353f7f7f7ffffffffffffffffffffffffffffffffffffffffff +dedede000000010101010101000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000c0c0c000000000000060606000000000000060606000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffffd2d2d2030303646464fffffffffffffdfdfdfbfbfbfcfcfcfffffffdfdfdffffff +dbdbdb000000000000040404000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000010101000000010101050505030303000000010101080808 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fffffffcfcfc000000616161fffffffefefefffffffdfdfdfffffffffffffbfbfbfefefe +cbcbcb0f0f0f000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000050505040404000000000000020202000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fafafaececec0000005d5d5dfcfcfcfbfbfbffffffffffffffffffffffffffffffffffff +e6e6e67d7d7d787878737373757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +7575757575757575757575757b7b7b6c6c6c7878787373736565658282826e6e6e111111 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffffededed0f0f0f676767fefefefcfcfcfffffffdfdfdfcfcfcfffffffefefeffffff +fffffff0f0f0fffffffcfcfcfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfffffff9f9f9fafafafffffffffffff8f8f8939393181818 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fcfcfce7e7e7000000606060f8f8f8fffffffffffffffffffffffffffffffcfcfcfefefe +fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff7f7f7fffffffdfdfdfffffffafafa9595951a1a1a000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fefefeffffff000000636363f9f9f9fffffffcfcfcfffffffdfdfdfafafafefefeffffff +fdfdfdfffffffffffff9f9f9ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff6f6f6fffffffafafa979797141414000000111111 + +000000010101000000000000020202212121fffffffffffffffffffefefefdfdfdffffff +f7f7f7ffffff383838040404404040f8f8f8fffffffffffffffffff6f6f6fffffffefefe +fffffff3f3f3000000787878edededfefefefffffffffffffefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefffffffbfbfbffffffffffff +fafafafffffffffffff9f9f9fefefefffffffafafa949494070707000000131313000000 + +000000010101000000000000020202212121fffffffffffffdfdfdfafafafffffffcfcfc +ffffffffffff2e2e2e000000464646fafafafffffffdfdfdfafafafefefefcfcfcffffff +fafafaebebeb0d0d0d333333cdcdcdfffffff6f6f6f8f8f8fefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefffffffffffffffffffefefe +f5f5f5f2f2f2f7f7f7ffffffffffffffffff919191151515020202050505000000030303 + +000000010101000000000000020202212121fffffffffffffdfdfdf9f9f9fffffff5f5f5 +ffffffffffff505050010101434343fefefefffffffcfcfcfafafafffffff9f9f9ffffff +fffffff0f0f0000000000000949494fffffffbfbfbffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffff9f9f9fffffffbfbfbfefefe +fffffffffffffffffffffffffcfcfc9494941d1d1d000000000000000000000000070707 + +000000010101000000000000020202212121fffffffffffffffffffefefefffffff7f7f7 +ffffffffffffababab1717173a3a3afffffffcfcfcffffffffffffffffffffffffffffff +fffffffdfdfd0000001717177d7d7df7f7f7fffffffdfdfdffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8 +ebebebf7f7f7fffffff7f7f79898981616160000000f0f0f0000000000000f0f0f000000 + +000000010101000000000000020202212121fffffffffffffefefefffffffefefeffffff +fcfcfcfdfdfdffffff1616163e3e3efffffff7f7f7fffffffffffffafafafffffffafafa +f7f7f7eeeeee1818180000000d0d0db5b5b5fffffffffffffcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfffffff0f0f0ffffffffffff +fffffffffffff7f7f79c9c9c101010000000000000020202030303010101000000000000 + +000000010101000000000000020202212121fffffffffffffafafafffffffdfdfdffffff +f6f6f6f8f8f8ffffff030303474747fbfbfbfffffffffffffffffff2f2f2fffffffdfdfd +ffffffffffffc3c3c31b1b1b0505058b8b8bc9c9c9b6b6b6c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d5d5d5bcbcbcc7c7c7cecece +c4c4c4c7c7c78989890e0e0e000000040404000000000000060606000000000000060606 + +000000010101000000000000020202212121fffffffffffffafafafffffffcfcfcffffff +f8f8f8fcfcfcffffff0707072a2a2abebebefffffffefefefffffffafafaffffffffffff +fcfcfcf9f9f9e2e2e2313131000000000000070707030303000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000101010b0b0b010101 +0000000000000606060000000e0e0e0000000000000a0a0a000000000000030303080808 + +000000010101000000000000020202212121fffffffffffffdfdfdfefefefafafafcfcfc +fefefefffffff1f1f11c1c1c000000777777fffffff4f4f4fffffffffffff9f9f9ffffff +fffffffffffff7f7f7d4d4d4979797292929000000020202000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000202020d0d0d000000000000 +0d0d0d0707070000000404040000000000000505050000000000000606060c0c0c000000 + +0202020000000101010000000000002c2c2cf6f6f6fffffffffffffffffff9f9f9fafafa +fefefefffffff6f6f6adadad070707676767fffffff9f9f9fffffff4f4f4fcfcfcffffff +fefefefcfcfcfffffffefefeefefefd3d3d3bbbbbbb0b0b0b2b2b2b2b2b2b2b2b2b2b2b2 +b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2 +b1b1b1b0b0b0b8b8b8b3b3b3a7a7a7b2b2b2bcbcbcafafafacacacc0c0c0b2b2b2535353 +0000000000000d0d0d000000000000000000000000000000000000000000000000000000 + +0000000000000f0f0f000000000000040404727272f9f9f9fcfcfcfcfcfcffffffffffff +fdfdfdf4f4f4fafafae4e4e40000002222229e9e9efafafaefefefffffffffffffffffff +fffffffffffffffffffffffffffffffefefef9f9f9fafafaffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffefefefffffff6f6f6ffffff8c8c8c111111 +0a0a0a090909000000101010000000000000000000000000000000000000000000000000 + +0404040000000a0a0a000000010101000000444444fffffffffffffefefefafafaffffff +fffffff5f5f5fefefef4f4f43131310000007d7d7df3f3f3fbfbfbf9f9f9e7e7e7ffffff +fdfdfdf9f9f9f8f8f8fbfbfbfdfdfdfffffffffffffffffffbfbfbfbfbfbfbfbfbfbfbfb +fbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfb +fefefefffffff4f4f4f9f9f9fffffff8f8f8efefefffffffffffff929292171717000000 +010101000000000000020202000000000000000000000000000000000000000000000000 + +070707000000000000090909000000040404595959f6f6f6fcfcfcfffffff9f9f9fafafa +fefefeffffffffffffedededb5b5b5171717000000c9c9c9fffffffbfbfbffffffffffff +fffffffffffffffffffffffffdfdfdfbfbfbfbfbfbfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffbfbfbffffffffffffffffffffffff9b9b9b0909090000000d0d0d +000000000000101010000000000000000000000000000000000000000000000000000000 + +0000000101010000000606060000000202022a2a2aabababf3f3f3fffffffefefefafafa +fbfbfbfdfdfdffffffffffffe4e4e42d2d2d0e0e0e555555e2e2e2fcfcfcffffffffffff +fffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fbfbfbfafafafffffffbfbfbfdfdfdffffffeeeeeea7a7a70a0a0a020202080808090909 +000000010101070707000000000000000000000000000000000000000000000000000000 + +000000000000060606000000020202080808000000919191fffffffffffff7f7f7fdfdfd +fffffffafafaffffffffffffffffff8b8b8b0404040000005c5c5cfffffff4f4f4f0f0f0 +fcfcfcfefefefdfdfdf9f9f9fafafaffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffbfbfbffffffffffffffffffefefef959595242424000000090909040404000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +0606060000000606060000000505050a0a0a000000666666f3f3f3fffffff5f5f5fcfcfc +fffffffffffffcfcfcfafafaf6f6f6fcfcfc555555000000060606545454ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffbfbfbffffffffffffa9a9a92b2b2b000000101010000000000000000000 +090909040404000000030303000000000000000000000000000000000000000000000000 + +0202020000000000000f0f0f0000000000000c0c0c010101acacacf4f4f4fffffffefefe +fdfdfdfdfdfdfffffffffffffffffffafafaf9f9f95f5f5f000000000000646464cecece +f5f5f5fdfdfdfffffffffffffffffffffffffffffff7f7f7ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f9f9f9fffffffafafafffffffcfcfc7878780000000b0b0b000000030303000000000000 +030303030303000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000717171f0f0f0ffffffffffff +fffffff4f4f4fffffffbfbfbf9f9f9fffffffffffffcfcfc646464363636010101000000 +7b7b7bb0b0b0b8b8b8fffffffbfbfbfbfbfbffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff9f9f9fffffffcfcfcf4f4f4fffffffffffffdfdfdfbfbfb +ffffffecececffffffb4b4b4898989000000000000090909000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +0000000000000000000000000000000000000000000000000202026d6d6df2f2f2ffffff +f8f8f8fffffffffffffffffffffffff4f4f4f4f4f4fffffff3f3f3dcdcdc8585852e2e2e +0000001a1a1a1e1e1e787878888888919191848484707070888888888888888888888888 +8888888888888888888888889393938181818686869292928585857b7b7b888888949494 +9090908d8d8d7d7d7d090909000000000000111111000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000030303646464ffffff +fffffff1f1f1fffffffffffffffffff7f7f7fffffffefefefffffffffffffbfbfbc7c7c7 +adadad7d7d7d1313130707070000000000000c0c0c0d0d0d000000000000000000000000 +000000000000000000000000020202000000000000010101000000000000000000000000 +0000000000000d0d0d0202020000000c0c0c060606000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000020202000000252525ffffff +fafafafffffffffffff9f9f9fefefef6f6f6fffffff2f2f2fffffffbfbfbfffffff9f9f9 +fffffff8f8f8cacacad5d5d5c7c7c7c7c7c7c2c2c2bcbcbccccccccccccccccccccccccc +ccccccccccccccccccccccccc9c9c9d5d5d5c8c8c8c2c2c2d5d5d5d2d2d2c6c6c6cfcfcf +d5d5d54a4a4a0000000a0a0a0000000000000000000c0c0c000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000060606000000000000272727 +686868fffffffffffff8f8f8fffffffbfbfbfffffffffffffffffffbfbfbfffffff8f8f8 +fffffffffffff4f4f4fffffff9f9f9fefefefffffffffffffcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcfffffffbfbfbfafafafbfbfbf9f9f9fcfcfcfcfcfcf3f3f3 +818181131313000000000000030303020202000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000030303010101000000 +4e4e4eb5b5b5eaeaeafffffffffffffffffffffffffffffffbfbfbf6f6f6fcfcfcffffff +fffffffffffffcfcfcfefefefdfdfdffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff2f2f2fffffffffffff6f6f6fffffff6f6f67d7d7d +0000000000000f0f0f050505040404000000060606050505000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +0000000000000000000000000000000000000000000000000000000c0c0c000000000000 +1010100000006f6f6ff7f7f7fbfbfbf9f9f9f8f8f8fbfbfbfffffffffffffefefef2f2f2 +fafafaf8f8f8fefefefffffffffffffffffffdfdfdf8f8f8fefefefefefefefefefefefe +fefefefefefefefefefefefefbfbfbfbfbfbfffffffffffffdfdfdeeeeee8d8d8d060606 +0c0c0c000000040404000000080808040404000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000040404000000000000070707 +0000000707070000006e6e6efefefeffffffffffffefefeffdfdfdf9f9f9ffffffffffff +fffffffffffffffffffbfbfbfbfbfbffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffff6f6f6ffffffffffff868686020202010101 +000000010101040404000000000000020202000000070707000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000737373f7f7f7fffffffffffffffffffefefeffffffffffff +fffffffdfdfdfffffffffffff7f7f7fafafafffffffefefeffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffbfbfb898989090909000000040404 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000404041e1e1e878787f8f8f8d9d9d9ffffffffffffffffff +fffffffafafafbfbfbfffffffffffffffffffdfdfdfffffffefefefefefefefefefefefe +fefefefefefefefefefefefef4f4f4f5f5f5ffffff8282820101010a0a0a0a0a0a000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000606060404040707070000000e0e0ebdbdbdc8c8c8d5d5d5 +fcfcfcfffffffffffff5f5f5fafafaf9f9f9f8f8f8ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff828282060606000000000000000000050505 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000030303161616000000656565 +979797eaeaeafffffffafafaffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff9f9f98585850202020000000c0c0c0000000b0b0b000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000808080000000808080000000000000b0b0b000000000000 +0606065858587979796969697171717a7a7a7070706e6e6e6f6f6f6f6f6f6f6f6f6f6f6f +6f6f6f6f6f6f6f6f6f6f6f6f767676050505000000000000000000090909000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000001010100e0e0e000000000000121212040404 +0000000d0d0d040404000000000000000000000000080808020202020202020202020202 +020202020202020202020202030303000000000000000000000000000000000000060606 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000707070000000000000000000e0e0e060606000000000000 +0000000000000000000505050a0a0a010101000000000000000000000000000000000000 +0000000000000000000000000505050000000000001d1d1d0000000000001c1c1c000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000606060505050000000000000a0a0a000000060606 +010101000000030303010101000000000000030303000000020202020202020202020202 +0202020202020202020202020000000606060404040000000303030e0e0e000000080808 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer diff --git a/executable_names/doc/slides/qsnet/penguin.eps b/executable_names/doc/slides/qsnet/penguin.eps new file mode 100644 index 0000000000000000000000000000000000000000..46819fc95ef19371934999910391bd01a47c0eee --- /dev/null +++ b/executable_names/doc/slides/qsnet/penguin.eps @@ -0,0 +1,1041 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(TM) 3.2 +%%For: (Neal Tucker) (ntucker@adobe.com) +%%Title: (penguin.eps) +%%CreationDate: (4/29/96) (8:20 AM) +%%BoundingBox: 4 2 221 258 +%%DocumentProcessColors: Black +%%DocumentSuppliedResources: procset Adobe_packedarray 2.0 0 +%%+ procset Adobe_cshow 1.1 0 +%%+ procset Adobe_customcolor 1.0 0 +%%+ procset Adobe_IllustratorA_AI3 1.0 1 +%AI3_ColorUsage: Black&White +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 31 31 583 761 +%AI3_DocumentPreview: Header +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_packedarray 2.0 0 +%%Title: (Packed Array Operators) +%%Version: 2.0 +%%CreationDate: (8/2/90) () +%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_packedarray 5 dict dup begin put +/initialize +{ +/packedarray where + { + pop + } + { + Adobe_packedarray begin + Adobe_packedarray + { + dup xcheck + { + bind + } if + userdict 3 1 roll put + } forall + end + } ifelse +} def +/terminate +{ +} def +/packedarray +{ +array astore readonly +} def +/setpacking +{ +pop +} def +/currentpacking +{ +false +} def +currentdict readonly pop end +%%EndResource +Adobe_packedarray /initialize get exec +%%BeginResource: procset Adobe_cshow 1.1 0 +%%Title: (cshow Operator) +%%Version: 1.1 +%%CreationDate: (1/23/89) () +%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_cshow 3 dict dup begin put +/initialize +{ +/cshow where + { + pop + } + { + userdict /Adobe_cshow_vars 1 dict dup begin put + /_cshow + {} def + Adobe_cshow begin + Adobe_cshow + { + dup xcheck + { + bind + } if + userdict 3 1 roll put + } forall + end + end + } ifelse +} def +/terminate +{ +} def +/cshow +{ +exch +Adobe_cshow_vars + exch /_cshow + exch put + { + 0 0 Adobe_cshow_vars /_cshow get exec + } forall +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_customcolor 1.0 0 +%%Title: (Custom Color Operators) +%%Version: 1.0 +%%CreationDate: (5/9/88) () +%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_customcolor 5 dict dup begin put +/initialize +{ +/setcustomcolor where + { + pop + } + { + Adobe_customcolor begin + Adobe_customcolor + { + dup xcheck + { + bind + } if + pop pop + } forall + end + Adobe_customcolor begin + } ifelse +} def +/terminate +{ +currentdict Adobe_customcolor eq + { + end + } if +} def +/findcmykcustomcolor +{ +5 packedarray +} def +/setcustomcolor +{ +exch +aload pop pop +4 + { + 4 index mul 4 1 roll + } repeat +5 -1 roll pop +setcmykcolor +} def +/setoverprint +{ +pop +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_IllustratorA_AI3 1.1 3 +%%Title: (Adobe Illustrator (R) Version 3.0 Abbreviated Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_IllustratorA_AI3 61 dict dup begin put +/initialize +{ +userdict /Adobe_IllustratorA_AI3_vars 58 dict dup begin put +/_lp /none def +/_pf {} def +/_ps {} def +/_psf {} def +/_pss {} def +/_pjsf {} def +/_pjss {} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart [/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0] def +/_renderEnd [null null null null /i1 /i1 /i1 /i1] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading [0 0] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx {} def +/Tj {} def +/CRender {} def +/_AI3_savepage {} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc {} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc {} def +/_i null def +Adobe_IllustratorA_AI3 begin +Adobe_IllustratorA_AI3 + { + dup xcheck + { + bind + } if + pop pop + } forall +end +end +Adobe_IllustratorA_AI3 begin +Adobe_IllustratorA_AI3_vars begin +newpath +} def +/terminate +{ +end +end +} def +/_ +null def +/ddef +{ +Adobe_IllustratorA_AI3_vars 3 1 roll put +} def +/xput +{ +dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if +load begin def end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ +dup length exch stringwidth +exch 5 -1 roll 3 index mul add +4 1 roll 3 1 roll mul add +} def +/swj +{ +dup 4 1 roll +dup length exch stringwidth +exch 5 -1 roll 3 index mul add +4 1 roll 3 1 roll mul add +6 2 roll /_cnt 0 ddef +{1 index eq {/_cnt _cnt 1 add ddef} if} forall pop +exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ +4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow +3 npop +} def +/jss +{ +4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + }ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow +6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow +2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + }ifelse + 2 copy rmoveto + } exch cshow +5 npop +} def +/pl +{ +transform +0.25 sub round 0.25 add exch +0.25 sub round 0.25 add exch +itransform +} def +/setstrokeadjust where + { + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def + } + { + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def + }ifelse +/d +{ +setdash +} def +/cf {} def +/i +{ +dup 0 eq + { + pop cf + } if +setflat +} def +/j +{ +setlinejoin +} def +/J +{ +setlinecap +} def +/M +{ +setmiterlimit +} def +/w +{ +setlinewidth +} def +/H +{} def +/h +{ +closepath +} def +/N +{ +_pola 0 eq + { + _doClip 1 eq {clip /_doClip 0 ddef} if + newpath + } + { + /CRender {N} ddef + }ifelse +} def +/n +{N} def +/F +{ +_pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore clip newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + }ifelse + } + { + /CRender {F} ddef + }ifelse +} def +/f +{ +closepath +F +} def +/S +{ +_pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore clip newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + }ifelse + } + { + /CRender {S} ddef + }ifelse +} def +/s +{ +closepath +S +} def +/B +{ +_pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore clip newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + }ifelse + } + { + /CRender {B} ddef + }ifelse +} def +/b +{ +closepath +B +} def +/W +{ +/_doClip 1 ddef +} def +/* +{ +count 0 ne + { + dup type (stringtype) eq {pop} if + } if +_pola 0 eq {newpath} if +} def +/u +{} def +/U +{} def +/q +{ +_pola 0 eq {gsave} if +} def +/Q +{ +_pola 0 eq {grestore} if +} def +/*u +{ +_pola 1 add /_pola exch ddef +} def +/*U +{ +_pola 1 sub /_pola exch ddef +_pola 0 eq {CRender} if +} def +/D +{pop} def +/*w +{} def +/*W +{} def +/` +{ +/_i save ddef +6 1 roll 4 npop +concat pop +userdict begin +/showpage {} def +0 setgray +0 setlinecap +1 setlinewidth +0 setlinejoin +10 setmiterlimit +[] 0 setdash +/setstrokeadjust where {pop false setstrokeadjust} if +newpath +0 setgray +false setoverprint +} def +/~ +{ +end +_i restore +} def +/O +{ +0 ne +/_of exch ddef +/_lp /none ddef +} def +/R +{ +0 ne +/_os exch ddef +/_lp /none ddef +} def +/g +{ +/_gf exch ddef +/_fc +{ +_lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if +} ddef +/_pf +{ +_fc +fill +} ddef +/_psf +{ +_fc +ashow +} ddef +/_pjsf +{ +_fc +awidthshow +} ddef +/_lp /none ddef +} def +/G +{ +/_gs exch ddef +/_sc +{ +_lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if +} ddef +/_ps +{ +_sc +stroke +} ddef +/_pss +{ +_sc +ss +} ddef +/_pjss +{ +_sc +jss +} ddef +/_lp /none ddef +} def +/k +{ +_cf astore pop +/_fc +{ +_lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if +} ddef +/_pf +{ +_fc +fill +} ddef +/_psf +{ +_fc +ashow +} ddef +/_pjsf +{ +_fc +awidthshow +} ddef +/_lp /none ddef +} def +/K +{ +_cs astore pop +/_sc +{ +_lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if +} ddef +/_ps +{ +_sc +stroke +} ddef +/_pss +{ +_sc +ss +} ddef +/_pjss +{ +_sc +jss +} ddef +/_lp /none ddef +} def +/x +{ +/_gf exch ddef +findcmykcustomcolor +/_if exch ddef +/_fc +{ +_lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if +} ddef +/_pf +{ +_fc +fill +} ddef +/_psf +{ +_fc +ashow +} ddef +/_pjsf +{ +_fc +awidthshow +} ddef +/_lp /none ddef +} def +/X +{ +/_gs exch ddef +findcmykcustomcolor +/_is exch ddef +/_sc +{ +_lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if +} ddef +/_ps +{ +_sc +stroke +} ddef +/_pss +{ +_sc +ss +} ddef +/_pjss +{ +_sc +jss +} ddef +/_lp /none ddef +} def +/A +{ +pop +} def +currentdict readonly pop end +setpacking +/annotatepage +{ +} def +%%EndResource +%%EndProlog +%%BeginSetup +Adobe_cshow /initialize get exec +Adobe_customcolor /initialize get exec +Adobe_IllustratorA_AI3 /initialize get exec +%%EndSetup +0 A +u +*u +0 O +0 g +0 i +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +74.8907 215.0693 m +74.041 243.9622 85.304 256.7226 108.6809 257.1476 c +132.0577 257.5727 146.7214 245.2467 149.6966 229.0954 c +152.6719 212.9441 150.9717 191.6925 156.9222 180.6416 c +162.8727 169.5907 166.698 161.09 176.8988 148.339 c +187.0996 135.588 193.4751 122.6245 196.4503 106.8983 c +199.4255 91.172 201.1257 83.7339 193.4751 75.6583 c +185.8245 67.5827 172.2234 54.4066 162.0226 69.2828 c +156.9158 76.7302 156.362 85.9914 164.9978 87.9843 c +170.5233 89.2594 174.4902 88.8343 178.5989 86.7092 c +182.7076 84.584 183.6993 85.5757 178.7406 89.2594 c +173.7819 92.943 172.7901 89.5427 174.4902 95.4932 c +176.1904 101.4437 178.4436 112.1015 173.7682 123.8608 c +171.6149 129.2767 164.3121 144.122 157.4349 147.7774 C +156.799 148.1155 154.9871 148.8579 156.2138 147.3473 c +158.0807 145.0483 167.9587 130.4785 170.7682 121.7774 c +173.7716 112.4762 174.2069 103.5688 172.6484 97.9017 c +171.09 92.2346 168.3981 89.9678 165.1395 89.9678 c +161.8809 89.9678 158.9057 88.4093 158.9057 95.9182 c +158.9057 103.4272 159.6849 114.7614 155.6471 124.3246 c +151.6093 133.8879 146.7214 140.4759 145.6588 144.5137 c +144.5962 148.5515 142.2585 159.3899 137.3706 165.5529 c +132.4828 171.7159 130.3576 175.7537 132.9078 182.7667 c +135.458 189.7798 133.5453 191.6925 128.4449 193.1801 c +123.3445 194.6677 116.544 196.7929 114.8439 200.1931 c +113.1437 203.5934 114.2063 210.3939 118.0316 212.0941 c +121.8569 213.7942 128.2324 211.4565 128.4449 206.5686 c +128.6575 201.6807 126.3198 199.1305 126.9573 198.068 c +127.5949 197.0054 130.9951 195.3052 132.6953 197.2179 c +134.3954 199.1305 134.8204 205.081 133.1203 210.6064 c +131.4202 216.1319 130.5701 219.9572 124.4071 221.2323 c +118.2441 222.5074 115.4814 222.0823 112.5062 218.257 c +109.531 214.4317 108.2559 208.2688 109.1059 203.8059 c +109.956 199.3431 108.2559 201.8933 105.2806 202.1058 c +102.3054 202.3183 103.1555 202.5308 100.1802 202.3183 c +97.205 202.1058 98.2676 204.0184 98.055 207.2062 c +97.8425 210.3939 97.4175 216.9819 92.9546 219.5321 c +88.4918 222.0823 80.8412 219.1071 81.0537 208.4813 c +81.2662 197.8554 84.879 192.755 87.0042 196.5803 c +89.1293 200.4056 88.0668 198.493 85.9416 200.1931 c +83.8164 201.8933 82.3288 208.9063 84.6665 211.0315 c +87.0042 213.1566 89.7669 213.1566 91.2545 211.8815 c +92.7421 210.6064 95.0798 206.3561 94.6548 203.5934 c +94.2297 200.8307 94.0172 200.6182 91.2545 198.7055 c +88.4918 196.7929 87.4292 195.0927 84.2415 192.9676 c +81.0537 190.8424 79.7786 185.9545 82.3288 184.6794 c +84.879 183.4043 85.0915 183.6168 87.2167 180.4291 c +89.3419 177.2413 92.9546 175.7537 101.8804 177.2413 c +110.8061 178.7289 114.472 180.8449 121.2194 183.1918 c +126.1073 184.8919 124.4071 184.6794 126.1073 186.5921 c +127.8074 188.5047 130.5701 185.742 128.0199 184.0419 c +125.4697 182.3417 119.7318 180.6416 115.4814 179.154 c +111.2311 177.6663 106.3432 173.416 97.4175 173.841 c +88.4918 174.2661 94.6548 174.0536 91.8921 174.2661 c +89.1293 174.4786 87.8542 174.0536 90.8295 171.9284 c +93.8047 169.8032 93.5922 169.1657 96.1424 168.3156 c +98.6926 167.4655 102.0929 167.4655 106.1307 168.9532 c +110.1685 170.4408 120.3693 174.9036 123.5571 177.0288 c +126.7448 179.154 129.295 176.3912 126.1073 174.2661 c +122.9195 172.1409 122.0694 172.7785 119.0942 170.8658 c +116.119 168.9532 110.5935 165.7654 106.9808 162.3651 c +103.368 158.9649 102.5179 158.7523 98.055 158.5398 c +93.5922 158.3273 90.8295 163.0027 88.9168 165.1278 c +87.0042 167.253 87.2167 168.5281 84.879 171.0783 c +82.5413 173.6285 82.3288 172.991 81.9038 170.2283 c +81.4787 167.4655 78.291 160.4525 75.5283 155.7771 c +72.7655 151.1017 72.553 145.3638 72.9781 141.326 c +73.4031 137.2882 72.3405 136.8631 69.1528 132.1878 c +65.965 127.5124 60.6521 113.6988 59.802 109.2359 c +58.952 104.7731 57.8894 95.6349 58.3144 90.3219 c +58.7394 85.009 57.2518 83.9464 53.4265 87.5592 c +49.6012 91.172 48.3261 95.2098 48.5386 100.5227 c +48.7204 105.068 49.3516 108.2774 49.9349 109.9441 c +50.5182 111.6108 49.9557 112.7983 48.7512 110.7236 c +46.1324 106.2131 45.9884 98.3976 46.626 95.6349 c +47.2635 92.8721 47.4761 87.9843 54.4891 81.3962 c +61.5022 74.8082 71.703 65.67 80.2036 59.507 c +88.7043 53.344 91.6795 45.6934 79.141 40.168 C +87.0042 29.5421 91.2545 24.0167 87.8542 17.0037 C +94.8673 21.0415 92.1685 30.5606 88.7682 33.1108 c +85.368 35.661 87.4292 37.6178 90.4044 35.7051 c +93.3797 33.7925 94.4423 29.9672 106.1307 30.1797 c +117.8191 30.3922 130.4218 31.5766 137.4349 41.7774 c +144.4479 51.9783 145.8017 43.3946 144.1016 37.4441 c +142.4014 31.4936 138.2207 18.0662 144.8087 19.3413 C +145.6588 27.2045 147.5715 34.005 147.5715 42.5057 c +147.5715 51.0063 148.4349 55.1108 147.7682 67.4441 c +147.1259 79.3277 152.2468 80.1211 157.5597 80.1211 c +162.8727 80.1211 161.1725 76.7209 157.7723 76.9334 c +154.372 77.1459 150.7592 75.8708 150.5467 67.1576 c +150.3342 58.4444 150.5467 59.2945 152.0343 51.4314 c +153.5219 43.5682 153.7344 41.2306 152.4593 32.5174 c +151.1842 23.8042 150.1217 19.1288 155.8596 13.8159 c +161.5976 8.503 170.3108 9.9906 174.7736 13.3909 c +179.2365 16.7911 187.7371 24.6543 195.3877 27.2045 c +203.0383 29.7547 211.114 31.6673 215.3643 35.9176 c +219.6147 40.168 218.5521 43.1432 214.0892 45.4809 c +209.6264 47.8186 205.376 46.756 201.9757 50.5813 c +198.5755 54.4066 196.8753 62.9073 198.1504 67.3701 c +199.4255 71.833 200.9132 69.9203 200.9132 66.7326 c +200.9132 63.5448 201.1257 60.5696 204.3134 56.5318 c +207.5012 52.494 210.4764 50.5813 215.5768 47.3936 c +220.6772 44.2058 223.865 39.1054 217.4895 34.6425 c +211.114 30.1797 207.5012 27.6295 202.1883 25.5043 c +196.8753 23.3792 188.1622 18.2788 182.8492 12.9658 c +177.5363 7.6529 174.5611 2.9776 164.1478 2.9776 c +153.7344 2.9776 148.9787 5.4759 145.8713 11.6907 c +143.7462 15.9411 142.6836 15.3035 137.7957 15.516 c +132.9078 15.7286 116.544 15.9411 103.793 15.7286 c +91.042 15.516 86.7917 13.3909 81.0537 8.7155 c +75.3157 4.0401 73.1906 0.4273 62.3522 4.0401 c +51.5139 7.6529 45.7759 11.6907 29.6246 14.8785 c +13.4734 18.0662 22.1865 16.5786 12.4108 18.7038 c +2.635 20.829 3.2726 25.5043 4.5477 29.3296 c +5.8228 33.1549 9.0105 39.1054 6.2478 46.9685 c +3.4851 54.8316 4.5477 62.9073 11.9857 62.9073 c +19.4238 62.9073 26.4369 61.4197 29.4121 71.1954 c +32.3874 80.9712 33.2374 73.3206 32.3874 70.7704 c +31.5373 68.2202 31.1123 61.2071 24.5242 60.1446 c +17.9362 59.082 16.4486 60.5696 12.4108 60.5696 c +8.373 60.5696 6.6728 57.8069 8.798 53.1315 c +10.9232 48.4561 13.2608 43.5682 12.8358 39.5304 c +12.4108 35.4926 11.9857 34.005 9.0105 30.1797 c +6.0353 26.3544 6.4603 24.4417 11.7732 23.1666 c +17.0861 21.8915 26.6494 19.3413 35.5751 17.2162 c +44.5008 15.091 45.1384 15.091 60.6521 11.0532 c +76.1658 7.0154 80.4161 14.2409 81.6912 22.9541 c +82.9664 31.6673 77.0159 39.9555 71.4904 48.2436 c +65.965 56.5318 60.0145 66.095 52.789 74.8082 c +45.5634 83.5214 41.3131 84.159 37.7003 82.2463 c +34.0875 80.3337 33.4499 80.7587 33.2374 85.6466 c +33.0249 90.5345 32.5999 93.7222 36.6377 100.9478 c +40.6755 108.1734 44.2883 116.0365 48.5386 128.1499 c +52.789 140.2634 56.6143 142.6011 63.8398 153.0144 c +71.0654 163.4277 67.8777 159.3899 72.9781 166.4029 c +78.0785 173.416 76.5908 172.1409 76.1658 183.1918 c +75.7408 194.2427 75.3157 200.6182 74.8907 215.0693 c +f +1 D +54.5971 128.6793 m +55.6961 127.3382 57.2428 130.4814 58.871 131.6548 c +60.3363 132.9959 60.9469 134.8818 60.6213 136.7258 c +60.4584 137.7316 58.8303 137.3963 58.5046 137.0611 c +57.5278 136.0552 57.7262 134.4523 57.0393 133.0378 c +56.2252 131.3615 53.498 130.0204 54.5971 128.6793 c +f +145.951 173.0707 m +148.2714 171.137 149.6701 169.4579 150.9452 172.3269 c +152.2203 175.1958 152.2203 176.3647 149.1388 177.5335 c +146.0573 178.7024 144.6759 179.9775 143.2946 181.5713 c +141.9132 183.1652 141.4224 180.4368 142.5507 177.746 c +143.9321 174.452 144.7375 174.0819 145.951 173.0707 c +f +98.0873 199.4234 m +96.4935 199.7421 94.5808 199.6359 93.5182 198.3608 c +93.0932 197.9357 93.3057 196.7669 94.0495 196.4481 c +95.0058 196.0231 95.6434 196.9794 95.8559 197.7232 c +95.9622 198.042 96.0684 198.467 96.3872 198.5733 c +96.8122 198.7858 97.4336 198.6093 97.8748 198.7858 c +98.4061 198.9983 98.1936 199.4234 98.0873 199.4234 c +f +105.5994 199.1305 m +106.2369 198.1742 107.4058 198.1742 108.3621 197.7492 c +108.8934 197.5367 109.956 197.2179 110.2748 197.9617 c +111.0186 200.2994 107.8346 199.5556 106.3432 199.5556 c +106.0244 199.5556 105.2806 199.6618 105.5994 199.1305 c +f +121.1016 209.4441 m +122.5269 209.3691 124.5182 206.7774 124.7124 203.8036 c +124.7431 203.3336 125.9489 203.3623 126.2015 203.838 c +126.8964 205.0116 126.4187 206.3414 126.0992 207.7666 c +125.8436 208.9067 124.4549 210.1084 123.2792 210.6309 c +122.4954 211.0229 121.7116 211.1535 120.6665 211.0229 c +120.4052 210.8922 119.5182 209.5274 121.1016 209.4441 c +f +89.4377 210.1679 m +88.1053 210.0672 88.5823 209.0454 88.6441 208.2274 C +90.4855 207.1912 90.6621 204.8539 91.0372 203.0018 c +91.0901 202.3005 92.1243 202.6138 92.2235 202.8563 c +93.0524 204.3294 92.0434 206.0161 91.6772 207.7514 c +91.3728 208.6687 90.7674 209.6807 89.8964 210.3201 c +89.7707 210.4281 89.5546 210.1767 89.4377 210.1679 c +f +130.0182 242.7358 m +128.7024 243.8124 126.6432 244.2358 126.0182 242.4858 c +125.3932 240.9858 125.6432 239.4858 125.2682 237.8608 c +125.2682 237.3608 124.6432 237.2358 124.2682 236.7358 c +123.7682 236.1108 123.8932 235.3608 124.1432 235.1108 c +125.3932 233.8608 127.6432 236.3608 129.2682 237.2358 c +130.5182 237.9858 132.2682 236.9858 133.6432 237.8608 c +134.0182 238.1108 134.1432 238.7358 133.7682 239.2358 c +132.8932 240.7358 131.3932 241.6108 130.0182 242.7358 c +f +*U +0 D +168.2848 73.7743 m +168.5016 74.6532 168.9399 76.3409 169.7682 76.6108 c +170.0768 76.7112 170.3298 76.5961 170.4302 76.2876 c +170.6103 75.7354 170.0485 72.6062 170.2761 71.9079 c +170.5247 71.1445 171.3895 71.2465 172.023 71.4529 c +173.4685 71.9237 174.2959 73.6304 174.2429 73.7927 c +174.2219 73.8576 174.1949 73.8848 174.1464 73.869 c +173.9189 73.7949 173.7245 73.013 173.0585 72.7962 c +172.6525 72.6638 172.3397 72.7417 172.2023 73.164 c +172.0594 73.6024 172.6218 76.8395 172.3784 77.5868 c +172.1352 78.3338 171.3801 78.5011 170.698 78.2789 c +169.1062 77.7604 168.4145 75.3615 168.0211 73.922 C +167.9833 73.9276 L +168.1952 77.2482 L +166.2463 76.6135 L +166.145 69.7539 L +167.9804 70.3516 L +168.0209 71.5506 168.0627 72.9115 168.2848 73.7743 c +f +176.8278 73.0178 m +178.4034 73.5309 179.1132 75.4328 179.0445 75.644 c +179.0232 75.709 178.9751 75.7472 178.9263 75.7312 c +178.7964 75.6889 178.4863 74.6 177.593 74.309 c +177.2032 74.182 176.8475 74.2816 176.7627 74.5416 c +176.6359 74.9313 176.7162 75.6223 176.7309 76.1839 C +176.7792 79.2896 L +178.9394 79.993 L +178.9284 80.7439 L +176.7519 80.0351 L +176.8533 82.9783 L +174.9009 81.8573 L +174.8182 75.3274 L +174.8024 74.6037 174.7658 73.9989 174.8716 73.6741 c +175.1466 72.8296 176.0159 72.7535 176.8278 73.0178 c +f +U +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_IllustratorA_AI3 /terminate get exec +Adobe_customcolor /terminate get exec +Adobe_cshow /terminate get exec +Adobe_packedarray /terminate get exec +%%EOF diff --git a/executable_names/doc/slides/qsnet/slides.tex b/executable_names/doc/slides/qsnet/slides.tex new file mode 100644 index 0000000000000000000000000000000000000000..fab9e22122fb1baa1467b69694030bffbd07f8b7 --- /dev/null +++ b/executable_names/doc/slides/qsnet/slides.tex @@ -0,0 +1,203 @@ +% +% $Id$ +% + +\documentclass[letter,landscape]{seminar} + +\usepackage{pstcol} +\usepackage{slidesec} +\usepackage{semcolor} + +\input{seminar.bug} +\input{seminar.bg2} + +\usepackage{graphics} +\usepackage{fancybox} +\usepackage{fancyhdr} +\usepackage{epsfig} + +% Headers and footers personalization using the `fancyhdr' package +\fancyhf{} % Clear all fields +\renewcommand{\headrulewidth}{0.2mm} +\renewcommand{\footrulewidth}{0.2mm} +\fancyhead[C]{\Large\textbf{QsNet Support}} +%\fancyfoot[L]{\tiny\thedate} +\fancyfoot[L]{\includegraphics[scale=0.075]{penguin.eps}\\\tiny LINUX} +%\fancyfoot[R]{\small LLNL} +\fancyfoot[R]{\includegraphics[scale=0.2]{llnl.ps}\\\tiny LLNL} +\fancyfoot[C]{\tiny Page \theslide} + +% Create room for headers and footers +\renewcommand{\slidetopmargin}{2cm} +\renewcommand{\slidebottommargin}{3cm} + +% Center horizontally the headers and footers (see seminar.bug) +\renewcommand{\headwidth}{\textwidth} + +% To adjust the frame length to the header and footer ones +\autoslidemarginstrue + +% Hook to tell dvips to print in landscape mode +\def\printlandscape{\special{landscape}} + +% Possibilities: shadow, oval, double, none, plain +\slideframe{none} + +% display grey text diagonally across background of each slide +%\definecolor{LightGray}{gray}{0.85} +%\newslideframe{BackgroundText}{% +% \boxput{\rotatebox{56}{\scalebox{4.5}{% +% \textcolor{LightGray}{CONFIDENTIAL}}}}{#1}} +%\slideframe*{BackgroundText} + +% Put an image in the background of each slide +%\newslideframe{IMAGE}{% +% \boxput{\rput(1,0){\includegraphics[scale=1.0]{kaos_logo2.ps}}}{#1}} +%\slideframe*{IMAGE} + +% This allows text to be blued with \textcolor{Blue}{my text} +\definecolor{Blue}{rgb}{0.,0.,1.} +\definecolor{Gold}{rgb}{1.,0.84,0.} +\definecolor{Pink}{rgb}{1.,0.75,0.8} + +\begin{document} + +\slidepagestyle{fancy} + +% The presentation begins here. + +\begin{slide} + %\slideheading{The Big Picture} +\begin{center} +\epsfig{file=slurm.eps,scale=0.50} +\end{center} +\end{slide} + +\begin{slide} + \slideheading{Goals} + \small + \begin{itemize} + \item Encapsulate QsNet details so QSW include files, data structures, etc. + do not "pollute" the rest of slurm. + \item Provide the simplest API possible for manipulating QsNet interconnect + resources, but no simpler. + \item Checkpointability of internal library state for transfer to failover + slurmctld. + \item Interfaces to pack/unpack data structures in network byte order for + use in slurmd packet protocol discussed last week. + \item API calls compatable with standalone programs like pdsh and + long-running servers like slurmctld. + \item Both client (pdsh/slurmctld) and server (qshd/slurmd) side functions + provided. + \end{itemize} +\end{slide} + +\begin{slide} + \slideheading{Library Initialization} + \small + Initialize/finalize the library, optionally saving/restoring internal state. + \begin{verbatim} + int qsw_init(qsw_libstate_t restorestate); + void qsw_fini(qsw_libstate_t savestate); + \end{verbatim} + Allocate/free a {\tt qsw\_libstate\_t} to represent internal state. + \begin{verbatim} + int qsw_alloc_libstate(qsw_libstate_t *lsp); + void qsw_free_libstate(qsw_libstate_t ls); + \end{verbatim} + Pack/unpack a {\tt qsw\_libstate\_t} into a format suitable for transmitting + over the network, writing to checkpoint file, etc.. + \begin{verbatim} + int qsw_pack_libstate(qsw_libstate_t ls, void *buf, int size); + int qsw_unpack_libstate(qsw_libstate_t ls, void *buf, int size); + \end{verbatim} +\end{slide} + +\begin{slide} + \slideheading{Client Side Functions} + \small + Create all the interconnect information necessary to start a parallel + program including Elan capability, program description number, etc.. + \begin{verbatim} + int qsw_setup_jobinfo(qsw_jobinfo_t job, int nprocs, + bitstr_t *nodeset, int cyclic_alloc); + \end{verbatim} + Allocate/free a {\tt qsw\_jobinfo\_t} to represent job information. + \begin{verbatim} + int qsw_alloc_jobinfo(qsw_jobinfo_t *jobp); + void qsw_free_jobinfo(qsw_jobinfo_t job); + \end{verbatim} + Pack/unpack a {\tt qsw\_jobinfo\_t} into a format suitable for transmitting + over the network. + \begin{verbatim} + int qsw_pack_jobinfo(qsw_jobinfo_t job, void *buf, int size); + int qsw_unpack_jobinfo(qsw_jobinfo_t job, void *buf, int size); + \end{verbatim} +\end{slide} + + +\begin{slide} + \slideheading{Server Side Functions} + \small + 1: Fork. Wait. Destroy program group with {\tt qsw\_prog\_reap}. + \begin{verbatim} + int qsw_prog_reap(qsw_jobinfo_t jobinfo); + \end{verbatim} + 2: Initialize program description and capability with {\tt qsw\_prog\_init}. + Fork N times. Wait N times. Exit. Destroy capability with {\tt qsw\_prog\_fini}. + \begin{verbatim} + int qsw_prog_init(qsw_jobinfo_t jobinfo, uid_t uid); + int qsw_prog_fini(qsw_jobinfo_t jobinfo); + \end{verbatim} + 3: (N instances) Attach to a hardware context with {\tt qsw\_attach}. + Set up environment. Fork. Wait. Exit. + \begin{verbatim} + int qsw_attach(qsw_jobinfo_t jobinfo, int procnum); + \end{verbatim} + 4: Setuid to the user. Exec. +\end{slide} + +\begin{slide} + \slideheading{Discussion Points} + \small + \begin{itemize} + \item If library is initialized, {\tt qsw\_setup\_jobinfo} allocates + program descriptions and Elan hardware contexts sequentially, else random. + \item Library internal state checkpoint capability available for failover. + \item Pack/Unpack routines translate between host/network byte order. + Macros used to permit assertions about size of incoming data types before + type promotion. + \item bitstr\_t used to represent ``nodeset''. Bit positions are elan + addresses. There is no provision for converting between Elan address and + hostname. + \item Elan include files are not required outside of qsw.c. + \item configure --with-elan or qsw.c becomes an empty source file. + \end{itemize} +\end{slide} + +\begin{slide} + \slideheading{pack.c} + \tiny + htonl/ntohl, htons/ntohs functions with macro wrappers with many assertions: + \begin{verbatim} + void pack32(uint32_t val, void **bufp, int *lenp); + void pack16(uint16_t val, void **bufp, int *lenp); + void unpack32(uint32_t *val, void **bufp, int *lenp); + void unpack16(uint16_t *val, void **bufp, int *lenp); + \end{verbatim} + Example - qsw\_pack\_libstate(qsw\_libstate\_t ls, void *data, int len) + \begin{verbatim} + pack32(ls->ls_magic, &data, &len); + pack32(ls->ls_prognum, &data, &len); + pack32(ls->ls_hwcontext, &data, &len); + \end{verbatim} + Example - qsw\_unpack\_libstate(qsw\_libstate\_t ls, void *data, int len) + \begin{verbatim} + unpack32(&ls->ls_magic, &data, &len); + unpack32(&ls->ls_prognum, &data, &len); + unpack32(&ls->ls_hwcontext, &data, &len); + \end{verbatim} +\end{slide} + + +\end{document} diff --git a/executable_names/doc/slides/qsnet/slurm.eps b/executable_names/doc/slides/qsnet/slurm.eps new file mode 100644 index 0000000000000000000000000000000000000000..da42db8a6aa9ced301ffc154f59ceee079f6caae --- /dev/null +++ b/executable_names/doc/slides/qsnet/slurm.eps @@ -0,0 +1,4115 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /home/dun/dvl/slurm-doc/slurm.eps +%%CreationDate: Fri Nov 2 14:10:19 2001 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 515 389 +%%EndComments +%%BeginPreview: 256 191 1 191 +% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +% fbefbdf7df7befbef7df7f7df7defbefefbefbdf7defbefbdf7df7befbfbefbf +% eebaebaebaeebaebaebaeaebaeb5d75d5d75d6baebbaebaeb5d75d6baeaebaeb +% fbefbf7df7ddefbefdf7dfbefbff7df7f7df7fefbeefbefbff7df7fefbfbefbf +% ef7b76efbefbbdedb7befb77aeabd75d5d75d57aebbb6dded5dbbdabdededdeb +% fbdeefdaebaf775bed6baeedfdfefefbfbefbfdfdf77fbb5ff776bfeb5b5bb7f +% eef7dd7fbefbeeff7ffefbdf5bb7addf6f7df6f5bbeeaf7fabdeff5bffffefd7 +% fbbd7bd6f7b6bdd6d5addf7bf77dfbb5ddd75dbf76bdfbeb7ef7d6f76b557afd +% ef6fdf7dddefefbdff7bb5debeef5f7f7bbdf7ebefefb6beedbd7ddefeffdfaf +% fbfaf5efbb7dbaf7adef7f77ebdbf5edef77bebebdbaefeddfefdbbbd7db75fb +% eeafbf7af7d777befbbdeded7efebf7bbbeeebedef77bdbbbabaf7777d77df5f +% fbfb6bdfbefdeeebb7777bbfd7abebdf76bddedfbbeef77777efbeeeefdef6f5 +% ef6efef5ebafbddeeeeedf75bdfedef5efefbbbaf6bdddeeeeddebdddafbbddf +% fbdddbbf7efaefbbddddf5ef775bbbbf7dbaf777bfefbbbdddfb7efbbfaeefbb +% defbbeebd7b7baf77bbbbf7deef7776bd777beeeeadaf777bbafd7af76fbdaf7 +% f7af77befdeef7beef776bd7bddeeefefdeeebdddfbfbeeef77afdfbefb77fbf +% edfbededaf7ddeebddeefefdefbbddd7afbddefbbb76ebdddeefaf5ebdeeeb6b +% df5ebf7bfbd7bbdefbbddbaf7af77bbdfaefbbaf77efbefbbbddfbf7ef7ddeff +% 7bf7ebdf6efdf77baf77befbdfbeef775fbaf77deebdedaf777b5ebd7bd7bbdb +% eebd7ef5ddaf5eef7beef7b6f5ebddeef5f7beef7def7bfbeeeff7efdefdf777 +% 7befdbbf7bfbf7ddeebdddefbf7efbbddf5eebdbd7bbdf6ebddd6d7af7af5eef +% ef7af76bef5ebd7bbdefbb7debd7af77bbf7befefdeef5ddefbbdfdfbdfbf7dd +% fbdfbefebbf7efdf77baf7d77efdfbeef6bdedabaf7bbf7bbaf77af5ef5ebd7b +% 6ef5ebd7eebd7af5eef7befdd7affebddfef7bfefbdeebef77beefbf7bf7efdf +% 7bbf7efd7defdfbf7ddeebaf7df807f7badbdf6ddef7bebbeeebddebdebd7af5 +% ef6bd7afd7baf5ebd7bbdefbdf00003ef7bef5dfb7bdedeebddefb7ef7efdfbf +% 7bfefdfafdefbf7efdf77bdef012a887def7bf7afdef7bbdefbbafd7bd7af5eb +% eeadaf5faf7b6bd7af5eef77c0400100f7ddebefaf7bdf77baf77afdefdfbf7f +% 7bfbfbf5fbdefefdfbf7dddf0a0912293d777ebb7bdef5eef7beefaf7af5ebd7 +% ef6f5ebf5ef7dbaf5ebd7bbc009020000fded7eeeef7bf7ddeebddfbdfbf7efd +% 7bddf7ebf7bd777bf7efdf7024024492437bfd7dddbdebd7bbdefb5ef5ebd7af +% eefbbd7ebdefdeeeddbb75e10090000009eeb7d7bbef7efdf77baff7bf7efdfb +% 7db777d7ef7b7bddfbf7df842402492490fbeefdf77bd7af5eef7addebd7af5f +% efeeeefd7bdeef7baf5ef7088090000002377daf5edefdfbfbddefbb7efdfbf5 +% 7b7dfdb7def7dddf7dfbbe2012024924905ed7fbfbf7af6edefbbdf7d7b76edf +% efdbafeef7bdbfbbef6f680240480000020ffdb6df5dfbdfb7af776efdeefdfb +% 7d7ffabdbdeff5f77bddf924090124924846b7efb6fb6efafdfbeefdaf7dd7af +% efed6ff7ef7b6f6edefbb00090240000010bfebdfddfffb7db5eddd7fbdbbefb +% 7b7ffdbd7bdffffff7af6248020092492423b7ef57bb5afef7f7bbfedef777b7 +% eed5afefdef5555addfdc1ffa09270000081fd7bfef7ffdbbeddf75bf7beedef +% 7bff7b7b77bffff7ff6f8bffc400f4924908d7deb7bedb7febbb5fff6eebdf7d +% ef5befdffdeb6dbeb5fb11f1c892f00000227ef7fdedf7d57f77fad5dddf7bdb +% 7dfedd76d77fffedefaf20f282200254948077bdb77bbeffdbfedfbf7bbdeeff +% efb7fbefbedb5b7fbdfe02f62ffcf8fe7ef93def7ddf6db6f6d7b6f7ef77bdab +% 7b7db77df7f7fedb776c48fe5ffdf9ff7e601f7beff6fbefbffdfddd7dfef7ff +% efef7fdb6eded7fffffc00fe9f7cfbcf1ee49bdedd5ddf7dedb76fbfdbabbdb7 +% 7dbbedbffdfbfdb6d55892f60f3cfbcf3fc00ef7bbfbf6db7ffffb75bf7f77fd +% effedff6dbb75ffdfff800f64f3cfbcf9fc92fbdff6f5fffd56d6ffff6edeeaf +% 7b6bfb6ffffef5afb6d124f0df3cfbef0fc006ef6bfdfb6dbffffdadbddfbdfb +% efff6ffdb6adfff058f401f1df7cfbef2f8927fbfedbb7fffb5b6fffeffb77b7 +% 7d5bfd5bffffad04826093ffdf7ef9fe078007aedbff7edadffffb6b7b6feeff +% effedbff6adb7f4910a403ffdf7ef8fc772491ffff56edfff6dadfffdffd7fdb +% 7b6dffb6fffff610452090000000f800f70003b5b6ffffb6bffff6ad76dbdaff +% efffb6ffdb6adc45102404491249f1223e4925ffffedadffffb6bfffffffffb7 +% 7db6ffdafffff8904560fc802001f2047c0000db6b7fff6c007fedb6d6b6b6fd +% efffd5bfb6db59051005861244920048009248ffffdb6df8ff06ffffffffffd7 +% 7b6afff6fffff051e564140000004900840002eadaffffacc1f8f56db6d5adbf +% efdfb6dfd5adb505f02aa649249200241092487fffb55b7c3f169ffffffffffb +% 7d7dfffb7ffff053baa80400000049012200006dadfffffe1fa9c7ab5ab6dadf +% efefadb7edb56505e832ad24924900240049257fff6db5b58fea31fffffffff7 +% 7b7b7ffedffff0517d5004000000248092000075b5fffff8e3daac76d6db56bd +% efdff56dfb6db204df8aa52e4925c712a0f2793fffb5ad6919c3c73fffffffef +% 7dbadfffb7ffe4a13a0c0c611f8228c633098436adfffff00e38119b5b6adb7b +% eff7fb6b7ed6d00a1e24a488904cb2488c4e2a7fff6db6da4b8f4a9fffffffdf +% 7b6f5fffedfff550aa440d52a14910b229148236dbffffe806f0ff8d6d5b6d7b +% effdf6db7fb5b80406054500aa52252488402a5ffed56dd895bf003fffffffef +% 7d5bbfffdb7fe951524c1455a05440202295411db7ffffe806d4fffb6b6dab7d +% effff5ad7fedba040504a680a5708aaa8800151ffdb6d5b12368037fffffffdb +% 7db6dfffeadffc5151940a2aa052203022aa813b57ffffd805b915badb5ab6ff +% f7fffb6dbffb6d04048545808a988ab28c022a1ffeadb6ea4b50437fffffffb7 +% 6edb6ffff76ffe51504414955049284824ad013d6dffffb405b9059b56db6dfd +% fffffedb6efdb6040554a88085480a4a8a05551fffdb6d5c96d0233fffffff6f +% 6db6dbffffdbfd51502408ab508aaec82a55011b6dbfff6805b2847b6d6adbfb +% ffffff6db6ff4784056549814488090a88892a3efff6dbb646d14edffffffedf +% 6d6db7ffffb695d150281095499958102d1102c01b6fff6c8b62209b5bb6d7fb +% fffffdb6dbffa3e40522a981408808950c4a5312a7fdb6da02a69a9ffefffdb7 +% 6dab57ffff6d05b150680a95958aa81054890444036fffb69106a93d77db6fff +% ffffff6db7ff2bf8052aa680204809328c2a511155fdb6db0248c33beefffdad +% 6d6d6dfffedb016aa06809950a4aa810254a044400dfff6d1012a837bddb6fff +% ffffffdb6ffe55fc0a29428050a80895140aa91154f6dcd6225492bef7bffdbb +% 76dbb6fffadb01b4a0c816aa824aa11054aa0044015ffcbb00606e3fdff6dbef +% ffff7fb6dfff28fc0a4aa48094c81412a412557f547b6c6d24cea075badfff7f +% 6db7f6fff6db0269508808ab4189505025528e9bc13ffc36004510fffffb6ded +% fffdbfdb6fffa89204955266770ea10fc2a2701ef46db895494ab376db6fffdf +% 76dff6fffdb682045184e010001008200905809bd13fe9060043427ffffedb7d +% fffb7fdb6fffd4a885110484484091002020041f785b78204be886edb6dbfff7 +% 6db7edbffdb6e00222020810820400250484489df2bfdd04025298ffffffb6df +% fffedffb6fffdaa88e4841277dfbfe804810801fd42dba209e4892edb6db7ffd +% 76ddfb6ffdb6fc022e010ae8000000be0122125db13ff784004d24fffffff6db +% fffbdffedfffdb50be487a02a5252401f000001fe476fd48998251db6db6dfff +% 6dbfbdbbfb6dfffffa0380a8084041540f49493b013fd6c00850c5fffffffb6f +% fff6fbf7bfffb6dfdebc2502a215140120ba003e546dfb449aa28bb6db6dbffd +% 777fefbf76dbfffb7b41082808a041544a02fff0017fb6c0f23125fffffff6db +% feedbef7ffff6dbfff245142a20a140100a80002aa6ded898a9249edb6db7fff +% 6ffffbfedb6dfff6d449041008a0a1545402aa9400ffa000991493bfffffedb7 +% fdb6efb7ffffdb7ff9005145420a040101500020aaede224c4b513fb6db6ffff +% 77ffdefedb6dbfeda255041014a0a9545405550a01ffc8434e6867b7ffffdb6d +% ff6dfdeffffffb7fc8005145400a000101500050abb6c14ca11247ff6db6ffff +% 6dffb7ddb6db6fed12aa8410157ffaa85405550207ffc8a4d5248f6effffdb6f +% ffdbff7ffffffefe200021454f0003c281500054af6dd124312897fdedb6fffd +% 7b7f6df6dbb6dbd88aaa8a1070200018280555003effa9552543076fdfffdb6f +% eff7ffdfff7ffff9200020878044940742a00055fbeda50b0e922ffdfdb6fffd +% 7ededb7db7f6db680aaa8a38048000a0e80aaa0befbfe75554a60edfb7ffdb6f +% fbfdfff7fedffff2a00020c0200922041d502fff7efb8ac4c5044ffbff6dfffd +% 6fb7db6f6ffdb6d00aaa8f128490082081ffa7fdedef822a29280edf6dffb6df +% feff7ffefdb7fff5500030001002410400000edbffdf3e11b2492ffbffdbfffb +% 7bedf6ddefff6db00555c4490248082094003fffb77d20548491ddbf6dbf6dbf +% efbfdffbddb6fffaa00600802401210401491db6fef75089cd137ff7fffbfff7 +% 7efb7dbfffffedbc0abe29124092042124007fffefef0fc48856bb7edb776dbf +% fbeff7f6db6ddff540ef00000800488400247b6dbdbf2035b225dfedffeffff7 +% 6fbedf7fffffbdbf5fbd9249212400109281f7fffbfb0a4b10a6bddfdb7edb7f +% fefbfdedb76dfbf7f7ff8000040124820010ff6db7b72088654dbbbdbfefffed +% 7befb7ffffffbfbedeedc924909000104905edffff7f4a24204b3ffbfb7db6ff +% efbeffbbeeedf6f7ffffe000020492420023dfdb6efe808cca8abb6fbfefffdb +% 7efbeeff7fffbffef6ddf24924200008490ffdbffdedd5209087bffef6feeeff +% fbefbfeffbb6f6dbdfffb80000849241002f7ffb6ffca00ac4957bdfffdbddef +% 77befbbddfffffffffbbfc9248100008249febbfff6cffd29106f77bb7ffffdd +% fffdf7ffbeedb6db76ff7e0002424921007dff76dbfca0248525fffffedb777f +% 76efdf6dfbdfffffefefefa49008000424ffbfffff78dec521036eeeefffeef7 +% fffffeffefff7df77fbdfd800241249081f7f6eddded73950b25fdddddbbbfff +% 77bb77f77edbefbffb7fb7e49008000213eefffffbfda4255001fffffffffddd +% feffefbfeffffdf6dff7fff00491249047bfdddf7fbf68890692edbb76eeefff +% 77eefefdfdbedffffefeeefc900000020ffdfbfbef76cc315200fffffffddedb +% ffbddfefbff7fbb7bbdfdfde024924907f77bfbf7dfda5630425dbeeeedffdff +% 76fffbbdf77eeffefffbfdffa4000004fefff777efecc3c12c81ff7dddfbbff7 +% ffedbf7fdeeffeefeedf77b7e0924923f7eefffeff7e48058813f7effffff7bf +% 77bff7f77ffdbbddfdfdeffefc00000fffdfdddfdbffb0117c81deffbbb6fefb +% feff7efefbdfffffbff7feefff92497fb6fdfbfbffb7da43d413ffdb7fffdfef +% 77f6efdfef7beedff7bfbffddffd17fefff7bfbf76fee60ab483b77ff6eefbbf +% ffbffdfbffff7ffb7efdf6dffbfffffbf7bff7f7eff7f9936c13fefeffdfef7d +% 76fddfbf6ddffbbfefeffffbbf7fffb7defdbefeffbfde62da87efedddfddff7 +% ffeffbf7fffb6ff77dff6efff7eddb7f7fefffdfddfdbf9f6c177dffffbffdff +% 77bf7f7eef7ffeffffbbffdb7effbffffbbf76fbffefffe3fb3fffbbbbf77fb7 +% fefbefeffdeefbdddbf7dbffefddfeeddffbffff777f76fc07feedffff7fedff +% 77fffdfdbfffdfffff7f7f77fdfff7fffeefdddbfff6fffff877ffeeefedffef +% ffb6dfbff76dfedb77effffedfb76fbb77fefbffdddfeedfffffbbbffdffbbbd +% 76fffbf77fffb7fffefddb6ffbfffeffffbbffbb7fbffffbdfeefffbbfbbf7ff +% fff7bf7feddfffbeefdffffddf7ddfeeedffb7fff7fb6dff7bbfeeeff7ff7f77 +% 77bef7edfffb7df7fdfb777fffeffbbfffeefeeefeffffb7fffbbffefeefefff +% fefffeffbbbfefffbfbfffedbb7f7ffbbbbff7ffdfdbbffeeeeffbbbdfddfddd +% 77eddfdffff77f6df7f7ddfffffbeeeffffbbfbbfbfff6effffeeffffbffbfff +% ffbffbfb6efffbfffefeffbbeeeffffeeeeffdff7f777fdddbbbfeeedf7bf777 +% 76fdbf7fffdddfdf6fdff7ff7dfedbbbfffeefefefefeeffffffbbffffef7fff +% fff7f7eefbfffefbfdfbbeefffdfffffbbbbff7dfdfefffbbeeeffbbbb7feddd +% 7fdffeffdf7777ffdfbf7fdddbfbbeeeffffbbffbfbfdbb7f7ffeefffffbffff +% f6fedfdbffffff6efbf4db3ef6df67fdee5bffb7f7f6ffff7fbbbfeeeeef6f77 +% 7ff7fbff76dd44aabf7ddedb7773df8d1eaf5b7d5cbec8cfedf7fbbffdfffdff +% f7bfff7ffffadaad575bad5ef577bd6eeb6bbe92adbdb75dffff7ffbbfdddfdd +% 7efedfedddff77dbdf7bbaedeb7aaf5d6b75ad7d6abadedfbbb7eefff7fffbfb +% fff7fbffffb6f5d5ed7ab5dd6eeabebdf77bbacefd7bbfdbfffeffdb7ef77f7f +% 76dfbf7f7bfdb7f7ff6bb5faeefafeb5f6eb7bfddbbaadbfb777fbffefdfefef +% fffdf7edfff5f7b776f757fdd6baf6bdb6bd55fd7b77bfb77fffdf77fefefdfd +% 77bfffffef6eedf7fedb77b5ddfbddbaeaf377b5f56b7b5ffeeefffeddfbffbf +% fef76edfbdfdd7f9eeab6a5b5d7bfdabeeef75fdf76f5f7df7fffb6fffdfdbf7 +% 7ffffffdfffbefbafd576abaadeadabdd5eb6ffbb7575377bfdddffddbff7fff +% f7defdfff7bad7cdddf76fb5bbfbfabbadaeebbaf55eaebffefffeffff7bff6f +% 7effefdbbffbded6fdeeaf57badbf5555daeeff5ef5afefef7fbbbdbbfefedff +% fffbfffffef5dfeafd6eed775ab777b6bd5eaf37eb5eff77dfdffffff6ff7ffd +% 77df7dbf77d7dbf5b5eaeab77557ebb57abd72f7af7e82fffeff77bf7ffdffb7 +% feffeffbfff7afbdfbff7577fff5efb5fafef575ef757edefbfbfffbffdfedff +% 7ffbffffeefeffffff7ffffeefffafbffffbfff7fdffdbfbdfdfeeffedfbffff +% f7df7db77fdffdf7b7eddffffedffdffb7dfefdfbfef7fffff7f7fdf7fbfbfb7 +% 7effeffffdfdefbefffffdb7dffdfff6ff7fbefff7bfff6f7bfbfdfbfffff6ff +% fffbfffeeffffffffedfbffefdffb7bffffbfffb7ffdedffffefefffedf6ffff +% 77df7db7ffb7bdf7dbfdfbffffdbfeffdbef7bdffef7bffdef7f7fb77fbfdfdb +% feffefffddfef7beffffffb7dbfffff6ff7fff7fefdfffb7bdfdfdfffffffdff +% 7ffbfffeffffffffff6fb7feffbf6dfffffdeffb7dff7bffffefeffeedf6ffbf +% f7df7db7fbb7def7dbfdff7ffffbffdfdbeffdeffffbff7ef7bfbfb7ffbfdbfb +% 7effefffdffefffefffffff7db7ffffb7f7fbfffefbfeff7fffdfdffdfffffff +% fffbfffeff7ffbdfff6fb6fefff76dbffffdf7bdbdf77dffdef7f7fefdf6ff6f +% 77df7db7fbf7df7bdbfdffefffffffffedeffff7ffffffdefbdfbfb7ffbfdbff +% feffefffdffeffffffffffffdb6efff6ffffbefff7beeffbfffffeffdbfffffd +% 7ffbfffeff6ffbef7f6fb6ddffffedbfdfbdf7dedff7fdbfdf7df7fefff6ff6f +% f7df7db7fbffdf7fedfdffffbffdfffffdf7fffffeffdfff7bf7bfdbff7fdbff +% 7effefffdffdfffdfffffffbfb6fdff6ffffbefbfbdefff7fffffeffdbeffffd +% fffbfffeff6fbbefbfb7b6dffffffdbfdbbef7df6ffffb7ef76f77ff7ffeff6f +% 77df7db7fbffff7ffbffffff6ffdbffffff7ffffff7bdfefffffffdbff7fdbff +% feffefffdffdf7fdff7efffbfdb7fbf6ff7fdefbfdff7fffdefdeeffededfffd +% 7ffbfffeff6fbfefb7f7db6fffffffbfdbfeffdf6feffb7dfbefbfff7fffff6f +% f7df7db7fbfffeffffffffff6ffedfffffeffbffffbdefefbffffddbffbfb7ff +% 7effefffdffdf7ddfedefffdfdb7fb76ff7ddf7bfdffffffff7df7ffedfbfefd +% fffbfffeff6fbfffb7fbdb6fffffffffdbffffff6ff7bdbdf7efbfbf7fff7fef +% 77df7db7fbfffefbffffffffb7fedfefffefbbefffbff7ffbefffefbffb7f7ff +% feffefffdffdf7dffedf7ffdff6ffb7eff7dff7dfdfefff7fffdf7ffedfffedd +% 7ffbfffeff6fbfff6ffbf6dffffdffffdbfff7ffdff7dedef7dfbfdf7ffedfff +% f7df7db7fbfffefbfdfffffbb6ffdfedffefbfeffbbffffffefbfefbffb7fbfb +% 7efff7ffdffef7dfffdf6fffffeffb7fff7dfefdbffefbfbdffff7ffedffffbf +% fffbfffeff6fffff6ffbfedffffdbfffb7fffbdfff77df6ffbdf7fdf7ffedff7 +% 77df6f6ffdffdefbfdbffffb6dbfffedfef7bffff7ffffff7ffbeefdffb7fb7f +% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +%%EndPreview +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 374.085208 translate +500.113915 -374.085208 scale +% Image geometry +500 374 8 +% Transformation matrix +[ 500 0 0 374 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 500 string def +/gstr 500 string def +/bstr 500 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 251367 ASCII Bytes +colorimage +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +!< +!< +!< +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +IK1Zr?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;s&a_W=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C;)1IU?2Z?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;s&a5I=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=C3?SJ,~> +IK10D69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qks#>Ho3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3(!X)IR6"R69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qks#=sa3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3'nD]J,~> +IK2-GFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_Js)id4F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`dY+IWT^TFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_Js)i:&F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`]A=J,~> +IfLd%=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=FOUZ=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?iO5W?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJr1=DV>H=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJr0=90]JJ,~> +IfL9O3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3.=1R3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa6N9#o69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j8)3,Co@3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j8(2usfqJ,~> +IfM6GF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKFaeFTF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFT6K4FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hg+F_l/BF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`hg*FTF5tJ,~> +!<=Es=FjSI=FOUZ=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?iO4=?W^E;=BJp4=C504?W\TSJ,~> +!< +!<=m+Fb+\.FaeFTF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFT6IoFEM_JF`heKF`_bKFEK>=J,~> +IfLd%=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4= +IfL9O3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3$^gM3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j8(3.=1R3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa6N9#' +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j7B3)r:) +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&h]SJ,~> +IfM6GF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKFX2'OF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hg*FaeFTF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFT6JA +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hfDF]EO+ +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`fG>J,~> +!<=Es=P['Z?iF/V?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJr1=DqPK=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C8sJ)IHTK?W^E;=BJp4=C504?W^E;=BJp4=C3?SJ,~> +!< +!<=m+Fkq0?FT-E3FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`hg+F`2AEF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`bND)K^+EFEM_JF`heKF`_bKFEM_JF`heKF`]A=J,~> +IfLcs=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?iO4O?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C:u.!+1:ZaB3Ii=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C:/l!@7_r~> +IfL9E3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa6N9"g69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3(!O&!()5ra>e3,3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'u^d!>b`d~> +IfM6HF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFT6J,FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`dP(!-Ed7aE;NFF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`c_f!AXY*~> +!<=F4=?Kqm=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJr0=FOUZ=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?iO4a?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;`)p#H=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^DV!.Y~> +!< +!<=mAFZabgF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`hg*FaeFTF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFT6J>FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_J`-#(%F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM^]!.Y~> +B`KG]?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJqK=9)_-=FOUZ=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?iO5H?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;`)mpb +=BJp4=C504?W^E;=BJp4=C504?W^E;,liG~> +B`Jr/69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j7C2ul;E3.=1R3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +6N9#`69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk`&JZ% +3&j5a3'oSa69$qk3&j5a3'oSa69$qk(BAs~> +B`Ko2FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hfEFT?O_FaeFTF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FT6K%FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J`,uu? +F`heKF`_bKFEM_JF`heKF`_bKFEM_J1&uh~> +!<=F2=>O;d=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C6V] +^K>M`=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C:2m +!@7_r~> +!<b`d~> +!<=m?FYe,^F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF``1W +^NFR=F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`cbg +!AXY*~> +!<=Es=JJuI?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJr1=9)^H=B&X0=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;==!rt~> +!< +!<=m+Fea).FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`hg+FT?O%F] +!<=Es=FjSX=@ce$=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJqK=;bIJ=C504?W^E;=BJp4=C504?W^E;=BHjLJ,~> +!< +!<=m+Fb+\=F\$UsF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`hfEFW#:DF`_bKFEM_JF`heKF`_bKFEM_JF`fG>J,~> +!<=Es=FjS*=Sc,p?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJqn=90]JJ,~> +!< +!<=m+Fb+[dFo$5UFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hfhFTF5tJ,~> +!<=Es=FjS*=MIrk?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C3?S +J,~> +!< +!<=m+Fb+[dFh`&PFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`]A= +J,~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d+TR#~> +!< +!<=^&Fb+[dFcgeI/HC;~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d+TR#~> +!< +!<=^&Fb+[dFcgeI/HC;~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=Kts?:dd,o,p=';%2'Hn+XJ]s3(/="JQVMG!?hGn~> +!<PTb~> +!<=^&Fg6'$DI?%$1+aUe&fMl8/M]R_>$uo(JT^R,!A+;%~> +!<=9o=LM<77PlD-%Jp,/'cnqQ*YnMO":Z.n1e*$uJQV_M!@7_r~> +!<b`d~> +!<=^&FgcDqAP"X"')MY4"pk_G#mU5+";2h48S*HqJT^d2!AXY*~> +!<=9o=LqT:6nfDdrW!-210eUXWOhoJ#Jm[:Jnn(9%/g/.(G/$OJQRJ*r`B1E!.Y~> +!<\JN/3?r\son!.Y~> +!<=^&Fh2\t?pGtMrW!--$lgB9/N3Df#<4Im-Qj36#Q4W)+@'=PJTZNdrcJ5n!.Y~> +!<=9o=M@lE:c'=)!!!EZ>`?8Zaoo;=A3CA#!!4<#:k;`"=90QFJ,~> +!< +!<=^&FhVu*DFlDm!!!65*$dH-4TmYh*YJ_W!!4`DDLlq]FTF&oJ,~> +!<=9o=M\)@:c'!f!!=f`R`+1-!hjZprW!!91f/a*KNJ6u!.Y~> +!< +!<=^&Fhr2%DFl,Q!! +!<=9o=Mn5A3$J8$!^2.Hg<'Z:N(49V!$O=Q=GBoY+TR#~> +!<d!#7):3/0Bn'``a~> +!<=^&Fi/>&=tT^R!YQk=g-#[#,SgUb!%hB*FbY#>/HC;~> +!<=9o=N4GJ:bW=Y!'#SHeB/$4N'..@%5:V0=G^,\+TR#~> +!< +!<=^&FiJP/DEng7!"^M;e3+$r,SC(W&jU>cFbt5A/HC;~> +!<=9o=NFSK7Nha3'kFSpap,Fm'`\4[7Y+["=90QFJ,~> +!< +!<=^&Fi\\0AM!l^"s,PF4U*ee"onWYAV"u^FTF&oJ,~> +!<=9o=NX_L6m2O115s;s"cP#5!$t*c=H-D`+TR#~> +!< +!<=^&Finh1?nD?Y$m`nW"XFNW!&A,:FcCME/HC;~> +!<=9o=NjkN6m2O14e]g:"e%CN!$tHm=H?Pb+TR#~> +!<c/en?d6*/#W"f+6\!#IMD30-$"'``a~> +!<=^&Fj+t3?nD?Y&i% +!<=9o=O("P:a#f=8$'MK"eIIL!&.6#=HQ\d+TR#~> +!< +!<=^&Fj>+5DCkhg(,EZg"Y^>b!'kFQFcgeI/HC;~> +!<=9o=O:.R:bVkL32+"-"Hk&2%6/o@P#q`.!.Y~> +!< +!<=^&FjP77DEn1%&2Cg\"=4BT&mBj/P'$dW!.Y~> +!<=9o=OC4R6k',BP.8X;Esr$b:k;`5=90QFJ,~> +!< +!<=^&FjY=7?kNGH-+H)@+pS)nDLlqpFTF&oJ,~> +!<=9o=OU@T:aH)MCUM:f\jl`#1kAbo=90QFJ,~> +!<2us`oJ,~> +!<=^&FjkI9DDD1s+LO?82AQ8m8V)#LFTF&oJ,~> +-3,2k=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*rJQV_M">gPf33fd3"I^&*(JoZb +QWO83!.Y~> +-3+c?3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQJN3Hb"="3Q4MA&Q"Jch6&iG5" +QT,!\!.Y~> +-3,W?F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>JT^d2"A'4+&2LOS"=OHS,]80U +QZW<\!.Y~> +!<=:u=?98\:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:psI/:a#fRH`tQp_+an=3.Y2!=90QFJ,~> +!<II2&-*-KWj#2bu+NJ/V,mK2us`oJ,~> +!<=_,FZOD_DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DROZjDCkhm-*KH73#;Q->(Lg`FTF&oJ,~> +,lf)j=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJD==?98\:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr;"@]k6k',d_5tc^N!o\<:k;`; +=90QFJ,~> +,leZ>3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&ie73'&oV2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2=`^0/dVMJc)fP#PS*s;21[`U +2us`oJ,~> +,lfN>F`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hT@FZOD_DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DXqoQ?kNGT3357G,R4<7DLlr! +FTF&oJ,~> +!<=;B=9)1q=9)1q=9)1q=9)1q=9)1q=9)1s=?02[=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr`E3^K=AW*r=AW*r=AW*r=>U!XH`>-lYq5ql:fpPF +=IiOp+TR#~> +!< +!<=_NFT?=WFT?=WFT?=WFT?=WFT?=WFT?=YFZF>^F`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>`H;c1F`)>>F`)>>F`)>>F\)Q5-)j$31(=4+DKTiJ +Fe*XU/HC;~> +!<=;A=9DB%=A]!!!)WVr"&N*%;#XPs;#OJu:fpgrr`B.sr)`qqr)`qqr)`qqr)`qqr)`qqr)`qq +r)`qqr)`qqr)`qqr)bsU=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%;"@]j/H?NZVTK*G!"D=u=AXQNT3)+;!.Y~> +!<oK:2)mQQr\sm8r&=[6r&=[6r&=[6r&=[6r&=[6r&=[6 +r&=[6r&=[6r&=[6r&?\o3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT +2)mQQ3&icT3&NZT2=`^/*WR"XVUu)O!!t8;3&Q7HT/Zid!.Y~> +!<=_MFTZN(F`.2$!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3Yr,i!Wr,i!Wr,i!Wr,i!Wr,i!Wr,i!W +r,i!Wr,i!Wr,i!Wr,k#;F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>EDXqoP5QD!CVEG,!!"r[^F`)bQT61/d!.Y~> +"99TI=A\ot!)WYs!)WVr!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr"&N*%;#XPs;#OJu:fpgrr`B.s +rE'.u=BJE!=9)1r=9DB%=A]!!!)WVr"&N*%;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq +;#FDq;#FE-:fpgr=BJC%=AW+%:fnk@/\7b#"+("W3:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:k;a%=90QFJ,~> +"99/r3&UUn!&aa8!&a^7!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7"#W%t2?#Q82>oK:2)mQQr\sm8 +rAXm:3&iep2uki73!2#t3&U[p!&a^7"#W%t2>fE62>fE62>fE62>fE62>fE62>fE62>fE62>fE6 +2>fE62>fEG2)mQQ3&icT3&NZT2)l +"9:#rF`.,"!,hdY!,haX!,hdY!,hdY!,hdY!,hdY!,hdY!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3Y +rH/3[F`hU$FT?=XFTZN(F`.2$!,haX")`7(DZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VW +DZ"VWDZ"VhDKU)>F`hSEF`)>EDKRN2%5t"F"!mp[>5iY(DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DLlr`FTF&oJ,~> +!<=;B=9;<$;#XPs;#XQ#:fpOr=A]!!!)WYs!)WYs!)WYs!)WYs!)WVr!)WYs!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr"&N*%;#XPs;#OJu:fpgrr`B.s +rE'.u=BJE!=9)1r=9DB%=A]!!!)WVr"&N*%;#FDq;#FE":fpO1!'S/maoe4D!&V\t1f.:N=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AY#[!?hGn~> +!<oK:2)mQQr\sm8 +rAXm:3&iep2uki73!2#t3&U[p!&a^7"#W%t2>fE62>fE<2)mH+!("l(fE8)c!$fKC1c76M3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&Q^U!>PTb~> +!<=_NFTQH'DZ4bYDZ4b^DKTi>F`.2$!,hdY!,hdY!,hdY!,hdY!,haX!,hdY!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3Y +rH/3[F`hU$FT?=XFTZN(F`.2$!,haX")`7(DZ"VWDZ"V]DKThB!"q8c4TdAC!(k1Q1i@GRF`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`*4^!A+;%~> +!rsKH;#OK":fpOr=A\ru$W'r-:fpgr=AW+%;#XPs;#XPs;#XQ#:fpOr=A]!!!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr!)WYs!)WYs!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr#uF`+:fpgr(B@1%aulaH!&.MW:fpgr +=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJDC=?98\:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:ruf?+TR#~> +!rs&q2>oK<2)mHQ3&UXo$T0n'2)mQQ3&NZT2?#Q82?#Q82?#Q=2)mHQ3&U[p!&aa8!&aa8!&aa8 +!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7!&aa8!&aa8!&aa8!&aa8!&aa8 +!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7#rO\%2)mQQ%ffM"fK?Vc!$4*Z2)mQQ +3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&ie=3'&oV2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ29@fY'``a~> +!rsoqDZ+\]DKTi>F`./#$Z:*0DKU)>F`)>EDZ4bYDZ4bYDZ4b^DKTi>F`.2$!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX!,hdY!,hdY!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX$#Xm.DKU)>+934M4ZkJ+!'k[LDKU)> +F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hTFFZOD_DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DTR#%/HC;~> +(B>U\:fpOr:fpOr:fpOr:fpOr=AW+%;#XQZ:fpgr=BJC%:fpgr=BJC%=AW+%:fpgr=AW+%:fpgr +=AW+%:fpgr=AW+%:fpgr=AW+%:fpgr=AW+%;#XPs;#XPs;#XQ#:fpOr=A]!!!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr!)WYs"&Kd6>b0"?YpBB%;#OJr +;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#XQQ:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr`E5,s=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*C!.Y~> +(B>102)mHQ2)mHQ2)mHQ2)mHQ3&NZT2?#Qt2)mQQ3&icT2)mQQ3&icT3&NZT2)mQQ3&NZT2)mQQ +3&NZT2)mQQ3&NZT2)mQQ3&NZT2)mQQ3&NZT2?#Q82?#Q82?#Q=2)mHQ3&U[p!&aa8!&aa8!&aa8 +!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7!&aa8"#UShA"D6T]dEe$2>oK7 +2>fE62>fE62>fE62>fE62>fE62>fE62>fE62>fE62?#Qk2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT +2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ`Afk83&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZ1!.Y~> +(B?%0DKTi>DKTi>DKTi>DKTi>F`)>EDZ4c@DKU)>F`hSEDKU)>F`hSEF`)>EDKU)>F`)>EDKU)> +F`)>EDKU)>F`)>EDKU)>F`)>EDKU)>F`)>EDZ4bYDZ4bYDZ4b^DKTi>F`.2$!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX!,hdY")]4]*1]4q1(""HDZ+\X +DZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ4c7DKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>`H=1YF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=R!.Y~> +8,sf8:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr=A\ru"&N*%;#OKY:fpgr=BJC%:fpgr=BJC%=AW+%:fpgr=AW+%:fpgr=AW+% +:fpgr=AW+%:fpgr=AW+%:fpgr=AW+%;#XPs;#XPs;#XQ(:fpOr=AW*r(BA!8ap,[.!%h;T;#XPs +;#OJu:fpgrr`B.srE'.u=BJE!=9)1r=9DB%=A]!!!)WVr"&N*%;#XPs;#FDq;#FDq;#FDq;#FDq +;#FDq;#FDq;#FDq;#FDq;#FEU:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr +=BJC%=AW+%:fpgr=BJC%=A[(@!`1$?J,~> +8,sAa2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ3&UXo"#W%t2>oKs2)mQQ3&icT2)mQQ3&icT3&NZT2)mQQ3&NZT2)mQQ3&NZT +2)mQQ3&NZT2)mQQ3&NZT2)mQQ3&NZT2?#Q82?#Q82?#QB2)mHQ3&NZQ%fgC7fETSJ!$4*Z2?#Q8 +2>oK:2)mQQr\sm8rAXm:3&iep2uki73!2#t3&U[p!&a^7"#W%t2?#Q82>fE62>fE62>fE62>fE6 +2>fE62>fE62>fE62>fE62>fEo2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ +3&icT3&NZT2)mQQ3&icT3&Sc:!]:\mJ,~> +8,t5aDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>F`./#")`7(DZ+]?DKU)>F`hSEDKU)>F`hSEF`)>EDKU)>F`)>EDKU)>F`)>E +DKU)>F`)>EDKU)>F`)>EDKU)>F`)>EDZ4bYDZ4bYDZ4bcDKTi>F`)>>+93IP4U*kQ!'k[LDZ4bY +DZ+\[DKU)>rcJ3YrH/3[F`hU$FT?=XFTZN(F`.2$!,haX")`7(DZ4bYDZ"VWDZ"VWDZ"VWDZ"VW +DZ"VWDZ"VWDZ"VWDZ"VWDZ"W;DKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)> +F`hSEF`)>EDKU)>F`hSEF`,9C!cBRiJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:]XZpr)a%t=BJDu=;Oe9=AW+%:fpOr=AW+%:fpgr=BJB9!,J"F#/N%p/Qc+Or`B.s +rE'%rr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.srE'.u=BJE!=9)1r +=9DB%=A]!!!)WVr"&N*%;#XPs;#OJu:fpgrr`B.srE'%rr)`qqr)`qqr)`qqr)`qqr)`qqr)`qq +r)`qqr)`qqr)`qqr`D3X=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%+TR#~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2$#Zor&=d93&ieo3#=G33&NZT2)mHQ3&NZT2)mQQ3&ic+!-=R\#0f"**]Q,:r\sm8 +rAXd7r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8rAXm:3&iep2uki7 +3!2#t3&U[p!&a^7"#W%t2?#Q82>oK:2)mQQr\sm8rAXd7r&=[6r&=[6r&=[6r&=[6r&=[6r&=[6 +r&=[6r&=[6r&=[6r\uqr3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT +2)mQQ3&icT3&NZT'``a~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>D?4ltr,i*ZF`hU#FVeqEDKTi>F`)>EDKU)>F`hRE!$I[m"um"k5]q3ercJ3Y +rH/*XrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrH/3[F`hU$FT?=X +FTZN(F`.2$!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3YrH/*Xr,i!Wr,i!Wr,i!Wr,i!Wr,i!Wr,i!W +r,i!Wr,i!Wr,i!WrcL8>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>E/HC;~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:aK4?=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r:_s+:Qc]ND,lfW$=A]!! +"]/;t=BJE!=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1r=9)1s=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9DB%=A]!!!)WVr"&N*%;#XPs +;#OJu:fpgrr`B.srE'.u=BJE!=9)1r=9DB%=A]!!!)WSq!)WSq!)WSq!)WSq!)WSq!)WSq!)WSq +!)WSq!)WSq!)WYs!`1$?J,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'k4>3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ2%fn!Qe2M^-NG2I3&U[p +"Z87s3&iep2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki72uki82uki8 +2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki83!2#t3&U[p!&a^7"#W%t2?#Q8 +2>oK:2)mQQr\sm8rAXm:3&iep2uki73!2#t3&U[p!&a[6!&a[6!&a[6!&a[6!&a[6!&a[6!&a[6 +!&a[6!&a[6!&aa8!]:\mJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DC'FCF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>DBo3%QTYO2$33>6F`.2$ +"`AI#F`hU$FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=XFT?=YFT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFTZN(F`.2$!,haX")`7(DZ4bY +DZ+\[DKU)>rcJ3YrH/3[F`hU$FT?=XFTZN(F`.2$!,h^W!,h^W!,h^W!,h^W!,h^W!,h^W!,h^W +!,h^W!,h^W!,hdY!cBRiJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:aB.>=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r+TPZ1atLRW!&Re[:fpgr +=BJC%=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=A]!!!)WYs!)WYs"]/;t=BJE!=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1r=9DB%=A]!!!)WVr"&N*%;#XPs +;#OJu:fpgrr`B.srE'.u=BJE!=9)1r=9)1s=90QFJ,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'b.=3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ'`_0tfItJs!$aH_2)mQQ +3&icT3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&U[p!&aa8!&aa8"Z87s3&iep2uki8 +2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki8 +2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki73!2#t3&U[p!&a^7"#W%t2?#Q8 +2>oK:2)mQQr\sm8rAXm:3&iep2uki72uki82us`oJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBs@BF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>/H?QO4YJc%!(h +F`hSEF`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`.2$!,hdY!,hdY"`AI#F`hU$FT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=XFTZN(F`.2$!,haX")`7(DZ4bY +DZ+\[DKU)>rcJ3YrH/3[F`hU$FT?=XFT?=YFTF&oJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a9(==AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*G!(W6q+0cje6r6u^=AW*r +=AW*r=AW*r=AW*r=AW*r=AW+%;#OJu:fpgrrE(mQ=BJC%=AW*r=BJC%=AW+%:fpgr=BJC%:fpgr +=BJC%:fpgr=BJC%:fpgr=BJC%:fpgrr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.s +r`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.srE'%rr`B.sr`B.sr`B.sr`B.sr`B.s +r`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B;"=BH^HJ,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'Y(<3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZ3!(W7*+2&cs/i>UG3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZT2>oK:2)mQQrAZVk3&icT3&NZQ3&icT3&NZT2)mQQ3&icT2)mQQ +3&icT2)mQQ3&icT2)mQQ3&icT2)mQQr\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8 +r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8rAXd7r\sm8r\sm8r\sm8r\sm8r\sm8 +r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\t$<3&hWQJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBj:AF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=W!#Cb]+#4-&?uC+)F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>EDZ+\[DKU)>rH0r7F`hSEF`)>>F`hSEF`)>EDKU)>F`hSEDKU)> +F`hSEDKU)>F`hSEDKU)>F`hSEDKU)>rcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3Y +rcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrH/*XrcJ3YrcJ3YrcJ3YrcJ3YrcJ3Y +rcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ?]F`f89J,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a9(==AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AUgS1;T-r=f`#37T`bh=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=BJE!=?B>]=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=AW+% +:fpOr=AW+%:fpOr=AW+%:fpOr=A]!!!)WYs!)WYs!)WYs"]/;t=BJE!=9)1s=9)1s=9)1s=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9DB%+TR#~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'Y(<3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&Mo\29h<:=go"D0fV-M3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&iep3'/uW3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&NZT +2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&U[p!&aa8!&aa8!&aa8"Z87s3&iep2uki82uki82uki82uki8 +2uki82uki82uki82uki82uki82uki82uki83!2#t'``a~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBj:AF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`'bN$ojD5=Y^3^AT`-5F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`hU$FZXJ`F`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`)>E +DKTi>F`)>EDKTi>F`)>EDKTi>F`.2$!,hdY!,hdY!,hdY"`AI#F`hU$FT?=YFT?=YFT?=YFT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFTZN(/HC;~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a0"<=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=?$:%_2ufhOoQ+k=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r&Qhk3 +:fpOr:fpOr:fpgr=BJE!=:e;2=AW+%:fpOr=AW+%:fpQm==[3M=AW+%:fpOr=AW+%:fpOr=AW+% +:fpOr=AW+%:fpOr=AW+%:fpOr=A]!!!)WYs!`1$?J,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'P";3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3%Y+Qc&gS-RfEjS3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ&NDX- +2)mHQ2)mHQ2)mQQ3&iep3"Rr,3&NZT2)mHQ3&NZT2)mJl3%HjG3&NZT2)mHQ3&NZT2)mHQ3&NZT +2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&U[p!&aa8!]:\mJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBa4@F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F]nbO306:Q,lej$F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>&Tqu6 +DKTi>DKTi>DKU)>F`hU$FV&G5F`)>EDKTi>F`)>EDKTjqFXq?PF`)>EDKTi>F`)>EDKTi>F`)>E +DKTi>F`)>EDKTi>F`)>EDKTi>F`.2$!,hdY!cBRiJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a&q;=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r7K +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'Fq:3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ0`ViqNnAi&!#7IN3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZ`2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2>fE92)mQQrAY3C3&icT3&NZQ3&hWQJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBX.?F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>AH2rjN]hk7!%i>2F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=iDKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DZ"VZDKU)>rH/NdF`hSEF`)>>F`f89J,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:`rk:=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r%02j]aoeo#F2=ftIm!cg=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=C"a*:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fnk@J,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'=k93&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ#lpdcfE8gFHd/MAImF&Z3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3*eC$2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)l +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBO(>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>&ca?E4TdGe+ulMaIhD`QF`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F^8m-DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKRN2J,~> +IfLWg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r= +IfL3@3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3$1";2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mH.!.4Rp!k1ZSoI'YOrVusRc/dL] +[rXh_-W6qgfRLm`!%p5g3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&Ou$2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mH.!.Y~> +IfM'>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>FWYLDDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKThK!$_8&!\tN#oEtU'rVus.3934, +1*@2:$5YD@4b#?r!+9qeF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`(K-DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKThK!.Y~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:``_8=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AUgS8,::-3:$VFHfiHOX>9VP!3FGf +J"ZiO:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:g@+!=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r= +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'+_73&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&Mo\8,:d;4R<%JK]^nf[l+!^!4U5* +J#iVV2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2-`*u3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3#)FD~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DB>F`)>>F`)>>F`)>>F`)>>F`)>>F`'bN(AU)n&F9As-0@>k1(=!Z!&De^ +Ik^p9DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DHq=%F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>FY*TD~> +IfLWg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=<::@:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:db:)_>24R8*g3U/a(7W_%lbG!0#.E +IsV/=:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:g7$u=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r+TR#~> +IfL3@3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3$'q:2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2(ekOc2#ul8*g3U1$@0ibnp0U!0k^[ +ItRe:2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2-W$t3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ'``a~> +IfM'>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>FWPFCDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DIDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DHh7$F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>/HC;~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:`WY7=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r:^mE(prWZSJee(]"Um@\7lVRf!!!Gj +aoJ%/!!*hGbK><)!&ReS=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW+':fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:a#gh~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'"Y63&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ2$j8hpt,YmM\l0h"VNpf7m%pl!!!Yp +fDqoH!!*nUbLh;7!$aH\3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&N[!2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2&-+A~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DB3k;F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>D@uq$pcS[<-O0AH"U>SS((^fM!!!8e +4TI23!!*9^b<:=j!(h>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>*DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DCkj=~> +IfLWg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=<(.>:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr+TQl^aoHeb!!*MEr5o&O8,WGNaoT=" +qZ$XVXNJ\8\ePZD=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r>$+U':fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fnk@J,~> +IfL3@3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3#je82)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ'``p[fDpU$!!*_Wr7D%i8,WGNfE'5> +qZ$XZ\'!?Q`YSq93&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ=u\B!2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)l +IfM'>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>FW>:ADKTi>DKTi>DKTi>DKTi>DKTi>DKTi>/H@*i4THf)!!*>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>>'4_*DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKRN2J,~> +!<=:n:i0<2=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=>U";oZ@0= +q>^LNq8re&!!")&ap,F^4ZH/WXN/J5OoQ:p=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=]eL&:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:a#gh~> +!<^LQq:Gd8!!"/(fET?*5s/%l\&[-NRfEsV3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ=ZA8u2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2&-+A~> +!<=_%DJaN6F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F\)QEoK<10 +q>^L(q)nfm!!!>f4U*ea&eGj'1<2P-,lf'*F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>=`nV)DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DCkj=~> +/-$hq:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:ftk:2crmY:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOj=ATG8](=)@!!#"Wb5Z#Paof4, +'o_q1!jS?8rQ55IR\%@faofS`R_e^?"g!Z7N1n)]ap#AUR[ThQqoT&QSsl7ep<%kf!&RMS:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*C!.Y~> +/-$DE2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)r`92`NZS2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHN3&M!T`q.jZ!!#.[f`,aefE9,J +(R4^I!kkS]rR_4cUoDW2fE9R2Us8Vc"h0_SPcW.'fEK:$Unk!'qq)%kWMHN +/-%8EDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKX*>2g'"\DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi7F`%fs2Y0*.!!!T/4oZT'4TdSO +"sit,!\uGsrB16<-nmXQ4Te&,-ogo`"Yq>N,V_:P4U!_q-n$c)q`P'?0ISV7p-!m@!(h'NDKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi! +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=R!.Y~> +@fRZK=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=O9kJ=AVg;!.sda!#>A2!''u# +"+("JC\PsY_2M)'!!#a9b)@D?!!,TkqT8oOHVGgc!!#ahao[_h%/U#*8"TY$!kMnoq>^[6K$)6) +-2[`C8,(./_%crH:k)SD=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AVpu:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:a#gh~> +@fR6$3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ37'Md3&NQ.!/pF#!#PM4!'L85 +",$XSF8+;oc'2*B!!#pLfT[NW!!,U!qUbniKMj2s!!#pmfE.O.')MY08#cF=!lf"1q>^[8MqH[X +-i +@fS)uF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>FjP"0F`)(K!%7>#!!`<#!"f,m +"!mpI+SS#+3$]:E!!!fu4X:@4!!*ijqE4p=,o6pf!!!i24TZoB#Q"K%(,5YL!]D)/q>^['-TsU@ +$N'l((ABrp3!KA#DLZeHF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`(-#DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DCkj=~> +!<=:n:hs00=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*Z!'Tkp!%n'J +!''u#"&/aq/c!NjSkTXk!!4puK),HJ%%dF?!M2IN!!#"UaoSS!p&G8$_90p=*qfU6aoDkH!!'+p +b(#QS+])9;=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW($:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:a#gh~> +!<0/3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZI!($/-!&=?N +!'L85"&]+!1&9H'WDXB,!!5%1Mu!DS&uki^!NAB]!!#.YfE&H=p&G8+c.L[s+SGg8fDlQ\!!'M& +fRK@j'f@s.3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&Obs2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2&-+A~> +!<=_%DJOB4F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>*!#"fb!"Jf* +!"f,m!uCq;%J`-g0Gaul!!3Ql-i*fD#;H*>!AG/_!!!T-4TR;Hp&G793'BDl$2+B!4TG``!!"eK +4b"aX/T,]KF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`(9'DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DCkj=~> +/-$hq:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fth9/m(qP:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOrr_NY*%(buO!%n'J!$;-^!$;+>qT8e. +q#CF(AG?--*l6"AN;*AQ3;go"Opps_"$OTF](Q++*m2VbqZ$UOou_bS!'!eW:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOp=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r= +/-$DE2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)r]8/iY^J2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQr\X``'#sIo!&=?N!$M9n!$M7@qUbd< +q#CF.C\Rl4+O/QkPkY4Y4T*h4RhG>n"$tAf`qBB7+P>=/qZ$URp"4aa!%g&f2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHo3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3#)FD~> +/-%8EDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKX'=/p2&SDKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>rb_cM#<)*8!"Jf*!"&Wf!"&W)qE4fo +q#CF#*r#^<#rk(2,kq?>&H"Zl,mX&B!tmsa2YI+Q#sCE_qZ$U)of[d?!*X8_DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKThtF`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>FY*TD~> +!<=:n:c2?O:fpOj=AVgr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +d80sJ:aH*_nB(_oq#CF:%/g/+])9\N]'KD!R``c)p](:RrQ5,/qZ$X<1ALnQ=j"m.%/9f)HcjL9 +r;ZjERe4`(\dT&!:k)SD=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AUDJ:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:f(7j +=AU.@J,~> +!<nCR_,q#CF<')_e1`r+Hh`p<[-UtF2>I4T;qT`L')2G/K\4qj +r;ZjGV"E:@`Y&U/21ISC3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&N*D2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)R?N +3&MENJ,~> +!<=_%DDcQSDKTi7F`))>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +d;B)0DDD29n3$aaq#CF%#Q4W&2Z,]<2XCDG-p9^&p](:*rB1-/qZ$X'%/Bl+(-Of)#P\9$,s=CH +r;Zj*..fY(2?slGDLZeHF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`&UMDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DJjT7 +F`&c2J,~> +.KCVg=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgrrD3Jrr(mAqdSM]$:f(7j +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpO^!%mZ^!'ToR!3uFD!,M +.KC2@3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQrA=R7r&"I6dPWd>2)R?N +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHG!&p92)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)l +.KD&DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>rGDUXr,)LWdV^g_DJjT7 +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi)!"JB[!#"l'!&FF7!$M"9 +!=8u+!!=E.4X0Y$!"f,m!B(/[!!Du%2@]H^!%%V-":"o,#<)-9/0Y'ZDKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKX-?Ecl8BDKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKRN2J,~> +!<=;@:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:b#RD:fpOj=AVgr:f(7j:fpOj=AVgr +:f(7j:fpOj=AVgr:f(7j:fpOj=T)%r=OU(J(BC/taoFTr!!';#aoICr!!@hqb!#S$!*oNG!O3C9 +!!#"XaoGuL!!$:'aoEaa!!#OgaoJ.2!!=Oib-CpG!,M)H?lf;;=AVgr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:ft\52crmY:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpO;!.Y~> +!< +!<=_LD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWDCTdHDKTi7F`))>DJjT7DKTi7F`))> +DJjT7DKTi7F`))>DJjT7DKTi7Fo?1XFjk40+94.b4TH,d!!"eN4THc'!!=T34VISk!$(u$!AXlU +!!!T04THQ#!!"#<4TGic!!!f64TI54!!DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKWp92g'"\DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKThK!.Y~> +!<=;,:]OVq:]OVq:]OVr:]jfr:g!]n"'AAr=T)%r=Sttq=Sttq=Sttq=Sttq=Sttq=Sttq=T2+s +=T)&K=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j2ul\@aoFU$!!4H@ +*rQ*7aoK9R!<1+@T)&Ee:&W37>l"F#3<%&#(&It2>lMkGAGH6(aoFU#!!\%tA,lT<_=5SMOoQY% +=P6Mg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW,B:]V^> +J,~> +!<Ic1'?gRfF0\ +38$0,3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&N\<2$"El +J,~> +!<=_8D?+hWD?+hWD?+hXD?G$!DKYqr"*JL!Fo?1XFo6+WFo6+WFo6+WFo6+WFo6+WFo6+WFoH7Y +Fo?21F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7=o]B,4TH,k!!3KD +$2jl"4TIJ;!<,+]0_tbL(]?Js*;TX8&H4fm#5\B#*<&)$*r,g74TH,j!!Xf6*WQ0F3:K'6,lfN7 +FkLYMF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)?ED?2 +!<=:K:]OVs:]OVq:]OVq:]OVs:]OVs:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVp:]_(7]'d]@ +4o,-_]#r/I!!")9aoK9S!!")>aoK9S!!#OfaoG]C!!>4'b-CdC!'U>(!1rud!29D7!1rud!=WN< +!!#a]aso@N6r6u^=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=NaN]=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r= +!<@9fY.+]!($V:!3,bo!3H1P!3,bo!>92I +!!#pbfIAu`/i>UG3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ36O1"3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3#)FD~> +!<=^WD?+hYD?+hWD?+hWD?+hYD?+hYD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWD?+hVD?:FU2XW^. +')DS42Ea24!!!?$4TIJ>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>Fj"ZCF`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>FY*TD~> +!<=9o;"RQg=AVgr0E>nUaoF$j!!!c5aoctj!*oKF"L5nfb/*oS!$;*]!"A`)!'U;'!*o@#"$"HG +Red!a(&l>U`;'B5P5WN'3;!7OT'j`&W;mae:c)9N:fpOj=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW,>:cDKQ=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r+TR#~> +!<4S8[SWUAC?ZN(Wj2)I9M2)mHN3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&N\82)dKP3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ'``a~> +!<=^&DY.fNF`))>5QDqo4TGrg!!!6&4Tcu1!$(r#">W>-4ZN9>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)?ADDu]UF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>/HC;~> +!<=9o;#O2m84cBDpeV#$'uB:[!%%LB!#>LU"0;J2Z2VlL>Q>h]b/*oS!$;*]!"A`)!&FMq!*o@# +"$"HGP5,(XZ2VlG*r5j:T)He3P4ekU*ph#t7fYqR=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr +:f(7j:fpOj=T2+s=NsZ%=AVgr:f(7j:fpOj=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=NXG@+TR#~> +!<f?34SL]7#oCkRfDm;r!!!i7fE8S_'#":s"_.NTc.L;;!!"/?fDlQ]!!"nTfDoFX!!>@9 +fUM[:!58Ba!$M+PTb~> +!<=^&DZ+GT;E-X6phg-G"uu!5!"/T'!!`Ec"#9i]1B'E?)up:)4ZN9DJjT7DKTi7F`))>DJjT7DKTi7F`))> +DJjT7DKTi7FoH7YFj4e`F`))>DJjT7DKTi7F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>FinS&/HC;~> +!<=:':]a0Z8c26_8P&bU#Y@le:J=PX7nEPS!\FD!m)f;:q>gK:!O9K?aoJF?!!7bp](uC,*rX4]% +/U#)1B#>q>l"F&36KC;q#CDArlP4#q>^N3r5o!cpAb2(m)fL:!#JI.=Sttq=Sttq=Sttq=Sttq= +Sttq=Sttq=T)&M=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj= +T2+s=Sttq=O0f&=AVgr:f(7j:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr: +fpOr:fnk@J,~> +!<pm+;:Nq>gKH!PQbWfDr8W!!8)2`qfZ8+T9pm')MY/ +2>u/-A,60-4P8;fq#CDJrn%35q>^N?r7CuspAb2/m+;KT!"q.H3;bW63;bW63;bW63;bW63;bW6 +3;bW63;k]g3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3;tc8 +3;bW636sH@3&NQQ2)R?N2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)l +!<=^3D?<]q3;b6,3)]Zl#WN(i!<<-#(/k'J!^H`3lob=Rq>gIW!AZY64TI)5!!4N22YmCR$2m!e +#Q"K$%/i^LTr&k#epAb17lobM-!$lH"Fo6+WFo6+WFo6+WFo6+W +Fo6+WFo6+WFo?23F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7 +FoH7YFo6+WFjFqaF`))>DJjT7DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKRN2J,~> +!<=:+:^0Ha7nc]P:]4-&9M\>U;+sPQ:Mm8Ta1IU6:JC^`!<=2-aoK9R!!'k2aoF3r!!7MiXSMns +*rX7X!!">DaoG]C!!>4'b/*lR!''u#!'U2Z!''ku!0$XP!3tk4!_iY_lqd[ar(mAqr(mAqrD3Su +:f(9m:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVs:]OVs:]OVq:b>dG:fpOj=AVgr:f(7j +:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgrrD3Jrr(mAqdng&g!.Y~> +!<'GRMHu)PS7/\tD!$LX\!6t<>!6t>l!&a`U!ef48q>^L< +rRgrH!%7`t!+Yj*"$G5gc1q>>4TUF3&NQQ2)R?N2)mHN +3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)RAl2#oW62#oVb2$"ElJ,~> +!<=^7D?`ug('"@8!W<99!!*'"#V%en!AT\D[A7XF!@n%c!<DJjT7 +DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>rGDUXr,)LWdr#1 +!<=:-:^BW_:J>ATZcD&'m0M\&]9RG79M]9tm0M[*9MA8Z/HCChaoJ.2!!&_iaoTFTr;Znfb+AG0 +!$;-^!4r",!$;*]!*o@#!''u#!'U,X".mZX(&It2T)-S0*r,d91@!!`X8j'C:]OVq:]OVq:]OVs +:]OVs:]jfr:g!Zm!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q/m(qH=AVgr:f(7j +:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f&;8J,~> +!< +!<=^9D?r3;!<=KIR'k]Im0MIjUhr-u!!+JEm0MHH!%Ml(5QE1u4TI54!!"bN4TRndr;ZmI4YZ^4 +!"&Wf!&jZR!"&Te!$(h8!"f,m!##)-"#)l$#5\B#0`!p4$2FQ$%-ftW1&rT+D?+hWD?+hWD?+hY +D?+hYD?G$!DKYnq!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W/p2&LF`))>DJjT7 +DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJh$+J,~> +!<=:/:^'B[:KaCCoBcY=]6gm[m0/5<8PfC.lcK3l"F#3<%&#U%nZi$p>p6!!$g1aoHea!!%B1aoY'57"J26:]OVq:]OVq:]OVr:]jfr:g!]n +"'AAr=T)%r=Sttq=Sttq=Sttq=Sttq=Sttq=Sttq=T)%s+TR#~> +!<^LXrn%4Pq#CI/5puO0!-@tg!/1.J!/0Uh!_35CJMmEa!''m6!''m6!''p7"#r.q3;tc; +3&NQQrA=R7r&"I6r&"I6r&"I6r&"I6r&"I6r&"I6rA=Tj!.Y~> +!<=^;D?WoR!>^+-oBcY7UdpgJm0-Ji3,S^&lTG4hq#CX/+seW`,od-f!!04TZB!@"E4pD?+hWD?+hWD?+hXD?G$!DKYqr +"*JL!Fo?1XFo6+WFo6+WFo6+WFo6+WFo6+WFo6+WFo?1Y/HC;~> +!<=:0;#a2i;5*%;"D1=Z!.sU\!P2"l!!>sl"F#3;pu"C[qH*AGF:J +`"i+K!5[pB!hKB +!<:3#&!''p7!''m6"?87r'``a~> +!<=^ +!<=:1:]j3]He79E"1q5Q($s'C=mH%hXND:P!!0ofpAb;:b0!uc!!#"VaoH5M!!*gdpJ,~> +!<X!-"+3`h([TcS;sODb\(DMk!!1?&pAb;Bf[s^1!!#.ZfDp!c!!*mop=K@dqZ$Ud +kL]em!.d#82$"ElJ,~> +!<=^=D?CXS8'Ku["/Go(#4+JQ(@(r%1-Gj9!!,&,pAb:>4Zse]!!!T.4THVt!!*9Op,rBuqZ$U3 +k +!<=:2:]aKfU#55==ZCKhaoI%[!!>s!_:D)p](F*WQN@gq>^LTqoSr21ALnO'kFoQap*G4 +!&Ch%_>=34RchfpMuYG\:ps1$+TR#~> +!<^LXqq(qK2>I4R(Mh%ffER6M +!&_IBc2.J@V!$A3PQ2bU27>@C'``a~> +!<=^>D?:(DIGaDn((_\V4THkr!!=$#4Vmem!Z!pQp](F%/Nl6:q>^L,q`Os6%/Bl)"s,]"4U*8< +!":VG3;W[U.-E_p,QL)\DROE`/HC;~> +!<=:3;#aAmZek'NL.oGLaoT)Fnt?2LF%ofRrlPMl"F# +3;L]%XE.W07nmcjq8r]+r;ZpOb/u^B!!"V4aoN4dJP`dO!?hGn~> +!<PTb~> +!<=^?DZ9tBR,733<<,#E4TRGpnhC7n+r;"Sr]LN@+;YY+(*"GOr]LQB*Z#S)()J#>2Z>i>*;TX8 +&G\Ho1*R\N()J)Iq)n^+r;Zp/4ZsAT!!!Ji4TPa"JSqo6!A+;%~> +!<=:4:]a-\]A;iUZV7@/aoG]C!!#ORaoG06!!9FJ3;igWRcVZnCB-2B:q'7%+TR#~> +!< +!<=^@D?:RRUttD>QiJ_K4THJu!!!f!4TH;r!!4o=&H)S/.-3Sn+94uaDRXKa/HC;~> +!<=:5;#a2hW8-bAf1_.6aoHeb!!$9gaoFs0!!,T#r;ZgljN7P8!#N%>!(QiRs$hrD!?hGn~> +!<!!,T*r;ZgqjOaOR!"u[s!&=@'s"THi!>PTb~> +!<=^AD?;9fLYV7ubQ&p!4THf)!!"#'4TH8q!!*iVr;Zg6j?3Q&!$nsi!+l%8s(..,!A+;%~> +!<=:6:]a0]HeRif;09Fm!hl&Qq>^MIl,j!IpAb4?_;iZ>7fZ#g:]VjOo`,4+&f2];1c.Ue:]V^> +J,~> +!<c(8!!`f=%i#m*,;,PTb~> +!<=^BD?<]98)!>2#SXg5!\l)=q>^LCkrf"jpAb4$39*.'('%pUD?2L*o`,40)B^Ue8P* +!<=:6:]aKsiS*Z"AnCVW#J-X`CgLFr_9pC*U%eTg'u]@Z!Pp)X!!+jdilV=c!%k`X&Ie^c=D;nl +F_Pu$=BJ0W1aEP-!!E`I,rA)^:]V^>J,~> +!<Bb46 +Fa%t@>?aca3@5(0!!ET=(F(Z*2$"ElJ,~> +!<=^BD?:(ZgY2#q-OfW1#<""M%gWFW370kh1&(_L#".Wh!'n)4&J>'lA9`EF +H?aaJA7SV*3[bX +!<=:7:]a3^Y1`1CHWKm`!jRGcr_*JuF)=TW]$e_$Z2"A#'qsg5!l8+Mr;Zj>Hf)sH$k9dE![Rhh +n\GIDWg8-I8h(;L!! +!<^%hX/(TcfP!mP3fr;Zj@K\tD_&dc-,!Z(iZ +n](mPYaL8V9J?eP!!PTb~> +!<=^CD?;ctOP0"%7g8WM!\t]#rW!*;3\^U?2UX_g1ALnN"u5:(!]V/)r;Zj)-/Uid#84Uc!\sb% +n^e#p^8@-/;_Jd_!! +!<=:7:]XF$f^/]o:\r3>_3/+u9P0R%iVr3G]1dq+aoRYHr;Zm?CV&TL"MpdjP-Nic!aG^n]2/M; +)uIGPWeLFp"+QW3^%]>FWde,&rW!!98j]=M!?hGn~> +!<I;#8fMc'r*6935qWNrG4DHqTCFfE%Har;ZmAF2m:n"O4$4S%[Y1!b23_]/9Tq +,5]C]Y_i@%",E;C_tV1RY_QF>rW!!49Lkm9!>PTb~> +!<=^CD?1"af^/]>!W"qb3$eh1!%2WZg]$RAU];@]4TQi8r;Zm*+?&:D"?8+],r4:>!ZV2J]5@W^ +./VTs^6S\D"-f[ke+_Gr^6E.crW!!F;eVtE!A+;%~> +!<=:8:]a0]W7^J=Pt]$lap!r/9OO.;q<\2pA^AL$Z'q8q\B4lE!%#6R!j1`J#33rg'RVbdC;!.Y~> +!< +!<=^DD?<]9LY1tqD#cQn4U!,8!$6"$q<\21%*q'=1+4h7\30mI!&D0(!n;4X`0]8H:#-VeuMe!.Y~> +!<=:8:]a-aiU#q8Tk7G8L=c%a!gQHqrlPAK?;+t;p?_m- +!<PTb~> +!<=^DD?:RZg[+;2I4#dO#QQ6>p?_lN"bAf;#njmg!bD@Br7:ue!)3BN"at8o +8M:qZ!#$2BF/I(2dsXnqNiT%%(]XOK11dJ'!A+;%~> +!<=:8:]X7Em-Ogp9`@Q^9E;6fm0JtN_90oh9Mqb\m/_Q7J]\%!!(=Ir!<>Lb_#ou4$uYm0"dXF: +6R3*>!!=K.5[sY[#=r!2)ZTj]7''2c+TR#~> +!<Xf`rh_9&q]qa"fd;i +7j\lJ!!=Q2;fqrB#?PPO+ohTX0!$o2'``a~> +!<=^DD?0`;m-Og7!<*c6!!&,Qm0IP/3'BDQ!!nAPm/]]\JNX&S!+djf)ql_#CZEK"f@&e +9.1&E!!=W99Q'd/#?5;V-ia6!@'"5H/HC;~> +!<=:9:]a3^ZgI,]L.k;?:]j6Y9ZQhn#DQ$sb*#G1fCSA1D.S:@!hfT?]MJVA'`5]TQ4s=5R[T4] +DJQ@2mt$k6\CRL*+p_829r!!!g'Y##-B!.Y~> +!<o902YBS"e;X8j'L2$"+#qo9,5'``H_Z)!,+ +GB\Y$ril[-O_72t$$?'L$"m_fa,<(\!"poe2$"ElJ,~> +!<=^ED?;ctR-j8B<<+NJD?EcP!4DLe#?:df4XC(Ubk(3&0arUr!\j[1]P[`g)#MnnVAK;XX/heH +I<^!bN;fj^VMo+Y#81qOWsNBDf@Q +!<=:9;#a2hiU6(7^e@H!:]X7%p$Ds1 +!<)r0;!EX5kfE0\A%)"M#/dVN7qo8i<'`_]_qGRB< +r36Wn;eNA2G@G$*Uh=08`s&D3!!!WaYVcFr!.Y~> +!<=^ED?;9fg[=G1WW4OGD?0_bp$DrR"[+F;1#)9d!@JD/4T[bN)SL"j?kNI)qpttZ(][iWqFgm6 +r2U3c9P1>rG[4U"SRu1+f*/TU!!"9PY\jIn!.Y~> +!<=:9:]X'umHjt09LenU!_H)+p?`#qA\hDMiUQ:9=`f5;"3O=<7__b'1]RLb%$LM(%&tQQ)_D^6 +$47;#5_f9,%@0OUQ@MLk;Gob_5T>LV_$-T$!!"<7Z;:QF!.Y~> +!< +!<=^ED?1M#mHjsT!+l%F!]U1fp?`#2$oeD+g[XY3())6^"$IG#A\W*d8H8`'#F>8=%)++i-oDt\ +&eZ!D9UGaZ%Am*(VN+VL?!U-99IPhsf*/TU!!"ccZ>K[p!.Y~> +!<=:9:]X7:mHjq$;>O)j7SImtm02HBI>gk3nEg6RFFhR:b)? +!<Js8oUn<3lJH%FTMfTZ@\^bl?A!!uCq#lo,F`rin5!!)p6 +(*Q4MUp71E;j4"Y=-p1sUmFFK!$Za,rPo&.0E;D(ZS_au!.Y~> +!<=^ED?0`-mHjpE#l8E?AH4dcm025E(F0!VnEg5^'7i:K4X:#!^hsBK!"s9k&cd7Tf)s,U!!)p0 +()KPASZAf,9TGZC<0sYdSX2J>!% +!<=:::]a*[Q0mr?L.k)5;#a2h]D1arZV7*0=mt_Y9SJ&?"3SF[(VroT2ujC_<)c3t!'@4Y_#qAQ +!!)p($55ZiJ;-J,~> +!< +!<=^FD?=ALD=-]l<<-V,D?;9fV"j<[QiJQG(@UVk!#pJP"$JUD,f+@*=o]1fN/V`p!(+R#f)sK4 +!!)p0$62`5NgEFWX(G%lrMp0i9RU(L!% +!<=:::]a0`W9rsRa%T2&:]a-QA.Y=r0dq05`M4u;@NUOP5W3"[7UE.1q$3]+TR#~> +!< +!<=^FD?<]:L[FI1[/_]PD?9eRg\L4>3WVAL1%=Q3gAi1D4o[YG$kgEp"(`)FEW(h!DAN9cK_s@' +PQq0nr=TAU8PE)_VO'u$r2U-P9V&5]>nR,cQMoD +!<=:::]a0]Zg@&\L.k28:]a0]F8G8-^eB1!Cgcc"!nU,)J]e#8!b;:!_b^CX!'U9[#@tcqOraTK +QMeQ$UFH6Dr<`c?1dGrI@R,JARK8_"rL*nU8.5JTU]&"2KbOM5[nm)K!.Y~> +!<PTb~> +!<=^FD?<]9R-a2A<<,#TD?<]93r84IWW3hu%j(6-!mCWiJNa#r!Zh>L_eoN-!+c%e#D#6*,maQ" +VYo$J[P%U\r=T>O4\U:)DG6)gWr])QrMp+! +!<=:::]a0`Zg@&]iGD7^qG78c9QSham0BspO/!lmutJ]e#8!h'*@`)$M!!#ti8!3uOG +"i4^L!'?tS_%OFo!!!E7$55KlQC;)E5Y,@4NVJqGNC*[GB>+;\"KF$R(Ikr3!?hGn~> +!<"_9[2$5s6?&AND#C0'F`n5l9Nq&;7JkMSaf`0S*U];IS2$,H3,5bmM^Acag +c"d:Z4fJ>"'#S2Z!"p+c,tM+;Z#N]@=*0S#pot!u7fWO!_u@[Z[57jr0tB.B'``a~> +!<=^FD?<]:R-a2BgG&[XqJHBp!'8@&m0B!a"ZAL[!8I&2!jr"SJNa#r![n%6`,5W_!%@c(!)*;S +"ZRP'!(+-mf+QPH!!!6:&faJBVQ4K+9N5ngSbT5hSP&q_C"*(5"N!"r,\=N(!A+;%~> +!<=:::]a0]Zg6u]iHn6g7f-!l8PE!9Y+]H$?EqYqRS9mSm/k=%Ra9+YU4n<;qT8rGP(f@@cH64" +Z,-1W!lP'T`)$LY!(6]a!-nC`"gLc%!(s$b_$?_e!!"K65_/j&!etSqr]gTW?#G1PqjIY9,QJdL +rkS]M8cT[<:]V^>J,~> +!<e@^"Cu596]oi!eO(@ce&?#Mi5jVfEAmWMknVCfE0(+ +c1fildJsou2$+Km:AnW%LATU,]i"h19W7p1#H0HZ!&.>MPQ%fgQ\&lL;Zp0AJs3#-Ylp19!$[j1 +`rj4Q!"ZUt!>PTb~> +!<=^FD?<]9R-X,BgID5ZAc$?T2uj4aOF8JV#VnP+-ifA!m/jZq.*k$Y.2s3cqE4s:,o\6lc924e +1-#"k!^cr5`,5W.!-.sr!-J*$"Ypko!)p?)f*A`A!!"ZG9TK+Q!ge=Ir_*GoCOM56ql9jY-ibZm +rmq8$;ZIrND?2 +!<=:::]a0`Zg$iZThJj;rN)opO!EQf1 +aoSJQrCd5mP4cs&_5rfYKoDbBq8s#^RWMS+9M]5R](jDLRVc+)9EJ7K](sJL/IfWp!< +!<:?!'L6R!EP-VfE,)PM=Qi3HqUO8fE/CDK)T]iH)orW!L-Xa9*&)5rR_.W +B`1R)BDb[.FSiPTb~> +!<=^FD?<]:R-Eu?I/jONqecF4&H2Y1"WRA&!X0@`o'HLS!%I\+!\GZ6rXT#C.H3Jk,R+/I! +!<=:::]a0]W9EUNZVaRjr(mMc!)9`0qT8o7:LLO#m/jUfWVagH\qO0Y9Mo20?r9U(Z2)NIZ%[%+ +ASd(%p<",T?;,4=iO_rn_90oK9NdY$iO`r#FSNuZU2Ba#!`+6\r5oD1<_QA;L6[L*9M^WEapXA5 +9Mp/1W0M3n:SR^.!aG^n`_Z^n!%e%Ip +!<KmS]uKp$"056tH1R4$GtYL@fF5cX<_H(\<**$o945I/fE]*JEG0$) +MmrE4'tn!J>'H!S:12?!fRcapCk@[p>"a/9fE&$mqF^ldK$F5G$_(0i:17^MAQMN$Pl')@RoW0W +@<$C*>"_\mqUbjZ!%u8K![@\$r*oBP#-:)j!'-Ibrl54h-3+$"GH1JD"Jh03FHQF)"IC;49Z-kM +!^-N)]/9U(!.Y~> +!<=^FD?<]9LZn+-Qj2B)f"!!jVn*XD`O1AO'<1)gc5 +$kF:4p,s-G#QQT@gS>)\3'BD@!#BFZgS?P('DO]k.1l=U!Wa)sr&kE6"TSfu +!!l)CLM\aG!@dk.!ZV2J`bkiL!)!0Jp,rU7&c_nmVUPOr#)"B)!&&Soq5XXhN.#T&qPsac-id2p +rmq3 +!<=:::]a*^Q07N:a&u),rD3PT!-@nW"/8gi@.`gfY"Z+uap!`"9Pp`[rTsaHW)6U#r5oDYFA,A2 +D/EEL9PqWAaoeA6;5jH\#I@*Xb&g=(iV`'EL.m +!<>?2$,?0HhZ.pX&_kmoTK?#9>18U"dDhV>',W"P6?nf:0,(+fF,]E91r2e +>#S'eER"=3"056nFT%C.GtX(JGtVS+r0%1n98i]"%C9G8:1\X$M3EdD@7tS=fEB3-936E9P66D? +99fG."NG+J<-eA)"+jKFX8CNNPQ2rJ2$+Qo:AnW%L@s1([SA4N!%*$0rl5529E5&*7u$H:$E?)d +8&NBf_]f(5]JT^)!.Y~> +!<=^FD?=AMD9j?WsY^b +!)(emf@),J@(^@X/HC;~> +!<=:9:]X7Ek3W9&=\MBc:]`R4aodf#@+Y;C"ER@m9SWB1!ddV8rlPD\FA,i2iVDjGPt[XhWD?Bbp[&3,9WZC2<_T4^m/u +!<NJ>>u6GPAbhMk@8![#fEKNF92fhjq3)&"9;L4H:el$)P6YAd\(I`^96'`j"--;\ +c2?2q]`8kg2$"*lr*fYmo[jFi@Tt5e!#8_Grl5;UFYEdq'hEqVn?E$c!,);O!gs$$]JT^)!.Y~> +!<=^ED?0`;k3W8p('%83D?<''-2'J'3"-)bm/h\92Z>iB3"H!D[J9+j[0R3>4TmYH!*.8Am0(XM +!!kR]4Tcu1*mFNK"?HQ&!*/j^!_35>r]LEE'*&erg\L4AD#btI/HH-*p[&2H!&?\d"TWuGm/u)Y +"ZZEC!\sa2`bkeq')[[gB_4FnJW,4@&c`bZ_Z&-maa,T?!#S:UVXUVf8H +!<=:9:]X'ujmhjn"]9-*:Kba3m0;0>D5'g/a7em%]1e1\aoMne`_Z[9)uNY8 +S+Oi'S,Q@l:b3:\!'?L[rkSo@B-[HW$n>/#QLpUJQ6ZI1rkSY.!(=Ls!?hGn~> +!<)rHC"+3a7>549fN`0?P6Qk=EN;o7K(bB0HqT_$fDuTq`\dbs,5bmM +WV"gCWW$?3>r*2q!'Qafrl5>L@jV0U&hmdLWqPTb~> +!<=^ED?1M#jm<>t*WT)UDDD2IofW!8tI/kku4oYcfV"sBZLB&:k4Tcu1 +1#)Ql"/Gns1&1,BgD1&X4Z3QG`*:m0:c?&1IVq[J&thU];\;4TPd1`bkeW./]#( +>kC/Z>lKZeL.W9_!(*R3rmqIjBd`r]#;9A +!<=:9;#a2hiT9G3f3h9C:a#hWou[;HD=m3#Pt]?C_.?_RZRS7SW +q<\:C;,#%)m09L_R_`<-Y4V)aHV[FFfC\G5L.kBTfC\G2?s``Q!B:)":]`TV/GrHIWV"=5`; +!<p"0:Y>4e!`CeNF5c"KaqoTKN?98hHTMbA9gP6,#dc2Q>tUe=mO +q3(o@:.p35P6Q,%Us3:BGP%(%@8Kd"M=cu7AP5j$M=cu4<+,UU!B^A&2$,?01]1\^[e/2PdedJX +7j7p5,&"C_`riPg4UM)f&0aJNFG?-^Z*C=6Um#m\!/CKn!gs$0]eog*!.Y~> +!<=^ED?;9fgZ@f-bT6a^DCkiUofW#7OD?r_]l!j&!.Y~> +!<=:9:]a3^^uXkdf3(d<(DZSb!EOR>m08;@b0#-+W:KM"%_#h:M+h^\Q+TR#~> +!<VL2`ra-Y'tlI*'``a~> +!<=^ED?;ctWoWONbSC1V+9qI$!r9Ef)jD$/\Q$&/HC;~> +!<=:9:]a*[Q/h67f3(cU/bI0d:PSN/"aa:mWD&':m0.?bb5;uiohaoJ.0 +!<(VM[,'``a~> +!<=^ED?=ALD<(!dbSC0`%J2da!EJdZ"\/_Z/HAf@m0,3Q4Y6Yqp?`+>!$j]c!>`oQmJkE'm/q2* +!*/UW!]gUpo'HM5MuZfJ4TJXZN!ElK!!!X)KXUd0%F_bOH?37n +92f#)Ga6#@f)iA\1;.Q+/HC;~> +!<=:8:]X'oip?ig;+rtAaoP2$o^)g'?HQSWiUQ:=D.UkD9\8t)"\a?eAPpM2m/ts6;;q*5s2X$a +!j54ur5o)7!%l8g!< +!<%lQH98W>*"\XI"BMO0BP66Y7:6+n/s+9-l +!d@;Hr7D(P!$93=!< +!<=^DD?1Loip?iU#QPG.4TPP"o^)fC#X&G/g[XY70ap2a!6k-'"TT?%$ja9(m/tQ4#i"q;s0^bO +!g!C;r&k*9!'nVC!<=DBMuZfJ4TJ%GMunW(,lRcI&isQ][aX]s"2Z\k>.neS/HC;~> +!<=:8:]a3^a5ZIg]1cPIp+AFib':e5+V(&\+H'JrEpFao.7URIsQR[0+^B1!+./\Fm\+TR#~> +!<utf((]==J'fertFbc<\W2?MlVO +!<=^DD?;ct[GpQUU]:Z[p,rI8!,_Aq">L<5!.FA("[E7m/iXT/c7a5 +2ukPPD?=,E9)FPI=n4]UJb+g'L/]3*#5nN+(ckT0HBacn[Ki[qKP='l!'n27!A+;%~> +!<=:8:]a0]Q/V*3PtZ;nao\hAW:]H[?u9^WiUH4;9RY'"B(bNpa%VYb9YfcW!DJ6mm/k'sUAN(6 +$l@#^!\FC8qc!Q[o#^rWnl,U'rlPDLP&!cI(%;2'/\=g[+TR#~> +!< +!<=^DD?<]9D;jj`D#b7C4T[A=L\0s:*Y8hfg[OS5!#Id/-hZj1[/_L$!35/J! +!<=:7:]a-aiSj/*L.mR#ao\P9Zh3Ve=_19]nEgD29T7,#F7no(]1erQ9]>+#!DJd'm/k=%Ret5. +/Iffu!Z(i5qc!QHo#^r`nl,U6pW<]FTot"KF$opX"unb47md8"]2/MO!.Y~> +!</V#/dF +0aYrZ!YPK=qdKPco%3r&nmVTRpXf\`XIG,pHUn&k"t`24>##&4]/9U(!.Y~> +!<=^CD?:RZgYqN$<<+<=4T[28R.TbJ((:1CnEgD'!$j]53q_kDU];h_!8HW&! +,lf)b:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'Wu:]a0]W8R%ED,7/+ao\;2_"@!r +;.WG(nEgCk9VT[1HhHb/W(aI<=lo#Pa%Uj)m/km5P5EB&7f^\.!_*V3qG[H4o#^rsnl,UGn]Ci: +q,@A-%D,F;+TR#~> +,leZ;2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,)2$$?li0+4G:p]rL!intDoTKAP +BM3R=P6H>,X4UH]oofN#9>,ULjc]at94?)/!f9R>qq(p>!6R/#0aS9b@K;#NfDqZ:@K;bbfDo^_ +@K?lD]/9U(!.Y~> +,lfN7DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%&D?<]9LZ%P$0``m$4T[&4Wq>Z\ +#Rg]pnEgCT!%C&78+l6PLB'(C(?Oob[/`_Am/kK3-2Th+(')Kp!bDu_qMYE&niZt]nr*Q^nN?l9 +q2>=m'"`#^/HC;~> +!<=:u:cV!A:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X +7SloNrD3Pb;./>L"4p[V_>24TP"`pgm/p%!9VLtC"fP,"b"RQ_m0&\J_/3TAm/t-t;;ogf!oZh3 +qoStF!(P..!^m#6q,Hq-!1WOY!1WQ%!4hl(!?D0P:]V^>J,~> +!<\pc#H_EP66;-:6*V`!ffp< +qq(s[!&;YS!\OI$q-rpI!3,Nu!3,PA!6=kD!?qNU2$"ElJ,~> +!<=_,DE29GDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsrGD[J#Thpk"3_Ma3;G]=,lk@Fm/m>"!.FA("c!(54TJLTm0%8+3"R.mm/s?g#i!Yl!o!]# +q`P!#!+j>k!al!fq2Fl-!*o)R!*o(X!(cmD!AXYeD?2 +,QJua7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e&B"!(Qra!_H(ai9^T]9PsUJ!fTh) +p$Dn@9SH/pnEgCE9YnP=Q1aMJHWJ:;;;p[)"0P +,QJQ:0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)3$,!&=I1!^'+ti0+4l96'd[!gH?7 +oofN=98cGSn<4#l9?k^SD"Wtq@92$4:6+J#"*[C2A^6J@N_><-fE-C"/^$!Q*WSS'@K=I?fDqoA +@K +,QKE6ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIpb(!+l.I!]U18i9^TG!"erh![Ici +p$Dn:!#ko!9"7g2$l#i"M/"-0Cdb5QG?jMuZE?4TJaX +MuZfI4TJX[MulTO?G(.V/HC;~> ++oic_:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloNr_PUE:f'VX:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7f?-e7SlQO=lJ<+!gQH[3 +#1lP3FA.t8o'HU- ++oi?82)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCr\Z\j2)R*G2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG1&Ws50f:[\;i]e"!c1MoqUbk-99/\/ +#)Q!BGtVt'nrj5c%lQa95KWFk`Z-c95mOJhNIqrnrj)IK)=1%PQ2rO2$+Km>PV_. +WUnaBYOZ-&ddl#jUA87#?9J95]JT^)!.Y~> ++oj34DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsrba`-DJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'Ac6KMASu&b(>Id7!c7o_qE4m!!8I26 +#0[&n'*)mLo'HTN"[+U@L\:$>0ap2n!,^K7kj8Li!"T'khX(s,QLEZD?;BiKDCH+ +>k:)Y=n7LO6h3A?@JPiaGsVL&]P[a%!.Y~> +,6/lV:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7fH4B7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X\:]Nu_:]a3^Q/Cs1Al#]/aoQofo^)q9 +9Tltu9MB'Mo^)fiCs&_NZh<\j=`)=(CeRN"kj8OpA3Jpf%6 +,6/H52)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG1&a$g0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,f2#oB/2$,m5Cu:EX=&?U-fE$S!oTKQ; +9:Nq791r?CoTKGXE7hKiH1d@+;fUIBE(`i!k`Z0U#FGOgq!EF!t_P6,;g@IoZ`97m&n!i,f@ +b;K;+pgO5Xo@O&Bo3q]?n^mi9r*fk9=&M[K!$8d1!>PTb~> +,60<,DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'Ac?R*ASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%bD?+8GD?;ctD;X^^-NQ""4TQ?)o^)q. +!$sN3!!"Cjo^)f'%m;KER.]hO((`Vl%fcS8kj8O7"ZQbfORhc?I6+1pm/g8f8+Z*K!#PMq![n%? +bAR=mpl#2po0!(Yo8E[#nN?k\r/:i79,@R:!'n27!A+;%~> +-3,2c7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8NrD5:>:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X\:^BNe:e"8X7o@mrm/km:Ac'UND-?Mu +#ffW-b0%;S:ODa$"]'QhU.iAqm/]n7rlP;2APr*e!nVMFq!A8_FNV1+9Wn$T"6!*N=nD"`Y"W.q +_"@!p=`jP`)Q<]g:f'VX:e"8X7SloN:f'VX:e"8X7SloNjA5nG!$q>=!*o- +-3+c<0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sCrA?Ac2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,f2$boo2)-sG7o"p!P6-S9B`$E_EDuLn +#_G^Ff\"3.:gs!["]0g'X%Rs8P6"=7rn%:JBMS2`!f:3>plbnWH.^,M96^#l"--,L;tH1UG=u=: +J+Sp*;gJ8m)RBDb2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCj>?uk!%@VO!,M2Y!1EFf!/C$r!3,p+ +#?OYn<,?OS*kX?2'``a~> +-3,W8ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm]srGFE&DJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%bD?sfkDIm^'('r.Bm/kK;%/W0g&/Op* +#djX\4Zt\K!CueL"T]E&.0-C@m/[2+r]L<2$jcLm!mE^Lq!A7k'0S5^!0Hj?"5=(](A$nrO8oOd +Wq>ZZ()-R.)D(qSDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsjDG$,!''b4!0d";!+b\[!-I`o!*oJ] +#?1s/*c6<*5eLt8/HC;~> ++oic_:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloNrD5jN:e"8X7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:e"8X7SloN85+*^m/itTL&B'oAS1T% +!kV.#rQ5._;>';\f1_.GP"`pim/km5N;^m"FA_\t!kV-Qq<\En9Ua,HYtV+gm0($p?;/uCm0$Qu +\kJC]m/^@3qoSuO!%$i**_&t&7SloN:f'VX:e"8X7SloN:f'VX:e"8X7Pk*JpJ_-loZ@/Yo2G^Z +n]D9N<)c[g9P1WumD],P]MJVP!.Y~> ++oi?82)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCrA?qs2)-sG0f:gC2)R*G2)-sG0f:gC +2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG0f:gC2+q64P6,_sMu;3.BNOhi +!dmYArR_-r:A'eTM+a)cRnJA,P6-S6Pl958Gu"!q!dmXLq3)&/9;L4m]hP6?8+?qZ@KP6=fl +`_1.?P6"U-qq(ti!#OiV*\fN00f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0d?[2pL4-2o[j.uo3q^! +n^n8j@U`V@936D&PC!9G]JT^)!.Y~> ++oj34DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsrGFu6DIm^'ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'ASuBs;?/c8m/h\9)uMi"$n(]7 +!i,fFrB1/p#kdQhbQ&nO,lk@Hm/kK3,lKk,'+"6t!i,fdq<\ES!%9un1'!+%m0'3b#QW*@m0"11 +2?7Udm/[t9q`P!=!&EbU*bB5,ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'AOul6pP])NoK<1ro8EZS +nN@:ON/WK-!%40$mD],]]P[a%!.Y~> +,lf)X:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SlSQ:btR;:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e(C["%H*`7fH6a9E;$Km/h?&Z2MfG??>c+ +!jbS"rQ5._=nV.d^eCKFN(hjsm/k=%Rf1A0FC=b."0P +,leZ72)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:]a2)?sE2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)5%e"#2Yj1&a$36q_XZP6,#_^&?Ra?sWDg +!dRGFrR_-r;tZ=YInQipPY6l,P6->/V#ApHGuXF""*[C2H2<^0>u8eufW.YpoTKDo99`)$oofQ' +9;L3@@J#`a;gJ8m)U/6s2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCj>@#U!2b);@K;G\fDp-e@K=I< +fEHk9=%d@irf[eJ!$4!P2)R*G2)-sG0ul-P'``a~> +,lfN.DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASu)XDDPjADIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIrca"(c@fAc?QK.KG7]m/frB1/p(A7&!WW4J2,QQ'^m/jZq./c:0'-?f5"- ++TNZ^7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X[:e!oN7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX7SloN:f'VX:e!rPfAQ#tf1^;baoPOi +o^)^Y9X4Q=!Gl0:m09L_Z-%boiV)X?ZV7@saoQ ++TN670f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,e2+B;X0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G0f:gC2)R*G2).TrM;XR!M+`-mfE##] +oTK>u9>1;V!H;$2P6Q,%^"A69NqSY ++TO*3ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%aDFS2TASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'ASuBsDJj$'DIjRhbi%jibQ&=T4TP^V +o^)^8!&FL9!=p7Em08=G1-HQVg\1"9QiJ`:4TQ'@o^)dC!!*@mr9XQ]!#to#![Icio^)cB#UobR +p$DoQ!BiRO3qVe?()-O-'EB^rDJj$'DIm^'ASuBsDJj$'DIr]_+(]>-ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'AJuE0^A*WfJOB)n!0d&6!-mrq"&!/tOT"PKgMHpGoklg%DJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'/HC;~> +9)p,):e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:e"8X7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7f?-l7SloN:f'VX:e"8X7fH3g7S-9D7nH2L:]a0]B&DtWL.oG_aoP1j +o^)^R9Y12F!G--@m0/bK_9-jsp$DgS9Y12F!G--?m0o[^XBnSA]A__O;-(O4aoQT]oBcZXFIGnD +p$Do[FNVa4F7ei#;18;`3rgF#7SloN:f'VX:e"8X7SloN:f'VX7SlQN:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8N!'@HjB_YO,U%QS";ui0\aofJKKpqeZ!bG'3rTt,o;+psA:e"8X7SloN:f'X& +:]a*0!.Y~> +9)o\]2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG1&Ws<0f:gC2)R*G2)-sG1&a$70g%io7m&O)2$$?Ohie+Q9?mIg!D@"r +P6,_s`r4NjBNk(m"`-iVfQg6bP6,_s`r4NjBNk%l$unqL?qXdQNfJ +9)pPTDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'ASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'Ac6KTASuBsDJj$'DIm^'Ac?QOAN2.T(-#n)D?<]9-f=:m<<,#X4TPO_ +o^)^.!&jd=!=U^Um0.>,3'@o\p$Dg/!&jd=!=U^Tm0nCC1'dk@UtaXc#R*3e4TQ3%oBcYd'.#3rgjMASuBsDJj$'DIm^'ASuBsDJj$'ASu'sDIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm]s!(kDYS+qpB=nOrLMu[;a4TdYl)^tJE!Xo'rrTt,N#QOiiDIm^'ASuBsDJj%, +D?=B$!.Y~> +D#b_U7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SlQN:e"8X7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SloN:f'VX:e"8N:f'VX:e"8X7SloN:f'VX85W&XD.$%785McP8PFlsm0C6sU<:Wp +9U58;!gQHqrQ5.IF7no(HWJ;3D.*&(!JXDJaoPgio^)gI9YnQ!:]3rf?Fp*X!G,m8m02HBN06ld +p?`()9TmQ@ATRM2!DIq_f!-n1Z!*o.q!6"iY!NB-!9EBRXqoSto9VMFP%YdYgHN5Wo:e"8X7SloN +r_PXF:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X ++TR#~> +D#b;.0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC +2)R*G2)-sG0f:gC2)R*G2)-sC2)R*G2)-sG0f:gC2)R*G2,6e>>#\-i2)R*G4A08DP6ZJ.X4Z(L +95O6a!c1NSrR_-Y?1jBb@92%5EE)Up!G,+*fE#AcoTKGp9?k_>;#O#f@)i/t!GGR,P6Ht>Pab=& +p6,]49:OSdBO17o!DA%@fEM +D#c/*ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASuBsDJj$'DIm]sDJj$'DIm^'ASuBsDJj$';@!7.0cg<#;Jp&`2ult:m0BEe.6TgR +!,_Aq!c7osrB1/e3q_kD7g2%=&0CN3!EB0u4TPgLo^)g!!&uqW!WN!-Ils!0d&6!(6]J!A+KS!!*lqq`P!"!.Fh5%TNK;,lg2JDIm^'ASuBs +rbac.DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^' +/HC;~> +@/qH?:f'VX7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8N:f'VX:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX7SloN:f'VX:e"8X7SloP9Ne_$m0UC-9LquL:eXQ]iU$m/9RY(+ +\kJgim/`JGr5o%9L@sp;=`)=(ASq,-!IIlFaoPOio^)[E9`E0;_4$(3Ret5.:PSN/"i*g#N(i4( +m09mjWQN@iF7no%f1_/$apOSZ!$t<4;.+6D;>s6?;+sPX:e"8X7SlQN7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SloN:f&G<6hF=X`:h=RAG&n%Jc3^sYtnc6f7lt1_>VLXYtT6;m1>OVFNTaH1e(;< +7SloN:f'X\:bY@8:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'XY +:]a*0!.Y~> +>6#Bm2)R*G0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sC2)R*G2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G0f:gC2)R*G2)-sG1&a$392g-8P6lV89/SR]2+1)ZiKFM,97kgK +`_1=DP6#Jmr7D$HAbD5j;fUIBBNk(m!F]%,fE##]oTK;l9E*QHc(p8UV#/dF:hB9_"b01@PY7&1 +P6Q;*Ze3o +@/qljDJj$'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm]sDJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'ASuBsDJj$'DIm^'ASuB`!#Ct$m0TR(!)d]GDCPXAiU$m)!#Id] +2?80tm/_&(r&k&]__((`Vl$o.GB!Cm=k4TP^Vo^)Zr!<,+a3%,^b./Q..!EJdZ"f_PN,QQTm +m08pX/Nl6&3q_kAbQ&pd4UNSN!"&]+#Tb]9#lXfT#V%fODIm^'ASu'sASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASuBsDJh30EV,1i6hWYCJb=s%D>cU'1'&G`bZ+WO3;kuA1&sB6m1=+7'0RWA8S)dW +ASuBsDJj%bDD5X>DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%_ +D?=B$!.Y~> +?iV?H7SloN:f'VX7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:e"8X7SloN:f'VX:e!oO;:ka5$.i$O7SlQD7o-qZm06s8b0$t_ +Y4V)^L/7`i!DeIDm0;NCL!%P=HhHb,D.WXf!DeIBm/_r8oZ@6H9U58;"KkG'I8'>$#,+`%b0!b3 +p$E4(9Ua,H\qNpR;1#7^iV`'KiP;..:J=VW7f#q&7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN +:_s-';uiWcaoH>P;ujl8aoZEWfDb.>ThJe(rlP:R;:kg7#J3ZHb0#;92#U5V7SloN:f'VX7f?.; +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7fH3b+TR#~> +?iUp!0f:gC2)R*G0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG0f:gC2)R*G2)-g\:5Sn4$&MDP0f:[?7o4]oP6P!+f\!l1 +GP%("APi%mid!DmA"P6#5fo[j5b95O6a"F!MPJkPd##'!;Uf[s55 +oofi79;L4m`f!Yd:186rNr5(HNdl%S:eOPG1&i\@ED']Zrn%9c:5St6#CK0af[u)^,Q0J*0f:gC2)R*G1&Ws` +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG1&a$2'``a~> +?iVcrASuBsDJj$'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'ASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'ASuBsDJj$'DImAb#gE56$-WY\ASu'j('1Gom04UC4ZtP# +OS%o@<<<"\!24Zt.m8c +?N;6=:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:f'VX:e"8X7SloN:f'VX:e"8X7SlQN:e"8X7SloN:f'hZ]DCmrY"VFd:]j6c=i]Oh#'4+nb+_SA +o^)[+i9iUlLeiM^?^9M%]M7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7K=D! +;uh1:aoI\";ui0]ao]CTLA^EDZV4]Ab,J("rp:-Q=]WA]b%guF:e"8NrD3J`rD5LD:e"8X7SloN +:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SlPt!.Y~> +?N:fq2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)R*G2)-sG0f:gC2)R*G2)-sG0f:[C2)-sG0f:gC2)RcpI/9$.G=t's2$-NOK&Vsu?!u=;X%Rj4 +P6#)mrR_1r95O(^!2.*93lh'oTLbbFB;+.4>A]J2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC!$_#D +!/C4"!2B0r!2BGE!mOPQr0%A2946#sZV,-6P73IM +?N;ZhDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DJj$'DIm^'ASuBsDJj$'DIm^'ASu'sDIm^'ASuBsDJgp(V#'H[O8q9>D?EcB(:E/h#!*#Q4XgB, +o^)ZL"oURc2umghm09ru-p9NiD>!8s()-U/!0Jg[sk_gP7-V!'"P-ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'AH4.M +Mu[tn4TJpaMu[;b4T[SD +?2u-<:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e497q!AB"9L_iJ:e48ffAl6&HWJ;3RS:co +m/_97rQ52Q9VM1I#.%"&b*l#9p?_q59SNGf!l7R(o^)[+b%52Xm08hLb0%Oo +Q1aMKL/3t59QS8Bm3f\d9Mn>W7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VF!%d\?pb%4H/rp9cP9VVO/!_iYarD3_g:e"8X7SlSQ:bY@8:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X[:]V^>J,~> +?2t]p2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)S$GnfP"@ZP6Phrf\"GA +D"WtrAPejs93m/;P:(i`927?%0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*B!&O1Tp=KAc +pL4,Wr7D(j96'im#'ij\fP"$?rf[D"9<8'E!`B"QrA=g72)-sG0f:]a2)$aB2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,e2$"ElJ,~> +?2uQgDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDGgI7q!AA8!+g%ZDGgHUbiA'p7g2%=-ig[I +m/]6RrB13?!.FS.#+,BB4X^<+p?_q*!#tl"!]U1.o^)ZL"nXqZ,lk@Fm0$Di4U`_2m07D-4Ztb) +D>!9#<<4BL!'7OUm3eng!!lJ?ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj#l!(ug@p,rCH +pP])or&k*>!.Fb3#+,B$4U_VNrp9c(!%In1!Z(iJrGDjODIm^'ASu)XDD5X>DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%aD?2 +?2u-<:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e+CAq!AEk9M&&W7SlWLB%Q,2#('\!b*#HM +o^)ZrAc9aQYtV=om09L_]#o+liV)X?ZV7@sao].JU%I^QD.W@^!ej>,o^)d&?HQ;qp$DsK9Ynl_ +9VM.H"Dph+@)2'p-*p`J9L_iJ:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X/HA0/;uiokaoIY$ +;upmTr5o)G9W7gT"I2Yt9U5VE!nU:crQ59q%8]Mj7f?-`7f?.E7SlQN:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8N:a#gh~> +?2t]p2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2+LE%plc&/90>'h0f:g]=,H"%#%:olfUGNj +oTK;ZB`6Qb]h%mQ\!fK^3oTKD`@+\LgoofSr9?l,/ +96'Wg"BnGk<.F1s-$`E^6npPR2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG*WSt+@K +?2uQgDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDAEN4q!AEM!'"k6AStBG-d:Z=#"Jq^4XC*P +o^)Z6%/i]p$Ds#!'!," +!.FP-">KlV*ieMm-(#GJ.V3L/DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'5QGfpMuZfM4TK$g +Mue>or&k*:!/LF<"Dn,M!,_`&!mCo\rB1;n&oM8uAc6KHAc6L-ASu'sDIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm]sDCkj=~> +>lZ$;:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N85,`Om0hlM9Me2T7SlZMB&Vk=#('Cnb(WOJ +o^)ZeD#MKXWD'Ylm00F^Z*?uWp$Dg`9X4Q=!jPFto^)ZkAb=+GD-?Jt"CQ&^9U5;<#*hlub,J(@ +p$DiY9U4T#m3LYF9Mn>W:e"8N:e"8X7SloN:f'VX:e"8X7SloN:f'VX(B@;&;ui-TaoI:q;uhLG +ao]CQQ20eLHV@,brp9cP9W\38%La.M:e"8X7SlQN:e"8Nr_P:<:f'VX:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloNrD3Pb+TR#~> +>lYTo2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2+qr`P7*CG6o?\V0f;'d=,uC+#%:QbfS`C_ +oTK;TE;eDjZV,T;P6H&$]tI'MoofH$9>1;V!kh6KoTK;WB_9pXEDuIm"B9?b95O9b#&HrWfX"4r +oofJQ95KXPP66hV92>ID*AKE+2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G%ffo+@K;hhfDq98@K;Gb +fE0;jD#'7s@7s7Mrf[D"9=OlP%MB:02)-sG0f:[C2)-sCr\ZAa2)R*G2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCrA=X2'``a~> +>lZHfDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s;?2.>m0hYS.W/g8ASsI--embM#"Jh[4W=CU +o^)Z#&,eWm/HD13m0/7F1,8i0p$DgB!&FL9!\sb2o^)Z,%.l[`&/Om)"EQ$7fWP5rp9c(!&FL9%L4+oDIm^'ASu'sDIm]srbaE$DJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsrGD[J/HC;~> +>lZ$;:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8X7oA7=m0e87:e"8N:f'\V@+XQ."`7hnb(WO\ +m/gZkP5`T*U.iArm01*qI9'4sp$Dh$9RZl^!jPG%o^)ZeD=ksO??>`*"As9G9W7XO#*hlub*l#E +p$DdY^uXl+ZVaCe:f'VX:e"8N:e"8X7SloN:f'VX:e"8X7SloN%2\P6!,hGO"gNVmDMbq$apG%h +<_Rl-m<`6mrp9dG;/Q="!o[9nrQ7a6!$tH2:e"8X7SlQN:e"8N:e"8N:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:e"8X+TR#~> +>lYTo2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sG7o#*,JlYX'oofH/97m,p!kh6NoTK;TEV.la?sWAf"AX6U96Bij#&HrWfVD/l +oofDuJ)ldpGtq$32&e8-2)-sC2)-sG0f:gC2)R*G2)-sG0f:gC#nlc;!.sjq"hp"@JsXOTfEnm0 +<_HkbP@7FIrf[DD:0RX\!fg2mrRa`O!#ILI2)-sG0f:[C2)-sC2)-sC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG'``a~> +>lZHfDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm^'('r[gm0cDaDIm]sDJi>P*mEd6"YgEK4W=Cm +m/e=0-2p%/.0-CAm009c(Bk)gp$Dgg!#PSs!\sb;o^)Z#&G/*d#WhSE":,Yr!/L77#&O?"4X^<< +p$Dd8WoWOjQj<[iDJj$'DIm]sDIm^'ASuBsDJj$'DIm^'ASuBs&g["+!.FK&"\W]WI:u1K4UE\R +"TV'[m7/5Arp9dA#Vl>G!o"J!rB3b.!&AG'DIm^'ASu'sDIm]sDIm]sDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'/HC;~> +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N9RHI"%&$?c:e"8N:e!uL=i]^m"^,]bb&geX +m0LL>9Q\G"RS:cpm/p`i=hsXr#^]6V_90p"9Y9ra!EjO:aoP1joBcZVI@ +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC94@LW$unot2)-sC2)-s];hF1r"]KEnfQgEe +P6cY>96o1BUe?=4P64cW;h+D&#[pA>c.L[T976Aq!E4:9fE"WVo90;RJtu%hoofSr9A%mT99.Pd ++G*Qc2)-sC2)-sC2)-sC2)-sG0f:gC2)R*G2)-sB!&O+RlIZNiGtUn +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s!(Z_L%"/+RDIm]sDIl]G(:E>m"VqY44VJV& +m0K^>!#%LY-ig[Jm/nC0(96un#Y+k'3'BDV!2T8S!>Z@@4TPO_oBcY](FT9`p$Ds#!'NIa!8H&k ++LN6j;Is`WDIm]sDIm]sDIm^'ASuBsDJj$'DIm]l!(ua>l9,P8'*&;! +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8P9Wn'U%D,;)7SlQN7SlQF9OQK:m0;NCIEK]K +@.EUgL.m$[3"bogqb'd.9m2sqf +9L_iT7SlQN7SlQN7SlQN7SlQN7SlQN7SlQ.!'TgN!4hF<"*@4kiVi-HL/3LsHhm%1HV_KVb">A. +7SlQN:e"8N:f'VX7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SlPt!.Y~> +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sG96^&m%=Cf+0f:[C0f:[C92pc4P6R%?K%S^p +<:Q.VAP7X-RnJV1P5pI/P6YnsK%S_V97QSt!D\7>fE/`ZFS(b#N_>:g99/\/"_CN_fRclIP95W\ +9//:]0f:[C0f:[C0f:[C0f:[C0f:[C0f:[,!(66b!6=EX"*mONNr>.EAPe:X@JQ)g@8P5IfLf$A +0f:[C2)-sC2)R*G0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC +2)R*G2)-sG0f:[#!.Y~> +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]`!0Hm@%AWu%ASu'sASu'W!$9AKm0;;F(Hjnl +*qAV%<<*gu,ll0]m/YB"m0@J.(Hjo1!35\Y!=0M74T[A=L\0s;gAi03!8I26"]YRd4VnCQm2sOn +!+g%cASu'sASu'sASu'sASu'sASu'sASu'E!+bSX!(cE=!ttZ7g\pLB<<4$=8,;NR7fbUJ4\?Lj +ASu'sDIm]sDJj$'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASu'2!.Y~> +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8Q9\8t)%G+9I:e"8N:e"8N85*mbm0:U)P01pY +D=HorHVC]'9]=st#('%Tb*l#Eo^)ZQL%WRiP"`pgm0)$7P&4@om0.i;b0":-dd8*k9M@oP7SlQN +7SlQN7SlQN7SlQN7SlQN7SlPt!)E#_!28c%!i\kJqs=Q6?HR[iQ2BqMiDF^pb" +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sN98W>*%>d_G2)-sC2)-sC2+q-;P6QV3S(QA, +>4@^Z@8":u99.tp#%:0EfVD/loTK;KMtP^(RnJA*P6?_8RrMC!P6GAqf[sk=dZY`%911Kl0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[#!*er%!3bbA!jbO2qi_1l@+^'(D#9CtN_XltfLcqg0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G +2)-s'!.Y~> +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]F!6k-'%Enf%DIm]sDIm]s;?/H9m09ru,s=C" +1%=Q67fY:i!8HK"#"JYO4X^<q,lk@Fm0(W5,nLjam0,u`4Zs3$dd8*U!%MPtASu's +ASu'sASu'sASu'sASu'sASu'2!/'d"!*SYO!\FCPqs=PW#X&t(D>W]%gB\Jj4\>nsASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$' +DIm];!.Y~> +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8T:\3r_?q4$_:e"8N:e"8Q9U4o1#,k5#b0!b3 +nEgD"9Tk*'iSj/.^eC3>P"aL#m/l6?L%WRhI8'8""M7@%?>]?%"_M>gb"mB3m2UjS85McP7SlQN +7SlQN7SlQN7SlQN7SlQN7L^(#;uhdAaoZubiVW!HL/5Y.D+po+m/jmnRf1B%\c +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sV;"Kk[<(Af#2)-sC2)-sN95NmW#' +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]8!V>[f*YrX)DIm]sDIm]F!,_#g#)<164Zrs= +nEgCe!$rQagYqN(WW4G1,ll0^m/l#B)tc>p(BF'o"Jc#H#Vku="Xa^A4TS(#m2T++;Jp&`ASu's +ASu'sASu'sASu'sASu'sAJ,jKMu[PX4TZE"g\^@B<<5'B&-.L`m/j'`./c;%2?5=HASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASs("J,~> +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8O@.WaqPtXSB7SlQN7SlQD7oA72m/_Q0rlP7; +L@FR5f1_-O9]5:BiCnsJN(hjrm/km5N:kNW)^eBI)_.? +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sY<:c:`CeHB<0f:[C0f:[?7o#*1P6#)grn%6J +AakldM+a(b9Al!;_PY6l+P6-S6PkEZ0BNOeh"E@)S:hB9_"]0g'`_1-qP9#KT7l<"Y0f:[C +0f:[C0f:[C0f:[C0f:[C/c]CUn6uBXm+;>H>5FEfInP^Pc"KatrK@:o:sJsk98`cp2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-s$!.Y~> +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]$*qSb/D#ds]ASu'sASu'j('r[\m/]]Xr]L8_ + +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8OD=d-)^e@6r6?L7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN+TR#~> +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sY>4[pfInMm]0f:[C0f:[C2+qcOP6Od%f\"GA +D"*VkED*W`:>h;_MbB*'P6-S6S+YD7@@0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C'``a~> +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]$1%XcBWW5"rASu'sASu's;?1S"m03h-4Ztb) +D=HoqI/ki4#iP(SgAi0U)Z\Xcm/kK3-1sD%"\81O"?H]L!,_Dr#0[&m4Y6Z$d-Vij!)d]GDIm]s +DIm]sDIm]sDIm]sDIm]s8H:,$FRb:iII00!3!DhJm0l#U.6TQm#ds'egB\>f4\Hap?uBOnASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu's/HC;~> +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e!oE@.N[o?r9Bi7SlQN7SlQN7r@V[#Ja#rb0%:h +U%%FP?s_!(9]5:AThMH.KhV.+!ln!'ou[;2L@jj:iDF^>9U5;<#,k4sb*#H=d-Vn5;+FGP:e"8N +:e"8N:e"8N:e"8N:e"8N+TT*r`+edA!+bQ@"GKlM9QU$s%+el\L!$Z$=kE%f9W@s49.^TB:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"7t!.Y~> +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-gU<:Z4^<),/*0f:[C0f:[C7p>8C#CfC9f\"2: +EU].p<++@19Al!;ED*XjMbE]+!eO(@p"0:AAb;/iN_XlP95O9b#' +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDImAp*qJ\-*XH=pASu'sASu's(,>1C#H@bM4Zt\' +IIQV,*XFnF!9!5JI/ki^)Z]Nt!jr"VofW +>6#g97SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQJ;=a)`ThJ$S7Rg3D:e"8N9Ng`L#DQ$cb0%Or +L@OX8ZV6>#KhUIam0-X!b0"g'o^)_#9VV4&!DeIBm00XdU<6/pp$Ds1:Wgh69]==b)3mld:e"8N +:e"8N:e"8N:e"8N:e"8N:^nKFaoT%`o2G^#nB(oV:MlA^ZhWnpiH%\@b+_R;D+oBUb"TVO(JmRt +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7Nhb^~> +>6#Bm0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[R:@aSXED&DO0ekO?2)-sC6rWH9#A$`Of\"GF +AatrgGtXCSMbB)hP6Flmf[tIEoTK?.9<7a^)/Mr'2)-sC +2)-sC2)-sC2)-sC2)-sC2$kE)fE'$5o3q]?nCRni:g.[OH2*R1Na5;0fW.YE>"aJFfM'Ni&iDC$ +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0bj\=~> +>6$6dASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'/#kI?lI/l6EAS#ajDIm]s.MhC<#?:d_4Ztb* + +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8T9]>U1%H1G[7SlQN7SlQN7RpVJm/^(#rQ5.7 +Q1=5G?rk+dP"`pfm/bhFo'HXH9Ua,HFBS8'!l.L(ou[;9L@jj:Alcaj +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sV99/V-%?=@W0f:[C0f:[C0h51/P6"EtrR_-D +D"3\n<*%8rRnJA)P6$Mcnrj8o9;L4mGuO@!!e3kDp"0:GAb;/i='!Su +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]8!8I,4%GMX6ASu'sASu'sAJQ'Jm/[J'rB1/] +D=Qut*X+Md,lk@Em/bFuo'HWu!%9un',L6-!ic5LofW +"99T77Ss(R!)WYa!)WYa!)WYa!)WYa!)WYa!)WYa!)WYa!)WYa1f-Y<7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQG9Y9l_%'E8t7SlQN7SlQF9SVs%!jbRhrlP;Y +9U529#F.uOb0$t_Q1XGGiE9%:o^)_#;.]aL!G,m8m/j4[XS'^:ARP2u#.%!^b0"O.p?`*M9WZCZ +N(hjnm02IaTn[VkqFh#hAp^K.nEh'69L_iJ:e"8N:e"8N:e"8N:e"8N:c&0!r5o#=oMbg$n]Co] +9]>m9"(4erU&43YHVBn'b"]]8!'!GE7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7Sjm$J,~> +"99/k0fAqb!&aa1!&aa1!&aa1!&aa1!&aa1!&aa1!&aa1!&aa11c7!F0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[J976;o%!P?40f:[C0f:[C94dLS!dRG7rn%:s +95O0_#Ad&/f\!l1D"NnnN`/]5oTK?.:2'XZ!GGR,P6,i!\+SASBN4Yg#'ik+f[t.Bp6,_t9=NR+ +PY6l'P6HtrEFiESqF^rd=(-3-n<4\p9//:Y2)-sC2)-sC2)-sC2)-sC2'W*Sr7D"XoO7f@n^mnp +99/n5"&qodEVkq$@8!EkfM0UV!%fo_0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f9RDJ,~> +"9:#bAT%KY!,hdI!,hdI!,hdI!,hdI!,hdI!,hdI!,hdI!,hdI1i?lBASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'=!2T2Q%$1H=ASu'sASu'W!*/FR!gis9r]L^X(-V&s9nEh&R!+g%ZDIm]sDIm]sDIm]sDIm]sDFjgSr&k$YoS`d$nN?pi +!8ID<"!.FBIJ`C57fXt44\[mK!*WrOASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASranJ,~> +-NG;Z:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N;#Woa;#Woa;#Woa;#Woa;#Woa +;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Wof:e"8L9U5/8!ddU4r^I&f7RfmDa6i6qF&0XNaoP:m +oBcUk9Pj[M!FB1,m0)Bb9MD/Qm/um/_9(oZ@5h9ZQnp#hN3[_90oS9\9(,!nU4Z +rlP;29ZQhn"6$D;@/`h':L7md4XL)!s%ED_r_*?0Y4CrsY"VAU:e"8N:e"8N:e"8N:e"8N:du`2 +Z2;ZDWV'3jAF[eCAS1i,"lW./APBo;m/u +-NFl92)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2?#<12?#<12?#<12?#<12?#<1 +2?#<12?#<12?#<12?#<12?#<12?#<12?#<62)-s@95O-^!b"_ar\4R60el0pK'ea'>u8fEfE"f[ +o906'95sj^!FSn"P6?nL91s9tP66hD:r`Le!ENY$P6"rco[j5'97lo%#`2J\c.L[,98WG-!f9`e +rn%:J97li#"-.S:<;oMo:ge9p5puXos$QiWr_!8qGOgq7G=seJ2)-sC2)-sC2)-sC2)-sC2),mI +^&-F^[e4)0Eq.c_BNP(p"cc66BM3jQP66hE +-NG`0DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDZ42IDZ42IDZ42IDZ42IDZ42I +DZ42IDZ42IDZ42IDZ42IDZ42IDZ42IDZ42NDIm]n!,_8n!_35Mrac7NARuVX[I*>_3WV5=4TPR` +oBcUT!"]#k!=0b>m0)/u!!%H?m/u)Y!B0p?!"ks"r$im=*m/u)a"ZZ?A:,iXd!,c@cASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASs("J,~> +]?% +"348>_>VLXRS9"@m0;0S9T3O[fD"Y7f3h:HrQ5.AF7no%W(_p;ao].MF85,)f4IgXrlP;I9RHU& +"6!ifZ2VlIWD'Jim0UguAkYloAVHSXrQ5U?!)Q-]7SlQD85)lS@)2F%(ZA%]7SlQN7SlQN7SlQN +7SlQN7SlPe(&>uPWV09kC%9=H9SWE2"\a$L +OuP6QkF99a*bM>*29M,[-KrR_-O?1jB_FA%PafE0&h?20TcM-!N[rn%:c94@X[ +"--GZ^&HXcZV,N;P6lhW=%c1_BT&\"rR_TM!&ZJg0f:[?2+124<.FP((QM-V0f:[C0f:[C0f:[C +0f:[C0f:Zo(\u\`[e=/1GOa;d94ds`"\X-\<`=kQP6,r$X8COFc"K`M%l#pr2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2),gG +J,~> +1(1B'EASu'sASu'sASu's +ASu'sASu&t#5LC^;tc.MGk!ot!*/m_"TT2o"W#>[m/i@L.Jl8(3",ce+D#G%DIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIkC" +J,~> +>lZ$;:e"8N:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D7SlQD:e"8N7SlQD:e"8N7SlQD +:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N:e"8N8PHJ[m0AnP9MA;W=hF%f!esCRr5o(h9]>^4 +"1qE2])0VOCeUf'm0KC_:R]G-:LMfMm/s:a:R_4(!e!bFq!A49L.l0po?%/h9QSh`m0)CH=\PRf +aoZubU&43Za(A#6rQ52X:OE!+#fi359MAcHU;?ZJ%o!$n:e"8N:e!oN7S-HNQ1XGZD,Ec!7SlQN +7SlQN7SlQN7SlQN7K>sRaoJ^@;uhL?ao]CQQ29kPL.nSJ:M/Sam/km5P5EBtAP@%C,u@'-7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7Sjm$J,~> +>lYTo2)-sC2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?0f:[?2)-sC0f:[?2)-sC0f:[? +2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC2)-sC4A0thP6Yo#91r#Q;gdqq!bG$#$e00f:[C +0f:[C0f:[C0f:[C0`X`=fDrY[@K;GZfE0;jD#0>"AP9A=:fi\UP6-S6S,:i6BM2V2(H!p)0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f9RDJ,~> +>lZHfDIm]sDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajASu'jDIm]sASu'jDIm]sASu'j +DIm]sASu'jDIm]sASu'jDIm]sASu'jDIm]sDIm]s2uo?8m0@J/!!!9)(8UNW(<<+U+!@QY#m/kK3-2Ti$$iim"12^Z@ASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASranJ,~> +"99T77Ss(R<_u7T:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:e!oN7Rg3D7SlQN7Rg3D7SlQN7Rg3D +7SlQN7Rg3D7SlQN7Rg3D7SlQN7Rg3D7SlQD:e!oN7T!RPnEgD2W.oYmiU#q5f26D^ao\;2U%n!X +iJ($4Z22TP_.?;e_!UOJ^m/%rA[26W%AHWqL9A=p];UHe9O>"$aq),fL2BUXFM[Li +$\_8MF-W#FHVmICXS^-J_.?;]W4T4+D,3rrqoT=h9Yg&_f:cSG9P'0fou[h?!)Q-]7SlQN7Rg3D +7Rp.,p$EN[9LqWL7SlQN7SlQN7SlQN7SlQ2!-@nW!P)b:;ui0Rao]CQQ29kWf3).cP"]8qmHqr8 +9X4N<:i&h!M?#J07SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN+TR#~> +"99/k0fAqb<])Td2)-gC0f:[?2)-gC0f:[?2)-gC0f:[?2)-gC0ekO?0f:[C0ekO?0f:[C0ekO? +0f:[C0ekO?0f:[C0ekO?0f:[C0ekO?0f:[?2)-gC0ht].n<4$4FCem#NpMr2M,&'ffE/*HEVP_# +Nb(jk^&$@jc"KaYJ!6(VIr&%VBYFDt%BE<#ATrWJHurpu945I1fFQ5792oJ=EHHDEAQh`"H-Pm3 +$]@YS?#4=g@89I'\,4ecc"KaUFF8:P>#8%kqq)=&97N.hM/cKf95'R'p"0gR!&ZJg0f:[C0ekO? +0h4lJoog/-9/SF]0f:[C0f:[C0f:[C0f:[1!.4Im!QT6V@K<.nfE0;jD#0>)M,RHpRnH_.PEUT( +9>18U:iK'I<<+7$0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C'``a~> +"9:#bAT%KYNW/bSC@?,lf!^mHq;B +!&FI8:_*PSM?$4cASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu's/HC;~> +!<=;A7Ku[Y7SlQD;#Nic:e!oNrC-lc7Rg5Q7QjR;7SlQD:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D +:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D7SlQD:e=?8ea3Em9X4H:!bG6Eqs=RGQ!$e&_>).R_1h_Z +!G._saoSbhqb.&eAX`D:"2Tq-:]*lg:L8ISm`GU9I9->@!`jE3pW[!/:?n;/Apkm774H7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7Nhb^~> +!<o632)-gCr@nC30ekQa0g.BK0f:[?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO? +2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?0f:[?2*=NCeWU&G9>12S!bb>Yqi_2DCfS3InMm]0f:[C0f:[C0f:[C0f:[C(BCQ1fE'EeqI0HF +n^mk=@JQ)jIo'OmUfRCd!/pd-;/f0EP;N=p0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0bj\=~> +!<=_MAHm$`ASu'jDZ+,KDImBsrFH(KAS#cXANapBASu'jDImBsAS#ajDImBsAS#ajDImBsAS#aj +DImBsAS#ajDImBsAS#ajDImBsAS#ajASu'jDE%Vrea3EW;3#h\o +!=UCR4TR;OqZ$Zu$n1m6"#qP7!W2p"!=0JsmQCV,(BsdDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s/HC;~> +"99T77SrkL!)WYa),Ndl:e"8N7SlQD:e"8N7SlQD:e!oN7Rg5Q7KZIV7Ss%Q"&MHV;#Nic:e!oN +rC-lc7Rg5Q7Lrc19aoSblr_ro/WUn79]#r0D9ZQtr$+iu6_82RgI>kH/b#3=TQ0mrT +&k5\e:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"7t!.Y~> +"99/k0fA_\!&aa1))X-'2)-sC0f:[?2)-sC0f:[?2)-gC0ekQa0`s9f0fAna"#Vef2>o632)-gC +r@nC30ekQa0b6,r0f:[?2)-gC0ekOR96]!O!eO'jq:H+h<`!U[JpD0991rZno[jAfRt?6MUrN/] +#0jKT\#[3en^mua]tMG1f%:)6X1cOHfEK97<`XLTn(7b/!&ZJgr\4a;0f:[?2)-gU98WD,"HH,; +0fAqb!&aa1!&aa1!&aa1!=oh7fE&^@raGnK[e&,T`n8pq97lu'$%,QMc-<&9Js +"9:#bAT%9S!,hdI)/a"sDIm]sASu'jDIm]sASu'jDImBsAS#cXAHQg]AT%HX")_[]DZ+,KDImBs +rFH(KAS#cXAIiZiASu'jDImBsAS#a/!0Gh"!jr"Aq)o-A"T`J9[?tec!!!9RoK!4DXi$)@S*3&i<&(F1d64]2pnD=-^9 +)J*etDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]2!.Y~> +!<=;A7Ku[Y7SlQD;#Woa:ut.H;#3W];#3W];#3W];#3W];#Woj:e!oN7Rg3D7Ss(R!_6&,f^/`J +:V->D!P3+F9EJOKWI`4`ap0L-7SlQN7Ss(R#>dlZ:e!uLHhQh@=[u:X:e"8N:e"8N:e"8N:e!nS +3:Y,m`3HT=ap=G39M]c!:LMfMm/jmnD"l'ZI8#C_mFM=]7Rg5R7K?9a7K?9a7QjR;:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:duT.J,~> +!<T$-2>T$-2>T$-2>T$-2?#<:2)-gC0ekO?0fAqb!_6(=fTQA9 +:r`:_!QK*V9*/LQZ[pd#fEX,;0f:[C0fAqb#;n4j2)-s]@J5m!;b&]"2)-sC2)-sC2)-sC2)-fc +4Rq&*d_ +!<=_MAHm$`ASu'jDZ42IDWPF0DYdoEDYdoEDYdoEDYdoEDZ42RDImBsAS#ajAT%KY!YtgEf^/_] +!B0^9!B(Jd!!3EB/V-(V4U2E/ASu'sAT%KY#B"*aDIl]G8+u?M((tLrDIm]sDIm]sDIm]sDImAZ +&Fhmb6VC)D4UP^AS#cYAH6WIAH6WIANapBDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIkC"J,~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss%Q"&MHV;#Nic:e!oNrC-lc7Rg5Q +7KZIV7Ss%Q!)W8V"%Z9lf@oTnL.n'/aoo;ER]3lLb4*Od*YLq3:e"8N:e"8N:e!oN7RpVTm1aD- +7SlQN7Rg3D7SlQN7Rg3D2umaQapPCIAtaQK9QWs2W;5f^Pt[qJao[8jLApQOVZ8PC:e"8N:e"8N +:e"8N;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa +;#Woc:_s+^~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAna"#Vef2>o632)-gCr@nC30ekQa +0`s9f0fAna!&a@&"#WhPM;"-pAP8ilfEB3iUpJ'lf^RN++:KtZ2)-sC2)-sC2)-gC0h519P8%1j +0f:[C0ekO?0f:[C0ekO?/HBkNfF#;b=)hYD96j0/FSV+%CeLi)fE-t(Ac@l)D#be82)-sC2)-sC +2)-sC2?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<1 +2?#<32%fn>~> +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%HX")_[]DZ+,KDImBsrFH(KAS#cX +AHQg]AT%HX!,hC>"&]C?bhDFc<<+H?4TmYk-nR?.4n(TI#o[AdDIm]sDIm]sDImBsAJQ'Tm1_8j +ASu'sAS#ajASu'sAS#aj=o]](4UNqE-[eJj!##>JL\^<=D#c$\4TZQ& +!<=;A7Ku[Y7SlQD;#Woa;!(4I;#3W];#3W];#3W];#3W];#Niq:e!oN7Rg3D7SlQD:e!uL@,]o. +!hi;0J]cil&e#RQ7Rg3D7SlQD:e"8N7SlcUp?`WB;+=#O7SlQD:e!oN7SlQD:b;Z6PJlM(%#%C, +mHrM5:RYT`@+Y;C!oZq'qT8ku9QU1":0R]d7Rg3D:e!oN7Rg3D:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:duT.J,~> +!<T$-2>T$-2>T$-2>T$-2>o6A2)-gC0ekO?0f:[?2)-s]<0#at +!c^kYJ_8i3&eY^40ekO?0f:[?2)-sC0f;?op6-8#:,+I\0f:[?2)-gC0f:[?2')`fRF:-J%#[c8 +PEUi&:o%Jl +!<=_MAHm$`ASu'jDZ42IDWYL1DYdoEDYdoEDYdoEDYdoEDZ+,YDImBsAS#ajASu'jDIl]G*o#K; +!dt%^JN_jQ&dKOsAS#ajASu'jDIm]sASrt'p?`Vc#\@RbASu'jDImBsASu'jDEn28A4,B?$l]2j +mHr+=!@S3R*mFNK!o!_lqE4m*!':)G:2Ku=AS#ajDImBsAS#ajDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIkC"J,~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss(R"&MHV;#Nic:e!oNrC-lc7Rg5Q +7KZIV7Ss%Q!)W/S"%Z*niSNr'ZV4q]b218B_#PYV7KZIV7Ss(R"AhQW7pu&X",9K=;#Woq:e!oN +7Rg3D:e!nj!)QX*WTM>*_9-S%rTsg09Q\F?9QU't!G5p?ao\#*D>`cr3"8>R7Rg3D:e!oN7Rg3D +7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD +:_s+^~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAqb"#Vef2>o632)-gCr@nC30ekQa +0`s9f0fAna!&a7#"#W_NNo#s$GtVh%f\Y6^blALV0`s9f0fAqb">qng7o]2G"(b+[2?#5XRZ,7-(^0ekO?2)-gC0ekO? +0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[? +2%fn>~> +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%KY")_[]DZ+,KDImBsrFH(KAS#cX +AHQg]AT%HX!,h:;"&]+?gYV4DZ42YDImBs +AS#ajDImB)!/?G`;s$4F3'@cnrTsfs!#%LA!'9uD!@J +!<=;A7Ku[Y7SlQD;#Woa;!(4I;#<]^;#3W];#3W];#3W];#Nil:e!oN7Rg3D7SlQD;#Nic8PE:= +i9^WL9ME$Kb218EX8jPC7Ss%Q#uF)\:e!oN7SJ1&m0&/;7Rg5R7KZIV7Ss%Q"&MGr'`Cu3M8\]% +"gMB-:JYj*m08;=_9.I*Q2BqLAo.Cf"/8J$iVi.>i;aZ`7SlQD:e"8N7SlQD:e!oN7Rg3D:e!oN +7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7ReO$J,~> +!<]*.2>T$-2>T$-2>T$-2>o6<2)-gC0ekO?0f:[?2>o634A/V0 +i0+7e92!9Uf\Y6a[f@4%0fAna#rOFl2)-gC0hYsKP6>Gi0ekQb0`s9f0fAna"#Ve>(&_SBQdY0O +"he;::f(?nP6PSkc.IqID#9Cs=)e)i"05'rNr>/;NW9\H0f:[?2)-sC0f:[?2)-gC0ekO?2)-gC +0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ejCCJ,~> +!<=_MAHm$`ASu'jDZ42IDWYL1DYmuFDYdoEDYdoEDYdoEDZ+,TDImBsAS#ajASu'jDZ+,K2uj`< +i9^W.!!"p.4l/=*1&s(IAT%HX$#X`!W]$-P-,<""=3tg\pM8gAiL1ASu'jDIm]sASu'jDImBsAS#ajDImBs +AS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS!FnJ,~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss(R"&MHV;#Wod:e!oNrC-lc7Rg5Q +7KZIV7Ss%Q!)W2T#>dlZ:e48W]Ai2\ThIEG_:m$:_6K_tN.#eirac14?=$\2?N"F8D>nYOIIqX\ +I0PCaP+&,H]"uMjMuY^57K?9[7fQ-^]CtUmL.qS9!)WM]!)WYa!^6T8r)<]7`9YPL?;Zu/9Ps^p +#I@+'b0"No]D_*uf1^nsaoe_@@+Y>D!l+dfr^HlarC01O7Rg3D7SlQD:e!oN7SlQD:e!oN7SlQD +:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:duT.J,~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAqb"#Vef2?#<42)-gCr@nC30ekQa +0`s9f0fAna!&a:$#;n4j2)S$%I,^=mED&Coc.^eTc+U0IP_+1+rb)C7?sm%6@/Xa=EW17XK(O?f +Jd.-tS#!*o`kg:/PQ2s,0`X*+0`ja9I.ia)AP<"W!&aU-!&aa1!\aU1r*f\Ydd,Nh?qtND93V7W +#C/tKf[t.9I/T61M+`d*fE8TZ +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%KY")_[]DZ42LDImBsrFH(KAS#cX +AHQg]AT%HX!,h=<#B"*aDGgH?UuLbEI/jfY38-M#3&2p/,Sq+-rX8l4#RCV4#lP/3&H3@;(\AC? +(Btg(,q(2t2ShNX,QLF7AH6WCAHF=]V"X0V<<3#0!,hXE!,hdI!aYk!r/:Z)6gHo8#Qnp)!&=E= +#FGKC4Zs;UV#BZ^bQ&U\4TdG?*mFQL!ic5crac(IrFJB7AS#ajASu'jDImBsASu'jDImBsASu'j +DImBsASu'jDImBsASu'jDImBsASu'jDImBsASu'jDImBsASu'jDIkC"J,~> +!<=;A7Ku[Y7SlQD;#Woa;!(4I;#<]^;#<]^;#3W];#3W];#Nil:e!oN7Rg3D7SlQD;#3Wa85W'G +iTBM3iHn6g,lk%)ap#V\N.#8!8sHVs]1"&MHV;#Nid:e!,=4o81ZA@_*M#/NuumHq^0r9Xcr +9W?1W_,a^trp9c69X4T>"0km(fDFqMC]HFa:e!oN7SlQD:e!oN7Rg3D7Ss%Q"&MHV;#Nic:e!oN +rC-lc7Rg5Q7KZIV7Ss%Q"&MHV;#Nim:e!oN7Rg3D:e!oN(BAs~> +!<]*.2>]*.2>T$-2>T$-2>o6<2)-gC0ekO?0f:[?2>T$12,6e\ +NolN0NaYRN(BCr&fEKO+P_*RLqb%Jq;cd.+@:4n'[@8?_T"#Vef2>o642)--P6i11>W"2.`1M>NJO;#i1&2)-gC0f:[?2)-gC0ekO?0fAna"#Vef2>o632)-gC +r@nC30ekQa0`s9f0fAna"#Vef2>o6=2)-gC0ekO?2)-gC&cdF~> +!<=_MAHm$`ASu'jDZ42IDWYL1DYmuFDYmuFDYdoEDYdoEDZ+,TDImBsAS#ajASu'jDYdoI;@!8> +gZIl-gID5Z1&s)f4U!es,SpjmqZ%05(+1gk7n5U17lj.$-SZtrrY>J>pAjh$!!r%M8_racCRAS#ajAStBG1%jo77gT$(")_[]DZ+,LDIl'5AG_;dJOo/k"ulU"mHpp]r9XcW +!%g>s3!C)Prp9bW!&FO:"#:#cbkpcBM#^^jDImBsASu'jDImBsAS#ajAT%HX")_[]DZ+,KDImBs +rFH(KAS#cXAHQg]AT%HX")_[]DZ+,UDImBsAS#ajDImBs,QN>~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss(R"&MHV;#Wod:e!oNr^Hud7Rg5Q +7KZIV7Ss%Q!)W2T"&MHV;#Nic7ndO8kj8V]=\MLY/-).#aooP[N,;Vp9F"F,H^1bGa5PG5s5=78 +a2"jOL3m<*r_*GqCk\Upc,p&W!;o:d;#3W`85*1N7K?9`7KO_5:ARojAAmoY!j#(u +q!A,p:Vm%Q#GOn(fAVHXIK%@k_,aFRqX";S!:3/T;#3W];#3W];#3W];#3W];#Wol:e!oN7SlQD +:e!oNrC-od7ReO$J,~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAqb"#Vef2?#<42)-gCr\4L40ekQa +0`s9f0fAna!&a:$"#Vef2>o637nZp8k`Z6s;bKM5+onG#fEBI*P]9b'9*\3n@;L.8Jr\6Bs,IAA +Jq%uaARSP5r_!ApE/Ud:c.E%e!;nPO2>T$02+pl)oofJ`7klms0`X*00`i'i>P_e0EmjC.!k1gH +plbb\:sK!l#HLL!M2l.?K)XC)buRSkqNCq;!:2E?2>T$-2>T$-2>T$-2>T$-2?#<<2)-gC0f:[? +2)-gCr@nF40ejCCJ,~> +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%KY")_[]DZ42LDImBsrac1LAS#cX +AHQg]AT%HX!,h=<")_[]DZ+,K('#_ikj8VB('#gq63&Fq4Tm_r,S1.Y!!`cW7r=?`[G0*rs4[h' +[Ao=: +!<=:b7K?9^7K?9]7K?9`7LW*_7SlQD:e!oN7Rg5N7K?9a7Kc:V9RGCXm0UgM9Mn>M7Pk*sl,j+> +P'p[99E\L>Q*])Vm0)%ITmKrA9ES=;N3(FL!u2G<;#Ecg:e!oN7S-9Na7Sa"=\&H\"&MHV;#Ecc +:e!n`')5E+DXPXKYtV=sm/tCG9To=r!Kp7X9E926aofIk9Y:,f'+GRD7SlQD:e!oN7Rg3D7SlQD +;#Ecb:e!oNrC-lc7Rg5Q7KZIV7Ss%Q"&MHV;#Ni`;"I-V;#Ec`+TR#~> +!<&I9*A1!CjClOP6?_fEFDfF9*84?Pdf&m!uDA#2>f072)-gC0g&*(K(P6-;b-gA"#Vef2>f03 +2)-fl%/=93K'q7m]hf022)-gCr@nC30ekQa0`s9f0fAna"#Vef2>o602=iO&2>f00'``a~> +!<=^nAH6WFAH6WEAH6WHAINHfASu'jDImBsAS#cUAH6WIAHXsm!(Y9"m0U0T!!lJ6AOukLkrf,, +,o6jd!!F&uD4&P]m0(Y#I7G(P!!p"#p\hV"sBk&fP=mDImBsAS#ajASu'jDImBs +r+,tJAS#cXAHQg]AT%HX")_[]DZ+,KDImBsrFGtHo47o>r+,m\!.Y~> +!< +!<"_LNr@n@-!-@P["211L%Mu9[$(lXHu*(`91r)pMmL[[fE/M^ +(]H,h2>T$06q^L2oTKE<911Klq_8(.r%S7*!%@SN!2Ar7!ldlQqi_,B:eR&LfE8gFJuek&!c^kT +q3(l,!#P&X!&aR,!&aU-!&aU-!&aU-!&a^0#rOFl2)-gC0ekQ`0`X*10``!hJ,~> +!<=C7AHXI_!(WjTm027"0`V25rFH%:!$LYl"#;/9"o\K(0iaUb[-\7UUhr-u!!!$.)_F&$4T[A= +1B(hbDYdoH.KCNto^)e9!%MPtqdfbFr+,q;!''_3!+G=Z!]C%,qs=L?!<=DA4TdGY(Ff;G!Y>?e +q<\7'!&EtR!,hUD!,hXE!,hXE!,hXE!,haH$#X +!<=:37K?!Y9ESFPZe,$?#hQ\RF%f8)8P&_J!<>jaapPD4D,s>(;0/GHiN)>Ja/F_qr_*E*IA4=- +aolbc1e(=@7K?9a7fH'^L>hak!lmu+r^Hud7Rg5R7K?9a7KPCH4n_hT`:(hL9SWE2!gQH-o?%,_ +9U5D?'8ccH7SlQD:e!oN7Rg3D7SlQD;#Nic:e!oNr'gcb7Rg5Q7KZIV7Ss%Q"&MHV;#Ni`;"R3W +;#Ecb:duT.J,~> +!<t[gc4>m!j!/4T7&;2)-gCr\4C1r\4I!!(6Hh!7L>g!D@##P6,PnK(IUr +JkKqTP7ppr,;D&10f:[?2)-gC0ekO?0fAna"#Vef2>f022)-gCr@nC30ekQa0`s9f0fAna!&aC' +!&a[/"#VeJ!.Y~> +!<=^?AHu*_!!!d7R*>Bn#gB)]3WK-c3)]Wb!<.`trW!$/(F_8s +4Tlr/8S)f=AH6WIAHXI_!*.eFm/jZq3 +!<=:17KPtL8,Z*]=oD_.=oD"q;+sRV7KErEou[TBN,;Th9Mp/1a.hr'f<^3Dr_*GqD2"^hi5u'[ +!<#@h:e!oFr_*?0_"$doPtX_FqF1H]r^I#e7Nhb,p/D$KnB(gD9VM:L!ddV"ou[>p9RHO$!B:)I +7K?9]7K?9\7K?9]7K?9]7K?9`7L;m\7SlQD:e!oNrC-c`r'g]1!.Y~> +!<j:..5>0`_S.p"0S[P]9_s928o8JteG2M0WZ6r_!ApEJpm2i7J&m +!<"VX2)-gC6q^0VJ+8^)CeHWCqCqt-r\4O50bj[mp0n#gnCRf^96'ck!b"`dp"0>194@RY!@%U4 +0`X*-0`X*,0`X*-0`X*-0`X*00aT]l0f:[?2)-gCr@n:0r%S3e!.Y~> +!<=^=AHH7!(B"45(B#9S(B"47#V%h/AH +!<k/:kK47F!#J+$ +7Rfp?7ncTt]C5+fD,L:%"&MHV;#Ni`;#Wra%J<[#AFR_C\kJgmm/h,uReOr,U.fF_q!Ac:$k5Zq +:e!oN7Rg3D7SlQD:e!oNr^Hud7Rg5Q7KZIV7Ss"P"&MHV;#Nic:e!oNrC-c`oL8gWrC-c`r^Ho3 +!.Y~> +!<&[)&cha[$+HCD:eOG[@<$mfP6?nnCgC!=9*J.*Js#,&O"#Vef2>o602?#?1$2%a-Eq%]_`_1=HP6+o\V"`LDX%QWVplcCt&d^9I +2)-gC0ekO?0f:[?2)-gCr\4L40ekQa0`s9f0fAk`"#Vef2>o632)-gCr@n:0oJ$>'r@n:0r\4Eg +!.Y~> +!<=C0AHGah.f:(^.fVI.;Y=T%,QRX'#r3eD)rI3!!NB3(F1Rjk<084!$l,n +AS"b!('"=qV!m[O0aRbi")_[]DZ+,HDZ45I'(q1`Jabf(2?81#m/f!B./,k,.0)*Wq!AbV#81TZ +DImBsAS#ajASu'jDImBsrac1LAS#cXAHQg]AT%EW")_[]DZ+,KDImBsrFGtHoOS#?rFGtHrac*^ +!.Y~> +!<=9o7f,XV/HD7S#:J=GbH_JKBm02+WTn[/Tr_*MlATWWpXLdiB$Yo`!7RTg<9MATSfC&#- +a%T2&7K?9`7KZIT!$1]2!6"BL"BJ[.a4L4U"6!W`WVO[=Ytncdq!A0)9E67(7K?9^7K?9]7K?9\ +7K?9]7K?9`7L;m\7SlQD:e!oNrC-c`rC-lc7Nhb^~> +!<WZh`5U]hh[gplbec9)o^p0`X*.0`X*-0`X*, +0`X*-0`X*00aT]l0f:[?2)-gCr@n:0r@nC30bj\=~> +!<=^&Ac$$?5QE524U +!<=9o7f,X_2umL3b.<:&9QR/QL[>8sZ_<+c;>j/r:L7jZKp%n(XLc!ZrQ5Ma\u[Y59LhcM;23-W +m/i#98Fo:P1]T*!;ujK%ap,G2FG7Q1 +!<E3M,%*kqq)"q<_eMHP8.M!9)p.j2)-gC0ekO? +0f:[?2)-gCr@nC30ekQb0`s9f0fAna"#Vef2>f022)-gCr@n:0oJ$>'r@n:0r@n +!<=^&Ac$$H=o]U,4Z45[!'5nCL[>8hR!hs^#lO`2!=02L)^Qma1,_$MrB1NJ2DP[J.M`!a#Z\:u +m/g8f;Y+H$8H;BTMuZEA4U*e`',rn_"o\K%Wr)/cbQnA1q`P$@"UN?Im/TZU!"hP/DImBsAS#aj +ASu'jDImBsrFH(KAS#cYAHQg]AT%HX")_[]DZ"&JDImBsrFGtHoOS#?rFGtHrFH!]!.Y~> +!<:J>iMJaNI(#M7#!Tn[Vr;=I6]:M,m(l0SQ2;+L1H![Rh:oMbh/p +!<T$-2>Js,2>o692)-gC0ekO?0fAna!&a^0 +">qng'``a~> +!<=BrAbosC&d^N:!<>0gJaNI(#L'T;I8r +!<=9o7f#US,m-q:F2rk!o^)kAf>,#$TqVIN#)8D.Tru#Zjm<,C9M"_D!>5k6;uhLCap5LR=i]pA +9O@_@!i\t-qX"?X9VVL.!e!b9q!A9Z9Q\E/%7IQm!?hGn~> +!<M19nsEH1to#%_UeEHceejc]ac9/Z8p!=T;,@K;G^fE]Dm;hC3\ +947bO!jb^)qNCu#9<8$D!eO'bplbo%96o/E#qiS>!>PTb~> +!<=^&AbosA1("$^3jjP+o^)k;bc7J#I=;*3#$#MWI?:8Kjm<+t!)iB!!?)UCMu[_g4U3kG(:EP* +!!rQe!\FF#qX"?4!%Ik0!Z(ibq!A96!#%L)&n&(X!A+;%~> +!<=9o7f,XX8PDfpa+iCnt)ao[`" +LA:-?ZV4rQ_#P:X7KFY4J,~> +!<8+A;8!%)a[@K;hhfE/*HI/]<2G>!knfE.O8Ac%YmN_><0fE.O8 +Ab_GnGtVi'blAB_0``!hJ,~> +!<=^&Ac$$A2uiq5[=R_bm/l#J(@br;!% +!<dZ8Pr/u]7K@fm/i#98Ff4Z2un$Bb.4L@P_k6\S#Q#%!g67/rTsZ59W\69!d%,7r9XaJ +9SLX3WD@.$m0C[-?GXdU!%kNH!?hGn~> +!<rK@:k9=OoQ!dRF\r0%AG +98hHTZVX`uP6Z\9@*R?'!$8I$!>PTb~> +!<=BrAc60C3!]L=Uk.pOm/g8f;Y"B.=o]a04\/LV@;'=b>Z:5W![RijrTsYV!&FO:!YYQhr9XaD +!#n'a/HI6om0C$"#WOt$!'ml%!A+;%~> +!<=9o7fPp\85W&gZ[qM]m/k=*8+B%M,ljP#ao\;2]D_*uf25lQaoZ-Ja8PB1]1eC1\lMtcq<\I> +=]W,Vb%gu:ZUOs=!.Y~> +!<28+A;8(BCGufE/*HI/T61M,%IWfE,_ZK)Ll +!<=^&AcH +!< +!<PTb~> +!<=BrAHYmH!#C?@mD8/k*WTU1( +/cIm6&cf4K!A+;%~> +!<=9q7Kl1R9Mq)6JaL;@!esB?n4!EY39nWjWKNFUD,Jp_m/hW.WW($JWD$0SQ!$eTb'csWq!A-0 +9Ubq&!=TUH7KFY4J,~> +!<5gH0``!hJ,~> +!<=^(AHcHk!!mGrJaL;@!`]4[n7;V#&F)C_/L;]$&.$MXm/fcX/cIm@/H?&nD&*+#4Vn*Hq!A,Q +!%@e/!='OKAH=@_J,~> +!<m33:QeLciVi-Tf3(dCKu(p:AP>d(U<8ouHhct0 +ThL1=ao\XE-*fu@+TR#~> +!<.QM,R&DMp9nfBM2!+X4X4@@JH#f +ED)5gfE/M^(U>ar'``a~> +!<=BuAHXsu!(Y7amD/)jO8pd"AHH$8*pYrh&H2Y4!@7aog\pLNbSC0Z)`Tu9$ig85.6T'Z8,2HQ +I/k5b4T[A=19tHl/HC;~> +!<=9t7Kc7P9OPJ`mD&#j^e[Hgn4!I2!1N8s$B.Z5f>g`pP"]KHrTsa.TlWn=rlY8Ps2kGT:LN/W +m/k'sAc0[PHN5n.7KFY4J,~> +!< +!<=^+AHYmH!$7qemD&#jWWs#gHB!?U"k +m/j9f%/`6i,lgNBAH=@_J,~> +!< +!< +!<=C#AHXsm#]8=ImD&#j[0R%9mpuPG!''[8""b#o/c.[3"Yp#D#)<0t-ik^Mqs=H%!%%M*rs/V4 +q<\:.('Q\q4TZE"@'X>E/HC;~> +!<=:!7KZ.SB#h(A!o`P*PjJRg;+sOK7KErMp_NX +I8$U7m/h?&WVag=,n7+K!?hGn~> +!<PTb~> +!<=^-AHN\J-ag,E!o*+sPjJRQ#QRcjAHYq@./c:11&ub$m0,NN1*lojqX";!&H"Zm +(BB6cm/f +!<rm.m/s[j;+U+E!^6Thp +!< +!<=C&AHYm:!,^Jtm00nZD)s$Mr;cd%%2L!4-TX:Y +!<=:$7KZ4U;7j=)"4sl6D>d-0S +!<5_(qbtqi4PDN%Bc.L[<98WS1"a!CqbuS$FP6"`urn%=m<`>%SP6->/E;J2gRfFM70``!hJ,~> +!<=^0AHOml#c+rs"3d-41&V(R"V2:F)[d;q',M2k%h&^L"TeQ%"p"]>3c18=XmH4-!#AK"AHG*s +,kjG22uuP:mE>hA3'BDN!6kB."c!'s3!D&6m/\RCr]L?A"W#kgm/jZq&,JEj,lg38AH=@_J,~> +!<1f4I]H7-mAI+TT*r\tZe5 +ao\#*Zi9=sY"X8db(WOJqs=Q.9WWY9iV`'D;0;f[!c1QNq<\:C?rjl8aoYfJ33bpR+TR#~> +!<?0'k:s'`c8+`iI,V +fE.jAH2a!4G>!P?fS`C_qi_1h9=KLGNr5(A:3lik!cUeaq3(o@<*%$8fE,O_/[7#2'``a~> +!<=C(AHOml-d90h$eq%K*WQ0@#T"dB3:/j52DQj1)\<;S!!4NbWj;!pbU3B+@-hG//H@[l2CUQ] +4T[#3R/ZIXO8p([4W=CUqs=PJ!&>>jg\gF>#S[2#!Y5:=q<\:=*X+Iu4TZT'>-VW>/HC;~> +!< +!<.G@8!rZMbB*-P6He< +!<=C)AHOml-el<$!k!G2rW!$/)_F&.4UF(s)[HED(0.0b\*X97#QQjLAI&nT4XgC3!#mor4TZ0# +g\pLD7fY,()Z\Xim01]>"W%0_rTsj6!#n'a,QM]Vm/g8f.JZ+.$kcsQAH=@_J,~> +!<=:'7KZ1T@,\lf$/rLN=\MLqIA4R2ap5M@Cem`-L;:Fg"Kl-+7nDo7%n$Clb#Vo^F%fWGb0%:h +LA^ECiE93tN(hk"m/tC+9Mt`T#,+_ib-=`Zq!A-p9Q^'P!< +!<t\5DK#'!;BfY(*bplbc,96p +!<=^3AHPg1*o"Hs$/;7U('"=?(F_>s4U3kk%flYG +!<!.pq=Y3kVg;-(NUN(h:h +m0L +!<<>;N`0!'q:GbJ!#Mjo!>PTb~> +!<=C*AHEVQ[DD59gR(J:!!*KR1=A;j3$f(8!#BFq_!M8d-NFE3k[b8r!%02qOR;G2#R*1N,QP7L +m0KKf'/BPBR!m3Vm1.?g[I*?O +!< +!<,eO"Vh$NJkM.'P6QM0ES-1B +Nr"qEAP8h`:eOG_pQPSL"`_Q7PY6#kP6,;gX8( +!<=C+AHGa0D8Y`HgQ4o*!!*`]36XMj3$\n4!&8oV`pEuSD&**W3+1o\"YB^0(BE4hm09Qj&3Us4 +g\U:B<<+Em!<<*Ip[.q["V +!<=:(7KQ(WiPt6jiN@N$9M]c)_8aV%Z%Z4P:OB^sm0D7:D+mVn8OVZ0";2HlD.*;/"dMcUN(h:g +m0MZY +!<"_LY4>,_M":Q+!EE)k""`-i4PY6W) +P6d1J +!<=^4AHEVQgW&UdgQ4o*!!*`^36")c1)gAs!Crs/m0Cj`0`V1h3+1iZ"<%J-&0Cc:"`45g,QP7K +m0MGf"ZA=l,QM]Wm/l#B)u_u%1''-)m/j9f'DFWk&cc=DAH=@_J,~> +!<Gap+S^:J=oVa3s>\f<0j99MA;W8E3/C6i\fT:NQI$#2rEj\kHu" +qX"@)9Pj^N!c1QNqX"@99ToCt!c1Q^q!A,jQ6N7KF;*J,~> +!<c0J0`_meJ,~> +!<=C,AHGa0?os4U*>K!< +!<Bap5bGAP>m@Y2S=+rSdds"LFeVF&Dp1"%Q$U7,^T=1]Sh)AsN8\ +#aJ)bN(dB>^t8MO#aJ)Hb0%:r=lK8F#I@*ub0$/HQ2'_JThLXDao\gJ-*Kc=+TR#~> +!<u(Al"%Pa:0&\Mg,60)i=)@bt +#]*/CPY4qkIu4)e#]*/'f\"2E;i^a=#C/tCf[uumD"s1qED)eqfE/_d(U#Oo'``a~> +!<=C,AHFgkWlj]5Uf@[#!>?on4U3qm$ig;hOPA^\rS.@["IOU;3XG]b!u<@a@,YZ#8H9)5-Z/bJ +#]0Ps,QJTsWm(D.#]0Pf4Zt\,(>J`R#FGK?4Zt1nD> +!<>f>kM+Q%j?l-2:167fl7D7,:<6,ljk< +m02*8IEJ9jr_*b`d~> +!<&8J@mZRs;M1U,!Ch6mR-hp@77fke90&85`(BA=I +P6He9K%R,3r_!6&r0%Cf:qbN6X&)u[r0%=r9?l,6<`JjX!f9Zcp=KG)!$e[%!>5B_~> +!<=C,AHF=]gWf*j[;?ZZ!"^P<[64dN(Bjd=0l<<%md1>8bdF7.D,iVE$MXW$('6H^@,5Aq1'!a; +m01]6(Hj2QrVupur9Xb;!AZf$.020Xr9X\g!'!,$"WmI+!mCoYp,rI)!(jA*!@.Yq~> +!< +!<e+BUd8MfE/+*@/W_1;d*U@;bm3_"]/S]!%(,44T@:j +0`_[hp6,M\1&O!`B"PY;$%m!.Y~> +!<=C,AcEOlm0Cj`-NF,T,ri(k!\"okr;[EF0h4`N0Ts&.H[ +!?)UEm/\pFr]LBB-kHBYrTs[1!"Aii![Ib9rTsjE((<>h(BCK1m/fcX1A3j4(B@dFAH=@_J,~> +!<D1.+sR\I('b.7uj7*nC(!(chN!hi +!<t[guMoMaK#KF*7JpD$1 +!<=C,AH&/Q92-n-o24Z3NX@*iHc!)iOX!dt&, +rB13A!@Rg4!dt%fr]LZ/!(Yf2m;2hO4Z3:1q!A-j!#P;k!=BIBAH=%VJ,~> +!<b`d~> +!<t_6Cf[u*T +=*\4IES/o_98WG-!`rFBp=KGk!#;Xk!>5B_~> +!<=C,AH +!< +!<`VLM,$]?Ph=Wa +:eOH5c.JLYD"s1qGtXCpfE.NB*j.3u'``a~> +!<=C,AH=7\fBigeI3&@g&1BMo4TdD=+CNQ-!\sbUrp9f9!!*,u!!!]/4TZ#tbl-o?bQn1L,X":= +!<<*93'APfD> +!< +!<]hho,P6"T_qq)4qWM6iLf[ss>/Zpf/&cdF~> +!<=C,AHFgk[G(!PUdkCb#UD<^4TYrj>0ga]+;3H.m0G'F6Tm"H)]L7%4T[A=3rJ@T[?**C.6TgP +-oO4O1''-(m/[t+q`P6V>[^Pu4Zshd>-;E;,QN>~> +!<Y--es\!''rE!FTa6ao[8jY5@SfiDF^naoYmHfD+_7W(`ZY +aoT%jr) +!<389FA&G. +fE'$Er*fbrdPV$,0`_meJ,~> +!<=C,AHGa0D;FR`b\\*q!>d>?4TZ`+1 +!<q,@E0$l?$8!>b`d~> +!<5B_~> +!<=C+AHEVQgYhH'O>-_8$mdlb4T[28'$b%i=o`^Dm/\pFnN?t6#Su1lm/\pMq`P!"!/L@:!o"Ir +rB1-Zq2>B"#9^-[!@.Yq~> +!<b`d~> +!<5B_~> +!<=C+AHG0uD<(!fbZ+oK"W&qF4U!u9$347;cXd/C!1EfQ".0'!2Y'!4/HA< +!<Q?(p7KOA+iV`'OPtXkfKqbQO]!8?A_>D@VI8%!Fm/^@, +r5o(P;:kU1!o[9grlP8[AGB+*/-%N/7KF;*J,~> +!< +!<=C*AHEVI[H?i\bZ+ZD&.(%A4oRSG)uqb=AHF+Wg\gFED#aPH)_!?o2Z>H33;Yi?(BBj#m/[t6 +r&k)i#gE)2!o"Irr]L9LJbY0*8cVGbAH=%VJ,~> +!< +!<"b2fDps+@KI_R0!-i/&cdF~> +!<=C*AHPg1*o#rH#c]oc!%Ll70am/kL3(AIk2#T#8q4TdYL#gE87!?MgN +4TZo0IJ<+1O8p^.4TK?nMuka7@'*u@,QN>~> +!<b0$eZ +F8bJ,AnCta!l7oLp?_lg +!< +!<=C)AHFgkE'!,XF,QN>~> +!<b`d~> +!<5B_~> +!<=C(AHF=] +!rs-,7#j_>5>4a_]CkOnf;O$nr_*AT7R[,C"$\=:9nURi9`QK_7KXG,9ZQMe&]\9QR``ch9U459 +9T7-:YtTNb`d~> +!rrrg/rhXh018H7I.`[0M0*0$91qZ90eW>X""thu;M3U';?.NV0`r$g97lMo&V5B_~> +!rsTX@#ee$?n).(V"O*]b_J[o!!"K8ARPCH"(4Fq(P=jP(B?56AHO1X!4D1\&[`Y[-p9^(!,]rI +!$j]j1&si +2ujaa7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R+d[ +s$R&_9MATSY/gOn"Mh@/HWg;@"A)!N7R[#@!Z(iqKusIZ4Y3YHZf4Ig[b/%Zg9EnP6 +b0"QsfD"Y6a%V3daoJ./ +2ujRG0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770e^F! +s"4L<91r3"GCogN"Fk]5@8m.u"[kI*0ek5B_~> +2uk48ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARNDe +s'Q$j!!!dOOL>)3"KIi+7i)(("Y)K>AS#9EAHEtS,_\A_+oib.AHNPM!0HO6#0\Fq1-IT*rW!-+ +3'BD9!R1<*!jr"Ir]L6ap5B&4!+)a +Er["G6q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R6 +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5PmnO +5"S9>9E\3_8Ou&97KYgS%(_5:"cNEj5=S&c7KbmT*DD4Qm/km:?N/(QWJm"Ob0$\WQ1jSHL.o2X +aoI\$)\#3:7KF;*J,~> +ErZh-/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70DdI* +0K_l#9*A![4>eh`0`s*0'#o^Z"dAun0/5*(0a'01,"lM4P6-S9@/edaZ]ps!f\!N'D"a%oAP:&B +fDqZ@@K_"b+pfm'0`_meJ,~> +Er[Is?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W@/FL: +?8r_q!!EQC3)X)RAHQ6=#<%?#"XF'\?tE`jAHZ<>1&t>>m/kK;#lZsm/L2W#4Zt@sD>*>u<<+rV +4TJpcN!,rn-k]phAH=%VJ,~> +IK10R7Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"0 +7RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^1 +7R'@17RTF2r(6oZ(I(AW7RT^17R'@,7R'@,7R'@,7Rf3715O'VTaUo\7RYHi"=sO99j-`J!j54[ +q8rbM;:kR0!oZgprQ5+kq,@K?Z)[j@X%!++!.Y~> +!<"G$fE,_]M>*28N_=ZrfDps-@K_S0_Z1=M0`_meJ,~> +IK1X)ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnW +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARJhBr&F^S(LUf^ARK(WARK(WARK(WARK(WAS"F5%#@%M0a@\^ARN_n"@<*!(Dc9&!g!C. +q)ncf#gE&1!o!\grB1-tq2>HWbfBc0X(;;W!.Y~> +IK10R5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,6q0R66q0R66q0R66q0R66q0C1 +7Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7Rfd8 +6q0X07Rfd6+%AIa5=Rk,7R'@35"7q06q0R66q0R66q0R65=QdrA;\M4Ym^Ul7*7t&+TP#/9Yfo[ +!FSt)ao\P9Q1jSHThMHaaoH\^-J,h/hX@<4,!.Y~> +3<0[H0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7/hnt5/hnt5/hnt5/hnt5/ho$! +0`is^0)RI(/dO0b0eY770ek?[0bQ)n/hnt5/hnt5/hnt50/41ACPpaI]b1;s0$5mP'`_E=97Q2i +!E<+rfE/BPD"a%oED*Y:fDp[%@KjZjP5lXVX>'_g!.Y~> +IK1X)?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ +?tEnWAS#7W+(\hk?tE_WARK(\?tE_W?tE_W?tE_W?tE_W?tCni*f<)`1'[e_@*3$a/HBfa!35;N +!?MF@4T[28D>*>uI/kkt4TKU"N!7;HNW;=PXCVDX!.Y~> +FoW=J7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@+7Qs:*7Qs:*7Qs:*7Qs:*7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@17RT^67RT^67RT^67RT^67R'@3 +-pC*g7RT^07RT^67RT^67RT^67RT^07RfR27Qs:25"8"07RTHR!/ulZ$G%8Y1djet7R'@,cUJ'N% +9-5!Hg0o!W(`r_aoZBViV)X>AmYDX!-n?>#$eF<=TCELX@<4,!.Y~> +,QJH30eY770eY770eY770eY770eY770eY770eY770eY770e_rL4>/EB0eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY760eP150eP150eP150eP150e`J[!\Q2[r\4g60eP150eP15 +0eP15oJ$P&0eP*f!0iGp$H=1g,;(](0eY77cS5S3$"@46@HisWFA&\3fE-"eNqSY;=((sY!/C>Z +#&D<$B)jM9X>'_g!.Y~> +FoWe!ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(\ +-t$UoARK(WARK(WARK(WARK(WARK(WAS#7\ARK(\?tEnWARJma!$mLd$8r1j8RQ+;ARK(WcXd7u +&r_)98*TCBLB&e#4TZ-"g\1"8-OBW5!-J'r#*[9TAcQ"BXCVDX!.Y~> +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rh+5"7_*5"7_*5"7_*5"7_*5=Rk, +5=Rh+5"7b+4s3d:Oc!3/Kh(BAs~> +?N:]n0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70CCOt0/5+70DmO)0Cgh)0/5+70/5+7 +0/5-X0`s!6'!.,G7)gSS*\K0"0eP150eP160eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY0[,%>"L:kItr!fg*/r7D([95O +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?m'#gARK(WARK(WARK(WARK(WARK(WARK(WARK(Q&dL.O4[_18!'jq'?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_R!&BLl.KQsBm/l#C +(]6Dt1&u1bm/jZq,lBe*D>K1oPK_6.!30T2,QN>~> +!rs-,7XmWl5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=QYX7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Pk)d\rb''_(>X57RfR27Qs:2 +5"7q06q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0!5/6#SH9Ps%] +!HV<>aoZZ\fCnS5Pt\deaoI:o<<'!"%2,[1!>b`d~> +!rrrg0n1i20/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/4J#0eY770eY770eY770eY770eY770eY770d?Z@`fSgTbqT27pG"TZ0eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP1*!&J(n?;"JdP6"rir7D'r +:l4n0!c1NLr7D"9q-sBA!=9170`_meJ,~> +!rsTXAUe*!?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tC?dARK(WARK(WARK(WARK(WARK(WARK(WAOuk.2NU'j3"5jCAS#7\ARK(\ +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tDn08rS^S!& +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,59`Q]7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@35:cd\_32r,_(l!:7Rfd86q0R6 +6q0R65"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs9f!(6`b!`2RU +lKnY<9Y15G!l7QWp$Dc_Ac'UMPke99RZ@Fp7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R,Zt!>b`d~> +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70-W,(0eY770eY770eY770eY770eY770eY770eY790-UBDc'$]hbr#J;0ek:8/hnt5 +/ho!+0`i-k:B"](=%dApP6,Pn`r=TlbtDL +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?m9/iARK(WARK(WARK(WARK(WARK(WARK(WARK(\?pXi#30HEj3",dBAS#7\?tE_W +?tE_W?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK()!-/!s!_WN1 +lKnXi!&jg>!]U0Mp$Dbq%/W0f@JPj>[\a$[ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARO;)!@.Yq~> +!rs-,7XmWl5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Q\Y7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'?g!'$1b6,>;V,sFd_7Qs:* +7Qs:*7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7RT^67RT^67M5_! +!rrrg0n1i20/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/4M$0eY770eY770eY770eY770eY770eY770eY6t!'HIt#0f"*(GRWtpb=KV +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY760eP150eP0h!;p:-6r7^cP6-#& +Zi8SYPY6W%P6->/Pl')5[eXB;H$9650eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP160eY770eY770eY770eY770eY770eY770eY770eY770eY6o!.Y~> +!rsTXAUe*!?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tCBeARK(WARK(WARK(WARK(WARK(WARK(WARK()!"b>W5r]8Q114[$ARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WAJtRHMukI0 +D +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,59iW^7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7RfQb!'QUi9YiIa+[8F\7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Qs:*7Qs:*7Qpf/S#UX2 +<)?:_L>hOe!ln!'rlP7J@.imgPt\ddaoK!I<*M0Z5=S%15"8"*7RfR27Qs:25"8"*7RfR27Qs:2 +5"8"*7RfR27Qs:25"8"*7RfR27Qs:07RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^8 +(BAs~> +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70-)c#0eY770eY770eY770eY770eY770eY770eY77r\4Hh!'un&2U+)Z'e_9p0eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77pb<12!'.!FSn"P6,Pn`r"Bga7s*H3<1]e0$uC#/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt50bOJ:~> +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?mB5jARK(WARK(WARK(WARK(WARK(WARK(WARK(WAS#7$!"tP[9K3F\/RW-tARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WAR5?t^;?q0 +N.r,K~> +IfL9Q7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7O12f5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk*(B?Ubb!W`l!$sj!5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rjo!,;G; +!-\?@"ADToW8[44#M2Y.b0$t_U%RdRF'e[b!+bn)rs`+#5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=S%16q0R66q0R66q0R66q0R66q0@07Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"* +7RT]^!.Y~> +IfL*60eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770dJD,0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+4&cb4afL*Y5!#I:C0/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+)!-eF` +!/gbb"@Q'bFH5gR#Dl* +IfLa%ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WAL(Yp?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_R,QJID4[V+:!&@qn?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_;!-nLe +!3?*X"=aEfLYM:b#L!/n4ZtP#IJ)t.3XGOE!.js)rt8IG?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_WARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnW +ARK'p!.Y~> +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5:&c`7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@358O;_RE@q/,lf5\5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5:$;q +rilL)>lI\5;FaDmH`49EL3muRD0qu8qs=X?9T7-:KhU+km/^")q8r\gqG^]p!$OQr5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5"7_*5"7_*5"7_*5"7_*5"7_*5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5"6=gJ,~> +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70-r>+0eY770eY770eY770eY770eY770eY770eY770eY790+n7NRFjpI-NFr;0/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70,FVg +rl>,XC].]P7nZoqFEqk;@9lr<@<%>)P6Zq;Ph=WH98W>*!Dn(;fDps.@NSeS'e_9p0eY770eY77 +0eY770eY770eY770eY770e_lJ+tkZ(0eY770eY770eY770eY770eY770eY770eY770eY77r\4Ed +!.Y~> +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?mTAlARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(\?mG^bR6o!DfKSPqC +IfL9Q5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7OLDi5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=?:f4i*Z27'Rd5/O)]o +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +&e4cD!-\9>!`i2sr_*Sn +IfL*60eP150eP150eP150eP150eP150eP150eP150eP150eP150eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770deV/0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.mk;6-YqP7(j]C*\T6& +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +$jljQ!/g\`!`r]7r_!MnF99e)]?s!#b!eO(7q:G\UqI3\s!$X-N0eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770ej:@J,~> +!<=D#@!lNnARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARJmJ,QJH:S397q#lm4uAS#7\?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tC5hr6,/Ar/:\\H$TAh#QY)7%h&I=(\!h$ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(\,QN>~> +IfL9S5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5:Auc7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Qs3`!&D-Wb!i!4!%gE) +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=>r1r366UqG[QJZ)P#*ao\P9LA^ECa%VZ=\kJC^m/itTZ1uHAAG]>2,QKen5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rj\!.Y~> +!< +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?moSoARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARJmt!":cW4[h(1!'jq' +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?sjU#r6,/>qMYMn1+b9Y4T[28 +-3+iM5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_#ImuUi5=Rh)5=Rh)5=Rh)5=Rh) +5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@t*+T_WbZ(T6/Oph=I +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,4oe.OYlJ_=;uiWeao].JLA^ECZV7@@P"`phm/_9/pW +>Q>Bh0.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn20ek:60ek:60ek:60ek:60ek:6 +0ek:60ek:60ek:60ek:60ek:60ek:60ek:60ek:60el?S0/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nt4'`]AiT\)`'&ca.0 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY78!*B*>!.+KN!3c1M!ldlEr0%>19=*9?97li#!F8b#fDq98@U'WS/ho"60/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70+n88~> +!<=D#?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?qP! +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@_*5=@_*5=@_*5=@_*5=@_* +5=@\)5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%V)5"%V)5"%V)5"%V)5"%V)5"%V) +5"%V)5"%V)4t8rb7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7R'@,7R'@,7R'@,7Qs%+4tQaCSta@tHN4%& +7Qs405=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5<&XGr366,r)D@VFA0aQm0/bK]#o+lo^)ZTFSEoX\boE4:]M;$5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,(BAs~> +49-!K0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nn40.nn40.nn40.nn40.nn4 +0/!5Y!&"7*!&"7*!&"7*!&"7*!&"7*!&"7*!&"7*!&"7*8hMbO0eP+60eP+60eP+60eP+60eP+6 +0eP+60eP+60eP+60eP+60eP+60eP+60eP+60eP+60/5+70/5+70/5+70eY79*WQhPU=_th!!"5u +0eP160eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY77/HBG]a8g#R@Kg%HH]+]Eqq(sq97m)*"`-iOfQg6aP6"L*pXfJdr*ir;!"q">0eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY6o!.Y~> +-3,<&?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_Wra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra6FO?tE_W?tE_W?tE_W?smPR5QD$CU-2!m!!#T% +?smPRARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(W=o`14bQ*k)N!4rp+r_piq`Ouo!4Dal"`45t4VJ+nm/[5$pH8LIr/=p9!$l,`ARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK'p!.Y~> +IfL9Q5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rh$7Qs:*6n:Gj5"%S(5"%S(5"%S(5"%S(5"%S(5"%V)5"%V)5"%V)5"%k(6pEL.!.1Na86c-( +3(-/(5"%k)7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@!!,;D:!1Ngb"'A5o;>s5oCm)'7XE7-jqs=Q(?HUDsD>!8t^eC3jaoI"k<*_fj/O)]h +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Re0oJ,~> +H2nR10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10/5+40/5+40/5+40/5+40/5+4 +0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+4 +0/517r@n:)r\4C*r\4C*r\4C*r\4C*r\4C*r\5*>0/5160/5160/5160ek:6,6.^sUtA4J!!t50 +/ho(50eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770d?[BrQ"u9r*fb49287]9*]F*]uIO,94e!a"^5 +!<=D"?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?j1+L?tE_Wra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5h>?smRF?irt#!%"F(8/qUB>$t`L?smPRARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(@!-nId!4Mfa"(VB;#lXf/%j`th1(sXfqs=PA +#X( +GlSXM5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@_*5=@_*5=@_*5=@_*5=@_* +5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_* +5=@mq5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rjs%00,@W6.`K +4TH*Y6p=()7Qs4(6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p=". +5=Rk,5=Rk,5=Rgn!,;G;!NKE&q>t4 +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Mc&T~> +GlSI30/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nn40.nn40.nn40.nn40.nn4 +0.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn4 +0.nk50.nn10/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+3#lmlOW7X_e +5l_%I>r)I* +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770bOJ:~> +-3,<&?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_Wra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +q-X26ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5qA?s40C(IP,a#riOt)I?fZ +ARK)q?k-aUARK(WARK(WARJ(0GlGnf_NXnV#>5'@mG"F:(An.4~> +IfL9Q5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk,5=@_*5;#>g7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R'+,5=@_(4q[iAZ)YrB +Xp:"Mgt0W7Un5#*hleb-=X=p$DcfAb=+FM>gI[)ZW>l +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@3(BAs~> +IfL*60.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10/5+40/5+40/5+40/5+40/5+4 +0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+4 +0/5+70.nn40.nk10eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY170.nn10FRq/]rK]l +[jM.g0/"q40eP-*0bQ)n/hnt5/hnt5/hnpXB?7uVC\qQB=%eSOP6?AWEHI'6P6Phr^"C"kFS1gu +<+tpV!13[o>p98'0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70bOJ:~> +!<=D"?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?ijnIAc?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?'; +Ac?';Ac?'>ARJnWrEob7)?:+"W]^G>$32@N?iXd;?nc/"ARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK*B?jC7H!+sHr[$1BG!_WOJr9XWeLOFs%qX"K(!&?\m!/L77 +!?M[A4TK0pN*Rh3ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WAS!+eJ,~> +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@_*5=@_*5=@_*5=@_*5=@_* +5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_* +5=@_(5=Rk*5;,Jj6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF((6pDst%"bS' +9Tfea/O)Wm5=@_*5=@n(6ps7-6pF(-5=@n(6ps7-5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_( +5 +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nn40.nn40.nn40.nn40.nn4 +0.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn4 +0.nn10/5+40/#%5/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\h1/h\"@&rWjD +4IZr`*\T-#0.nn40.nk1/hSe0/h\h00.nk1/hSe00.nn10.nn10.nn10.nn10.nn10.nn10.nn1 +0/)uQs"=BQ,55OJ?:8o*P6Zq>E7igL96p5p!eO(0o[mU#EaiJX%kfXj0eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY-l!.Y~> +-3,<&?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_Wra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +r*TM9ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;qHsC\!!amQ4U*2;!'jq" +Ac?';A^=`kARK(WARK(WARK*K?i^6UpP]0!.YmQ]#L!Ga4Zt@sR.fnK[/_KE4^g^/N/R`Z?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?sk5[J,~> +IfL9Q5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk,5=@_*5;>Pj7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R'@,7R'@!%0/o0 +YKBUN!!"i?6pF((7R':*7R':*7R'@,6pF.*7R':*7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R':/5=@n(6ps7-6pF'U!)E8f!`2\5o'H[/9WZCZU.iArm/iPHZ1H+GWDl4b,sOU`5"%V) +5"%V)5"%V)5"%V)5"%V)5"%V)5"%V)5"%V)5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=RgQ!.Y~> +IfL*60.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10/5+40/5+40/5+40/5+40/5+4 +0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+4 +0/5+70.nn40/5(40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY770eY7+#lmK8 +YLlTc!!"5s/h\h10eY.40eY.40eY77/h\q40eY.40eY770eY770eY770eY770eY770eY770eY77 +0eY770eY.30.nk1/hSe0/h\gf!*f2,!`r3Mnrj;e9=NR+X%Rs9P6,Pn^%9la[UMu3(G@Er0eP+6 +0eP+60eP+60eP+60eP+60eP+60eP+60eP+60/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/50o!.Y~> +!<=D"?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?ijnIAc?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?'; +Ac?';Ac?';Ac?'FARK(WARK(@&c`\*Y<;t/!!#Ug?iXd;?iXd;?ijnIAc?'=ARK*K?m'#gARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK*@?ihGNKD1<+9*)Hkm0?,]1-IcL!35b[!c7omo0!=W +N,\hQ?smRF?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?o_e+ARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARHb`J,~> +IfL9L6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF((6o$tp5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_#4r426 +N3^T'\i9[&3(,u#5=Rk*5=Rk*5=Rk*5=@_*5=@_(5=Rk*5=@_(5=@_(5=@_(5=@_(5=@_(5=@_( +5=@_(5=@_(5=Rk*5=Rk,5=@_*5=RI0'LVXp"0km0fC\G3ThL1>ao\#*a7em$?s`BG?\p<61d4Am +6p=((6p=((6p=((6p=((6p=((6p=((6p=((6q0@)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4) +7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7R'9W!.Y~> +IfL*7/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/i#(40.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn20Fn." +Pd8q=`]O50/M8\20/5+40/5+40/5+40.nn40.nn10/5+40.nn10.nn10.nn10.nn10.nn10.nn1 +0.nn10.nn10/5+40/5+70.nn40/4[O'i+O5"2.`6M=cu5ED)5hfE.jAK(bB/<+,7K".(eD,Q9Ct +0)dR*0)dR*0)dR*0)dR*0)dR*0)dR*0)dRf/ho(60ek:60ek:60ek:60ek:60ek:60ek:60ek:6 +0ek:60ek:60ek:60ek:60ek:60ek:60eY-l!.Y~> +!<=Br@+AWf?6B4P,dKQ>2@oj,>$t`L?tK=F!+l.;!+l(9!+l(9!+k"p!+l.;!bGbNra5qA?tDn0 +(if>0"#:#qbk19(I/k5c4T[#3[J&tg*XM:!"_^L.8RQ-/?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?j:1M?tE_RAc?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?'? +ARJmk!.Y~> +!rs-%5CZ'b6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="& +6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF.*6pF.*6pE@p5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_(5=@_(7R'9l +!!#O#[E;F>'`]C@6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF.*7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R':*6pF((7R':*6pF.*6pF'U!"D^"ao\#*_"[3ta%VH] +b$IR<5=@_(7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':15=@_*5=@_*5=@_*5=@_*5=@_* +5=Rh+5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%k(5=RgQ!.Y~> +!rrre07PT//hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\q4/h\q4/h\n50.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn10.nn10eY.' +!!#O/[FeEW(B>1(/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\q40eY770eY770eY770eY77 +0eY770eY770eY.4/h\h10eY.4/h\q4/h\gi!!um+@KheEZVX_`p6,T&95)TLfE.jAJ+o-.JkM?t +fK)M&0.nn10eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.60.nn40.nn40.nn40.nn40.nn4 +0E!U*0)dR*0)dR*0)dR*0)dR*0)dR*0)dR1/ho(60ej:@J,~> +!<=C#?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd6?jC7N?pXhn(,iQ` +">C#[/RIIF)J*;f?tE_W?tE_W?tE_W?tE_W?tE_W?tE_WqHs;7r*TM9rEo^Q!"sq\N!4&]/HI6R +p?_sD!":jd4T[#3WqYl^[/_KA4TQ;urEoV:ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5h>?smRF +?iXd;?iXd;?iXd;?iXd;?j(%KARK*K?iXd;?iXd;?iXd;?iXd;?iXd;?jUCP?tE_RARHb`J,~> +!<6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="& +6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6pAj[+@JF^5=@_(5=@_(5=@_(5=@_( +5=@_(5=@_#7Q;1a%!/o#R6 +ao\P9]D([oL.o2Jb$H+u5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_(5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*7R'9W!.Y~> +!<,<"0.nn10.nn10.nn10.nn1 +0.nn10.nn20eF"<&pq+? +!<=Br@+/KeAQg>Z#9pW?"!.FB6N(:1ARK(WARK(WARK(WARK(WARK(WARK(WARK*1?j(%KARK*K +?ijnIAc?'BARK'^!!":!qht\O4Zt(k8,)BQLB%T>rB136!2TAV!`]4Yn3$dY')l8=Ac?';Ac?'; +Ac?';Ac?';Ac?';Ac?';Ac?';Ac,p9Ac?';Ac?';Ac?';Ac?';Abod7Ac?';Ac?';Ac?';Ac?'; +Ac?';Ac?'BARJnW?sk5[J,~> +!WX$)r]bQo5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5",B7!(?fN!(?fN!(?fN!(?fN!(?fN&O\fI5=@\"5=@\"5=@\"5=@^257'_A6pEme%0.]C +]?43[/H?5>6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF((6pF((6pF((6pF((6pF((6p:TCB)inK;ugY2ao[8jQ29kNiJ($;])9\PYtUkdm/l6B +D=G\T\c +!WWicr\&FI0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eWGY!&"7(!&"7(!&"7(!&"7(!&"7(&M>dk0.nt40.nt40.nt40.o!T0*s6c/h\k%#ll?K +]@^2u0`VM3/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/hd9!@fR_N@K:WNfE-t(D#0=uNb(js`r+Hj]h +!<=Br@*i9a64s8*.(_VF1(=3r>-qZ@?3!o +!<;:T +:PSZ3!gQQ\nB,*s!%^?&5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=@_*5=@_*5=@_* +5=@_*5=@_*5=@_(5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*58O +!<nCV*4!$X'K0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40.nn40.nn40.nn4 +0.nn40.nn40.nn10.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40+n88~> +!<=Br@*`3a?8;K\(,ETe"!n0P/_j_NARK(WARK(WARK(WARK(WARK(WARK(WAbod7Ac,p9Ac?'B +?3"Nf;ZJS-reph^r&k)m!0I-G"O%ne(HD7S!~> +!<f?Q_"2S;;U&OE]a&u*)prWV?D>EQ#iE9a\b$SBR3(,u#5=@_(5=@_( +5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_( +5=@_(5=@_(5=@_(5=@_(5=@_((BAs~> +!<=5=?`N`0W[fO&+g/M8\20.nn10.nn10 +.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10 +.nn10.nn10.nn10.nn10.nn1&cdF~> +!<=Br@*N'_=s*eF(,j#m">USi&kT<8$33-=f1Q*!L5_<`r&k-A#QT;Pm/sa3!%@V*!G4(^m/l#X% +.?=_)us/M?tH +!WX$)q`fQu5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5"%S&5"%S&5"%Rk6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&5 +!WWicq_*FO0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP1;/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt50/"q2 +/h\k&$ig9;]uAV0EtSHc0J>(31&`gc/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h10)@4%/i!;X%PBIh0.mk;RE*3=!"rS(qUc(nBM2<9>"_\mpt,\_ +@TS'UP6,PnX7+\J0aTKc0.nn40/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/4(>J,~> +!<=Br@*;p]8K%R/*&>Jr"<[pL,[RZ^#p]MJf@*Xu,_g"/4UARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK'p!.Y~> +!< +!<BFRRi`blACT0*!X(0*!X( +0*!X(0*!X(0*!X(0*!X(0*!X(00Lp@/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h1/h[h;J,~> +!<=Br@*)d[8K%R/*&>W!"=4?S&kT35$!I!=0W&pH8UhN#,"]m/j\@DXT^i +2uk5#?i_MQJ,~> +!<ss66p="&6p="&6p="&6p="&6p="&6p="&6p="& +6pEn(5"%S&5"%S&5"%S&5"%S&5"%S&5!MG!6p="&6p="&6p="&6p="'/-$BQ_80gc'qX[4"DLh3 +9ZR,!"6!WiAFIYIScC'$6p="&5=GK8!(?fN!(?fN!(?fN!(?fN!(?fN!(?cM3^c/"5"%S&5"%S& +5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%V'5=?:fJ,~> +!<M8#abc%AYi]!#I=B0.nn2/ho!W02jJX/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +/h\k10eP150eP150eP150eP150eP150eY.6/hnt5/hnt5/hnt5/hnt3+oi@Ta2`B((THZO"F"bEpqWeW;m_f/hnt50/!5W!&"7(!&"7(!&"7(!&"7(!&"7(!&"4'3\E->0eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP+30.mk;J,~> +!<=Br@)lXY8J2"'(,3ur"XjcZ!&@l]?jT."(q/&JGQ7q%krf/oN(X/YrTs^A*b9ij4T[;;18S@Z +,QN>~> +!<K6p="&6p="&6p="&6p="&6p="&6p="& +6p="&6p="&5=@\'5"%S&5"%S&5"%S&5"%S&5"%V"6p="&6p="&6p="&6p="&5=@%&!-uDsOpqD4 +lcK^U<)cam@,^M?iFYbc<4VM@#BKl%5L6p +!< +!<=Br@)ZLX8K\!5%4=-`4U!,?!!"TSW*fou!!%](f9R$L,3qB%6]?tL#ThafmFrugA;j(K4TZf- +8Yoeq,QN>~> +!< +9`R@A6p="&5 +!<'Fd]935S3[d_oY +;?/C(/hnt50/"q40/!5W!&"7(!&"7(!&"7(!&"7(!&"7(4"`0>/hnt5/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnsk!.Y~> +!<=Br@)H@V=sO(J#8T&G4U*kl#ljrN>,>U68J2#6f@RGZ!#@K[4TJF[N!`_g0p$5f!)&90;t)pO +(B@d +!<0/!,T!&"4'!\Q2[r@]0D0eP150eP150eP150eP150eP150eP150eP151&`g=/hnt5/hnt5 +/hnt5/hnt5/ho!W0+BNg/hnt5/hnt5/hnt5r\"X6/IVVB]#V]^!#M-mfDq9:@K9L/9*%ppraGko +nCRsg#qmnc/ho!X0,cGr0.nt30eP150eP150eP150eP150eP151&`gb/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hmt=J,~> +!<=Br@)64U?9f,'!"'i(gcYif('ag>10UG\$Y +!<6p="&7/]=O6p=$;59*'T6p="&6p="&6p="&6p="&6p="&6p="& +6p=$;58$@J6p="&6p="&6p="&6p="&7/]=Y6p="&6p="&6p="&7/]=Y6p;Ce)kb$`IglBP](!iB +DZ!H8:f:3h;uh15apbi](IUGT5"%S&5"%U658HXN6p="&6p="&6p="&6p="&6p="&7/]>.6p="& +6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6l,iR~> +!< +!<=Br@(p"R8M(PT!"'c$j#mW*,Sp[c!#e+o?jg9d!%=o"f9?mJ(H1bG!.Fd(!etuGr/:VtnN?q3 +!$n@J!@.Yq~> +!<S5"%S&5"%S&5"%S& +5"%S&5"%S&rBE/-5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%RN!.Y~> +!<B.L0eY77,8(:_!"qeCUs88Y"1O1u-iO)I$l:Mo0*!a*0*X-a0eY771&Wa,0eY9Z0,uT! +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/ho!W0+oll/hnt5/hnt5/hnt5/hnt50)[FD/hnt5/hnt5 +/hnt5/h\k10eP+#!!%/^a0e&1&qof-nm_.A%"nU)0.nt30eP150eWDX(+q +!<=Br@(TeQ8L+oK!!a8^-ogQV"#;5D$N:#,)DYKb?j].!!.*8K_En5--1O.hN:B%4,lg9-?i_MQ +J,~> +!<!%jZ3aoK!C;uj2oapg<15!M8"5"%S&5"%S&rBD&c5"%S&5"%S&5"%S&5"%S& +5"%S&5",?61djMq5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +(BAs~> +!<(30eP150eP15r@\p=0eP150eP150eP150eP15 +0eP150eWDX1bLL80eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +&cdF~> +!<=Br@(9SG8MV4_!#,VK(*FtQ0etLD2E3HI-mTuX(((!))lG!Y>? +!<S5"%S&5"%S&5"%S&5"%S&5"%S& +rBE)+5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&4r43L~> +!<_r@\[90/5+70/5+70/5+70/#'Y0+9NI!""D# +a2;*f!(!^[fDrAN@K +!<=Br@'sAF?:cmt)XdY0&g/bm>$dA"$sk1Z&r5)jdps'k&i')C!)rHI!*o+Y!]C$(UL4*J!.Y~> +!< +!<(6N@t\a#lm,ma2bDX!!#r0eY770eY770eY770eY140eP150eWDX1+k:60eP150eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eO(=J,~> +!<=Br@' +!<c&ddDJ"u.bc +0/5+7r@]o\0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/"q4/hnt5&cdF~> +!<=Br@"D^_?k$9b!"s"pf@RH(!!!HUqE4glnr*U#6hNSD2?skh?i_MQJ,~> +$31l+5<_:q5<_:qJNn]MXZlqF%0.)frkSf=cdnH!.jZ>!3u4>!a,LSW':MN5<_:q58O +$31\n0/5+70/5+7JM2R-XY0f%#lk]drl55I +!<=Br@"D^]?j'%6!#UCgf*8rm&c`+U1As?9D=NPb9D(FL('$[q?i_MQJ,~> +!<brJ,[7j[<3_p!$uE^b(9(^!/^El!g3NrTg&Po!.Y~> +!<"!%2isfT,K2!13E3!h0/uTe?EZ!.Y~> +!<=Br@"D^\?j0k%!!"F3rmqIuH7/an$6V)eD=NPbB_FRj,lejW?i_MQJ,~> +!< +!<87,<+?;epo3q]?pXfVX&caL;U+ZN[!.Y~> +!<=DA?@cL8@&RH;?7c-W.#6:Nf*JEf(]XOB3b4!:Mu\G'4TmMF!*W^'?i_MQJ,~> +!< +!<31#=Pf0eY170/#'Z0*!a+0*!_X0B=bk0eF+?!#91Yrl5,YR9Lm7!!a!5A9] +".Ko',G6[j&cdF~> +!<=C[?@cL8@,YJt=tK^S(j!guf)sL!A17EW!uO".EV>=k9DL^Q,mOEATO7dG!.Y~> +,QJWF5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!Q,4X$6YL5b`d~> +,QJH10J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50JBL]X"ON/0/;68!&9]k"u$i"!"qe[ +r5SoDH:J_K!"'Gb-o44c>$GHFLATU,Ud4t\,;GiE!>5B_~> +,QK)t?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=9j@JRFaN#$s%t!!c/_r7;%bKM*0\ +!"'Pu3(d_$EeB=0FSe3(-kZL[8Y9Ak,QN>~> +?iV!-5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!Q/5Zp+UU5b`d~> +?iUfm0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50JBO^ZnDJ80/_i\(?f0/:R% +$8F1f+q+GO'j$g@r5SuKM.fC+$2FQ(#o=3j(]==7&hT\.!>5B_~> +?iVH[?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=9mAJRHc2#[Th9!!!j>VUPIp"i?OG +9.1GK!!Eo=#6kD2!!+?KSmVRE!.Y~> +IfL9L5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q4rQXL5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5HI&O56=#554:]954q,?55[VN3$f"6 +!"D;@WqjI9Wh>&gBNRl!r&Y#]%4*ttSNd,k!.Y~> +IfL*70J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50H)Su0/,%50/,%50/,%50/,%50/,%50/,%500ISM(!V!.Y~> +IfLa%?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?5d3X?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I@'![h?jKpk&c_nE98(1Xf*B0nQ$RL^ +;cET\"99&i>$db-!@.Yq~> +IfL9L5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5#=I-5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_<55.j)`5!M4j+VObS"<0^NQF6;""b-Lu5!M7+ +56*nA56=#55.!NT(BAs~> +IfL*70J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50MjDV0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,&\0YB%B0J>.4'b('A" +IfLa%?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?;P$9?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[6B?G'YL?=7/E/K4Tg"=QohVTJD\"dB!B?sm<3 +?i_MQJ,~> +IfL9L5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5(>d\5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<]K?5!M4q5!M4q5!M4qXZlDB!'^BH"#qhJ%K-8?'J2[SFann,QA($Y +UP2_K%6-R9ffoI#q*+pE5b`d~> +IfL*70J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50Rk`00/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/*ef0J>+50J>+50J>+5XYBE$!&4C*""b]0$2ji;'f8EbFbba?R>Hcg +W/4RU#q[eafe3=[q(De(0/:g,!>5B_~> +IfLa%?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?@Q?h?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?sX7L?=7)I?=7)I?=7)IX^:[.!+,Y4"'S#:')_eD(c=rsHBaYkVNmFD +[Zt"r&mA[LS6u@C!.Y~> +!rs-$5Nb4[5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:qIm6+]5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q4t&WZ5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_ +!rrrf0BY$=0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%5IkNK/0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50ISS.0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,'30FBHe0/#"5,8Ut$$1n3!$mRLr0X<>31&EU)&cdF~> +!rsTQ@-:jG?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5IIpcSj?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?792f?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[6n?4((H?sm;I8MVP0'(c/*)G+?+?E7H7,QN>~> +!rs-$5I!D%5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:qIm6+]5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q4s<-S5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +rBL +!rrrf0+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50Hi)'0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +r@e1)""b`A,5rVf+r;%>,;Cp`0]=Yc&cdF~> +!rsTQ@'O$f?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5IIpcSj?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?6N]_?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +rF#Y3"'S8_6N04S68C;_8RPr:?K#8m,QN>~> +!rs-$5Cl#l5(>d\5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<`pK5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q55meH4p4)65 +!rrrf07bhN0Rk`00/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/.5r0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50`Ea*0Ea$_0/#$Y0.ek20J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+5a"RN,!.Y~> +!rsTQ@"DYX?@Q?h?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[\X?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?N+@4?3FYB?sm=??nG\m?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)Ia'Jcl!.Y~> +!rs-$5Cl#15(>d\5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5 +!rrrf07bgh0Rk`00/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/.l/0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+/0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%4&cdF~> +!rsTQ@"DXr?@Q?h?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s\=j?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7(g?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5K,QN>~> +!< +!<+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>*m!.Y~> +!<=D#?3"Aa?E%7\?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5IF'r<^?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7(b!.Y~> +!< +!<+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+5&cdF~> +!<=C=?3"Aa?E%7\?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I3+-'#?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I,QN>~> +!<$/5Cl"t5(,XZ5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<]k`J,~> +!< +!<=Br?KPPo@"DX`?@?3f?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?sY)YJ,~> +!< +!< +!<=Br?Ed`9@"DX`?:SC0?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I,QN>~> +!< +!< +!<=Br?@cGU?3"Aa?E%6>?s[5I?s[5I?s[4d!.Y~> +!< +!< +!<=Br?@cF6?BSUr?mG`&~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BSUr?mG`&~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +)ZU[<3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3/'Ns6:KKi!^0%:JNeWKeij*N!.Y~> +)ZUL)/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/VPk[7oM.p0EOUF6g-6(0nD$00_$gt&cdF~> +)ZV-i>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>(p8aBPh/0?34YXAE[A"@"DX8?L_>&,QN>~> +"996%4uiO*!''sA!''sA!''sA!''sA!''sA1cRZY4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c +4ub_c4ub_c4ub_c4ub_c4ub_c4ug/<"%u]s;"-XN7nu]?mQLV6r`9(_l95;C='%hA5(Pog4olH" +J,~> +"99&g0J38X!%n1(!%n1(!%n1(!%n1(!%n1(1bCC50J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J0mj")!d[Hgrcm0j8X26gcW.6iN5K6g??-B9JEVJM;X/nh:(W +!.Y~> +"99]R?<[>7!*]A.!*]A.!*]A.!*]A.!*]A.1g43h?AFB +!.Y~> +)ZU[<3'KMc5!Cqi3'KMc5!Cqi3'KMc5!Cqi3;u)A3;u)A3;u)A3;u)A3;u)A3;u)A3;u)A3;u)A +3;u)A3;u)A3;u)A3;u)A3;u*(3'KMc4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c78#s2 +3'K;c3'K;c3'K;c3'K;c3'K;c3;,N9<;ots4p"P[7J]1J8,QEg8,>CO6;UKFqE=mPr`9(ipHAXF +91AV>!([#i!)W)Ir_!;_69Y$+!([#f"&MWZ4b5eg4olH"J,~> +)ZUL)/MJk10JG(4/MJk10JG(4/MJk10JG(4/cIF(/cIF(/cIF(/cIF(/cIF(/cIF(/cIF(/cIF( +/cIF(/cIF(/cIF(/cIF(/cIFd/MJk10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1;eJTS +/MJb1/MJb1/MJb1/MJb1/MJb1/bUjuM#NP;1&`j/0m8@OqChnQr/q%`qCi"AH[A9Z0E>bbOoS\[ +0EOaW;tr$H>5jZbHg`Wg1&bee>":sR0E>;UL]_g5;a^.1!&:c5!&9$Yr@e6b!.Y~> +)ZV-i>$bN=?=$fA>$bN=?=$fA>$bN=?=$fA>5hh.>5hh.>5hh.>5hh.>5hh.>5hh.>5hh.>5hh. +>5hh.>5hh.>5hh.>5hh.>5hhj>$bN=?$bB=>$bB=>$bB=>$bB=>$bB=>4u8&L]354@/aI7@"3rKqHa/Br/:VrqHa8;JUqM2?3#3KMu[nm +?34eaD>7E;ErM!tJaZnF@/b?OEbK"W?3#$FLBE$MD.N6E!+<*=!+:@arE]LM!.Y~> +&-*M14ub_i3'KMc5!Cqi4uiO*5<(hj3'KMc5!Cqi4ub_c5!Cqi4ub_c5!Cqi4ub_c5!Cqi4ub_c +5!Cqi4ub_c5!Cqi4ub_c5!Cqi4ub_i3;u)A3;l#V7nZ$06;UWX<)?Oj<)?Oj<)?Oj6U!s<-36;'Z;4p+,J:d+b@#XqBV7n#j569Y30"%#sg97];+4olH"J,~> +&-*=s0J+t4/MJk10JG(40J38X5:nQC/MJk10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t1 +0JG(40J+t10JG(40J+t10JG(40J+t4/cIF(/c@@=>%]QD7sg&=LjOr)LjOr)LjOr):,#WGOpj]3 +0J,"XB4kC&0JG*X0E<^(0FTNe0J+t10J+t10J,$XOp!Hj0JISIOp3Wp0J+t4F8D%4;_TdW/MJc4 +P*1VT/MJb1/MN"[OoS#O0EtI&F"o@&6iN5K;u/0J8,\SNG5*cg7ftJ"0R!>V!f1nfqChn:q2tf+ +=u#e+"%SN;>50cR>%_J8kqE0/B1MSJ"%R]]6iA\G;eK9;;c?1V6SU=o0EXh$P%T>"r\+?c!.Y~> +&-*t^?$bN=?=$fA?<[>75?_B">$bN=?=$fA?5hh.>5_bCEd(ntBRtqiLOk53LOk53LOk53EF*M]N!s6' +?$bBf +N/WNu>$bB=>$d!`Mu[Pj?3Y7tI:-AfAH%MfD>IQ=B`3kiJ,!@IBEMXK?@Vj2!f)2;qHa/4q2>B+ +Ea\ZK")*XPEqirCEd)_ +-NFrH3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_i3;u)M3'KMc5!Cqi4ub_i3;u)M +3'KMc5!Cqi4ub_i3;u)U3'KMc5!Cqi4ub_c5!Cqi9351o54DVS5#D5["@YL679'1d&k>,L3'K;c +4ub_i3'Ku37m9*rr]U7K-?o:-LX$3'K;b<;or+<'<3)3'K;c3'L18:@7m6Z3##nZ*:d.'3oiD,gr]U +-NFc5/MJk10JG(40J+t4/MJk10JG(40J+t4/MJk10JG(40J+t4/cIF4/MJk10JG(40J+t4/cIF4 +/MJk10JG(40J+t4/cIF,0RNe^"B.!+;i(@7&m?tC/MJb1 +0J+t4/MLga=thW^r\+=NrfRG.0JG(4M#NP@6SL)G0PC3E#)Fre/MJk5rfRA>0JG*X0E=WBOp$Rp +0J,$YOoobW0N7t6#]h[O0J+t16\t`)$A_&$0J+t10J+u%qN:nI0SoLe!II?70E=K7Oo^A;q(Mf) +rf[+3!CM\AOoS\b0E=K37fYpU0E=K>Op"9/;d)Qa0F!>rP'\l:;tZ:RF8dinHiB0.0nD%Y0EDdd +J,~> +-NGDu>$bN=?=$fA?$bN=?=$fA?$bN=?=$fA?5hh:>$bN=?=$fA?5hh: +>$bN=?=$fA?5hhB>$bN=?=$fA?$bB= +?$cE(EaE'Ura#SAreq#1?=$fAL]359A6rGG??c4(#)?Mk>$bNCrepr7?=$h7?3"[]\##^p#_? +;ZIUt4ub_c4ub_c4ub_c4ub_i3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_c5!Cqi4ub_i3'KMc5!Cqi +4ub_i3'KMc5!Cqi4ub_c5!Cqi4ub_i3;u)E3'KMc<;or!4n)MQ6N(!c4oe+K!^](7rE"P6r]U?!!.Y~> +;ZIFa0J+t10J+t10J+t10J+t4/MJk10JG(40J+t4/MJk10JG(40J+t10JG(40J+t4/MJk10JG(4 +0J+t4/MJk10JG(40J+t10JG(40J+t4/cIF,/MJk1M#NP;6h$6=8,\SP0ecf,Opc=b/MJk10JG(4 +0N7t6#"L@$/MJbhrfRCf0JG(GrfRG@0JG(4;uMj[Lg'b?"]I*,0JHH)Op?.a/MJk10PCBJ!,)9b +!*]Ab"*Q@M6iN5RLbLM70JG5;rK77Q0JG*X0ENg[8,8;LB/!ulOp5PN0J+t4BD.JnB.tnk/MJb2 +rK@17"YDD[0LLZnOoe--;t6"QB.u#PrfRCfB9JF6qChnQrfR>=0JN*]!_4q!rK7.8JM@*X!>5B_~> +;ZJ(L?$bN=?=$fA?$bN=?=$fA?$bN=?=$fA +?$bN=?=$fA?5hh2>$bN=L]354AFPNXB`3kk?s[mLN!k&?>$bN=?=$fA +?>]\##&%=L>$bBVrepu#?=$fGreq#9?=$fAD>fCoLN$bN=??cC-!-eEK +!-8't"+OW\AH%MmLL+:j?=%#prJUhl?=$h7?34;:B_dSgG@#LeN!=K0?$bB? +rJ^b_"^559?=\igMum[!D=NPeG@"U"repu#GDqK9qHa/Brepo6?=*5^!bbnJrJU_aJR8@_!@.Yq~> +7fX>h3'KMc5!Cqi4ub_i3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc4ub_c5!Cqi3'K;c3'K;c +3'K;c3'K;c3'K;c3;u)P3'KMc5!Cqi4ub_c5!Cqhr`9/#5"kHJs%E>m!`2'LpK%\p5!Cqi4ub_i +3)9HS!_#:4r]U_4ub`!r`9=p5!Cqi4ucO@C56N'sc<;T`$90P=!3'Ke1 +r`9(rJNj&s!>b`d~> +7fX/U/MJk10JG(40J+t4/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10J+t10JG(4/MJb1/MJb1 +/MJb1/MJb1/MJb1/cIF7/MJk10JG(40J+t10JG(GrfR>=0PBs>s(D=o!d67rpQ>kr0JG(40J+t4 +/T^oS!`Ld)r\+>!rfRCS0J+tWrfRD*0J+t5rK78=0ed8>Op,n\0J+tkrfRLi0JG(40J/+[Op"9/ +/MMAIOp"rB0J/+[Op+3,0J+u%rK7Lk0J+t4/MJb10Q[&Q"&gm*8,\SNM#3>>B.tnk/ML-&Oo^A[ +qiUq_r\+C*0Lu,*!dcUQr\+@-M#*89HSBg9Ood3hHiB0/7sk5u#=C0s0J+t4M#NP==tiJ +7fXf@>$bN=?=$fA?$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?$bB=>$bB= +>$bB=>$bB=>$bB=>5hh=>$bN=?=$fA?(-C/!c;7Ira#SUreptn?$c^XN!+0-?$bB=?@DX.")V@JB`3kiL\m#7G@"HZ>$c(FMue]^ +qhtMqra#Y0?>0=s!eFZ]ra#V5L\cr2JR3osMum0hJc:T/BS$/A#@q.E?oIoJUq/,?3);OJ,~> +=o]@&3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc4ub_i3'KMc5!Cqi +4ub_i3'KMc5!Cqi4ub_c4ub_c4ub_c5!Cqi3'KMrr`9.r4uiL)!([#i!)WMU!*&r!!_#:PrE'"h +!*&nu#t7$;4ub_i3'L=@ +=o]0h/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10J+t4/MJk10JG(4 +0J+t4/MJk10JG(40J+t10J+t10J+t10JG(4/MJk^rfR>(0J35X!*]Ab!-\5o!AK?/OoeQ:M#EM: +=oaBWOpP&@/MJb10J+u7rfRFP0JG(41&[:80ENg[F8h=*=thW^F8_7(6SL)ZrfRG@0J+t4M#NPA +7kcMK0J,foOoU=;0E +0LodROoS#O0EEbHrfR@e0JQc/Op+3,/MJkkrfRIu0J+t10PC?I!-A+%!CpemOofta1&[790RNe^ +#"('u/MJk^rfRA>0ed8>OpuS5B_~> +=o]gS>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?$bN=?=$fA +?$bN=?=$fA?$bNUrepo,?<[;8!-8't!.XlR!FCQ\Mumj(L]*23 +EWCmnN!X?->$bB=?$cFON!4E3>$bN=ra#V/AGhAkLOFSf?+Q\Mu[Pj?3+5Xrepr"?=7gON!3`u>$bNZreq&*?$bNUrepr7?s\'VN"(8WGB\I`It +=o]@&3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;sr`9=p3'K;c4uc=:Y5!D,/r`98"5!Cqi<;or&69[Rm4]MD^"\q6@4ucC<l +r`9)!rD!Jl90GI-r`9.t5#D5[#!G.63'KN*r`91l5!DgB$4p3i/3'KP) +=o]0h/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJbtrfRLi/MJb10J.AFOoS\`0EEaqrK718Hi9*1 +7kcMLM#NPCLbUS80J+t16iN5QLbLD70J,foOp-1d/MJc4rfR@N0JH#qOp+c<0J+u7rfR@N0J,$X +Op3Tl0JG(4BE"%sF"f1";uVp`HS@-*0O"I="*6.M;uMjZHi>](/MJk10J+tkr/q:t0J+t10JH]0 +Op,nY0JGkMrfRG30JG(4M#NP@7kcVK6\t`)"`l@L0J.JIOp+c+0RNe^#"('u/MJl7rfR@e0JIkQOp"];/MJdU0E`s]/MJmWOon'*0J38X +!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(3\<$;0J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1o.U1X!.Y~> +=o]gS>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB\req)&>$bB=?$bBfrepqi?=%=DN!4')?oItJR2Yd??6%("+=K^D>fCnJc8s\>$bN=?$bNKrJUf%?@Dg3!dA$rrI"[$ +repi4rI"fuG@Y#srepo.?@i*7#%V%H>$bNjrepr"?=&3^N!+!(>$bD3?3FG<>$bP6N!!Ts?<[>7 +!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.3a,in? +=o]@&3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'KN*r`9=f4ub_c4ucO@l[ +dTD4ub_c<;or%69[Rm:B";u7m8mr3'I7B!`V?HrDsA+5!Cqi3'K;c4ubb' +=o]0h/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJl7rfRLR0J+t10J/+[Op=?+0J+t10PCBJ!G>@0 +Op,#@0J+tGrK7Ch/MJb1/MLB-Op5tZ0J+t4BE"%sB.Yeh1&d==LbLM7HiB04HS@$*0J.AFOonW: +0N7t6#BhdQ0J+t1M#NP?7kcVKF8h=+=thN^/OTN#!f/NtrK7PE0eb15/MJb10J,$VOp>VR0J+t4 +/U%,V"]I*//MKQjOon'*0JWNh"YDD[0JH#qOp!Hj0JJ=^Op*Qo0J+u*rfRA10JH#rOp?dp0J+t1 +0R!GY#u`N00J+t4/MM8FOoef@M#NP@0eb150O"I=",JZc1&[7D0eb:50JG(40J+t48,eZ5Lb1;7 +/MJb10J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t1r\+=( +r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+j70J+t1 +0J+t10J+t10G4A9~> +=o]gS>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bNjreq(m?$bB=>$c7KN!=]6?]\##Cg&`?%IVk!f()mrJV,>?s[#C>$bB=?(?O1"`7RP>$bb$cXVMun$+L]359?s[#C??6%(",C8j@/Z#m?s[/C?=$fA?$bB=? +=TB6t4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c +4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ubn.76?4ub_i +<;ou!4p3i/4uc=:dTJ3'K;c<;or$4[(hgr`98&4ub_c6N'sf69[@mr`92$5!Ct* +55eR^4pEu14ub_i<;or#4[)jE=8kAb3'L=@ +=TB'd0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J,foOp?ds/MJb1/OTN##`(/d0J+t10PCBJ!CqM9 +Op?.^0J+t10O"I=#?*3./MJb1F8h=,;_TdW/MMPNOp"9//ML-&Oook]/P#c&#"('r0J+t^rfR@R +0J-r:Op5)D0J+t18,\SQ0J+t4rK7@P0J+t10So^k!CqtEOpaW2/MJk10JG(40O"@:#A5_B0J+t4 +M#NPA0eb150J.AFOonlA/Q;Y3#BhdT/MJb1M#NP>6SL)ZrfRG@0J+t18,\SQ7kcMKrfRJA0JG(4 +0JWNh#r++f/MJk10JJ=^Ooe!)M#NP@0eb:50So^k"'RB48,eY\HS@-*0JG(40J+t4/SG'G#\PhC +0JG(40J38X$nX.e/MJk10JG(40J38X$nX.e/MJk10JG(40J38X$nX.e/MJk10JG(40J38X3\<$; +0JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t1r\+=( +r\+=(r\+I,0JF+>J,~> +=TB^N?$bB=>%IVk#_u_i?$bB=IK#00D-gCP>$cdZN!*g#>$c(FN!"Q9>%mkn#%V%D?$bN=?=$fA??5q%#BsKX?&F7t#Cg&d>$bB=L]357A6rGMreq#9?$bN=?=&EdMumNrL]359?s[/C?AJN="*.^SB`'Kt)#^9TY +?=$fA?<[>7$sHtD>$bN=?=$fA?<[>7$sHtD>$bN=?=$fA?<[>7$sHtD>$bN=?=$fA?<[>73a,in +?=$fA?(3'K;c3'L+5 +=TB'g/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MLB-Op>VR/MJb1/R&.:%!+*S0J+t1/OP>WF$onh +&hu'l0J+t10P>`90J+t10J+u7rfRFP0J+t10`@.;0eb15BE"%r=thOTrfRb40J+t10J+tkHWi*T +0RNe^#"L@!0J+tkrfRD*/MJbTrfRMB/MJb1/MM8AOpk8@0J+t10J+t10J/+XOp5PQ/MJk18,eYV +LbLD7/MJkWrfR@r0J.AFOp>/E/MJb1/T^oS"%P%!;uVp`F"K("/T^oS%Wa +=TB^R>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$c7KN!FQ5>$bB=>&sV$%"2Gc?%EDII:W;8 +&n#$L?8?(# +?@i*7#&%=H?$bBLreq);>$bB=>$cXQN!sQ,?$bN=B`$bNPrepr'?$bB=>(-C/"))"ID>oItI9Kr`>(-C/%XhYe?$bN=AH%MiLL+/>reptf>$bBQrepu8?s[#\req;1?$bN=?=$fA?$bN=?=$fA?$bN=?=$fA?$bN=ra$":?=$fA?$bN=ra$":?=$fA?$bN=ra$":?=$fA?$bN=ra$+=?$bN=? +!<3'K;c3'K;c3(NsL +&l(VM4ub_c4ubMc3&j)]4ub_hr`9;'3'K;c3(!UG"]RHF3&jn: +!<5jZi +B.tnk/MJbTrfR@r0J/+[Op=?./MJb1/T^oS"%P$sF8h=*=thN^1&[7F6SL)G/MK[b0JG(4/MLi: +OpPbQ0J+t10J+t^rfR>(/MR-d">DD]0So^k"BmK20RNe^$qE!*/MJk10JG(4/OTK"IP!6*0J+t4 +/MJk10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t4/MJb1/MJk10JG(40J+t4/MJk10JG(4 +0J+t10JG(40J+t4/MJk10JG(40J+t4/MJk10JG(40J+t10JG(40J+t4/MJk10JG(40J+t4/MJk1 +r\+I,0JF+>J,~> +!<=DE>#\g3?$bB=>$bB?>&sV$ +&q+(i?$>69?$bB=>%mno"c$8f>$?^\MumZrB`3l!A6N;C?$bB= +>%%;f#$tJ>>$bBfreptn?$bB=ErM"& +G@"HZ>$bBLrepr'?$bB=>(-C/"))"EIK#0.EaDpU@/Z#oA6rGG>$blU?=$fA>$cFP +N!X]3?$h/d"C>8$bN=?=$fA>%ISjITg&]?$bN=?$bB=>$bN=?=$fA?$bN=?=$fA +?$bN=?=$fA?$bN=?=$fA?$bN=?=$fA?$bN= +ra#_2?="lWJ,~> +=9'.$3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'R:Bs#pTG4ub_c<;or-4ZGVb3'K;c3'K;c9E%um +8,bIX4ub_c4ubMc3&j)]4uc(34ubMu +r`9=n4ub_c4uc(3:-LX$ +3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_i3'K;c3'K;c3'K;c3'K;c +3'K;c3'KMc4ub_c5!Cqi3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc4ub_c5!Cqi4ub_i3'KMc5!Cqi +4ub_i#<4n,5!CqB!.Y~> +=9&sf/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MR-d#;Ina0J+t1M#NPG6S0uD/MJb1/MJb1BE"%o +>5g)`0J+t10J+k1/M/Y.0J-K-Op5PQ/MJb1>5jZfB.Y\h1&[7:0J.AFOq)Ob0J+t10J+t1/MJb1 +8,eYUHS$p'0J,ZjOomBi0JNHg#=C's/MJb16i3#UF"f1"/MJb1/MJb1/URJ[!/UW;#%oVA0J+l' +rfRLb0J+t10J-K-Oof8M6iN5SLbLD7/MJb1HiB016SL*JrfRCS/MJb[rfRe=0J+t10J+t10J+t1 +0J/+[OpOW10J+t10J+u%rfR=]0J36d""c2Y>5jZfLbUS81&[7D0J+t4/MJb1/MJb1>5j\7F"f1" +/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10JG(40J+t4/MJk10JG(40J+t4/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJk10J+t10JG(4/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10J+t10JG(40J+t4/MJk10JG(4 +0J+t4#;%V]0JG'k!.Y~> +=9'UQ>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$h/d#@LkA?$bB=>$bB=GQ*O$ +ErK5P?$>69?$bB=ErM"#G?S0V@/Z#c??$bB= +B`$bB=AG_;pI9p)`>$bB=>$bB=>(Q[3!/LQ4#'XBW?$bB=Jc:T1A6rGpreptn>$bBQreqA=?$bB=>$bB=ErM#II9p)` +>$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?=$fA?$bN=?=$fA?$bB=>$bB=>$bB=>$bB= +>$bB=>$bN=?$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?$bN=?=$fA +? +=9'-s4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c +4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c5!o6M!*&nV!^8S,r`9P.4ubMc3&j)]4ub_c9E&!* +76W[p3'K;c3'K;]4ubMc3'L1< +=9&sc0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10Lu,*!/US*!\c2nrfR_H0J+k1/M/Y.0J+t1BE"&, +;_TdW/MJb1/MJb.0J+k1/MMAIOp4i:0J+t1G5dX-;_TdT;uVp]HS$uNOq'u6/MJb1/MJb1/M/Y. +BE"%uB.Y\h/MLB-Op#hX0J,foOpQpr0J+t10J+l4rK7V:0eG(20J+t10J+t18,\SN>5jZgB.Yeh +0J36d#;Iea/MJb1F8h=(=tN\POp?.^0J+t10JWNh!\c2\rK7:;/MJc'rfRap/MJb1/MJb1/MJb1 +/OTN#$&C8e0J+t10J,!WOod?l/cCh7/MJl7rfRCf0J+tWrfR_;/MJb1/MJb1/MJb1HiB1X;_TdW +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb10J+t4/MJk10JG(40J+t4/MJb10J+t4/MJk10J+t10J+t10J+t1 +0J+t1s"FU.0J+sk!.Y~> +=9'UM?0=s!/LMV!a]&@req;A?$>69?$bB=>$bB9?$c^XN!=-&?oIqJQcI[N"0N)>$bB=>$bB=>$>69 +GQ*O*G?S0V>$c7KN!+Q4?$bB=IK#0,Ea!>ZN!Fi9?$bB`req>->$bB=>$bB=>$bB= +>%IVk$&;hj?5aB^>$bNjrepu#?$bB=>$bB=>$bB=Jc:UXD-gCP +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=?$bN=?=$fA?$bB=?$bN=?k4? +=9'.$3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3(s6P#>76?4ubMc8,cR!:,kEs3'K;]4ub_c5"klV +&P##E3'K;c3'K;c3&j)]3'K>#=8tGe3'K;c<;ou!4p!]-9E%uo9/oH@ +=9&sf/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/SG'G#A5_B0J+k1>5jZoF"K't/MJb.0J+t10PCBJ +&R$k?/MJb1/MJb1/M/Y./MJdTOp3Wp/MJb1M#NP?0eb15BE"%qB.[5jZgLbUJ8/T^oS$sG>:0J+t10J+t10JWNh +Ik`W/0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10F'0`/MJb1&cdF~> +=9'UQ>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>'Kt)#BsKX?$bB9?$bB=>$bB=>$>69>$bD2N!$bB=L]358?s[#CGQ*O&G?T%dN":JG>$bB=>$bB=>$bB9 +?@i*7#&%=H>$bBfrepts>$>6\req/->$>69?$bB=>$bB=>$cXVMue?Dreq#) +?(-C/#BF-S?$bBCrJV4m>$>69?$bB=>$bnAN!"W;>%%>g",C&dErM"$LL=:l>(-C/%!#ZX?$bB=,QN>~> +!<76?4ub_c9E%up<&d'@r`9:e3'K;c3'I4A"%>C59E%uq9/nmp8,cR#:-LX$3'K;c3'K;c +3'K;ur`9Cp4ub_c4ub_c9E%up9/o+!r`92$3'L=@ +!<T0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10RNe^#=gI"/MJb.G5dX6;_9RT/M/Y./MJb1/Q;Y3 +&Vr"m/M/Y.0J+t10J+k1/M0KlOoU=:/HIOmrfRG@/MJb.HiB007kf;hOq(YI0J+t10J+t10J+t1 +0`@.<0eG(2/OTK"">DD]/VsCh#tHR$/MJb1/MMPNOpt>A0J+t10J+t10J+t5rK71O;uVp`B.Yeh +0O"I=#A5_B0J+t1BE"%rLb1<:rfRIQ/MJb1/OTK""&gm*BE"%sB.Y\h>5jZqF"f1"/MJb1/MJb1 +/MJc'rfRRd0J+t10J+t1BE"%rB.YelrfRA>/MN"[Op,#C/M/Z4rfR[[/MJb1/MJb1/MJbTrfVbX +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJa^0J+t10J+sk!.Y~> +!<=DE>#Sa2?$bB9J,YB9D-C+L>$>69>$bB=>&F7t +&VjOr>$>69?$>V=Mu\Y3=ohr?req#9>$bB9Jc:T0BO68hN"0l3?%ISj"C>8<>)3*9$#!LK>$bB=>$cdZN"'W-?oItG?Sreq%l>$bB=>%ISj")V@JGQ*O(G?S0VErM".I9p)`>$bB=>$bB= +>$bB`req/#?$d!`N!46.>$>6freq8!>$bB=>$bB=>$bBLreu>X +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bA +#=8tJa3!hc.3'K;]4ub_irDsP' +3'K;]4ub_c4ub_c3'K;pr`9(rr'p`^r`94t3&j)crE'"_rDsIm3&j)]4ub_c4ub_c5!o6M##IKC +3'K;lr`94t3'K;gr`9D*3'K;c3'K;c3;lnf4ubMc3'K;c3'K;c3(s6P!`1jFr`97r4ub_c;#XN# +76!Ij4ub_( +0eG(2/MJdTOps-"/M/Y./MJb.0J+t5rK7_) +/MJb.0J+t10J+t1/MJbhrfR8.r)s)ArfRD*/M/Y1rK@18rK7XF/M/Y.0J+t10J+t10Lu,*#(&$U +/MJb[rfRD*/MJbHrfRSD/MJb1/MJb1/cChA0eFt2/MJb1/MJb1/SG'G!dcLtrfRFt0J+t1HiB04 +;_9[T0J,ZjOoeQ66iN5RLbLD40J+u"rfRD?/M/Z"rfRCZ/MJc'rfRai/MJb1/MJb1/MJb1/M[3e +#r+"c/MJb1/MN"[Oon3./M[6f!f/F3rfRG@0eG(26iE/V/MJb1/MJb1/MJb1F8h>P=thN^/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +#V@_^0J+t1&cdF~> +$bB9?$>69>$bB9?$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=@/Z#g?s6l?>$bD2N"'0$>$>69>$bB9?$bB9?$bBVrepi.r,Mdcrepu.>$>6=rJ^barJV4o>$>69?0=s#(^)a +>$bBQrepu.>$bBGreq/=>$bB=>$bB=>5aBh?s6`?>$bB=>$bB=>'Kt)!eFNlreq#)?$>6^repu">$bB`req>(>$bB=>$bB=>$bB=>%%;f +$"-qC>$bB=>$d!`N!!a">%%>g!f's"req#9?s6l?AGqGq>$bB=>$bB=>$bB=IK#1TEaDpU>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +#[1P~> +!<dTD3'K;c6N1$s<&d'$4ub_c3'K;]4ubMprDsLu3'K;]4ub_c4ub_c +3'L12 +!<0J+t10RNe^"+)^R>5jZhF"K't/MK]n +OonW70J36d"#2AZ1&[7F0eFt2/MJb1/MJb1/ML-&OpQIh/M/Y.0J+t5rK@14!AHn?OoftaM#NP@ +=thN[0N7t6%!F?m6UsXF>#R")0J36dImYeA/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/I4$^0J+t10G4A9~> +!<=D6>!lV">$bB9?$>69>$bB9?$>69>$bB9?$>69>$bB9?$>69>$bB= +>$bB=>$bB=>$bB=>&F7t#D$2b>$bB=B`$bB9?$bB9?$c^NN!+!(>$>V=MunQ:D>oIpIs:[C"Fjf_>'Kt)!/LPt!e#9Jrepts?$bB=>$bB=>%%;f!c;+Xrepu(>$bB=rJUqg?$bn@ +N!!p#?<[;d"(5;9@/Z#o?s6`?>$bB=>$bB=>$c(FN!Y&A>$>69?]\#%"DYqA8#XnEc"u`?<[;dIq2_h>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB==pSG +!< +!<0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J*Sb/MJb1/MJah!.Y~> +!<=CQ=p\M=>$bB9?$>69>$c7KN"C2>>$>69>$bB9?%!-aN"'<$>$bB=>$>69 +>$bB?o8Ef_>$bBQrepo&?@Dg3!-e-q"*.^OJb4m(?]\#%=MDd>$bB= +>$bB=>$c7KN!"i=?>]\#"F"0U?>0=s!J+SV=ohrHrJUhl>$cXVN!=<+>$bB?L]358Ip-/^AH%Mj +LK\"fB`$bB=>$bB=>$bB\req/(?oIsIp-/^AH%MgJTCaK#)?Si?$bB=>$bAX!.Y~> +!< +!<=thO,rfRCs/MJbhrfRFt/MJb1 +1&[7 +!<=CH=oa?WMu[Pg=oa-QMu[_c=oi/hrepl/?M7P&B_75eLL+.f?@Vs5!c;+rrephop5B&n>$gi[ +"FXH[>%mno$AVqk>$bB=>$bBVreq;,?$bBVreq#)>$bB= +@/Z#eI9Kr\L]359A6N;C??c@,"Ct\B>&sV$"FXHW??cC-%sM2`>$bB=>$bB=>$bB=L]35=A6rGC +?$>69L\6T.LK\#.reu>N?$bB=>$bB=,QN>~> +!<3&j)]4ub_c4ub_h +r`9G+4ub_c3'K;c3)olY"?e_.3(!IC##mcG4ubMboN),i3&jn:=+ +!< +!<=CI=o_t/N;HcY?N#f_@/!h+D0KOi=o`F5aB\?sE2?$?.LN!ac4?$>69Jc:T:BNe_G>$bB9?fFmG6!'jN!+?2>$cdZ +N!4'%?fCsEaDpU>(-C/"EI[P>(-C/%WPZY>$>69??$bB=>)3*9"Ct\B>%mbk#)?Si?$?^\N.5ME?$bB=>$bAX +!.Y~> +!<C54oJH33'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c#rk+. +4ub_c4r43L~> +!<= +/M[6f!/UP)!\c3IrfR@e/M10*OoTk-;ZL#"OoR69/HCV+OoS#I/cCh41&!7#0SoFc"(s2;0`@.; +0eFt2BDmtr;_TdT>5jZgF"Jst6\t`)#(&$U0J+l4rfRCO/MJc4rfRaY/M/Y./MJb.0J+k1/SG'G +$"kqD/MJb.0J,foOp-Xq/M/YHqN;%d0J+k1/R&+9s+p]%s)\3Q"&gm*6iE0t/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1#q[h_ +0J+t10G4A9~> +!<=CI=o`F=Mu\A)=o`78Mu\Y-=o`UBMu[Df=o`dGMue]ApK@QJrephjr)s)Erephtr`T;4repo6 +>%%>g!/LJU!a]&Yrepr">$>tGMu\G-D#eVTMu[8b=oa?WMu[Pd>5aB[@/!h*?AJ65"*[pP?N#fc +?s6`?GQ!I'D-gCLErM"$I9Kf\A;C/C#(^)a?$bBfreq=t>$>69>$bB9?'Kt) +$$T]Z>$bB9?$>6GqMYW!?&sS#s+gW*s*aok")V@JAGqI:>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=$!LY= +? +!< +!<5jZfF"K't/UoH+0J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J*G^/MJah!.Y~> +!<=CI=oa!MMu[nq=o`dGMu\(r=oa!MN!4uI>$>oIq +I9L1\Mu\G-=or#6?N#fbA6N/drephorE92Arepi,r`T;4repl5?MRb)AH%MfL\=mOB_@;dG?S0` +repi.r`T;=rJU`)rE92Lrepts>$>$bB9??6%( +"a=-V>$>e?N!G,G>$bB=>(?O1!,_^=!+,V-"(#/;ErM"#I9Kr\>(9j^?$bAX!.Y~> +!< +!< +!<=CI=oa?WMu[Dc=oa-QMu[Pc=o`F$>tGMu\G(=o`F=Mu\G,=o_t/N;Zo[GQ*O&E`ulM +Mu\Y1=o`F=N!"i=>$h/d!+>b/!.k-.!,_^=!-eF$!.FWG!,_^o!.FQE!.FO!"*[pPGQ*O'G?S0e +rJUc4?N"(+N!!To@#+]>!,_X;!,_^o!.k)Prepi4qHEo,rE92/rJU__q-!cLrephorE92$>69>$bB9?$>69>$bB9?$>69>$bB9?$>69>$bB9 +?$>69>#\g3? +!< +!<";(]7oNS]/M1W7OoS\[/HA0:OoS\a;ZLJ0 +Ooo>K/URJ[!_4hGr/q%Ir@J">rfRA>/OtWqOoT.l/HBG_OoT.o/H@L'P5?g5B9JE]r[e+KrfR8. +q(2S#rK7.8r@J"Jr/q):0`3L&8,eYOM"N>"G5dX)0uY_=0J+k1/M/Y./MJb.0J+k1/M/Y./MJb. +0J+k1/M/Y./MJb.0J+k1/M/Y./MJb.0J+k1/M/Y.0J+t10J+t10J+t10J+t10J+t1&cdF~> +!<=CJ=o`+4Mu\Y1=o_t/Mu[8Z=o`U@MumZr@/Z&Z=o`dGMu\)"=o`F=Mu\A+=oa?WMumNn?N#f_ +?N"%.?AJN="*.RKAH%MfL](BV@/Z#a@/a=0L]35>EbK-'BPhd'>$?.LMu[nm=o`+3Mu[nsD#eeZ +N!"9->(Q[3!bbbXr/:VdrE927repr7>%i]iMu\)!=o`dGMu\)$=o_n-N;Hc\GDqK$r`T;=repi. +q-!c)rJU_arE92$>69>$bB9?$>69>$bB9 +?$>69>$bB9?$>69>$bB9?$>69?~> +!<!)*;m!)WSQ!(Hlg!_YL:rDs"_ +:Ae/n6MreC8,cQj:.tLd!)*/J!)WYr!(-WDrDrt_rAXdGr`9)!r\smQr`9(iq)A@Cr`9(rr&=[H +r)Wkgq`"RKr`9(mof*%B=&_\F3"S853'K;]4ubMc3&j)]3#;RF~> +!<5^#Q>5aTd0eFt\rfR7or@J"QrfR8.r[e+;oo]Ah/URJ[!(Zc8!,):o!.4Vq!)rl[!bX)>rK71K +F8V1$8,Oq=>5jZcF(bE6!,)-[!.4^.!(Zu>rK7.7r@J"JrfR8;r[e+krfR7bq(2SFrfR8.r%.nP +r/q%`q^he\rfR7oodp8EP)*:s/J'Tf/MJb.0J+k1/M/Y./J8&6~> +!<=CJ=o`UBMu\;'=o`78Mu\G$=o`dEMue-5rJ^MT!.k-.!,2:6!-eF$!-eEG!+,V_"(#/7L]354 +ErB/AErCq!?s6`Srepi$rE92Arepi.r`T;4oo&rr>(Q[3!,2+1!-eF$!.k&O!,_^o!d@gUrJUbf +IJf$(B`)$6ErM!uI$bB9?$>69=sO)u~> +!<Z3'L=@H6(BAs~> +!<SsBDmtq7kH;k +rK7.nr[e+nrfR7[r@J"rrfR7br[e+Roo]B'0So^k!&=7#!&=G8##d**0J+kTrfR=q/Q;V2!/UQ9 +!(Zo +!<=CJ=oa!MMu[nq=o`dGMu\(n=o`dAMu\G)=o_t/N;HcYJc:T.B`;08B`S*!+>ba#&ROI?&F4s!/LK2 +!,275!.Xd&!-e9C!FCQ\Mu[8a=oa-QMu[nt=o`UAN!+W6>$d!`Mu[Da=o`dGMu\)"=o`UAMue]? +qcWuNrephorE9S8A8#Xa>$>TuN/(el>528%,QN>~> +!<TT +!<a!*]7O!&4A7 +s)S6gLku"m",JZ`BE"%p7kfKGq(2U[!.Y~> +!<=CJ=oa?WMu[Dc=oa-QMu[P^=o`U=Mu[np=ohrHrepi.qcWuJreph`r`T;Brepi$r`T;0r/:Z- +L]*/4LLC*b!/LQ4!FT75=oa-QMu[8b=o`F4Mue-5repi4pK@Q;repi4qcWu:repo&>'Ke$!Jb@c +=o_n(Mun$'?Mdn+AH%MfL\t%mno!/L>Q!/LQ4!,2:6!-8$s!-7s?!+,V_ +s*Xs"LPPhe",C8fGQ*O%BO66nq-!eE!.Y~> +!<2ul;E:dY+?!([#i!(ZuI!(HW`!(-ZE +!'U<_!*&kU"%#sg8,P=H9DhTk:.n>T91;$5r`9(ppc&:<<;or!8,G7G7K-?i9/ocE +!<5TrRB7#")FpE)$F(],a0N7t6!-@oe!AK?/OoS\_/HA`KOof8JHhrm+HUIW] +!(6UG!Jj8@/HA5B_~> +!<=CK=o`78Mu\Y1=o_t/N::!OBSZME!Jb(Y=o`dGMu[nq=p&/\JS>!c!-8't!-8$A!,_Ih!,2@8 +!+c(f!/LJU")*IKEr9)BGCb>EIg:CGI]\#!.FWG!FCQ\Mu[nq=o`F=Mun3,Jbk<+JRnU\ +!+bqb!Jb@`=o`78Mu\;(=o_t(Mu[_o=o`dGMu\(t=o`+3N;HcYGQ*O%LL0j]!,_=d!c;+lrephj +JQhhP!@.Yq~> +!<2ul;E4]GKa4o@8>8,63d6N&kD55nU` +:AQpM55@/<55.#:6N1$d8,,%D7K$9f55R;>7K-?i9/ocGb`d~> +!<5=<]8,Y">1&d=9 +F8@Hg0_m:#0_[.!8,eYO>50ZL;uMjZ0`*F%;uVp]B.\K.Oo^ABpalM#M#EJ5B_~> +!<=CK=o`78Mu\)!=o_n.Mu\Ft=pA;RLQ%1IAGB=.Jc:T.B_,C1A;?,&AGfU2EqtXoB`2*7@/c)b +IJR+I?MRb)?M@V'B`fCn?Mdn+D>oIqG?TRqMue]Spf[])L]*/5LN6_q=p/5gN/VHI +=o`F8Mue]IrE92Prephjq-!c/repi,qcWu?rephtqH(Q[3JQheO!@.Yq~> +!<7$>:fL7d7J/VC4\&.84nCW75".X12uu0=rDs&"90W85"A;ft<'L(:"&;os +6Mi_F5#bT[55I5=7JKpk<)?Ca69$qf:f'T33;5B5(BAs~> +!<*>&)nLXf0;_e,#!CLr,Oo]VYq^hnRLiY<4/H]XAB/'*4 +!,):o!,)-[!([$O#A5VUH\d#i;tV^F6X",+6h;l20iLI8/HJ4^rK750`!@$;tuL_LjO;X7kH;[H[A\B/b^gt&cdF~> +!<=CJ=p'>7LLg6b")WU?AF*M"AG01/Ef>s4nQH!)D.*3D!G$WWMue?7qcX)BLOERl=p&u(G@(&J +!-eF$!-e9C!,2@j#Bs?^JVSf)D=q'8A9)m7AFit+?u9HM=oi/`rJUf5G@:>P"F#f`LL0aZ"+?,` +B_ts9@#'\l?M[h*D>9%sLOjr!BNeSMJUqZh>5)2$,QN>~> +!<[6*4Zu!Q2ul;E5"eO3p,E(955R;A4ubMb +pG`LM91qcD69RLl3'R0u!'Yrnp,E'h!.Y~> +!< +!<=CI=o`*\=oi;RjB;XnA7T#j=o`78Mu[8]=p&u(I:1?("(#MOAGKC2@!?g*p0%K-?Mdn.?$h&/!+(4[p0%JB!.Y~> +!< +!< +!<=Br>,,7&A9)43>(KlJ=oflKJ,~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +*rm*:/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/:fd33.X&m2usfqJ,~> +*rlp*1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1P%-//V,LW/HH@^J,~> +*rmQi8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8qC/s>(Kk\=of`GJ,~> +!< +!< +!<=8%=u])W8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei +8m4f;>(Kk.>3T2k+96o~> +*WR!9/3#1?3&ETG3&i`S/3#UG3%R$K1cR$G3&ETG`Af\*3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG +3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETGJN/3?T/Zif!.Y~> +*WQg)1G(C7/L)i'/M/2!1G(1'/Met1,:t]'/L)i'`@Wo&/L)i'/L)i'/L)i'/L)i'/L)i'/L)i' +/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'JLuF)T.L'S!.Y~> +*WRHh8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi`EG)j>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"MmiJQdV.T3;7 +!< +!<1G(C71G(C71G(C71G(C71G(C71G(C71G(C7/L)i' +/M/2!1G(1'/Met1,:t]'/L)i'/M/2!1Wh:1,:t]',:t]',:t]',:t]',:t]',:t]',:t]',:t]' +,:t]',:t]',:t]',:t]',:t]',:t]',:t^&/V,M./HH@^J,~> +!<=DD=o_1n=o_1n=o_1n=o_1n=o_1n=uo8Z8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi +>$=L$8m5Ci>"Vt%8Qn_i>"Mmi>$=L$9$1(Kl3=of`GJ,~> +#QPZ#/3#IG3%Y"f!%e(.!%e(.!%e(.!%d+h!%e(.!%e(.!%e(.!%e(.!%e(.!%e%-2(U^<3%R$? +3%R$?3%R$?3%R$?3%R$?3%R$?3%R$K1cR$G3&ETG3&i`S/3#UG3%R$K1cR&*3&i`S/3#IG/3#IG +/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#J;30cH((BAs~> +#QPJh1G'h'/Mm>W!&OR*!&OR*!&OR*!&NUd!&OR*!&OR*!&OR*!&OR*!&OR*!&OO)2)?g?/Met7 +/Met7/Met7/Met7/Met7/Met7/Met1,:t]'/L)i'/M/2!1G(1'/Met1,:t^j/N=t,1G'h'1G'h' +1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'i&/X7mg%fh+~> +#QQ,R8m4ei>"\`s!)!2n!)!2n!)!2n!(u6S!)!2n!)!2n!)!2n!)!2n!)!2n!)!/m2+h%E>"Vsj +>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>"Vt%8Qn_i>"Mmi>$=L$8m5Ci>"Vt%8Qna*=u])W8m4ei8m4ei +8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4f;>*W7l+96o~> +!<b`d~> +!< +!<=DD=u/cS>"Vsj>$=O%8m5Cj>"Vt%8m4hj>"Vsj>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"Vsj>"SZr +!)!2n!)!2n!)!2n!)!2n!)!2n!_QWgj&uFTrE91nrE91nrE91nrE91nr)u'O>"Vt%8Qn_i8m4hj +8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi`EG)j>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"MmiJQg6#!?_Am~> +!rs,s/H%O.2#TB62#TB62#TB62#TB61upV8/3#1?3%R$?3&iHK/3#U?3%R$K/3#1?3%R$?r&>TG +3&ETG3%R$G3%R$?3&ETG3%R$G3%R$?3&LRn!%e(.!%e(.!%e(.!%e(.!\?;^rAXd.jZ!5krAXd. +rAXd.rAXd.rAXd.rAZhh3%R$?3%R$?3%R$?3%R$?3%R$?3%R$?3%R$?3&i`S/3#UG3%R$K1cR$G +3&ETG3&i`S/3#UG3%W333]&fI3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG +3&ETG3&ETG3&ETG3&ETGLH#;N!.Y~> +!rrrc1]8m*,Q01o,Q01o,Q01o,Q01o,NLEq1G(C7/Met7/M/b11G(17/Met11G(C7/Met7r%/gC +/L)i'/Met'/Met7/L)i'/Met'/Met7/L13G!&OR*!&OR*!&OR*!&OR*!])Dar@J"*jXgHgr@J"* +r@J"*r@J"*r@J"*r@L&d/Met7/Met7/Met7/Met7/Met7/Met7/Met7/M/2!1G(1'/Met1,:t]' +/L)i'/M/2!1G(1'/MkO$3[644/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i' +/L)i'/L)i'/L)i'/L)i'LFiN;!.Y~> +!rsTM9)Von8c;fm8c;fm8c;fm8c;fm8`X%o8m4hj>"Vsj>$=O%8m5Cj>"Vt%8m4hj>"Vsjr)t"2 +>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"Vsj>"SZr!)!2n!)!2n!)!2n!)!2n!_QWgrE91nj]VXVrE91n +rE91nrE91nrE91nrE;6S>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>$=L$8m5Ci>"Vt%8Qn_i +>"Mmi>$=L$8m5Ci>"Zq@3_
  • "Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"MmiLKX^$!.Y~> +"ooH!3%R$?r\sm/rAXd.rAXd.rAXd.rAY]H3%R$?3&ETG3%R$G3%R$?3&ETG3%R$G3%Xte!&XX6 +!&XX6!&XX6!&XX6!&XX6!\?;fjZ"#,3%R$K/3#1?3%R$?3&iHK/3#U?3%Xte!%e(.*@s0$3&ETG +3%R$G3%R$?3&ETG3%R$G3%R$G3&iJf2ukN.2ukN.2ukN.2ukMh2ukN.2ukN.2ukN.2ukN.2ukN. +2ukN-3&N6H/3#1?/3#1?/3#1?/3#1?/3#1?/3#1?/3#1?3&ETG3&i`S/3#UG3%R$K1cR$G3&ETG +`Afn83%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G +3%Vs,!>b`d~> +"oo8f/Met7r[e++r@J"*r@J"*r@J"*r@JpD/Met7/L)i'/Met'/Met7/L)i'/Met'/Mm;V!$hFo +!$hFo!$hFo!$hFo!$hFo!])DQjXh6(/Met11G(C7/Met7/M/b11G(17/Mm;V!&OR**A]9'/L)i' +/Met'/Met7/L)i'/Met'/Met'/M/dW/H@U*/H@U*/H@U*/H@Td/H@U*/H@U*/H@U*/H@U*/H@U* +/H@U)/N#=91G(C71G(C71G(C71G(C71G(C71G(C71G(C7/L)i'/M/2!1G(1'/Met1,:t]'/L)i' +`@X+q/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met' +/Mk9r!=o0\~> +"oooP>"Vsjr`T:orE91nrE91nrE91nrE:+3>"Vsj>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"\]r!(m,m +!(m,m!(m,m!(m,m!(m,m!_QWfj]WEl>"Vt%8m4hj>"Vsj>$=O%8m5Cj>"\]r!)!2n*D0L->"Mmi +>"Vsi>"Vsj>"Mmi>"Vsi>"Vsi>$=Ps=o_1n=o_1n=o_1n=o_1S=o_1n=o_1n=o_1n=o_1n=o_1n +=o_1m=uAoU8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi +`EG;o>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi +>"Z\9!?_Am~> +!< +!< +!<=DB=qjS4>"Vsj>$=O%8m5Cj>"Vt%8m4jJ=oq<"8cDln9)Von9)Von9)Von9)Von9)Dd18m4hj +8m4ei8m4hj8Qn_i8m4ei8m4hj8Qnab=o_.m=o_.m=o_.m=o_.m=pIZ'8Qo:i>"[m[1J1hS8m4hj +>"Vsj>$=O%8m5Cj>"Vt%8m4hj8Qn_i8m4ei8m4hj8Qn_i8m4ei8m4hj8c;fm9)Von9)Von9)Von +9)Von9)Vop8m4jI=o_1n=o_1n=o_1n=o_1n=o_1m=u])W8m5Ci>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj +>"Vsj>"Vt%8Qn_i>"Mmi>$=L$8m5Ci>"Vt%8Qna(=u&ZQ8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei +8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei9(uKi+96o~> +!WWZBJJWkRJJXIc!=]$Z~> +!rrW9')iCA')iCR&e>Tc%h]Bc%hB9`&e>Kc%hdt7#8.O[&e>Tc')iCA')`=@')`=@')`=@')N1H +&e>Tc&e>Tf%h]EP&crRV&,m1C%h]EP&ciLUrX]#ArX]#ArX]#ArX]#ArXT>K%h]Kc&e>Tc%he(: +!##8A'bV#i%hB9`&e>Kc%h]B`&e>Tc%h]EP&crRV&,m1C%h]EP&crRV&,m1C%h]EP')iCA')`=@ +')`=@')`=@')`=@')`=E&e>Tc%hdt7;A'KQ%hB9`&e>Kc%h]B`&e>Tc%h]Bc%hB9c%h]Bc&e>Tc +&e>Tc&e>Tc&e>Tc&e>Tc&e>Tc&e>Tc&eY]f%h]Kc&e>Tf%h]Bc&e>Tc&eY]f`"2k\0b4m-&eY]f +&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>WL%flt:J,~> +!rrrP,lSnd,lSnu,Tn?T+=&'T+ +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/slides/users/Makefile b/executable_names/doc/slides/users/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..ebb8bcf9881651ab5fdffaab4bbcf31a0a033e40 --- /dev/null +++ b/executable_names/doc/slides/users/Makefile @@ -0,0 +1,11 @@ +all: slides + +# -paper usr +clean: + rm -f slides.dvi slides.aux slides.log slides.ps slides.pdf slides.out + +slides: slides.tex + (TEXINPUTS=.:./tex:./figures:../../common::; export TEXINPUTS; \ + latex slides; latex slides; \ + dvips -K -Ppdf -G0 slides.dvi -o slides.ps; \ + ps2pdf13 -dPDFsettings=/prepress slides.ps slides.pdf ) diff --git a/executable_names/doc/slides/users/figures/arch.dia b/executable_names/doc/slides/users/figures/arch.dia new file mode 100644 index 0000000000000000000000000000000000000000..553e4c0e44dabec6e45248c24e9ea887f9b9259f --- /dev/null +++ b/executable_names/doc/slides/users/figures/arch.dia @@ -0,0 +1,5 @@ + +#Letter##scancel##srun##squeue##sinfo##slurmctld +(primary)##slurmctld +(backup)##scontrol##slurmd##slurmd##slurmd##User +Commands##Controller##daemons##Compute node##daemons# diff --git a/executable_names/doc/slides/users/figures/arch.eps b/executable_names/doc/slides/users/figures/arch.eps new file mode 100644 index 0000000000000000000000000000000000000000..4b4f1dea9e582deef295b70b90f94c01cee22ba7 --- /dev/null +++ b/executable_names/doc/slides/users/figures/arch.eps @@ -0,0 +1,3931 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: arch.dia +%%Creator: Dia v0.91 +%%CreationDate: Mon Apr 7 10:36:35 2003 +%%For: grondo +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 784 613 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-0.555625 -22.565680 translate +%%EndProlog + + +0.498039 0.498039 0.498039 srgb +n 1.750000 4.625000 m 1.750000 6.375000 l 6.000000 6.375000 l 6.000000 4.625000 l f +n 1.750000 5.500000 m 1.750000 5.500000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 6.000000 5.500000 m 6.000000 5.500000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 0.875000 5.500000 m 0.875000 5.500000 l 6.875000 5.500000 l 6.875000 5.500000 l f +n 1.750000 5.500000 m 1.750000 5.500000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 6.000000 5.500000 m 6.000000 5.500000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 1.750000 4.625000 m 6.000000 4.625000 l s +n 1.750000 6.375000 m 6.000000 6.375000 l s +n 1.750000 5.500000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 6.000000 5.500000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 0.875000 5.500000 m 0.875000 5.500000 l s +n 6.875000 5.500000 m 6.875000 5.500000 l s +n 1.750000 5.500000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 6.000000 5.500000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 2.000000 7.375000 m 2.000000 9.125000 l 5.550000 9.125000 l 5.550000 7.375000 l f +n 2.000000 8.250000 m 2.000000 8.250000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 5.550000 8.250000 m 5.550000 8.250000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 1.125000 8.250000 m 1.125000 8.250000 l 6.425000 8.250000 l 6.425000 8.250000 l f +n 2.000000 8.250000 m 2.000000 8.250000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 5.550000 8.250000 m 5.550000 8.250000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 2.000000 7.375000 m 5.550000 7.375000 l s +n 2.000000 9.125000 m 5.550000 9.125000 l s +n 2.000000 8.250000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 5.550000 8.250000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 1.125000 8.250000 m 1.125000 8.250000 l s +n 6.425000 8.250000 m 6.425000 8.250000 l s +n 2.000000 8.250000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 5.550000 8.250000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 2.000000 10.125000 m 2.000000 11.875000 l 5.550000 11.875000 l 5.550000 10.125000 l f +n 2.000000 11.000000 m 2.000000 11.000000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 5.550000 11.000000 m 5.550000 11.000000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 1.125000 11.000000 m 1.125000 11.000000 l 6.425000 11.000000 l 6.425000 11.000000 l f +n 2.000000 11.000000 m 2.000000 11.000000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 5.550000 11.000000 m 5.550000 11.000000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 2.000000 10.125000 m 5.550000 10.125000 l s +n 2.000000 11.875000 m 5.550000 11.875000 l s +n 2.000000 11.000000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 5.550000 11.000000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 1.125000 11.000000 m 1.125000 11.000000 l s +n 6.425000 11.000000 m 6.425000 11.000000 l s +n 2.000000 11.000000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 5.550000 11.000000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 2.000000 12.875000 m 2.000000 14.625000 l 5.550000 14.625000 l 5.550000 12.875000 l f +n 2.000000 13.750000 m 2.000000 13.750000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 5.550000 13.750000 m 5.550000 13.750000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 1.125000 13.750000 m 1.125000 13.750000 l 6.425000 13.750000 l 6.425000 13.750000 l f +n 2.000000 13.750000 m 2.000000 13.750000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 5.550000 13.750000 m 5.550000 13.750000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 2.000000 12.875000 m 5.550000 12.875000 l s +n 2.000000 14.625000 m 5.550000 14.625000 l s +n 2.000000 13.750000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 5.550000 13.750000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 1.125000 13.750000 m 1.125000 13.750000 l s +n 6.425000 13.750000 m 6.425000 13.750000 l s +n 2.000000 13.750000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 5.550000 13.750000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 2.000000 15.375000 m 2.000000 17.125000 l 5.550000 17.125000 l 5.550000 15.375000 l f +n 2.000000 16.250000 m 2.000000 16.250000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 5.550000 16.250000 m 5.550000 16.250000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 1.125000 16.250000 m 1.125000 16.250000 l 6.425000 16.250000 l 6.425000 16.250000 l f +n 2.000000 16.250000 m 2.000000 16.250000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 5.550000 16.250000 m 5.550000 16.250000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 2.000000 15.375000 m 5.550000 15.375000 l s +n 2.000000 17.125000 m 5.550000 17.125000 l s +n 2.000000 16.250000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 5.550000 16.250000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 1.125000 16.250000 m 1.125000 16.250000 l s +n 6.425000 16.250000 m 6.425000 16.250000 l s +n 2.000000 16.250000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 5.550000 16.250000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 12.005600 9.111450 m 12.005600 12.811450 l 20.205600 12.811450 l 20.205600 9.111450 l f +n 12.005600 9.511450 m 12.005600 9.511450 0.400000 0.400000 180.000000 270.000000 ellipse f +n 20.205600 9.511450 m 20.205600 9.511450 0.400000 0.400000 270.000000 360.000000 ellipse f +n 11.605600 9.511450 m 11.605600 12.411450 l 20.605600 12.411450 l 20.605600 9.511450 l f +n 12.005600 12.411450 m 12.005600 12.411450 0.400000 0.400000 90.000000 180.000000 ellipse f +n 20.205600 12.411450 m 20.205600 12.411450 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 12.005600 9.111450 m 20.205600 9.111450 l s +n 12.005600 12.811450 m 20.205600 12.811450 l s +n 12.005600 9.511450 0.400000 0.400000 180.000000 270.000000 ellipse s +n 20.205600 9.511450 0.400000 0.400000 270.000000 360.000000 ellipse s +n 11.605600 9.511450 m 11.605600 12.411450 l s +n 20.605600 9.511450 m 20.605600 12.411450 l s +n 12.005600 12.411450 0.400000 0.400000 90.000000 180.000000 ellipse s +n 20.205600 12.411450 0.400000 0.400000 0.000000 90.000000 ellipse s +n 16.005600 4.111450 m 16.005600 7.411450 l 22.155600 7.411450 l 22.155600 4.111450 l f +n 16.005600 4.511450 m 16.005600 4.511450 0.400000 0.400000 180.000000 270.000000 ellipse f +n 22.155600 4.511450 m 22.155600 4.511450 0.400000 0.400000 270.000000 360.000000 ellipse f +n 15.605600 4.511450 m 15.605600 7.011450 l 22.555600 7.011450 l 22.555600 4.511450 l f +n 16.005600 7.011450 m 16.005600 7.011450 0.400000 0.400000 90.000000 180.000000 ellipse f +n 22.155600 7.011450 m 22.155600 7.011450 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 16.005600 4.111450 m 22.155600 4.111450 l s +n 16.005600 7.411450 m 22.155600 7.411450 l s +n 16.005600 4.511450 0.400000 0.400000 180.000000 270.000000 ellipse s +n 22.155600 4.511450 0.400000 0.400000 270.000000 360.000000 ellipse s +n 15.605600 4.511450 m 15.605600 7.011450 l s +n 22.555600 4.511450 m 22.555600 7.011450 l s +n 16.005600 7.011450 0.400000 0.400000 90.000000 180.000000 ellipse s +n 22.155600 7.011450 0.400000 0.400000 0.000000 90.000000 ellipse s +n 9.105630 18.261500 m 9.105630 20.111500 l 12.555630 20.111500 l 12.555630 18.261500 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 9.105630 18.261500 m 9.105630 20.111500 l 12.555630 20.111500 l 12.555630 18.261500 l cp s +n 13.355600 18.261500 m 13.355600 20.111500 l 16.805600 20.111500 l 16.805600 18.261500 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 13.355600 18.261500 m 13.355600 20.111500 l 16.805600 20.111500 l 16.805600 18.261500 l cp s +n 19.405600 18.261500 m 19.405600 20.111500 l 22.855600 20.111500 l 22.855600 18.261500 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 19.405600 18.261500 m 19.405600 20.111500 l 22.855600 20.111500 l 22.855600 18.261500 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 19.029394 13.188297 m 19.818300 13.840200 20.818300 15.940200 21.032535 17.239360 c s +0 slj +n 19.188643 12.995580 m 18.412700 12.678700 l 18.870144 13.381014 l f +0 slj +n 20.785867 17.280037 m 21.162700 18.028700 l 21.279204 17.198684 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.932418 13.359263 m 15.055600 15.386500 15.205600 16.111500 15.231197 17.200221 c s +0 slj +n 16.161875 13.458507 m 16.250000 12.625000 l 15.702961 13.260018 l f +0 slj +n 14.981266 17.206097 m 15.250000 18.000000 l 15.481128 17.194345 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.847040 13.409272 m 14.970300 15.436500 15.120300 16.136500 15.145839 17.225220 c s +0 slj +n 16.076500 13.508510 m 16.164600 12.675000 l 15.617580 13.310035 l f +0 slj +n 14.895908 17.231083 m 15.164600 18.025000 l 15.395770 17.219357 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 13.260655 13.105887 m 11.679900 14.170500 10.974600 16.143100 10.942543 17.231946 c s +0 slj +n 13.400307 13.313245 m 13.924200 12.659000 l 13.121003 12.898529 l f +0 slj +n 10.692651 17.224589 m 10.919000 18.031600 l 11.192435 17.239304 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.899328 17.846934 m 3.935120 19.603400 6.933330 22.608500 10.254266 20.478941 c s +0 slj +n 4.149276 17.841841 m 3.883030 17.047100 l 3.649380 17.852027 l f +0 slj +n 10.389217 20.689389 m 10.927700 20.047100 l 10.119316 20.268493 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.898465 17.854111 m 3.981360 21.665700 11.542300 23.452200 14.602661 20.587416 c s +0 slj +n 4.148405 17.848675 m 3.881070 17.054300 l 3.648524 17.859547 l f +0 slj +n 14.773509 20.769928 m 15.186700 20.040700 l 14.431812 20.404903 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.881413 17.876497 m 3.968900 23.338000 17.036300 23.972900 20.548604 20.660390 c s +0 slj +n 4.131381 17.872493 m 3.868600 17.076600 l 3.631445 17.880502 l f +0 slj +n 20.720132 20.842264 m 21.130600 20.111500 l 20.377076 20.478516 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 6.994366 15.537278 m 7.461400 14.799600 9.511400 12.699600 10.914957 12.127613 c s +0 slj +n 6.783140 15.403548 m 6.566430 16.213200 l 7.205592 15.671008 l f +0 slj +n 11.009305 12.359127 m 11.655800 11.825700 l 10.820609 11.896100 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.193068 13.184354 m 8.568690 11.946400 9.779980 11.607100 10.935189 11.190750 c s +0 slj +n 7.025835 12.998523 m 6.598410 13.719500 l 7.360301 13.370184 l f +0 slj +n 11.019954 11.425941 m 11.687800 10.919500 l 10.850423 10.955559 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.332861 10.696473 m 8.509050 10.303300 10.259100 10.055800 10.864442 10.026404 c s +0 slj +n 7.253603 10.459370 m 6.574130 10.950100 l 7.412120 10.933577 l f +0 slj +n 10.876568 10.276109 m 11.663500 9.987600 l 10.852316 9.776698 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.749201 5.419536 m 9.313720 5.386450 13.789300 5.725000 13.884019 8.225573 c s +0 slj +n 7.743915 5.169592 m 6.949380 5.436450 l 7.754487 5.669480 l f +0 slj +n 13.634198 8.235036 m 13.914300 9.025000 l 14.133840 8.216110 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.348807 8.149207 m 8.738980 8.085710 10.332200 8.519290 11.043573 8.836039 c s +0 slj +n 7.337400 7.899468 m 6.549640 8.185710 l 7.360214 8.398947 l f +0 slj +n 10.941882 9.064422 m 11.774400 9.161450 l 11.145264 8.607656 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.175935 7.920991 m 19.181065 8.439619 l s +0 slj +n 19.425923 7.918518 m 19.170000 7.321020 l 18.925947 7.923464 l f +0 slj +n 18.931077 8.442092 m 19.187000 9.039590 l 19.431053 8.437146 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.521569 0.580392 0.839216 srgb +n 2.151777 12.750000 m 5.758883 12.750000 l 6.256921 12.750000 6.660660 13.141751 6.660660 13.625000 c 6.660660 14.108249 6.256921 14.500000 5.758883 14.500000 c 2.151777 14.500000 l 1.653739 14.500000 1.250000 14.108249 1.250000 13.625000 c 1.250000 13.141751 1.653739 12.750000 2.151777 12.750000 c f +0.000000 0.000000 0.000000 srgb +n 2.151777 12.750000 m 5.758883 12.750000 l 6.256921 12.750000 6.660660 13.141751 6.660660 13.625000 c 6.660660 14.108249 6.256921 14.500000 5.758883 14.500000 c 2.151777 14.500000 l 1.653739 14.500000 1.250000 14.108249 1.250000 13.625000 c 1.250000 13.141751 1.653739 12.750000 2.151777 12.750000 c s +gsave 2.524463 13.825000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 2.939330 13.825000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 3.354197 13.825000 translate 0.035278 -0.035278 scale +start_ol +1984 0 moveto +2583 0 lineto +2691 0 2762 12 2798 43 curveto +2875 99 2921 203 2921 308 curveto +2921 375 2880 438 2817 480 curveto +2766 510 2719 518 2579 518 curveto +2496 518 lineto +2496 1562 lineto +2496 1988 2112 2240 1473 2240 curveto +1213 2240 829 2173 580 2085 curveto +476 2048 424 1976 424 1867 curveto +424 1785 534 1722 681 1722 curveto +728 1722 801 1722 890 1722 curveto +1131 1722 1324 1722 1497 1722 curveto +1832 1722 1984 1660 1984 1519 curveto +1984 1423 lineto +1772 1457 1611 1472 1445 1472 curveto +984 1472 627 1346 394 1104 curveto +270 973 192 804 192 654 curveto +192 295 612 0 1124 0 curveto +1430 0 1735 51 1984 142 curveto +1984 0 lineto +1984 702 moveto +1692 579 1394 518 1108 518 curveto +879 518 704 595 704 694 curveto +704 866 1033 1024 1394 1024 curveto +1575 1024 1772 1003 1984 966 curveto +1984 702 lineto +end_ol grestore +gsave 3.769063 13.825000 translate 0.035278 -0.035278 scale +start_ol +1024 2240 moveto +541 2240 lineto +499 2240 489 2240 433 2228 curveto +283 2210 196 2103 196 1942 curveto +196 1760 310 1664 512 1658 curveto +512 492 lineto +481 492 lineto +351 492 310 482 263 458 curveto +186 413 139 330 139 246 curveto +139 172 180 93 241 49 curveto +293 15 354 0 477 0 curveto +1050 0 lineto +1158 0 1224 10 1265 34 curveto +1342 84 1388 162 1388 246 curveto +1388 325 1348 399 1282 448 curveto +1231 482 1191 492 1054 492 curveto +1024 492 lineto +1024 1387 lineto +1262 1638 1424 1722 1657 1722 curveto +1970 1722 2112 1609 2112 1368 curveto +2112 492 lineto +1914 492 1803 403 1803 246 curveto +1803 84 1916 0 2146 0 curveto +2602 0 lineto +2710 0 2776 10 2817 34 curveto +2894 79 2940 162 2940 246 curveto +2940 403 2826 492 2624 492 curveto +2624 1387 lineto +2624 1687 2527 1900 2324 2052 curveto +2157 2174 1948 2240 1720 2240 curveto +1441 2240 1268 2170 1024 1954 curveto +1024 2240 lineto +end_ol grestore +gsave 4.183930 13.825000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 4.598797 13.825000 translate 0.035278 -0.035278 scale +start_ol +2851 896 moveto +2851 1095 lineto +2851 1756 2281 2240 1509 2240 curveto +752 2240 171 1752 171 1120 curveto +171 463 736 0 1540 0 curveto +1908 0 2436 93 2670 197 curveto +2794 254 2851 326 2851 430 curveto +2851 559 2742 660 2602 660 curveto +2556 660 2494 651 2431 638 curveto +1954 535 1825 518 1586 518 curveto +1130 518 855 638 736 896 curveto +2851 896 lineto +752 1344 moveto +829 1571 1135 1722 1514 1722 curveto +1892 1722 2193 1575 2276 1344 curveto +752 1344 lineto +end_ol grestore +gsave 5.013663 13.825000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.521569 0.580392 0.839216 srgb +n 2.151777 15.250000 m 5.758883 15.250000 l 6.256921 15.250000 6.660660 15.641751 6.660660 16.125000 c 6.660660 16.608249 6.256921 17.000000 5.758883 17.000000 c 2.151777 17.000000 l 1.653739 17.000000 1.250000 16.608249 1.250000 16.125000 c 1.250000 15.641751 1.653739 15.250000 2.151777 15.250000 c f +0.000000 0.000000 0.000000 srgb +n 2.151777 15.250000 m 5.758883 15.250000 l 6.256921 15.250000 6.660660 15.641751 6.660660 16.125000 c 6.660660 16.608249 6.256921 17.000000 5.758883 17.000000 c 2.151777 17.000000 l 1.653739 17.000000 1.250000 16.608249 1.250000 16.125000 c 1.250000 15.641751 1.653739 15.250000 2.151777 15.250000 c s +gsave 3.138297 16.325000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 3.553163 16.325000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 3.968030 16.325000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 4.382897 16.325000 translate 0.035278 -0.035278 scale +start_ol +1024 2240 moveto +541 2240 lineto +499 2240 489 2240 433 2228 curveto +283 2210 196 2103 196 1942 curveto +196 1760 310 1664 512 1658 curveto +512 492 lineto +481 492 lineto +351 492 310 482 263 458 curveto +186 413 139 330 139 246 curveto +139 172 180 93 241 49 curveto +293 15 354 0 477 0 curveto +1050 0 lineto +1158 0 1224 10 1265 34 curveto +1342 84 1388 162 1388 246 curveto +1388 325 1348 399 1282 448 curveto +1231 482 1191 492 1054 492 curveto +1024 492 lineto +1024 1387 lineto +1262 1638 1424 1722 1657 1722 curveto +1970 1722 2112 1609 2112 1368 curveto +2112 492 lineto +1914 492 1803 403 1803 246 curveto +1803 84 1916 0 2146 0 curveto +2602 0 lineto +2710 0 2776 10 2817 34 curveto +2894 79 2940 162 2940 246 curveto +2940 403 2826 492 2624 492 curveto +2624 1387 lineto +2624 1687 2527 1900 2324 2052 curveto +2157 2174 1948 2240 1720 2240 curveto +1441 2240 1268 2170 1024 1954 curveto +1024 2240 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.521569 0.580392 0.839216 srgb +n 2.151777 10.000000 m 5.758883 10.000000 l 6.256921 10.000000 6.660660 10.391751 6.660660 10.875000 c 6.660660 11.358249 6.256921 11.750000 5.758883 11.750000 c 2.151777 11.750000 l 1.653739 11.750000 1.250000 11.358249 1.250000 10.875000 c 1.250000 10.391751 1.653739 10.000000 2.151777 10.000000 c f +0.000000 0.000000 0.000000 srgb +n 2.151777 10.000000 m 5.758883 10.000000 l 6.256921 10.000000 6.660660 10.391751 6.660660 10.875000 c 6.660660 11.358249 6.256921 11.750000 5.758883 11.750000 c 2.151777 11.750000 l 1.653739 11.750000 1.250000 11.358249 1.250000 10.875000 c 1.250000 10.391751 1.653739 10.000000 2.151777 10.000000 c s +gsave 2.727663 11.075000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 3.142530 11.075000 translate 0.035278 -0.035278 scale +start_ol +2240 -576 moveto +1941 -576 lineto +1817 -576 1766 -586 1725 -612 curveto +1647 -658 1601 -745 1601 -832 curveto +1601 -914 1637 -986 1704 -1037 curveto +1756 -1078 1812 -1088 1941 -1088 curveto +2837 -1088 lineto +2950 -1088 3012 -1078 3053 -1052 curveto +3131 -1001 3177 -919 3177 -832 curveto +3177 -750 3136 -673 3073 -622 curveto +3022 -586 2975 -576 2835 -576 curveto +2752 -576 lineto +2752 1722 lineto +2835 1722 lineto +2954 1722 3011 1730 3053 1749 curveto +3130 1783 3177 1849 3177 1914 curveto +3177 2018 3136 2116 3074 2181 curveto +3023 2227 2976 2240 2837 2240 curveto +2240 2240 lineto +2240 1940 lineto +1988 2157 1772 2240 1448 2240 curveto +727 2240 192 1765 192 1122 curveto +192 514 722 64 1437 64 curveto +1741 64 1972 146 2240 351 curveto +2240 -576 lineto +1467 1722 moveto +1926 1722 2240 1483 2240 1144 curveto +2240 991 2142 820 1993 714 curveto +1864 624 1688 576 1472 576 curveto +1256 576 1080 624 951 714 curveto +802 820 704 991 704 1149 curveto +704 1307 802 1478 951 1584 curveto +1085 1674 1256 1722 1467 1722 curveto +end_ol grestore +gsave 3.557397 11.075000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 3.972263 11.075000 translate 0.035278 -0.035278 scale +start_ol +2851 896 moveto +2851 1095 lineto +2851 1756 2281 2240 1509 2240 curveto +752 2240 171 1752 171 1120 curveto +171 463 736 0 1540 0 curveto +1908 0 2436 93 2670 197 curveto +2794 254 2851 326 2851 430 curveto +2851 559 2742 660 2602 660 curveto +2556 660 2494 651 2431 638 curveto +1954 535 1825 518 1586 518 curveto +1130 518 855 638 736 896 curveto +2851 896 lineto +752 1344 moveto +829 1571 1135 1722 1514 1722 curveto +1892 1722 2193 1575 2276 1344 curveto +752 1344 lineto +end_ol grestore +gsave 4.387130 11.075000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 4.801997 11.075000 translate 0.035278 -0.035278 scale +start_ol +2851 896 moveto +2851 1095 lineto +2851 1756 2281 2240 1509 2240 curveto +752 2240 171 1752 171 1120 curveto +171 463 736 0 1540 0 curveto +1908 0 2436 93 2670 197 curveto +2794 254 2851 326 2851 430 curveto +2851 559 2742 660 2602 660 curveto +2556 660 2494 651 2431 638 curveto +1954 535 1825 518 1586 518 curveto +1130 518 855 638 736 896 curveto +2851 896 lineto +752 1344 moveto +829 1571 1135 1722 1514 1722 curveto +1892 1722 2193 1575 2276 1344 curveto +752 1344 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.521569 0.580392 0.839216 srgb +n 2.151777 7.250000 m 5.758883 7.250000 l 6.256921 7.250000 6.660660 7.641751 6.660660 8.125000 c 6.660660 8.608249 6.256921 9.000000 5.758883 9.000000 c 2.151777 9.000000 l 1.653739 9.000000 1.250000 8.608249 1.250000 8.125000 c 1.250000 7.641751 1.653739 7.250000 2.151777 7.250000 c f +0.000000 0.000000 0.000000 srgb +n 2.151777 7.250000 m 5.758883 7.250000 l 6.256921 7.250000 6.660660 7.641751 6.660660 8.125000 c 6.660660 8.608249 6.256921 9.000000 5.758883 9.000000 c 2.151777 9.000000 l 1.653739 9.000000 1.250000 8.608249 1.250000 8.125000 c 1.250000 7.641751 1.653739 7.250000 2.151777 7.250000 c s +gsave 2.935097 8.325000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 3.349963 8.325000 translate 0.035278 -0.035278 scale +start_ol +1792 2240 moveto +855 2240 lineto +718 2240 676 2235 628 2204 curveto +549 2157 502 2069 502 1981 curveto +502 1898 544 1820 611 1774 curveto +658 1732 720 1722 850 1722 curveto +1280 1722 lineto +1280 518 lineto +621 518 lineto +486 518 450 513 403 482 curveto +326 435 279 347 279 259 curveto +279 176 321 98 389 52 curveto +431 16 504 0 624 0 curveto +2422 0 lineto +2527 0 2605 16 2642 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 2240 lineto +1728 3200 moveto +1088 3200 lineto +1088 2656 lineto +1728 2656 lineto +1728 3200 lineto +end_ol grestore +gsave 3.764830 8.325000 translate 0.035278 -0.035278 scale +start_ol +1024 2240 moveto +541 2240 lineto +499 2240 489 2240 433 2228 curveto +283 2210 196 2103 196 1942 curveto +196 1760 310 1664 512 1658 curveto +512 492 lineto +481 492 lineto +351 492 310 482 263 458 curveto +186 413 139 330 139 246 curveto +139 172 180 93 241 49 curveto +293 15 354 0 477 0 curveto +1050 0 lineto +1158 0 1224 10 1265 34 curveto +1342 84 1388 162 1388 246 curveto +1388 325 1348 399 1282 448 curveto +1231 482 1191 492 1054 492 curveto +1024 492 lineto +1024 1387 lineto +1262 1638 1424 1722 1657 1722 curveto +1970 1722 2112 1609 2112 1368 curveto +2112 492 lineto +1914 492 1803 403 1803 246 curveto +1803 84 1916 0 2146 0 curveto +2602 0 lineto +2710 0 2776 10 2817 34 curveto +2894 79 2940 162 2940 246 curveto +2940 403 2826 492 2624 492 curveto +2624 1387 lineto +2624 1687 2527 1900 2324 2052 curveto +2157 2174 1948 2240 1720 2240 curveto +1441 2240 1268 2170 1024 1954 curveto +1024 2240 lineto +end_ol grestore +gsave 4.179697 8.325000 translate 0.035278 -0.035278 scale +start_ol +1536 1722 moveto +2319 1722 lineto +2433 1722 2495 1732 2537 1758 curveto +2614 1810 2661 1893 2661 1981 curveto +2661 2064 2620 2142 2552 2193 curveto +2500 2230 2459 2240 2319 2240 curveto +1536 2240 lineto +1536 2430 lineto +1536 2600 1676 2682 1971 2682 curveto +2132 2682 2381 2682 2557 2682 curveto +2619 2682 2671 2682 2702 2682 curveto +2837 2682 2946 2765 2946 2874 curveto +2946 2993 2869 3081 2729 3117 curveto +2564 3164 2238 3200 2021 3200 curveto +1406 3200 1024 2920 1024 2467 curveto +1024 2240 lineto +786 2240 lineto +646 2240 609 2235 563 2204 curveto +485 2157 438 2069 438 1981 curveto +438 1898 479 1820 547 1774 curveto +593 1732 656 1722 780 1722 curveto +1024 1722 lineto +1024 518 lineto +723 518 lineto +588 518 552 513 505 482 curveto +428 435 381 347 381 259 curveto +381 181 422 98 484 52 curveto +531 16 603 0 722 0 curveto +2258 0 lineto +2361 0 2439 16 2475 36 curveto +2552 88 2599 171 2599 259 curveto +2599 342 2558 420 2495 471 curveto +2444 508 2397 518 2257 518 curveto +1536 518 lineto +1536 1722 lineto +end_ol grestore +gsave 4.594563 8.325000 translate 0.035278 -0.035278 scale +start_ol +1552 2240 moveto +781 2240 192 1755 192 1120 curveto +192 495 786 0 1536 0 curveto +2286 0 2880 495 2880 1120 curveto +2880 1740 2286 2240 1552 2240 curveto +1547 1722 moveto +2005 1722 2368 1455 2368 1120 curveto +2368 781 2005 518 1536 518 curveto +1067 518 704 781 704 1120 curveto +704 1464 1067 1722 1547 1722 curveto +end_ol grestore +0.462745 0.615686 0.462745 srgb +n 12.150000 9.000000 m 12.150000 12.650000 l 20.350000 12.650000 l 20.350000 9.000000 l f +n 12.150000 9.400000 m 12.150000 9.400000 0.400000 0.400000 180.000000 270.000000 ellipse f +n 20.350000 9.400000 m 20.350000 9.400000 0.400000 0.400000 270.000000 360.000000 ellipse f +n 11.750000 9.400000 m 11.750000 12.250000 l 20.750000 12.250000 l 20.750000 9.400000 l f +n 12.150000 12.250000 m 12.150000 12.250000 0.400000 0.400000 90.000000 180.000000 ellipse f +n 20.350000 12.250000 m 20.350000 12.250000 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 12.150000 9.000000 m 20.350000 9.000000 l s +n 12.150000 12.650000 m 20.350000 12.650000 l s +n 12.150000 9.400000 0.400000 0.400000 180.000000 270.000000 ellipse s +n 20.350000 9.400000 0.400000 0.400000 270.000000 360.000000 ellipse s +n 11.750000 9.400000 m 11.750000 12.250000 l s +n 20.750000 9.400000 m 20.750000 12.250000 l s +n 12.150000 12.250000 0.400000 0.400000 90.000000 180.000000 ellipse s +n 20.350000 12.250000 0.400000 0.400000 0.000000 90.000000 ellipse s +gsave 14.378867 10.575000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 14.793733 10.575000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 15.208600 10.575000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 15.623467 10.575000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 16.038333 10.575000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 16.453200 10.575000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 16.868067 10.575000 translate 0.035278 -0.035278 scale +start_ol +1088 1722 moveto +2026 1722 lineto +2140 1722 2202 1732 2244 1758 curveto +2321 1805 2368 1893 2368 1981 curveto +2368 2064 2327 2142 2264 2193 curveto +2207 2230 2166 2240 2026 2240 curveto +1088 2240 lineto +1088 2679 lineto +1088 2809 1083 2843 1052 2888 curveto +1006 2963 919 3008 832 3008 curveto +750 3008 673 2968 627 2908 curveto +586 2858 576 2809 576 2679 curveto +576 2240 lineto +395 2240 lineto +260 2240 224 2235 177 2204 curveto +99 2157 52 2069 52 1981 curveto +52 1903 94 1820 156 1774 curveto +208 1732 265 1722 395 1722 curveto +576 1722 lineto +576 699 lineto +576 268 943 0 1532 0 curveto +1801 0 2209 88 2463 207 curveto +2659 295 2721 363 2721 487 curveto +2721 622 2612 732 2472 732 curveto +2415 732 2379 722 2291 680 curveto +2057 570 1809 518 1534 518 curveto +1337 518 1192 551 1129 613 curveto +1098 646 1088 689 1088 789 curveto +1088 1722 lineto +end_ol grestore +gsave 17.282933 10.575000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 17.697800 10.575000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +gsave 14.472000 11.475000 translate 0.035278 -0.035278 scale +start_ol +2241 3276 moveto +2127 3276 2065 3230 1946 3043 curveto +1567 2478 1344 1814 1344 1260 curveto +1344 689 1531 93 1899 -492 curveto +2050 -736 2117 -793 2241 -793 curveto +2392 -793 2506 -679 2506 -539 curveto +2506 -477 2496 -446 2444 -363 curveto +2086 218 1920 715 1920 1244 curveto +1920 1768 2081 2265 2444 2846 curveto +2496 2929 2506 2960 2506 3022 curveto +2506 3162 2392 3276 2241 3276 curveto +end_ol grestore +gsave 14.886867 11.475000 translate 0.035278 -0.035278 scale +start_ol +896 351 moveto +1164 146 1391 64 1696 64 curveto +2413 64 2944 514 2944 1122 curveto +2944 1760 2407 2240 1685 2240 curveto +1365 2240 1149 2157 896 1940 curveto +896 2240 lineto +299 2240 lineto +175 2240 129 2227 83 2194 curveto +5 2136 -41 2025 -41 1914 curveto +-41 1853 0 1795 63 1757 curveto +114 1730 166 1722 301 1722 curveto +384 1722 lineto +384 -576 lineto +301 -576 lineto +177 -576 130 -581 83 -612 curveto +6 -658 -41 -745 -41 -832 curveto +-41 -914 0 -991 62 -1037 curveto +114 -1078 170 -1088 299 -1088 curveto +1197 -1088 lineto +1310 -1088 1372 -1078 1413 -1052 curveto +1491 -1001 1537 -919 1537 -832 curveto +1537 -750 1501 -673 1434 -622 curveto +1382 -586 1330 -576 1196 -576 curveto +896 -576 lineto +896 351 lineto +1667 1722 moveto +1879 1722 2049 1679 2184 1584 curveto +2334 1483 2432 1307 2432 1149 curveto +2432 815 2111 576 1667 576 curveto +1211 576 896 815 896 1154 curveto +896 1307 994 1483 1144 1584 curveto +1279 1679 1449 1722 1667 1722 curveto +end_ol grestore +gsave 15.301733 11.475000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 15.716600 11.475000 translate 0.035278 -0.035278 scale +start_ol +1792 2240 moveto +855 2240 lineto +718 2240 676 2235 628 2204 curveto +549 2157 502 2069 502 1981 curveto +502 1898 544 1820 611 1774 curveto +658 1732 720 1722 850 1722 curveto +1280 1722 lineto +1280 518 lineto +621 518 lineto +486 518 450 513 403 482 curveto +326 435 279 347 279 259 curveto +279 176 321 98 389 52 curveto +431 16 504 0 624 0 curveto +2422 0 lineto +2527 0 2605 16 2642 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 2240 lineto +1728 3200 moveto +1088 3200 lineto +1088 2656 lineto +1728 2656 lineto +1728 3200 lineto +end_ol grestore +gsave 16.131467 11.475000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 16.546333 11.475000 translate 0.035278 -0.035278 scale +start_ol +1984 0 moveto +2583 0 lineto +2691 0 2762 12 2798 43 curveto +2875 99 2921 203 2921 308 curveto +2921 375 2880 438 2817 480 curveto +2766 510 2719 518 2579 518 curveto +2496 518 lineto +2496 1562 lineto +2496 1988 2112 2240 1473 2240 curveto +1213 2240 829 2173 580 2085 curveto +476 2048 424 1976 424 1867 curveto +424 1785 534 1722 681 1722 curveto +728 1722 801 1722 890 1722 curveto +1131 1722 1324 1722 1497 1722 curveto +1832 1722 1984 1660 1984 1519 curveto +1984 1423 lineto +1772 1457 1611 1472 1445 1472 curveto +984 1472 627 1346 394 1104 curveto +270 973 192 804 192 654 curveto +192 295 612 0 1124 0 curveto +1430 0 1735 51 1984 142 curveto +1984 0 lineto +1984 702 moveto +1692 579 1394 518 1108 518 curveto +879 518 704 595 704 694 curveto +704 866 1033 1024 1394 1024 curveto +1575 1024 1772 1003 1984 966 curveto +1984 702 lineto +end_ol grestore +gsave 16.961200 11.475000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 17.376067 11.475000 translate 0.035278 -0.035278 scale +start_ol +1255 -15 moveto +969 -576 lineto +451 -576 lineto +327 -576 280 -586 233 -612 curveto +156 -658 109 -745 109 -832 curveto +109 -914 150 -991 218 -1037 curveto +264 -1078 321 -1088 451 -1088 curveto +1566 -1088 lineto +1680 -1088 1742 -1078 1783 -1052 curveto +1861 -1001 1908 -919 1908 -832 curveto +1908 -750 1866 -673 1804 -622 curveto +1752 -586 1700 -576 1566 -576 curveto +1540 -576 lineto +2732 1720 lineto +2903 1736 3002 1829 3002 1980 curveto +3002 2063 2965 2141 2893 2193 curveto +2846 2230 2794 2240 2659 2240 curveto +2182 2240 lineto +2141 2240 2131 2240 2074 2230 curveto +1923 2214 1835 2120 1835 1980 curveto +1835 1814 1954 1720 2167 1720 curveto +1545 562 lineto +954 1720 lineto +1151 1725 1260 1819 1260 1980 curveto +1260 2063 1218 2141 1156 2193 curveto +1104 2230 1052 2240 918 2240 curveto +451 2240 lineto +415 2240 404 2240 347 2230 curveto +197 2214 109 2120 109 1980 curveto +109 1834 202 1741 363 1720 curveto +1255 -15 lineto +end_ol grestore +gsave 17.790933 11.475000 translate 0.035278 -0.035278 scale +start_ol +895 3276 moveto +744 3276 630 3162 630 3022 curveto +630 2960 640 2929 692 2846 curveto +1050 2265 1216 1768 1216 1239 curveto +1216 715 1055 218 692 -363 curveto +640 -446 630 -477 630 -539 curveto +630 -679 744 -793 895 -793 curveto +1009 -793 1071 -746 1190 -565 curveto +1569 5 1792 669 1792 1223 curveto +1792 1794 1605 2390 1237 2976 curveto +1087 3219 1019 3276 895 3276 curveto +end_ol grestore +0.870588 0.870588 0.870588 srgb +n 16.150000 4.000000 m 16.150000 7.250000 l 22.350000 7.250000 l 22.350000 4.000000 l f +n 16.150000 4.400000 m 16.150000 4.400000 0.400000 0.400000 180.000000 270.000000 ellipse f +n 22.350000 4.400000 m 22.350000 4.400000 0.400000 0.400000 270.000000 360.000000 ellipse f +n 15.750000 4.400000 m 15.750000 6.850000 l 22.750000 6.850000 l 22.750000 4.400000 l f +n 16.150000 6.850000 m 16.150000 6.850000 0.400000 0.400000 90.000000 180.000000 ellipse f +n 22.350000 6.850000 m 22.350000 6.850000 0.400000 0.400000 0.000000 90.000000 ellipse f +0.050000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 16.150000 4.000000 m 22.350000 4.000000 l s +n 16.150000 7.250000 m 22.350000 7.250000 l s +n 16.150000 4.400000 0.400000 0.400000 180.000000 270.000000 ellipse s +n 22.350000 4.400000 0.400000 0.400000 270.000000 360.000000 ellipse s +n 15.750000 4.400000 m 15.750000 6.850000 l s +n 22.750000 4.400000 m 22.750000 6.850000 l s +n 16.150000 6.850000 0.400000 0.400000 90.000000 180.000000 ellipse s +n 22.350000 6.850000 0.400000 0.400000 0.000000 90.000000 ellipse s +gsave 17.378867 5.375000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 17.793733 5.375000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 18.208600 5.375000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 18.623467 5.375000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 19.038333 5.375000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 19.453200 5.375000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 19.868067 5.375000 translate 0.035278 -0.035278 scale +start_ol +1088 1722 moveto +2026 1722 lineto +2140 1722 2202 1732 2244 1758 curveto +2321 1805 2368 1893 2368 1981 curveto +2368 2064 2327 2142 2264 2193 curveto +2207 2230 2166 2240 2026 2240 curveto +1088 2240 lineto +1088 2679 lineto +1088 2809 1083 2843 1052 2888 curveto +1006 2963 919 3008 832 3008 curveto +750 3008 673 2968 627 2908 curveto +586 2858 576 2809 576 2679 curveto +576 2240 lineto +395 2240 lineto +260 2240 224 2235 177 2204 curveto +99 2157 52 2069 52 1981 curveto +52 1903 94 1820 156 1774 curveto +208 1732 265 1722 395 1722 curveto +576 1722 lineto +576 699 lineto +576 268 943 0 1532 0 curveto +1801 0 2209 88 2463 207 curveto +2659 295 2721 363 2721 487 curveto +2721 622 2612 732 2472 732 curveto +2415 732 2379 722 2291 680 curveto +2057 570 1809 518 1534 518 curveto +1337 518 1192 551 1129 613 curveto +1098 646 1088 689 1088 789 curveto +1088 1722 lineto +end_ol grestore +gsave 20.282933 5.375000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 20.697800 5.375000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +gsave 17.679433 6.275000 translate 0.035278 -0.035278 scale +start_ol +2241 3276 moveto +2127 3276 2065 3230 1946 3043 curveto +1567 2478 1344 1814 1344 1260 curveto +1344 689 1531 93 1899 -492 curveto +2050 -736 2117 -793 2241 -793 curveto +2392 -793 2506 -679 2506 -539 curveto +2506 -477 2496 -446 2444 -363 curveto +2086 218 1920 715 1920 1244 curveto +1920 1768 2081 2265 2444 2846 curveto +2496 2929 2506 2960 2506 3022 curveto +2506 3162 2392 3276 2241 3276 curveto +end_ol grestore +gsave 18.094300 6.275000 translate 0.035278 -0.035278 scale +start_ol +896 3137 moveto +299 3137 lineto +175 3137 129 3132 83 3101 curveto +5 3054 -41 2966 -41 2878 curveto +-41 2795 0 2717 63 2665 curveto +114 2628 166 2618 301 2618 curveto +384 2618 lineto +384 518 lineto +301 518 lineto +171 518 130 514 83 492 curveto +6 458 -41 395 -41 332 curveto +-41 226 0 126 62 60 curveto +108 20 175 0 299 0 curveto +896 0 lineto +896 254 lineto +1164 67 1371 0 1675 0 curveto +2057 0 2346 101 2583 313 curveto +2820 530 2944 804 2944 1118 curveto +2944 1436 2820 1715 2583 1927 curveto +2346 2139 2057 2240 1670 2240 curveto +1360 2240 1118 2157 896 1981 curveto +896 3137 lineto +1667 1722 moveto +1915 1722 2080 1667 2230 1540 curveto +2354 1427 2432 1272 2432 1122 curveto +2432 968 2360 813 2230 700 curveto +2085 577 1910 518 1667 518 curveto +1211 518 896 768 896 1127 curveto +896 1277 968 1427 1098 1540 curveto +1243 1667 1413 1722 1667 1722 curveto +end_ol grestore +gsave 18.509167 6.275000 translate 0.035278 -0.035278 scale +start_ol +1984 0 moveto +2583 0 lineto +2691 0 2762 12 2798 43 curveto +2875 99 2921 203 2921 308 curveto +2921 375 2880 438 2817 480 curveto +2766 510 2719 518 2579 518 curveto +2496 518 lineto +2496 1562 lineto +2496 1988 2112 2240 1473 2240 curveto +1213 2240 829 2173 580 2085 curveto +476 2048 424 1976 424 1867 curveto +424 1785 534 1722 681 1722 curveto +728 1722 801 1722 890 1722 curveto +1131 1722 1324 1722 1497 1722 curveto +1832 1722 1984 1660 1984 1519 curveto +1984 1423 lineto +1772 1457 1611 1472 1445 1472 curveto +984 1472 627 1346 394 1104 curveto +270 973 192 804 192 654 curveto +192 295 612 0 1124 0 curveto +1430 0 1735 51 1984 142 curveto +1984 0 lineto +1984 702 moveto +1692 579 1394 518 1108 518 curveto +879 518 704 595 704 694 curveto +704 866 1033 1024 1394 1024 curveto +1575 1024 1772 1003 1984 966 curveto +1984 702 lineto +end_ol grestore +gsave 18.924033 6.275000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 19.338900 6.275000 translate 0.035278 -0.035278 scale +start_ol +1088 843 moveto +1181 914 lineto +1715 451 lineto +1653 384 1632 332 1632 259 curveto +1632 88 1746 0 1974 0 curveto +2586 0 lineto +2701 0 2768 10 2810 36 curveto +2887 88 2934 171 2934 259 curveto +2934 342 2892 420 2825 471 curveto +2773 508 2731 518 2586 518 curveto +2415 518 lineto +1586 1234 lineto +2197 1722 lineto +2343 1722 lineto +2462 1722 2519 1732 2561 1758 curveto +2638 1810 2685 1893 2685 1981 curveto +2685 2064 2649 2142 2581 2193 curveto +2529 2230 2472 2240 2343 2240 curveto +1762 2240 lineto +1638 2240 1581 2230 1539 2204 curveto +1462 2152 1415 2069 1415 1981 curveto +1415 1908 1436 1862 1498 1789 curveto +1088 1468 lineto +1088 3209 lineto +476 3209 lineto +350 3209 302 3204 255 3173 curveto +175 3126 128 3038 128 2950 curveto +128 2867 172 2789 237 2738 curveto +292 2701 347 2691 489 2691 curveto +576 2691 lineto +576 518 lineto +489 518 lineto +352 518 308 513 259 482 curveto +177 435 128 347 128 259 curveto +128 88 244 0 476 0 curveto +1088 0 lineto +1088 843 lineto +end_ol grestore +gsave 19.753767 6.275000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 20.168633 6.275000 translate 0.035278 -0.035278 scale +start_ol +896 351 moveto +1164 146 1391 64 1696 64 curveto +2413 64 2944 514 2944 1122 curveto +2944 1760 2407 2240 1685 2240 curveto +1365 2240 1149 2157 896 1940 curveto +896 2240 lineto +299 2240 lineto +175 2240 129 2227 83 2194 curveto +5 2136 -41 2025 -41 1914 curveto +-41 1853 0 1795 63 1757 curveto +114 1730 166 1722 301 1722 curveto +384 1722 lineto +384 -576 lineto +301 -576 lineto +177 -576 130 -581 83 -612 curveto +6 -658 -41 -745 -41 -832 curveto +-41 -914 0 -991 62 -1037 curveto +114 -1078 170 -1088 299 -1088 curveto +1197 -1088 lineto +1310 -1088 1372 -1078 1413 -1052 curveto +1491 -1001 1537 -919 1537 -832 curveto +1537 -750 1501 -673 1434 -622 curveto +1382 -586 1330 -576 1196 -576 curveto +896 -576 lineto +896 351 lineto +1667 1722 moveto +1879 1722 2049 1679 2184 1584 curveto +2334 1483 2432 1307 2432 1149 curveto +2432 815 2111 576 1667 576 curveto +1211 576 896 815 896 1154 curveto +896 1307 994 1483 1144 1584 curveto +1279 1679 1449 1722 1667 1722 curveto +end_ol grestore +gsave 20.583500 6.275000 translate 0.035278 -0.035278 scale +start_ol +895 3276 moveto +744 3276 630 3162 630 3022 curveto +630 2960 640 2929 692 2846 curveto +1050 2265 1216 1768 1216 1239 curveto +1216 715 1055 218 692 -363 curveto +640 -446 630 -477 630 -539 curveto +630 -679 744 -793 895 -793 curveto +1009 -793 1071 -746 1190 -565 curveto +1569 5 1792 669 1792 1223 curveto +1792 1794 1605 2390 1237 2976 curveto +1087 3219 1019 3276 895 3276 curveto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.462745 0.619608 0.462745 srgb +n 2.001777 4.500000 m 6.008883 4.500000 l 6.562150 4.500000 7.010660 4.891751 7.010660 5.375000 c 7.010660 5.858249 6.562150 6.250000 6.008883 6.250000 c 2.001777 6.250000 l 1.448510 6.250000 1.000000 5.858249 1.000000 5.375000 c 1.000000 4.891751 1.448510 4.500000 2.001777 4.500000 c f +0.000000 0.000000 0.000000 srgb +n 2.001777 4.500000 m 6.008883 4.500000 l 6.562150 4.500000 7.010660 4.891751 7.010660 5.375000 c 7.010660 5.858249 6.562150 6.250000 6.008883 6.250000 c 2.001777 6.250000 l 1.448510 6.250000 1.000000 5.858249 1.000000 5.375000 c 1.000000 4.891751 1.448510 4.500000 2.001777 4.500000 c s +gsave 2.367030 5.575000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 2.781897 5.575000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 3.196763 5.575000 translate 0.035278 -0.035278 scale +start_ol +1552 2240 moveto +781 2240 192 1755 192 1120 curveto +192 495 786 0 1536 0 curveto +2286 0 2880 495 2880 1120 curveto +2880 1740 2286 2240 1552 2240 curveto +1547 1722 moveto +2005 1722 2368 1455 2368 1120 curveto +2368 781 2005 518 1536 518 curveto +1067 518 704 781 704 1120 curveto +704 1464 1067 1722 1547 1722 curveto +end_ol grestore +gsave 3.611630 5.575000 translate 0.035278 -0.035278 scale +start_ol +1024 2240 moveto +541 2240 lineto +499 2240 489 2240 433 2228 curveto +283 2210 196 2103 196 1942 curveto +196 1760 310 1664 512 1658 curveto +512 492 lineto +481 492 lineto +351 492 310 482 263 458 curveto +186 413 139 330 139 246 curveto +139 172 180 93 241 49 curveto +293 15 354 0 477 0 curveto +1050 0 lineto +1158 0 1224 10 1265 34 curveto +1342 84 1388 162 1388 246 curveto +1388 325 1348 399 1282 448 curveto +1231 482 1191 492 1054 492 curveto +1024 492 lineto +1024 1387 lineto +1262 1638 1424 1722 1657 1722 curveto +1970 1722 2112 1609 2112 1368 curveto +2112 492 lineto +1914 492 1803 403 1803 246 curveto +1803 84 1916 0 2146 0 curveto +2602 0 lineto +2710 0 2776 10 2817 34 curveto +2894 79 2940 162 2940 246 curveto +2940 403 2826 492 2624 492 curveto +2624 1387 lineto +2624 1687 2527 1900 2324 2052 curveto +2157 2174 1948 2240 1720 2240 curveto +1441 2240 1268 2170 1024 1954 curveto +1024 2240 lineto +end_ol grestore +gsave 4.026497 5.575000 translate 0.035278 -0.035278 scale +start_ol +1088 1722 moveto +2026 1722 lineto +2140 1722 2202 1732 2244 1758 curveto +2321 1805 2368 1893 2368 1981 curveto +2368 2064 2327 2142 2264 2193 curveto +2207 2230 2166 2240 2026 2240 curveto +1088 2240 lineto +1088 2679 lineto +1088 2809 1083 2843 1052 2888 curveto +1006 2963 919 3008 832 3008 curveto +750 3008 673 2968 627 2908 curveto +586 2858 576 2809 576 2679 curveto +576 2240 lineto +395 2240 lineto +260 2240 224 2235 177 2204 curveto +99 2157 52 2069 52 1981 curveto +52 1903 94 1820 156 1774 curveto +208 1732 265 1722 395 1722 curveto +576 1722 lineto +576 699 lineto +576 268 943 0 1532 0 curveto +1801 0 2209 88 2463 207 curveto +2659 295 2721 363 2721 487 curveto +2721 622 2612 732 2472 732 curveto +2415 732 2379 722 2291 680 curveto +2057 570 1809 518 1534 518 curveto +1337 518 1192 551 1129 613 curveto +1098 646 1088 689 1088 789 curveto +1088 1722 lineto +end_ol grestore +gsave 4.441363 5.575000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 4.856230 5.575000 translate 0.035278 -0.035278 scale +start_ol +1552 2240 moveto +781 2240 192 1755 192 1120 curveto +192 495 786 0 1536 0 curveto +2286 0 2880 495 2880 1120 curveto +2880 1740 2286 2240 1552 2240 curveto +1547 1722 moveto +2005 1722 2368 1455 2368 1120 curveto +2368 781 2005 518 1536 518 curveto +1067 518 704 781 704 1120 curveto +704 1464 1067 1722 1547 1722 curveto +end_ol grestore +gsave 5.271097 5.575000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +0.462745 0.619608 0.462745 srgb +n 9.250000 18.000000 m 9.250000 20.000000 l 12.750000 20.000000 l 12.750000 18.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.250000 18.000000 m 9.250000 20.000000 l 12.750000 20.000000 l 12.750000 18.000000 l cp s +gsave 9.751167 19.200000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 10.166033 19.200000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 10.580900 19.200000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 10.995767 19.200000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 11.410633 19.200000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 11.825500 19.200000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +0.462745 0.619608 0.462745 srgb +n 19.500000 18.000000 m 19.500000 20.000000 l 23.000000 20.000000 l 23.000000 18.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.500000 18.000000 m 19.500000 20.000000 l 23.000000 20.000000 l 23.000000 18.000000 l cp s +gsave 20.001167 19.200000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 20.416033 19.200000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 20.830900 19.200000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 21.245767 19.200000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 21.660633 19.200000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 22.075500 19.200000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +0.462745 0.619608 0.462745 srgb +n 13.500000 18.000000 m 13.500000 20.000000 l 17.000000 20.000000 l 17.000000 18.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 13.500000 18.000000 m 13.500000 20.000000 l 17.000000 20.000000 l 17.000000 18.000000 l cp s +gsave 14.001167 19.200000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 14.416033 19.200000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 14.830900 19.200000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 15.245767 19.200000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 15.660633 19.200000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 16.075500 19.200000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +0.200000 slw +[1.000000] 0 sd +[0.200000] 0 sd +0 slc +n 17.500000 19.000000 m 19.000000 19.000000 l s +1.000000 1.000000 1.000000 srgb +gsave 3.000000 2.500000 translate 0.035278 -0.035278 scale +start_ol +3200 4224 moveto +3200 1357 lineto +3200 808 2787 472 2106 472 curveto +1792 472 1536 545 1332 685 curveto +1123 842 1024 1049 1024 1357 curveto +1024 4224 lineto +512 4224 lineto +512 1348 lineto +512 517 1118 0 2106 0 curveto +3083 0 3712 528 3712 1348 curveto +3712 4224 lineto +3200 4224 lineto +end_ol grestore +gsave 3.550333 2.500000 translate 0.035278 -0.035278 scale +start_ol +2624 2128 moveto +2624 2691 2211 3008 1476 3008 curveto +736 3008 256 2675 256 2162 curveto +256 1729 496 1522 1204 1364 curveto +1649 1263 lineto +1981 1189 2112 1078 2112 878 curveto +2112 618 1835 444 1421 444 curveto +1167 444 952 512 833 626 curveto +759 704 725 782 697 974 curveto +256 974 lineto +256 316 638 0 1409 0 curveto +2152 0 2624 344 2624 878 curveto +2624 1290 2373 1517 1779 1649 curveto +1322 1750 lineto +934 1834 768 1951 768 2146 curveto +768 2400 1038 2564 1465 2564 curveto +1886 2564 2112 2413 2112 2128 curveto +2624 2128 lineto +end_ol grestore +gsave 3.931333 2.500000 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 4.354667 2.500000 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1561 lineto +896 1992 1005 2273 1236 2440 curveto +1386 2549 1530 2583 1864 2589 curveto +1864 3008 lineto +1781 3008 1740 3008 1675 3008 curveto +1357 3008 1115 2849 832 2463 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 3.000000 3.500000 translate 0.035278 -0.035278 scale +start_ol +3769 2899 moveto +3603 3790 3077 4224 2161 4224 curveto +1601 4224 1149 4053 840 3721 curveto +462 3323 256 2748 256 2095 curveto +256 1432 468 862 863 470 curveto +1183 149 1595 0 2138 0 curveto +3157 0 3729 533 3855 1604 curveto +3302 1604 lineto +3256 1331 3198 1145 3112 986 curveto +2939 658 2582 472 2133 472 curveto +1298 472 768 1106 768 2101 curveto +768 3123 1275 3752 2087 3752 curveto +2427 3752 2744 3654 2917 3500 curveto +3072 3364 3159 3194 3222 2899 curveto +3769 2899 lineto +end_ol grestore +gsave 3.550333 3.500000 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 3.973667 3.500000 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 4.608667 3.500000 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 5.243667 3.500000 translate 0.035278 -0.035278 scale +start_ol +3115 414 moveto +3063 420 3040 420 3011 420 curveto +2844 420 2752 492 2752 618 curveto +2752 2221 lineto +2752 2733 2333 3008 1538 3008 curveto +1070 3008 681 2888 466 2675 curveto +318 2528 256 2364 256 2080 curveto +881 2080 lineto +921 2413 1136 2564 1577 2564 curveto +2002 2564 2240 2416 2240 2152 curveto +2240 2035 lineto +2240 1850 2120 1771 1743 1729 curveto +1068 1649 965 1628 782 1560 curveto +433 1427 256 1179 256 819 curveto +256 317 634 0 1240 0 curveto +1618 0 1921 132 2259 441 curveto +2295 137 2451 0 2774 0 curveto +2876 0 2953 12 3115 54 curveto +3115 414 lineto +2240 1019 moveto +2240 873 2195 784 2053 665 curveto +1861 503 1629 420 1351 420 curveto +983 420 768 581 768 857 curveto +768 1144 977 1289 1481 1357 curveto +1980 1420 2081 1440 2240 1508 curveto +2240 1019 lineto +end_ol grestore +gsave 5.667000 3.500000 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 6.090333 3.500000 translate 0.035278 -0.035278 scale +start_ol +2880 4224 moveto +2368 4224 lineto +2368 2543 lineto +2165 2847 1840 3008 1434 3008 curveto +644 3008 128 2425 128 1531 curveto +128 583 621 0 1421 0 curveto +1829 0 2113 153 2368 522 curveto +2368 0 lineto +2880 0 lineto +2880 4224 lineto +1518 2559 moveto +2039 2559 2368 2143 2368 1494 curveto +2368 865 2033 449 1524 449 curveto +993 449 640 870 640 1504 curveto +640 2138 993 2559 1518 2559 curveto +end_ol grestore +gsave 6.513667 3.500000 translate 0.035278 -0.035278 scale +start_ol +2624 2128 moveto +2624 2691 2211 3008 1476 3008 curveto +736 3008 256 2675 256 2162 curveto +256 1729 496 1522 1204 1364 curveto +1649 1263 lineto +1981 1189 2112 1078 2112 878 curveto +2112 618 1835 444 1421 444 curveto +1167 444 952 512 833 626 curveto +759 704 725 782 697 974 curveto +256 974 lineto +256 316 638 0 1409 0 curveto +2152 0 2624 344 2624 878 curveto +2624 1290 2373 1517 1779 1649 curveto +1322 1750 lineto +934 1834 768 1951 768 2146 curveto +768 2400 1038 2564 1465 2564 curveto +1886 2564 2112 2413 2112 2128 curveto +2624 2128 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.901961 0.901961 0.980392 srgb +n 1.500000 1.750000 m 0.912500 1.000000 l 0.625000 1.237500 l 1.387500 2.212500 l 0.975000 3.675000 l 1.437500 3.675000 l 1.687500 2.725000 l 1.925000 3.675000 l 2.350000 3.675000 l 2.025000 2.425000 l 2.662500 2.800000 l 2.837500 2.475000 l 1.962500 1.925000 l 1.925000 1.737500 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 1.725000 1.484686 0.338980 0.338980 121.081372 58.918628 ellipse s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.678431 0.847059 0.901961 srgb +n 19.116694 13.159597 m 19.905600 13.811500 20.905600 15.911500 21.119835 17.210660 c s +0 slj +n 19.275943 12.966880 m 18.500000 12.650000 l 18.957444 13.352314 l f +0 slj +n 20.873167 17.251337 m 21.250000 18.000000 l 21.366504 17.169984 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.932418 13.384263 m 15.055600 15.411500 15.205600 16.111500 15.231197 17.200221 c s +0 slj +n 16.161875 13.483507 m 16.250000 12.650000 l 15.702961 13.285018 l f +0 slj +n 14.981266 17.206097 m 15.250000 18.000000 l 15.481128 17.194345 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 13.336446 13.096873 m 11.755600 14.161500 11.055600 16.111500 11.023543 17.200346 c s +0 slj +n 13.476094 13.304234 m 14.000000 12.650000 l 13.196798 12.889513 l f +0 slj +n 10.773651 17.192989 m 11.000000 18.000000 l 11.273435 17.207704 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.968143 17.799897 m 4.055630 23.261500 17.155600 23.861500 20.668004 20.548890 c s +0 slj +n 4.218111 17.795893 m 3.955330 17.000000 l 3.718175 17.803902 l f +0 slj +n 20.839532 20.730764 m 21.250000 20.000000 l 20.496476 20.367017 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.972726 17.799811 m 4.055630 21.611500 11.605600 23.411500 14.665961 20.546716 c s +0 slj +n 4.222667 17.794375 m 3.955330 17.000000 l 3.722785 17.805247 l f +0 slj +n 14.836809 20.729228 m 15.250000 20.000000 l 14.495112 20.364203 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.971625 17.799834 m 4.007410 19.556300 7.005630 22.561500 10.326574 20.431853 c s +0 slj +n 4.221573 17.794742 m 3.955330 17.000000 l 3.721677 17.804926 l f +0 slj +n 10.461528 20.642299 m 11.000000 20.000000 l 10.191620 20.221407 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.088617 15.449091 m 7.555630 14.711500 9.605630 12.611500 11.009171 12.039446 c s +0 slj +n 6.877396 15.315355 m 6.660660 16.125000 l 7.299839 15.582828 l f +0 slj +n 11.103529 12.270956 m 11.750000 11.737500 l 10.914812 11.807937 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.255303 13.089837 m 8.630940 11.851800 10.345700 11.324200 10.996210 11.092957 c s +0 slj +n 7.088065 12.904011 m 6.660660 13.625000 l 7.422542 13.275663 l f +0 slj +n 11.079947 11.328516 m 11.750000 10.825000 l 10.912474 10.857398 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.419391 10.621373 m 8.595580 10.228200 10.345700 9.980740 10.950943 9.951329 c s +0 slj +n 7.340133 10.384270 m 6.660660 10.875000 l 7.498650 10.858477 l f +0 slj +n 10.963077 10.201034 m 11.750000 9.912500 l 10.938809 9.701624 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.459827 8.088497 m 8.850000 8.025000 10.425000 8.475000 11.136373 8.791749 c s +0 slj +n 7.448420 7.838758 m 6.660660 8.125000 l 7.471234 8.338237 l f +0 slj +n 11.034682 9.020132 m 11.867200 9.117160 l 11.238064 8.563366 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.810481 5.358086 m 9.375000 5.325000 13.875000 5.700000 13.969719 8.200573 c s +0 slj +n 7.805195 5.108142 m 7.010660 5.375000 l 7.815767 5.608030 l f +0 slj +n 13.719898 8.210036 m 14.000000 9.000000 l 14.219540 8.191110 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.255935 7.849971 m 19.261065 8.368599 l s +0 slj +n 19.505923 7.847498 m 19.250000 7.250000 l 19.005947 7.852444 l f +0 slj +n 19.011077 8.371072 m 19.267000 8.968570 l 19.511053 8.366126 l f +1.000000 1.000000 1.000000 srgb +gsave 21.329800 8.843570 translate 0.035278 -0.035278 scale +start_ol +3769 2899 moveto +3603 3790 3077 4224 2161 4224 curveto +1601 4224 1149 4053 840 3721 curveto +462 3323 256 2748 256 2095 curveto +256 1432 468 862 863 470 curveto +1183 149 1595 0 2138 0 curveto +3157 0 3729 533 3855 1604 curveto +3302 1604 lineto +3256 1331 3198 1145 3112 986 curveto +2939 658 2582 472 2133 472 curveto +1298 472 768 1106 768 2101 curveto +768 3123 1275 3752 2087 3752 curveto +2427 3752 2744 3654 2917 3500 curveto +3072 3364 3159 3194 3222 2899 curveto +3769 2899 lineto +end_ol grestore +gsave 21.880133 8.843570 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 22.303467 8.843570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 22.726800 8.843570 translate 0.035278 -0.035278 scale +start_ol +1519 3008 moveto +1024 3008 lineto +1024 3837 lineto +512 3837 lineto +512 3008 lineto +103 3008 lineto +103 2616 lineto +512 2616 lineto +512 469 lineto +512 170 727 0 1114 0 curveto +1233 0 1352 11 1519 40 curveto +1519 436 lineto +1456 420 1381 420 1289 420 curveto +1082 420 1024 474 1024 674 curveto +1024 2616 lineto +1519 2616 lineto +1519 3008 lineto +end_ol grestore +gsave 22.938467 8.843570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1561 lineto +896 1992 1005 2273 1236 2440 curveto +1386 2549 1530 2583 1864 2589 curveto +1864 3008 lineto +1781 3008 1740 3008 1675 3008 curveto +1357 3008 1115 2849 832 2463 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 23.192467 8.843570 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 23.615800 8.843570 translate 0.035278 -0.035278 scale +start_ol +896 4224 moveto +384 4224 lineto +384 0 lineto +896 0 lineto +896 4224 lineto +end_ol grestore +gsave 23.785133 8.843570 translate 0.035278 -0.035278 scale +start_ol +896 4224 moveto +384 4224 lineto +384 0 lineto +896 0 lineto +896 4224 lineto +end_ol grestore +gsave 23.954467 8.843570 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 24.377800 8.843570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1561 lineto +896 1992 1005 2273 1236 2440 curveto +1386 2549 1530 2583 1864 2589 curveto +1864 3008 lineto +1781 3008 1740 3008 1675 3008 curveto +1357 3008 1115 2849 832 2463 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 21.417600 9.593570 translate 0.035278 -0.035278 scale +start_ol +2880 4224 moveto +2368 4224 lineto +2368 2543 lineto +2165 2847 1840 3008 1434 3008 curveto +644 3008 128 2425 128 1531 curveto +128 583 621 0 1421 0 curveto +1829 0 2113 153 2368 522 curveto +2368 0 lineto +2880 0 lineto +2880 4224 lineto +1518 2559 moveto +2039 2559 2368 2143 2368 1494 curveto +2368 865 2033 449 1524 449 curveto +993 449 640 870 640 1504 curveto +640 2138 993 2559 1518 2559 curveto +end_ol grestore +gsave 21.840933 9.593570 translate 0.035278 -0.035278 scale +start_ol +3115 414 moveto +3063 420 3040 420 3011 420 curveto +2844 420 2752 492 2752 618 curveto +2752 2221 lineto +2752 2733 2333 3008 1538 3008 curveto +1070 3008 681 2888 466 2675 curveto +318 2528 256 2364 256 2080 curveto +881 2080 lineto +921 2413 1136 2564 1577 2564 curveto +2002 2564 2240 2416 2240 2152 curveto +2240 2035 lineto +2240 1850 2120 1771 1743 1729 curveto +1068 1649 965 1628 782 1560 curveto +433 1427 256 1179 256 819 curveto +256 317 634 0 1240 0 curveto +1618 0 1921 132 2259 441 curveto +2295 137 2451 0 2774 0 curveto +2876 0 2953 12 3115 54 curveto +3115 414 lineto +2240 1019 moveto +2240 873 2195 784 2053 665 curveto +1861 503 1629 420 1351 420 curveto +983 420 768 581 768 857 curveto +768 1144 977 1289 1481 1357 curveto +1980 1420 2081 1440 2240 1508 curveto +2240 1019 lineto +end_ol grestore +gsave 22.264267 9.593570 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 22.687600 9.593570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 23.322600 9.593570 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 23.745933 9.593570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 24.169267 9.593570 translate 0.035278 -0.035278 scale +start_ol +2624 2128 moveto +2624 2691 2211 3008 1476 3008 curveto +736 3008 256 2675 256 2162 curveto +256 1729 496 1522 1204 1364 curveto +1649 1263 lineto +1981 1189 2112 1078 2112 878 curveto +2112 618 1835 444 1421 444 curveto +1167 444 952 512 833 626 curveto +759 704 725 782 697 974 curveto +256 974 lineto +256 316 638 0 1409 0 curveto +2152 0 2624 344 2624 878 curveto +2624 1290 2373 1517 1779 1649 curveto +1322 1750 lineto +934 1834 768 1951 768 2146 curveto +768 2400 1038 2564 1465 2564 curveto +1886 2564 2112 2413 2112 2128 curveto +2624 2128 lineto +end_ol grestore +gsave 23.320533 18.817300 translate 0.035278 -0.035278 scale +start_ol +3769 2899 moveto +3603 3790 3077 4224 2161 4224 curveto +1601 4224 1149 4053 840 3721 curveto +462 3323 256 2748 256 2095 curveto +256 1432 468 862 863 470 curveto +1183 149 1595 0 2138 0 curveto +3157 0 3729 533 3855 1604 curveto +3302 1604 lineto +3256 1331 3198 1145 3112 986 curveto +2939 658 2582 472 2133 472 curveto +1298 472 768 1106 768 2101 curveto +768 3123 1275 3752 2087 3752 curveto +2427 3752 2744 3654 2917 3500 curveto +3072 3364 3159 3194 3222 2899 curveto +3769 2899 lineto +end_ol grestore +gsave 23.870867 18.817300 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 24.294200 18.817300 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 24.929200 18.817300 translate 0.035278 -0.035278 scale +start_ol +320 -1270 moveto +832 -1270 lineto +832 449 lineto +1081 138 1358 0 1742 0 curveto +2505 0 3008 583 3008 1477 curveto +3008 2419 2517 3008 1722 3008 curveto +1317 3008 991 2827 768 2476 curveto +768 3008 lineto +320 3008 lineto +320 -1270 lineto +1647 2559 moveto +2161 2559 2496 2138 2496 1488 curveto +2496 870 2155 449 1647 449 curveto +1156 449 832 865 832 1504 curveto +832 2143 1156 2559 1647 2559 curveto +end_ol grestore +gsave 25.352533 18.817300 translate 0.035278 -0.035278 scale +start_ol +2816 0 moveto +2816 3008 lineto +2304 3008 lineto +2304 1386 lineto +2304 802 1990 420 1502 420 curveto +1132 420 896 638 896 982 curveto +896 3008 lineto +384 3008 lineto +384 786 lineto +384 308 749 0 1322 0 curveto +1754 0 2029 154 2304 546 curveto +2304 0 lineto +2816 0 lineto +end_ol grestore +gsave 25.775867 18.817300 translate 0.035278 -0.035278 scale +start_ol +1519 3008 moveto +1024 3008 lineto +1024 3837 lineto +512 3837 lineto +512 3008 lineto +103 3008 lineto +103 2616 lineto +512 2616 lineto +512 469 lineto +512 170 727 0 1114 0 curveto +1233 0 1352 11 1519 40 curveto +1519 436 lineto +1456 420 1381 420 1289 420 curveto +1082 420 1024 474 1024 674 curveto +1024 2616 lineto +1519 2616 lineto +1519 3008 lineto +end_ol grestore +gsave 25.987533 18.817300 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 26.410867 18.817300 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 26.622533 18.817300 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 27.045867 18.817300 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 27.469200 18.817300 translate 0.035278 -0.035278 scale +start_ol +2880 4224 moveto +2368 4224 lineto +2368 2543 lineto +2165 2847 1840 3008 1434 3008 curveto +644 3008 128 2425 128 1531 curveto +128 583 621 0 1421 0 curveto +1829 0 2113 153 2368 522 curveto +2368 0 lineto +2880 0 lineto +2880 4224 lineto +1518 2559 moveto +2039 2559 2368 2143 2368 1494 curveto +2368 865 2033 449 1524 449 curveto +993 449 640 870 640 1504 curveto +640 2138 993 2559 1518 2559 curveto +end_ol grestore +gsave 27.892533 18.817300 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 24.242400 19.514800 translate 0.035278 -0.035278 scale +start_ol +2880 4224 moveto +2368 4224 lineto +2368 2543 lineto +2165 2847 1840 3008 1434 3008 curveto +644 3008 128 2425 128 1531 curveto +128 583 621 0 1421 0 curveto +1829 0 2113 153 2368 522 curveto +2368 0 lineto +2880 0 lineto +2880 4224 lineto +1518 2559 moveto +2039 2559 2368 2143 2368 1494 curveto +2368 865 2033 449 1524 449 curveto +993 449 640 870 640 1504 curveto +640 2138 993 2559 1518 2559 curveto +end_ol grestore +gsave 24.665733 19.514800 translate 0.035278 -0.035278 scale +start_ol +3115 414 moveto +3063 420 3040 420 3011 420 curveto +2844 420 2752 492 2752 618 curveto +2752 2221 lineto +2752 2733 2333 3008 1538 3008 curveto +1070 3008 681 2888 466 2675 curveto +318 2528 256 2364 256 2080 curveto +881 2080 lineto +921 2413 1136 2564 1577 2564 curveto +2002 2564 2240 2416 2240 2152 curveto +2240 2035 lineto +2240 1850 2120 1771 1743 1729 curveto +1068 1649 965 1628 782 1560 curveto +433 1427 256 1179 256 819 curveto +256 317 634 0 1240 0 curveto +1618 0 1921 132 2259 441 curveto +2295 137 2451 0 2774 0 curveto +2876 0 2953 12 3115 54 curveto +3115 414 lineto +2240 1019 moveto +2240 873 2195 784 2053 665 curveto +1861 503 1629 420 1351 420 curveto +983 420 768 581 768 857 curveto +768 1144 977 1289 1481 1357 curveto +1980 1420 2081 1440 2240 1508 curveto +2240 1019 lineto +end_ol grestore +gsave 25.089067 19.514800 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 25.512400 19.514800 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 26.147400 19.514800 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 26.570733 19.514800 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 26.994067 19.514800 translate 0.035278 -0.035278 scale +start_ol +2624 2128 moveto +2624 2691 2211 3008 1476 3008 curveto +736 3008 256 2675 256 2162 curveto +256 1729 496 1522 1204 1364 curveto +1649 1263 lineto +1981 1189 2112 1078 2112 878 curveto +2112 618 1835 444 1421 444 curveto +1167 444 952 512 833 626 curveto +759 704 725 782 697 974 curveto +256 974 lineto +256 316 638 0 1409 0 curveto +2152 0 2624 344 2624 878 curveto +2624 1290 2373 1517 1779 1649 curveto +1322 1750 lineto +934 1834 768 1951 768 2146 curveto +768 2400 1038 2564 1465 2564 curveto +1886 2564 2112 2413 2112 2128 curveto +2624 2128 lineto +end_ol grestore +showpage diff --git a/executable_names/doc/slides/users/figures/arrow-glow.ps b/executable_names/doc/slides/users/figures/arrow-glow.ps new file mode 100644 index 0000000000000000000000000000000000000000..fe556fb134eba49fef81736ba9a95033856f00ce --- /dev/null +++ b/executable_names/doc/slides/users/figures/arrow-glow.ps @@ -0,0 +1,173 @@ +%!PS-Adobe-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /tmp/arrow-glow.ps +%%CreationDate: Mon Apr 7 13:28:36 2003 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 47 47 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 32.400000 translate +32.400000 -32.400000 scale +% Image geometry +45 45 8 +% Transformation matrix +[ 45 0 0 45 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 45 string def +/gstr 45 string def +/bstr 45 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 6545 ASCII Bytes +colorimage +e,Y"~> +e,Y"~> +e,Y"~> +qZQp$rWE3'pB9da!!%N~> +rWWK1#mgqGrX8c6rX&T0rs&H*lN.%dJ,~> +rX&c<&eYrqrYbbPrY#5@rsJ`0lN@1fJ,~> +qZHm$n-&+\!!%N~> +!X8r;rX8o>'+kfirX\u:!so2:#6"bm!WW4N~> +!X]PQrYbbXr?hLfrYbkO%LNRB#42Nn!.Y~> +!X&T-rWE3'pB1Huq#p-g!!%N~> +"pkVD%hfTnr#,MM#8@[Z%L`XM#Q=o-"RcBl!.Y~> +"qh[e+snWlr&4R-#:^oA*Z>Y(%fQe8#4DZp!.Y~> +!X&T-rWE3'pB1Huq#p-g!!%N~> +"pkVD%hfTnr#,MM#8@[Z%L`XM#Q=o-"RcBl!.Y~> +"qh[e+snWlr&4R-#:^oA*Z>Y(%fQe8#4DZp!.Y~> +!!DZmrr`'"ncJjlJ,~> +(^^ca'H%c.+!i3X,9J!I)&X2%%LrmR#m^G6!!Mio!!%N~> +(`";>.Q01K7SZ]N8k)962E!07*Zc44&e=mJ!!_us!!%N~> +!!E*$!!E0&rWE!"rr`*#oE,'nJ,~> +#7_F^)'9qI/,_%!.1I[M,9.R:((h#d$jd.DrW_ur!!%N~> +#9G?E2F^/6?N"@5=q+M)8j5-c/g_V\)A3MirX/9#!!%N~> +!!E*$!!E0&rWE!"rr`*#oE,'nJ,~> +#7_F^)'9qI/,_%!.1I[M,9.R:((h#d$jd.DrW_ur!!%N~> +#9G?E2F^/6?N"@5=q+M)8j5-c/g_V\)A3MirX/9#!!%N~> +!!N0$q?-m&"9\i'"TAN""S`'!!.Y~> +*t]>,*[iEj&MGdu3&WZM/1`4p*#oh1'G1f^$4-qB#6"c#!WW4N~> ++!NHq6<7-!,%>#1H?OIH@U`M55!CkS.OH2P((q)e$N:8)"98FP~> +q?-p0)]KIorWE-&rWE!"rWE'$q#^TsJ,~> ++;>b6,qLT*$lU$-4$l7s3&i]H-n$;[*#TG$%h8pR#m^G4q#UNrJ,~> ++=]E5:1@[U%NHHDJrYkGH?sI@<`VgV4uOl7+s%L8&e=mFq#gZtJ,~> +!!N9'rWEE6)]L"@$k3+;qum$%q#g["qZQg!!!%N~> ++;Q(B.5NbA$lU$.)D*O-77BI$1G^R1-mK]L)&*Sl$jut=rWN-#!!%N~> ++>,uI>&J50%NHH6**-+#QBmDSDJioa<_>P62C]mp)A`;^rW`9'!!%N~> +!!N9'rWEE6)]L"@$k3+;qum$%q#g["qZQg!!!%N~> ++;Q(B.5NbA$lU$.)D*O-77BI$1G^R1-mK]L)&*Sl$jut=rWN-#!!%N~> ++>,uI>&J50%NHH6**-+#QBmDSDJioa<_>P62C]mp)A`;^rW`9'!!%N~> +&H`.=!sA`/$l^-2,U4NQ$k*:<"8N*""8E#t!rr=O~> +-Q!pI.l]LT$lU$0,U+EN/M0@Z4Ztb\1Fsjp*ul+7&J#9Y#mUY="T8B%!.Y~> +-Se.\?@$pX%NHH8-6siV<`YBLL5("lDIQL57QrR_-6a?H&e56U#5nZ)!.Y~> +rWEf8"9\f8)]L%Y/1`%d*#f:h"TAK("9\E%rr`0%rrW6$J,~> +//]`[0KM6`$lU$01+Xt%*#okK6psI,4ZG2J/1)Pb)\s"t%LNFG"p>&1!W[`~> +/2g6uAq#2p%NHH81bLC-*Zc;%P*2,cL3dTD@T#Zb3\Da+*Yo4q$3g\;"9 +rWN3&%g3:[)^@.#4#AK>.i]KI"9&E)!sAc+!rrK'!rrK'"8r?'!s!i~> +//]`[/j2?g$lU$.1-.HQ/1`7j)B(;%8jkg%3&3!7,p!m?'+P?V#6kA8!W[`~> +/2g6uAql&3%NHH61d!lY/hS[r*#rRbU6:7WH>6bm:-p]k-6 +rWN3&%g3:[)^@.#4#AK>.i]KI"9&E)!sAc+!rrK'!rrK'"8r?'!s!i~> +//]`[/j2?g$lU$.1-.HQ/1`7j)B(;%8jkg%3&3!7,p!m?'+P?V#6kA8!W[`~> +/2g6uAql&3%NHH61d!lY/hS[r*#rRbU6:7WH>6bm:-p]k-6 +r<3-&'a+pa)^I7&4@;1l1Fsds,8:go"9Sc)"98Q&"TAN%"98FP~> +//]c]1I")p$lU$01d!le3]]#I,U=QT*\^,O69@%^0.7na)&*Pj$3pe?"9 +/2gC(DMEn;%NHH82Ej;m4?PGQ-70uf.V>94Ne2:l@TGrf2C]ah((Lf]"os/~> +rWE3'rWEiB)]L"X6UOO86pj$l1Fj^r,8C+[rrW6(rWDou!!%N~> +//oo_/jMZo$lU$.1."<$6ps@&1,:=),U+9_01S/g3%cU-*uPY&$jd4E"9 +/36[,Ar;J?%NHH61dj`,7Rfd.1c-a1-6t'M@[`%+H=g2Y7Q)S?)A3Yi"os/~> +rWE3'rWEiB)]L"X6UOO86pj$l1Fj^r,8C+[rrW6(rWDou!!%N~> +//oo_/jMZo$lU$.1."<$6ps@&1,:=),U+9_01S/g3%cU-*uPY&$jd4E"9 +/36[,Ar;J?%NHH61dj`,7Rfd.1c-a1-6t'M@[`%+H=g2Y7Q)S?)A3Yi"os/~> +q?.TC)]L%Z4?Q89<(o\I6SpST.jQ)S'E\I4"TJT("98FP~> +//oo_1I+2t$lU$01d!lm<)cOZ6:*La1+FOh*$-[`5W18K-6*d:%giXK"os/~> +/36[,DMj=G%NHH82Ej;u<`Vsb6prpi1b9sp*\(K&MKWH<;Ec]c+r1q($35S~> +r<3*%#7MOj,;V\S9`A6.<(otR4?P\].k;kb*#&JX"9\T*rr`9(!!%N~> +%N?`A1Hdlo$lU$.1."<$r`U4>9M@i:4?>5I.O5uR+Yki0.3]WI&IJjO"9 +%Q[KcDMEnC%NHH61dj`,r`g@B:/48B5!1YQ/1)DZ12:]E>"1D.-5I@0"os/~> +q?.`G)]L%Z4?Q;A>@_5J>>n0f6p*:_1Ft(%*#'+^"98FP~> +*uQCP1I+2t$lU$01d!lo>$>HG>$=fr8jkcu1bpU5,5rPg-6F*C'+>9U"os/~> +/2gC(DMj=G%NHH82Ej<">[1lO>[16%9L_3(2Dd$=,T\Eb;FWQ&-5md8$35S~> +q?.`G)]L%Z4?Q;A>@_5J>>n0f6p*:_1Ft(%*#'+^"98FP~> +*uQCP1I+2t$lU$01d!lo>$>HG>$=fr8jkcu1bpU5,5rPg-6F*C'+>9U"os/~> +/2gC(DMj=G%NHH82Ej<">[1lO>[16%9L_3(2Dd$=,T\Eb;FWQ&-5md8$35S~> +r<3*%)[mZ),;V\S9Nt_+>>nHo6psC(1c-a/,U49C'_he2!.Y~> +*ucOR1Hdlo$lU$.1."<$>$>07;Gp1V6p`pk1b9mt,5rS^-3"nf&I]'S"os/~> +/36[,DMEnC%NHH61dj`,>[1T?<)cU^7RT?s2D-=',T\Eb:/3i2-5md8$35S~> +q?.lK)]L%Y4?Q;:<)ZIY6p*Om1G^O3,T@[:!sA`/"9Sc("98FP~> +//oo_1I+2t$lU$01-@Zm<)cah6ps-u3\iH?.O5oN-nmG5.3BBD'+>9S"os/~> +/36[,DMj=G%NHH81d4)u<`W0p7RfR(4>\lG/1)>V6=t+Q>"18&-5md4$35S~> +q?.lK)]L%Y4?Q;:<)ZIY6p*Om1G^O3,T@[:!sA`/"9Sc("98FP~> +//oo_1I+2t$lU$01-@Zm<)cah6ps-u3\iH?.O5oN-nmG5.3BBD'+>9S"os/~> +/36[,DMj=G%NHH81d4)u<`W0p7RfR(4>\lG/1)>V6=t+Q>"18&-5md4$35S~> +r<3*%"q2Fi,VqeTr_*\f6T[@c/1`%l)]K1a"8N*""9/K(!.Y~> +%3$T>1Hdlo$lU$01.">,9H-Ad3]]#I/0lJZ)D46=4Z4iB,od[9%giXK"os/~> +%6@6ZDMEnC%NHH81djb2:('NZ4?PGQ/g_nb**W>r%!H)h:-L9_+r1q($35S~> +rWE3'rWF)I)]L%Y6UO7(4?G>L.jQ>a*")iN"9S`/"TAN!"98FP~> +//oo_/jMZm$lU$01.";q4?PY[.Ol\f+ri:'6: +/36[,Ar;J;%NHH81dj`$5!D(c/1`+n,T^-LNfo-OG%+KQ68g/;)A3Yi"os/~> +rWN3&&HiL])^@.$4?G>T.jQ)S)[m/R!rrK'!rrK'!rrK'"8r?&!.Y~> +//]`[/j2?g$lU$.1-@Z[1,:=)*#okK/ODlh4ZY>R.jc;Y(_dGi$3pe?"9 +/2g6uAql&3%NHH61d4)c1c-a1*Zc;% +rWN3&&HiL])^@.$4?G>T.jQ)S)[m/R!rrK'!rrK'!rrK'"8r?&!.Y~> +//]`[/j2?g$lU$.1-@Z[1,:=)*#okK/ODlh4ZY>R.jc;Y(_dGi$3pe?"9 +/2g6uAql&3%NHH61d4)c1c-a1*Zc;% +rWN0%!t6+f,lTS)/0lJ\'E\F?rWE-&rWE0'rrW6(rWE*%! +$5k-9/jDQh$lU$0r\>NG,U=?N1,;Hj76N[h2)$F,,9.O;'+P?V#6kA8!W[`~> +$8tXSAql&+%NHH8r\PZK-70c`C20K/QA0j/Eb8?Q8j5!c-6 +&H`.=!sA`/$l^-2.jQA['GLZG"TAK)"9Sc)"TJT$"9AT)J,~> +-Q!pI.lK:P$lU$0.O68Z*Zd"-6ps:"3&N<:-m'KO)& +-Se.\??ULP%NHH8/1)\b.Oo&)P*1]KH?*Uu<^oDB2D-='*Yo4q$N:51"9 +&H`.=!sA`/$l^-2.jQA['GLZG"TAK)"9Sc)"TJT$"9AT)J,~> +-Q!pI.lK:P$lU$0.O68Z*Zd"-6ps:"3&N<:-m'KO)& +-Se.\??ULP%NHH8/1)\b.Oo&)P*1]KH?*Uu<^oDB2D-='*Yo4q$N:51"9 +!!N9'rWEH7)]L"A'GLZK"98Q%"9S`/!sAK)rWE'$r +-PdgI.5`tE$lU$.*$-.T84Z-53&i]F/1;_a*ZGk1'+P?V#mUY="T8B%!.Y~> +-S@_P>&nY8%NHH6*\&XOSt;+"H?sI<@TH)f696_O-6 +q?.$3)]KIn"9\i("9S`/"9\T*rr`'"quZp!J,~> +,8;(9,qLT*$lU$-1.4Ms4$,DX/1`1o,9@^<()%/f$jd.D#6"c'!WW4N~> +,:Y`8:1@[U%NHHDC6Fa?JqA;d@U`A18jYEg/g_V\)A3Mi$N:8-"98FP~> +!sA]."TAK)'E\I8"TAN!"TAN!"Sr3#!.Y~> ++:f;++"/Ni*\K'+4#f2W1,:@,,9n0G)%dMl%LNLK#6t,0q>pWsJ,~> ++ +!sA]."TAK)'E\I8"TAN!"TAN!"Sr3#!.Y~> ++:f;++"/Ni*\K'+4#f2W1,:@,,9n0G)%dMl%LNLK#6t,0q>pWsJ,~> ++ +!!E-%rr`9(rr`9(!!Dru!!E!!p]CKrJ,~> +'b1ol)'U7Q.k`P.0J"b(-70fS)&X4h&H`@H#m^G6rWMut!!%N~> +*$-RZ2F^/:?=IAUAn#4Q;GotJ2E!07-6a3<&e=mJrW`-#!!%N~> +!!E-%!!E'#!s8Z/"8rB&"8W/m!rr=O~> +!"/];rtth[+8mMc,7>P3)]08"%h&dP#m^G6rrhrq!!%N~> +#8SL--8mbK7f?*^8ddsH3\i0/+rV44&e=mJrs&)u!!%N~> +qZHm$qum$%r<3*%q?6 +!XT8DrXf/J)>tNS(_%5m&JGW]$4-qB"pP25nH&[jJ,~> +#8.pn+snWl2Z5]:1&rs+-4(_/((q)e$46tAnH8glJ,~> +qZHm$qum$%r<3*%q?6 +!XT8DrXf/J)>tNS(_%5m&JGW]$4-qB"pP25nH&[jJ,~> +#8.pn+snWl2Z5]:1&rs+-4(_/((q)e$46tAnH8glJ,~> +rWN3&q#gd%"9\i&"RcEm!.Y~> +&I&OJ$4[OV'+kfi&J#B^$k*LB#Q=r-"RcBl!.Y~> +"pttU(*4M@r$MFf"!/@!(B+gC$NC>!"98FP~> +qZHm$r<3*%q#p!c!!%N~> +rWWH0#mgt;%/pV5#lt88rWMNg!!%N~> +rX&`;&eYuY)ZCNO&ciILrW_Zk!!%N~> +qZHm$r<3*%q#p!c!!%N~> +rWWH0#mgt;%/pV5#lt88rWMNg!!%N~> +rX&`;&eYuY)ZCNO&ciILrW_Zk!!%N~> +mKD_U!!%N~> +rWN3)r +rW`?/r=/f?rXSo7rs%Zi!!%N~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/slides/users/figures/bullet-glow.ps b/executable_names/doc/slides/users/figures/bullet-glow.ps new file mode 100644 index 0000000000000000000000000000000000000000..c96a348f73c02e48363b6584cdb7c140766fea17 --- /dev/null +++ b/executable_names/doc/slides/users/figures/bullet-glow.ps @@ -0,0 +1,173 @@ +%!PS-Adobe-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /g/g0/grondo/proj/slurm/doc/slides/users/bullet-glow.ps +%%CreationDate: Fri Apr 4 13:20:19 2003 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 47 47 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 32.400000 translate +32.400000 -32.400000 scale +% Image geometry +45 45 8 +% Transformation matrix +[ 45 0 0 45 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 45 string def +/gstr 45 string def +/bstr 45 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 6293 ASCII Bytes +colorimage +e,Y"~> +e,Y"~> +e,Y"~> +e,Y"~> +&d8ID#7(SB$OmOU%hK9b',)&pq\BAN'GM2n&eP$Q#n77L$4$kA"pG!W~> +&e,B`&JPoq*$67H,UXri/1`D.q_Ag>/hS\*.jlSd+s.d@(DIGn&.JVi~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&do-X&/#Ti(E+24+!MmS-71)hq^N7.-RU5d,U+ +'HA2:-7UK!2EX)g852fV<`WC0?XNe?'OP-L>#nO!9h7T;4>nlI.OHJa)utK~> +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +n,Ne)-oa1K3B8`6#mp)$J,~> +)%RAo()[u0+!W!W.4d#'1,:dO5 +/0lbt1-%?[85N,a?=d\`EH,_r8kM?24@)bSAT;L$AR8G>:e3i:3AN?@,QN>~> +nc8\?$VEu[7RKC)4#SfJ)Y!fX~> +/.`L0(E4;7+seNa/2&Y45X7q57Rfa05 +/13&&2*F)k9iY2!ASc1(>[0lm7Rfa05nN4Z,)L-NJY~> +o)K=[:/4S[91q`@69R:a1G0Xeo)O:~> +/.r^6)&sV=,Ub&l0/GCQ:/4S[91q`@69R:a1G1401G::1-mToX*#TV0&cdF~> +/1ND13C,r';Hm@9CNFQ!:/4S[91q`@69R:a1G1mVF),;s>>e'c5rgq\.KFu~> +o)K=[:/4S[91q`@69R:a1G0Xeo)O:~> +/.r^6)&sV=,Ub&l0/GCQ:/4S[91q`@69R:a1G1401G::1-mToX*#TV0&cdF~> +/1ND13C,r';Hm@9CNFQ!:/4S[91q`@69R:a1G1mVF),;s>>e'c5rgq\.KFu~> +o`5"B&Pc5%<)QId8OPs13A`QG.4Gu'!.Y~> +//&d7)BKqD-7UJt1-e*";GpIl:/4AK6p`*Z>q4'**O~> +/1`V74@M\5=(#ELEElaD;GpIl:/4AK6p +p&Gg:8kMlY<*E6s:J+#C5<:VX0.JFs"n_kG~> +///m:)]p.I-S-f&2bH\<<)d%#:JXSN6pE^h1bU=.,VLi*/12\g*uc.8'EEX~> +/1rh=5=e=B>%D/\C._)o<)d%#:JXSN6pE^h1bU=.,[tV-A6Mi-83] +p&Gg:8kMlY<*E6s:J+#C5<:VX0.JFs"n_kG~> +///m:)]p.I-S-f&2bH\<<)d%#:JXSN6pE^h1bU=.,VLi*/12\g*uc.8'EEX~> +/1rh=5=e=B>%D/\C._)o<)d%#:JXSN6pE^h1bU=.,[tV-A6Mi-83] +p&GgU8P)ZT;H-Oh:.[iA4ukGV0.A=q'(l6T~> +///p<*$?@L.4m,+4\84?;GpIl:/4AK6p +/20%C5tXaJ?"[eh=\21[;GpIl:/4AK6p +p&Gge7Rg$G:/=VX91D674ZG5R/h&4o)>*u[~> +//B*@*?cRP.P<>/5=S+8:/4S[91q`@69R:a1G1+*,9S`s/h/.n+WVR@('&j~> +/2B4G6;'sO?YF+n8k)9C:/4S[91q`@69R:a1G1+*,:deTBO=b>90ts*1&uh~> +p&Ggi6UO=78P2QD7RKC)4#SfJ/12eh*;';^~> +//B*@*?cRQ.PEG25!q\,8P)NG7Rfa05 +/2B7I6VL0S?tsFt5XRn.8P)NG7Rfa05 +p&Ggi6UO=78P2QD7RKC)4#SfJ/12eh*;';^~> +//B*@*?cRQ.PEG25!q\,8P)NG7Rfa05 +/2B7I6VL0S?tsFt5XRn.8P)NG7Rfa05 +p&G1T5 +%Mfp"*?cRQ.PEG23^5hqrC$ZP(I'uC3&<3@.O?A`)`'9'.OHJc*??"5!.Y~> +%Pg(+6VL0S?tsFt4?l%srC$ZP(I'uC3&<3@.O?A`*-619?rg<%6UNmi!.Y~> +p&Gg\4$,Sh5!M4o4ZbV_1b^I3-R0iW(%hQW~> +//B*@*?cRP.P<>/2ENu`5!D1p4Ztkd3&E +/2B4G6;'sO?YF+n5s%.k5!D1p4Ztkd3&E90ts*1&uh~> +p&Gg\4$,Sh5!M4o4ZbV_1b^I3-R0iW(%hQW~> +//B*@*?cRP.P<>/2ENu`5!D1p4Ztkd3&E +/2B4G6;'sO?YF+n5s%.k5!D1p4Ztkd3&E90ts*1&uh~> +p&GgK2E!NT3BB/[3&WQK0J+_&,Tn3L%J9^O~> +///p<*$?@L.4m,+1H%-N3B9,\3&ifP1GCC0.3p#Y*$R*l/L_qj+<2@<'EEX~> +/20%C5tXaJ?"[eh:Gt*j3B9,\3&ifP1GCC0.3p#Y*'S=\B3eG78jPa&0E?V~> +p&G1$0ekK_2#f?>0eY12.4$8`*??"#o`0L~> +%MT]q)]p.I-S-f&1,1L>rA=O1(GRQr/1Dkk+WVR@/2/b/-R9rZ)]KS-!.Y~> +%PBXt5=e=B>%D/\AMGnqrA=O1(GRQr/1Dkk+WVR@?YsXj>#A-f5 +o`5"1!&"4's"4X0.Olek+X%jE)@c<=J,~> +%MKTn)BKqD-7UJt1+t:5r@e1'(G%$c-R9iY*?#h?1+k1/-6aWT)B'A)!.Y~> +%P0Fn4@M\5=(#ELED&qWr@e1'(G%$c-R9iY*?#h[EG0#n=%uCX4?PGO!.Y~> +o`5"1!&"4's"4X0.Olek+X%jE)@c<=J,~> +%MKTn)BKqD-7UJt1+t:5r@e1'(G%$c-R9iY*?#h?1+k1/-6aWT)B'A)!.Y~> +%P0Fn4@M\5=(#ELED&qWr@e1'(G%$c-R9iY*?#h[EG0#n=%uCX4?PGO!.Y~> +o)Jk4.4HbG.1%@J,pONQ*?#G!o)O:~> +&J>ip)&sV=,Ub&l0/GC8.4HbG.2O?X,pONQ*?#t?1G::1-mToX*#TV0&cdF~> +&LoOk3C,r';Hm@9CNFP].4HbG.2O?X,pONQ*?$XeF),;s>>e'c5rgq\.KFu~> +nc8\(s!7Uh#9k95*ZQ%8%IjFK~> +/.`L0(E4;7+seNa/2&Y4.Ol\h,9nBT+ +/13&&2*F)k9iY2!ASc1(7ReXK,9nBT+nN4Z,)L-NJY~> +nc8\(s!7Uh#9k95*ZQ%8%IjFK~> +/.`L0(E4;7+seNa/2&Y4.Ol\h,9nBT+ +/13&&2*F)k9iY2!ASc1(7ReXK,9nBT+nN4Z,)L-NJY~> +n,Ne!&fDQ,)B'>""9e2oJ,~> +/.WC-()[u0+!W!W.4d#'1,:I0+ +/0lbt1-%?[85N,a?=d\`EH,GT.k;Y\*%*pW?ZBjsAR8G>:e3i:3AN?@,QN>~> +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +&do-X&/#Ti(E+24+!MmS-71)hq^N7.-RU5d,U+ +'HA2:-7UK!2EX)g852fV<`WC0?XNe?'OP-L>#nO!9h7T;4>nlI.OHJa)utK~> +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +&d8ID#7(SB$OmOU%hK9b',)&pq\BAN'GM2n&eP$Q#n77L$4$kA"pG!W~> +&e,B`&JPoq*$67H,UXri/1`D.q_Ag>/hS\*.jlSd+s.d@(DIGn&.JVi~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/slides/users/figures/entities-layered.dia b/executable_names/doc/slides/users/figures/entities-layered.dia new file mode 100644 index 0000000000000000000000000000000000000000..fe6b2418dcb1144e3df3ff0803f76b36ff0ef02d --- /dev/null +++ b/executable_names/doc/slides/users/figures/entities-layered.dia @@ -0,0 +1,4 @@ + +#A4##Partition 1##Partition 2##Job##Job##Job +Step##Job +Step##node##node##node##node##node##node##node##node##node##node##node##node# diff --git a/executable_names/doc/slides/users/figures/entities0.eps b/executable_names/doc/slides/users/figures/entities0.eps new file mode 100644 index 0000000000000000000000000000000000000000..bcb24d0107f561e919cb68494ae29e8e1d97324b --- /dev/null +++ b/executable_names/doc/slides/users/figures/entities0.eps @@ -0,0 +1,1139 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: entities-layered.dia +%%Creator: Dia v0.91 +%%CreationDate: Mon Apr 7 14:43:35 2003 +%%For: grondo +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 414 308 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-0.700000 -12.050000 translate +%%EndProlog + + +1.000000 1.000000 1.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l cp s +gsave 4.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l cp s +gsave 7.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l cp s +gsave 4.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l cp s +gsave 7.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l cp s +gsave 4.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l cp s +gsave 7.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l cp s +gsave 4.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l cp s +gsave 7.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l cp s +gsave 11.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l cp s +gsave 11.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l cp s +gsave 11.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l cp s +gsave 11.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l cp s +showpage diff --git a/executable_names/doc/slides/users/figures/entities1.eps b/executable_names/doc/slides/users/figures/entities1.eps new file mode 100644 index 0000000000000000000000000000000000000000..1d835679d1ac0fd83e34e9353d9f84f0d6b73aec --- /dev/null +++ b/executable_names/doc/slides/users/figures/entities1.eps @@ -0,0 +1,1498 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: entities-layered.dia +%%Creator: Dia v0.91 +%%CreationDate: Mon Apr 7 14:43:51 2003 +%%For: grondo +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 414 311 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-0.700000 -12.150000 translate +%%EndProlog + + +0.694118 0.694118 0.776471 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 9.750000 12.000000 l 9.750000 1.250000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 9.750000 12.000000 l 9.750000 1.250000 l cp s +0.600000 0.709804 0.596078 srgb +n 9.750000 1.250000 m 9.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.750000 1.250000 m 9.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l cp s +gsave 3.980000 11.750000 translate 0.035278 -0.035278 scale +start_ol +896 1024 moveto +1641 1024 lineto +2162 1024 2496 1413 2496 2019 curveto +2496 2616 2172 2944 1578 2944 curveto +320 2944 lineto +320 0 lineto +896 0 lineto +896 1024 lineto +896 1472 moveto +896 2440 lineto +1454 2440 lineto +1773 2440 1920 2285 1920 1954 curveto +1920 1627 1773 1472 1454 1472 curveto +896 1472 lineto +end_ol grestore +gsave 4.335600 11.750000 translate 0.035278 -0.035278 scale +start_ol +2113 98 moveto +2012 213 1984 288 1984 428 curveto +1984 1526 lineto +1984 1957 1670 2176 1058 2176 curveto +446 2176 128 1935 128 1450 curveto +730 1450 lineto +756 1654 843 1720 1103 1720 curveto +1306 1720 1408 1653 1408 1518 curveto +1408 1450 1373 1390 1314 1360 curveto +1240 1323 1240 1323 970 1282 curveto +750 1244 lineto +332 1177 128 971 128 607 curveto +128 435 179 292 276 191 curveto +397 71 581 0 768 0 curveto +1002 0 1217 105 1408 311 curveto +1408 150 1421 92 1476 0 curveto +2113 0 lineto +2113 98 lineto +1408 920 moveto +1408 624 1257 456 990 456 curveto +813 456 704 547 704 694 curveto +704 847 787 920 1005 964 curveto +1186 997 lineto +1325 1022 1348 1030 1408 1059 curveto +1408 920 lineto +end_ol grestore +gsave 4.631933 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1131 lineto +832 1454 997 1616 1328 1616 curveto +1388 1616 1428 1612 1505 1600 curveto +1505 2176 lineto +1473 2176 1453 2176 1436 2176 curveto +1179 2176 953 2009 832 1719 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 4.843600 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 5.021400 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 5.173800 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 5.351600 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 5.504000 11.750000 translate 0.035278 -0.035278 scale +start_ol +1212 2176 moveto +540 2176 128 1761 128 1088 curveto +128 411 540 0 1216 0 curveto +1884 0 2304 415 2304 1073 curveto +2304 1769 1901 2176 1212 2176 curveto +1216 1720 moveto +1526 1720 1728 1468 1728 1081 curveto +1728 712 1518 456 1216 456 curveto +910 456 704 712 704 1088 curveto +704 1464 910 1720 1216 1720 curveto +end_ol grestore +gsave 5.834200 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1278 lineto +832 1530 1016 1696 1295 1696 curveto +1541 1696 1664 1566 1664 1313 curveto +1664 0 lineto +2240 0 lineto +2240 1435 lineto +2240 1906 1969 2176 1497 2176 curveto +1197 2176 996 2070 832 1836 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 6.164400 11.750000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 6.316800 11.750000 translate 0.035278 -0.035278 scale +start_ol +960 1972 moveto +960 0 lineto +1536 0 lineto +1536 2859 lineto +1153 2859 lineto +1064 2520 769 2347 275 2347 curveto +275 1972 lineto +960 1972 lineto +end_ol grestore +gsave 11.191900 11.750000 translate 0.035278 -0.035278 scale +start_ol +896 1024 moveto +1641 1024 lineto +2162 1024 2496 1413 2496 2019 curveto +2496 2616 2172 2944 1578 2944 curveto +320 2944 lineto +320 0 lineto +896 0 lineto +896 1024 lineto +896 1472 moveto +896 2440 lineto +1454 2440 lineto +1773 2440 1920 2285 1920 1954 curveto +1920 1627 1773 1472 1454 1472 curveto +896 1472 lineto +end_ol grestore +gsave 11.547500 11.750000 translate 0.035278 -0.035278 scale +start_ol +2113 98 moveto +2012 213 1984 288 1984 428 curveto +1984 1526 lineto +1984 1957 1670 2176 1058 2176 curveto +446 2176 128 1935 128 1450 curveto +730 1450 lineto +756 1654 843 1720 1103 1720 curveto +1306 1720 1408 1653 1408 1518 curveto +1408 1450 1373 1390 1314 1360 curveto +1240 1323 1240 1323 970 1282 curveto +750 1244 lineto +332 1177 128 971 128 607 curveto +128 435 179 292 276 191 curveto +397 71 581 0 768 0 curveto +1002 0 1217 105 1408 311 curveto +1408 150 1421 92 1476 0 curveto +2113 0 lineto +2113 98 lineto +1408 920 moveto +1408 624 1257 456 990 456 curveto +813 456 704 547 704 694 curveto +704 847 787 920 1005 964 curveto +1186 997 lineto +1325 1022 1348 1030 1408 1059 curveto +1408 920 lineto +end_ol grestore +gsave 11.843833 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1131 lineto +832 1454 997 1616 1328 1616 curveto +1388 1616 1428 1612 1505 1600 curveto +1505 2176 lineto +1473 2176 1453 2176 1436 2176 curveto +1179 2176 953 2009 832 1719 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 12.055500 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 12.233300 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 12.385700 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 12.563500 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 12.715900 11.750000 translate 0.035278 -0.035278 scale +start_ol +1212 2176 moveto +540 2176 128 1761 128 1088 curveto +128 411 540 0 1216 0 curveto +1884 0 2304 415 2304 1073 curveto +2304 1769 1901 2176 1212 2176 curveto +1216 1720 moveto +1526 1720 1728 1468 1728 1081 curveto +1728 712 1518 456 1216 456 curveto +910 456 704 712 704 1088 curveto +704 1464 910 1720 1216 1720 curveto +end_ol grestore +gsave 13.046100 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1278 lineto +832 1530 1016 1696 1295 1696 curveto +1541 1696 1664 1566 1664 1313 curveto +1664 0 lineto +2240 0 lineto +2240 1435 lineto +2240 1906 1969 2176 1497 2176 curveto +1197 2176 996 2070 832 1836 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 13.376300 11.750000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 13.528700 11.750000 translate 0.035278 -0.035278 scale +start_ol +2112 504 moveto +861 504 lineto +935 651 1026 728 1456 1021 curveto +1963 1369 2112 1577 2112 1948 curveto +2112 2476 1720 2816 1099 2816 curveto +486 2816 128 2476 128 1889 curveto +128 1865 128 1834 132 1791 curveto +704 1791 lineto +704 1879 lineto +704 2180 857 2356 1122 2356 curveto +1379 2356 1536 2190 1536 1916 curveto +1536 1614 1432 1495 782 1066 curveto +282 749 128 506 128 0 curveto +2112 0 lineto +2112 504 lineto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l cp s +gsave 4.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l cp s +gsave 7.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l cp s +gsave 4.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l cp s +gsave 7.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l cp s +gsave 4.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l cp s +gsave 7.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l cp s +gsave 4.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l cp s +gsave 7.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l cp s +gsave 11.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l cp s +gsave 11.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l cp s +gsave 11.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l cp s +gsave 11.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l cp s +showpage diff --git a/executable_names/doc/slides/users/figures/entities2.eps b/executable_names/doc/slides/users/figures/entities2.eps new file mode 100644 index 0000000000000000000000000000000000000000..4b0041a785431c7d772fd3c07c262996066da213 --- /dev/null +++ b/executable_names/doc/slides/users/figures/entities2.eps @@ -0,0 +1,1611 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: entities-layered.dia +%%Creator: Dia v0.91 +%%CreationDate: Mon Apr 7 14:44:15 2003 +%%For: grondo +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 414 311 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-0.700000 -12.150000 translate +%%EndProlog + + +0.694118 0.694118 0.776471 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 9.750000 12.000000 l 9.750000 1.250000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 9.750000 12.000000 l 9.750000 1.250000 l cp s +0.600000 0.709804 0.596078 srgb +n 9.750000 1.250000 m 9.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.750000 1.250000 m 9.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l cp s +gsave 3.980000 11.750000 translate 0.035278 -0.035278 scale +start_ol +896 1024 moveto +1641 1024 lineto +2162 1024 2496 1413 2496 2019 curveto +2496 2616 2172 2944 1578 2944 curveto +320 2944 lineto +320 0 lineto +896 0 lineto +896 1024 lineto +896 1472 moveto +896 2440 lineto +1454 2440 lineto +1773 2440 1920 2285 1920 1954 curveto +1920 1627 1773 1472 1454 1472 curveto +896 1472 lineto +end_ol grestore +gsave 4.335600 11.750000 translate 0.035278 -0.035278 scale +start_ol +2113 98 moveto +2012 213 1984 288 1984 428 curveto +1984 1526 lineto +1984 1957 1670 2176 1058 2176 curveto +446 2176 128 1935 128 1450 curveto +730 1450 lineto +756 1654 843 1720 1103 1720 curveto +1306 1720 1408 1653 1408 1518 curveto +1408 1450 1373 1390 1314 1360 curveto +1240 1323 1240 1323 970 1282 curveto +750 1244 lineto +332 1177 128 971 128 607 curveto +128 435 179 292 276 191 curveto +397 71 581 0 768 0 curveto +1002 0 1217 105 1408 311 curveto +1408 150 1421 92 1476 0 curveto +2113 0 lineto +2113 98 lineto +1408 920 moveto +1408 624 1257 456 990 456 curveto +813 456 704 547 704 694 curveto +704 847 787 920 1005 964 curveto +1186 997 lineto +1325 1022 1348 1030 1408 1059 curveto +1408 920 lineto +end_ol grestore +gsave 4.631933 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1131 lineto +832 1454 997 1616 1328 1616 curveto +1388 1616 1428 1612 1505 1600 curveto +1505 2176 lineto +1473 2176 1453 2176 1436 2176 curveto +1179 2176 953 2009 832 1719 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 4.843600 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 5.021400 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 5.173800 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 5.351600 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 5.504000 11.750000 translate 0.035278 -0.035278 scale +start_ol +1212 2176 moveto +540 2176 128 1761 128 1088 curveto +128 411 540 0 1216 0 curveto +1884 0 2304 415 2304 1073 curveto +2304 1769 1901 2176 1212 2176 curveto +1216 1720 moveto +1526 1720 1728 1468 1728 1081 curveto +1728 712 1518 456 1216 456 curveto +910 456 704 712 704 1088 curveto +704 1464 910 1720 1216 1720 curveto +end_ol grestore +gsave 5.834200 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1278 lineto +832 1530 1016 1696 1295 1696 curveto +1541 1696 1664 1566 1664 1313 curveto +1664 0 lineto +2240 0 lineto +2240 1435 lineto +2240 1906 1969 2176 1497 2176 curveto +1197 2176 996 2070 832 1836 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 6.164400 11.750000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 6.316800 11.750000 translate 0.035278 -0.035278 scale +start_ol +960 1972 moveto +960 0 lineto +1536 0 lineto +1536 2859 lineto +1153 2859 lineto +1064 2520 769 2347 275 2347 curveto +275 1972 lineto +960 1972 lineto +end_ol grestore +gsave 11.191900 11.750000 translate 0.035278 -0.035278 scale +start_ol +896 1024 moveto +1641 1024 lineto +2162 1024 2496 1413 2496 2019 curveto +2496 2616 2172 2944 1578 2944 curveto +320 2944 lineto +320 0 lineto +896 0 lineto +896 1024 lineto +896 1472 moveto +896 2440 lineto +1454 2440 lineto +1773 2440 1920 2285 1920 1954 curveto +1920 1627 1773 1472 1454 1472 curveto +896 1472 lineto +end_ol grestore +gsave 11.547500 11.750000 translate 0.035278 -0.035278 scale +start_ol +2113 98 moveto +2012 213 1984 288 1984 428 curveto +1984 1526 lineto +1984 1957 1670 2176 1058 2176 curveto +446 2176 128 1935 128 1450 curveto +730 1450 lineto +756 1654 843 1720 1103 1720 curveto +1306 1720 1408 1653 1408 1518 curveto +1408 1450 1373 1390 1314 1360 curveto +1240 1323 1240 1323 970 1282 curveto +750 1244 lineto +332 1177 128 971 128 607 curveto +128 435 179 292 276 191 curveto +397 71 581 0 768 0 curveto +1002 0 1217 105 1408 311 curveto +1408 150 1421 92 1476 0 curveto +2113 0 lineto +2113 98 lineto +1408 920 moveto +1408 624 1257 456 990 456 curveto +813 456 704 547 704 694 curveto +704 847 787 920 1005 964 curveto +1186 997 lineto +1325 1022 1348 1030 1408 1059 curveto +1408 920 lineto +end_ol grestore +gsave 11.843833 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1131 lineto +832 1454 997 1616 1328 1616 curveto +1388 1616 1428 1612 1505 1600 curveto +1505 2176 lineto +1473 2176 1453 2176 1436 2176 curveto +1179 2176 953 2009 832 1719 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 12.055500 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 12.233300 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 12.385700 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 12.563500 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 12.715900 11.750000 translate 0.035278 -0.035278 scale +start_ol +1212 2176 moveto +540 2176 128 1761 128 1088 curveto +128 411 540 0 1216 0 curveto +1884 0 2304 415 2304 1073 curveto +2304 1769 1901 2176 1212 2176 curveto +1216 1720 moveto +1526 1720 1728 1468 1728 1081 curveto +1728 712 1518 456 1216 456 curveto +910 456 704 712 704 1088 curveto +704 1464 910 1720 1216 1720 curveto +end_ol grestore +gsave 13.046100 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1278 lineto +832 1530 1016 1696 1295 1696 curveto +1541 1696 1664 1566 1664 1313 curveto +1664 0 lineto +2240 0 lineto +2240 1435 lineto +2240 1906 1969 2176 1497 2176 curveto +1197 2176 996 2070 832 1836 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 13.376300 11.750000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 13.528700 11.750000 translate 0.035278 -0.035278 scale +start_ol +2112 504 moveto +861 504 lineto +935 651 1026 728 1456 1021 curveto +1963 1369 2112 1577 2112 1948 curveto +2112 2476 1720 2816 1099 2816 curveto +486 2816 128 2476 128 1889 curveto +128 1865 128 1834 132 1791 curveto +704 1791 lineto +704 1879 lineto +704 2180 857 2356 1122 2356 curveto +1379 2356 1536 2190 1536 1916 curveto +1536 1614 1432 1495 782 1066 curveto +282 749 128 506 128 0 curveto +2112 0 lineto +2112 504 lineto +end_ol grestore +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.407843 0.486275 0.407843 srgb +n 10.000000 10.375000 m 10.000000 9.875000 10.000000 2.250000 10.000000 1.750000 c 10.000000 1.250000 14.500000 1.250000 14.500000 1.750000 c 14.500000 2.250000 14.500000 9.875000 14.500000 10.375000 c 14.500000 10.875000 10.000000 10.875000 10.000000 10.375000 c f +0.411765 0.486275 0.411765 srgb +n 10.000000 10.375000 m 10.000000 9.875000 10.000000 2.250000 10.000000 1.750000 c 10.000000 1.250000 14.500000 1.250000 14.500000 1.750000 c 14.500000 2.250000 14.500000 9.875000 14.500000 10.375000 c 14.500000 10.875000 10.000000 10.875000 10.000000 10.375000 c s +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.419608 0.419608 0.607843 srgb +n 1.500000 6.750000 m 2.000000 6.750000 5.500000 6.625000 5.750000 7.000000 c 6.000000 7.375000 5.750000 8.375000 6.000000 8.500000 c 6.250000 8.625000 9.500000 8.750000 9.500000 8.250000 c 9.500000 7.750000 9.500000 1.750000 9.250000 1.750000 c 9.000000 1.750000 2.000000 1.750000 1.500000 1.750000 c 1.000000 1.750000 1.000000 6.750000 1.500000 6.750000 c f +0.423529 0.423529 0.607843 srgb +n 1.500000 6.750000 m 2.000000 6.750000 5.500000 6.625000 5.750000 7.000000 c 6.000000 7.375000 5.750000 8.375000 6.000000 8.500000 c 6.250000 8.625000 9.500000 8.750000 9.500000 8.250000 c 9.500000 7.750000 9.500000 1.750000 9.250000 1.750000 c 9.000000 1.750000 2.000000 1.750000 1.500000 1.750000 c 1.000000 1.750000 1.000000 6.750000 1.500000 6.750000 c s +0.000000 0.000000 0.000000 srgb +gsave 1.852067 6.125000 translate 0.035278 -0.035278 scale +start_ol +1152 2496 moveto +1152 722 lineto +1152 541 1049 442 864 442 curveto +661 442 576 534 576 755 curveto +576 985 lineto +64 985 lineto +64 743 lineto +64 487 126 329 275 195 curveto +421 67 615 0 854 0 curveto +1370 0 1664 256 1664 707 curveto +1664 2496 lineto +1152 2496 lineto +end_ol grestore +gsave 2.106067 6.125000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 2.385467 6.125000 translate 0.035278 -0.035278 scale +start_ol +192 2496 moveto +192 0 lineto +704 0 lineto +704 269 lineto +820 86 980 0 1211 0 curveto +1650 0 1984 399 1984 928 curveto +1984 1165 1909 1405 1787 1574 curveto +1661 1746 1436 1856 1211 1856 curveto +983 1856 820 1770 704 1583 curveto +704 2496 lineto +192 2496 lineto +1088 1452 moveto +1313 1452 1472 1235 1472 925 curveto +1472 621 1313 404 1088 404 curveto +857 404 704 615 704 934 curveto +704 1238 860 1452 1088 1452 curveto +end_ol grestore +gsave 13.102067 9.500000 translate 0.035278 -0.035278 scale +start_ol +1152 2496 moveto +1152 722 lineto +1152 541 1049 442 864 442 curveto +661 442 576 534 576 755 curveto +576 985 lineto +64 985 lineto +64 743 lineto +64 487 126 329 275 195 curveto +421 67 615 0 854 0 curveto +1370 0 1664 256 1664 707 curveto +1664 2496 lineto +1152 2496 lineto +end_ol grestore +gsave 13.356067 9.500000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 13.635467 9.500000 translate 0.035278 -0.035278 scale +start_ol +192 2496 moveto +192 0 lineto +704 0 lineto +704 269 lineto +820 86 980 0 1211 0 curveto +1650 0 1984 399 1984 928 curveto +1984 1165 1909 1405 1787 1574 curveto +1661 1746 1436 1856 1211 1856 curveto +983 1856 820 1770 704 1583 curveto +704 2496 lineto +192 2496 lineto +1088 1452 moveto +1313 1452 1472 1235 1472 925 curveto +1472 621 1313 404 1088 404 curveto +857 404 704 615 704 934 curveto +704 1238 860 1452 1088 1452 curveto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l cp s +gsave 4.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l cp s +gsave 7.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l cp s +gsave 4.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l cp s +gsave 7.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l cp s +gsave 4.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l cp s +gsave 7.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l cp s +gsave 4.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l cp s +gsave 7.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l cp s +gsave 11.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l cp s +gsave 11.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l cp s +gsave 11.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l cp s +gsave 11.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l cp s +showpage diff --git a/executable_names/doc/slides/users/figures/entities3.eps b/executable_names/doc/slides/users/figures/entities3.eps new file mode 100644 index 0000000000000000000000000000000000000000..6cba9947edd2c2d8d6224a291bb06dc014b17744 --- /dev/null +++ b/executable_names/doc/slides/users/figures/entities3.eps @@ -0,0 +1,1885 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: entities-layered.dia +%%Creator: Dia v0.91 +%%CreationDate: Mon Apr 7 14:44:29 2003 +%%For: grondo +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 414 311 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-0.700000 -12.150000 translate +%%EndProlog + + +0.694118 0.694118 0.776471 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 9.750000 12.000000 l 9.750000 1.250000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 9.750000 12.000000 l 9.750000 1.250000 l cp s +0.600000 0.709804 0.596078 srgb +n 9.750000 1.250000 m 9.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.750000 1.250000 m 9.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l cp s +gsave 3.980000 11.750000 translate 0.035278 -0.035278 scale +start_ol +896 1024 moveto +1641 1024 lineto +2162 1024 2496 1413 2496 2019 curveto +2496 2616 2172 2944 1578 2944 curveto +320 2944 lineto +320 0 lineto +896 0 lineto +896 1024 lineto +896 1472 moveto +896 2440 lineto +1454 2440 lineto +1773 2440 1920 2285 1920 1954 curveto +1920 1627 1773 1472 1454 1472 curveto +896 1472 lineto +end_ol grestore +gsave 4.335600 11.750000 translate 0.035278 -0.035278 scale +start_ol +2113 98 moveto +2012 213 1984 288 1984 428 curveto +1984 1526 lineto +1984 1957 1670 2176 1058 2176 curveto +446 2176 128 1935 128 1450 curveto +730 1450 lineto +756 1654 843 1720 1103 1720 curveto +1306 1720 1408 1653 1408 1518 curveto +1408 1450 1373 1390 1314 1360 curveto +1240 1323 1240 1323 970 1282 curveto +750 1244 lineto +332 1177 128 971 128 607 curveto +128 435 179 292 276 191 curveto +397 71 581 0 768 0 curveto +1002 0 1217 105 1408 311 curveto +1408 150 1421 92 1476 0 curveto +2113 0 lineto +2113 98 lineto +1408 920 moveto +1408 624 1257 456 990 456 curveto +813 456 704 547 704 694 curveto +704 847 787 920 1005 964 curveto +1186 997 lineto +1325 1022 1348 1030 1408 1059 curveto +1408 920 lineto +end_ol grestore +gsave 4.631933 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1131 lineto +832 1454 997 1616 1328 1616 curveto +1388 1616 1428 1612 1505 1600 curveto +1505 2176 lineto +1473 2176 1453 2176 1436 2176 curveto +1179 2176 953 2009 832 1719 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 4.843600 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 5.021400 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 5.173800 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 5.351600 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 5.504000 11.750000 translate 0.035278 -0.035278 scale +start_ol +1212 2176 moveto +540 2176 128 1761 128 1088 curveto +128 411 540 0 1216 0 curveto +1884 0 2304 415 2304 1073 curveto +2304 1769 1901 2176 1212 2176 curveto +1216 1720 moveto +1526 1720 1728 1468 1728 1081 curveto +1728 712 1518 456 1216 456 curveto +910 456 704 712 704 1088 curveto +704 1464 910 1720 1216 1720 curveto +end_ol grestore +gsave 5.834200 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1278 lineto +832 1530 1016 1696 1295 1696 curveto +1541 1696 1664 1566 1664 1313 curveto +1664 0 lineto +2240 0 lineto +2240 1435 lineto +2240 1906 1969 2176 1497 2176 curveto +1197 2176 996 2070 832 1836 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 6.164400 11.750000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 6.316800 11.750000 translate 0.035278 -0.035278 scale +start_ol +960 1972 moveto +960 0 lineto +1536 0 lineto +1536 2859 lineto +1153 2859 lineto +1064 2520 769 2347 275 2347 curveto +275 1972 lineto +960 1972 lineto +end_ol grestore +gsave 11.191900 11.750000 translate 0.035278 -0.035278 scale +start_ol +896 1024 moveto +1641 1024 lineto +2162 1024 2496 1413 2496 2019 curveto +2496 2616 2172 2944 1578 2944 curveto +320 2944 lineto +320 0 lineto +896 0 lineto +896 1024 lineto +896 1472 moveto +896 2440 lineto +1454 2440 lineto +1773 2440 1920 2285 1920 1954 curveto +1920 1627 1773 1472 1454 1472 curveto +896 1472 lineto +end_ol grestore +gsave 11.547500 11.750000 translate 0.035278 -0.035278 scale +start_ol +2113 98 moveto +2012 213 1984 288 1984 428 curveto +1984 1526 lineto +1984 1957 1670 2176 1058 2176 curveto +446 2176 128 1935 128 1450 curveto +730 1450 lineto +756 1654 843 1720 1103 1720 curveto +1306 1720 1408 1653 1408 1518 curveto +1408 1450 1373 1390 1314 1360 curveto +1240 1323 1240 1323 970 1282 curveto +750 1244 lineto +332 1177 128 971 128 607 curveto +128 435 179 292 276 191 curveto +397 71 581 0 768 0 curveto +1002 0 1217 105 1408 311 curveto +1408 150 1421 92 1476 0 curveto +2113 0 lineto +2113 98 lineto +1408 920 moveto +1408 624 1257 456 990 456 curveto +813 456 704 547 704 694 curveto +704 847 787 920 1005 964 curveto +1186 997 lineto +1325 1022 1348 1030 1408 1059 curveto +1408 920 lineto +end_ol grestore +gsave 11.843833 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1131 lineto +832 1454 997 1616 1328 1616 curveto +1388 1616 1428 1612 1505 1600 curveto +1505 2176 lineto +1473 2176 1453 2176 1436 2176 curveto +1179 2176 953 2009 832 1719 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 12.055500 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 12.233300 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 12.385700 11.750000 translate 0.035278 -0.035278 scale +start_ol +1210 2112 moveto +896 2112 lineto +896 2697 lineto +320 2697 lineto +320 2112 lineto +42 2112 lineto +42 1728 lineto +320 1728 lineto +320 504 lineto +320 167 504 0 879 0 curveto +1006 0 1108 12 1210 44 curveto +1210 438 lineto +1154 431 1121 427 1081 427 curveto +932 427 896 468 896 644 curveto +896 1728 lineto +1210 1728 lineto +1210 2112 lineto +end_ol grestore +gsave 12.563500 11.750000 translate 0.035278 -0.035278 scale +start_ol +832 2181 moveto +256 2181 lineto +256 0 lineto +832 0 lineto +832 2181 lineto +832 2944 moveto +256 2944 lineto +256 2440 lineto +832 2440 lineto +832 2944 lineto +end_ol grestore +gsave 12.715900 11.750000 translate 0.035278 -0.035278 scale +start_ol +1212 2176 moveto +540 2176 128 1761 128 1088 curveto +128 411 540 0 1216 0 curveto +1884 0 2304 415 2304 1073 curveto +2304 1769 1901 2176 1212 2176 curveto +1216 1720 moveto +1526 1720 1728 1468 1728 1081 curveto +1728 712 1518 456 1216 456 curveto +910 456 704 712 704 1088 curveto +704 1464 910 1720 1216 1720 curveto +end_ol grestore +gsave 13.046100 11.750000 translate 0.035278 -0.035278 scale +start_ol +256 2176 moveto +256 0 lineto +832 0 lineto +832 1278 lineto +832 1530 1016 1696 1295 1696 curveto +1541 1696 1664 1566 1664 1313 curveto +1664 0 lineto +2240 0 lineto +2240 1435 lineto +2240 1906 1969 2176 1497 2176 curveto +1197 2176 996 2070 832 1836 curveto +832 2176 lineto +256 2176 lineto +end_ol grestore +gsave 13.376300 11.750000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 13.528700 11.750000 translate 0.035278 -0.035278 scale +start_ol +2112 504 moveto +861 504 lineto +935 651 1026 728 1456 1021 curveto +1963 1369 2112 1577 2112 1948 curveto +2112 2476 1720 2816 1099 2816 curveto +486 2816 128 2476 128 1889 curveto +128 1865 128 1834 132 1791 curveto +704 1791 lineto +704 1879 lineto +704 2180 857 2356 1122 2356 curveto +1379 2356 1536 2190 1536 1916 curveto +1536 1614 1432 1495 782 1066 curveto +282 749 128 506 128 0 curveto +2112 0 lineto +2112 504 lineto +end_ol grestore +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.407843 0.486275 0.407843 srgb +n 10.000000 10.375000 m 10.000000 9.875000 10.000000 2.250000 10.000000 1.750000 c 10.000000 1.250000 14.500000 1.250000 14.500000 1.750000 c 14.500000 2.250000 14.500000 9.875000 14.500000 10.375000 c 14.500000 10.875000 10.000000 10.875000 10.000000 10.375000 c f +0.411765 0.486275 0.411765 srgb +n 10.000000 10.375000 m 10.000000 9.875000 10.000000 2.250000 10.000000 1.750000 c 10.000000 1.250000 14.500000 1.250000 14.500000 1.750000 c 14.500000 2.250000 14.500000 9.875000 14.500000 10.375000 c 14.500000 10.875000 10.000000 10.875000 10.000000 10.375000 c s +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.419608 0.419608 0.607843 srgb +n 1.500000 6.750000 m 2.000000 6.750000 5.500000 6.625000 5.750000 7.000000 c 6.000000 7.375000 5.750000 8.375000 6.000000 8.500000 c 6.250000 8.625000 9.500000 8.750000 9.500000 8.250000 c 9.500000 7.750000 9.500000 1.750000 9.250000 1.750000 c 9.000000 1.750000 2.000000 1.750000 1.500000 1.750000 c 1.000000 1.750000 1.000000 6.750000 1.500000 6.750000 c f +0.423529 0.423529 0.607843 srgb +n 1.500000 6.750000 m 2.000000 6.750000 5.500000 6.625000 5.750000 7.000000 c 6.000000 7.375000 5.750000 8.375000 6.000000 8.500000 c 6.250000 8.625000 9.500000 8.750000 9.500000 8.250000 c 9.500000 7.750000 9.500000 1.750000 9.250000 1.750000 c 9.000000 1.750000 2.000000 1.750000 1.500000 1.750000 c 1.000000 1.750000 1.000000 6.750000 1.500000 6.750000 c s +0.000000 0.000000 0.000000 srgb +gsave 1.852067 6.125000 translate 0.035278 -0.035278 scale +start_ol +1152 2496 moveto +1152 722 lineto +1152 541 1049 442 864 442 curveto +661 442 576 534 576 755 curveto +576 985 lineto +64 985 lineto +64 743 lineto +64 487 126 329 275 195 curveto +421 67 615 0 854 0 curveto +1370 0 1664 256 1664 707 curveto +1664 2496 lineto +1152 2496 lineto +end_ol grestore +gsave 2.106067 6.125000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 2.385467 6.125000 translate 0.035278 -0.035278 scale +start_ol +192 2496 moveto +192 0 lineto +704 0 lineto +704 269 lineto +820 86 980 0 1211 0 curveto +1650 0 1984 399 1984 928 curveto +1984 1165 1909 1405 1787 1574 curveto +1661 1746 1436 1856 1211 1856 curveto +983 1856 820 1770 704 1583 curveto +704 2496 lineto +192 2496 lineto +1088 1452 moveto +1313 1452 1472 1235 1472 925 curveto +1472 621 1313 404 1088 404 curveto +857 404 704 615 704 934 curveto +704 1238 860 1452 1088 1452 curveto +end_ol grestore +gsave 13.102067 9.500000 translate 0.035278 -0.035278 scale +start_ol +1152 2496 moveto +1152 722 lineto +1152 541 1049 442 864 442 curveto +661 442 576 534 576 755 curveto +576 985 lineto +64 985 lineto +64 743 lineto +64 487 126 329 275 195 curveto +421 67 615 0 854 0 curveto +1370 0 1664 256 1664 707 curveto +1664 2496 lineto +1152 2496 lineto +end_ol grestore +gsave 13.356067 9.500000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 13.635467 9.500000 translate 0.035278 -0.035278 scale +start_ol +192 2496 moveto +192 0 lineto +704 0 lineto +704 269 lineto +820 86 980 0 1211 0 curveto +1650 0 1984 399 1984 928 curveto +1984 1165 1909 1405 1787 1574 curveto +1661 1746 1436 1856 1211 1856 curveto +983 1856 820 1770 704 1583 curveto +704 2496 lineto +192 2496 lineto +1088 1452 moveto +1313 1452 1472 1235 1472 925 curveto +1472 621 1313 404 1088 404 curveto +857 404 704 615 704 934 curveto +704 1238 860 1452 1088 1452 curveto +end_ol grestore +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.886275 0.886275 0.917647 srgb +n 2.000000 2.250000 m 2.750000 2.250000 8.750000 2.250000 9.000000 2.250000 c 9.250000 2.250000 9.250000 8.250000 9.000000 8.375000 c 8.750000 8.500000 6.500000 8.500000 6.250000 8.375000 c 6.000000 8.250000 6.250000 6.916670 6.000000 6.625000 c 5.750000 6.333330 3.500000 6.625000 3.250000 6.375000 c 3.000000 6.125000 3.000000 4.750000 3.000000 4.500000 c 3.000000 4.250000 2.750000 4.250000 2.000000 4.250000 c 1.250000 4.250000 1.250000 2.250000 2.000000 2.250000 c f +0.890196 0.886275 0.913725 srgb +n 2.000000 2.250000 m 2.750000 2.250000 8.750000 2.250000 9.000000 2.250000 c 9.250000 2.250000 9.250000 8.250000 9.000000 8.375000 c 8.750000 8.500000 6.500000 8.500000 6.250000 8.375000 c 6.000000 8.250000 6.250000 6.916670 6.000000 6.625000 c 5.750000 6.333330 3.500000 6.625000 3.250000 6.375000 c 3.000000 6.125000 3.000000 4.750000 3.000000 4.500000 c 3.000000 4.250000 2.750000 4.250000 2.000000 4.250000 c 1.250000 4.250000 1.250000 2.250000 2.000000 2.250000 c s +0.000000 0.000000 0.000000 srgb +gsave 2.102067 3.250000 translate 0.035278 -0.035278 scale +start_ol +1152 2496 moveto +1152 722 lineto +1152 541 1049 442 864 442 curveto +661 442 576 534 576 755 curveto +576 985 lineto +64 985 lineto +64 743 lineto +64 487 126 329 275 195 curveto +421 67 615 0 854 0 curveto +1370 0 1664 256 1664 707 curveto +1664 2496 lineto +1152 2496 lineto +end_ol grestore +gsave 2.356067 3.250000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 2.635467 3.250000 translate 0.035278 -0.035278 scale +start_ol +192 2496 moveto +192 0 lineto +704 0 lineto +704 269 lineto +820 86 980 0 1211 0 curveto +1650 0 1984 399 1984 928 curveto +1984 1165 1909 1405 1787 1574 curveto +1661 1746 1436 1856 1211 1856 curveto +983 1856 820 1770 704 1583 curveto +704 2496 lineto +192 2496 lineto +1088 1452 moveto +1313 1452 1472 1235 1472 925 curveto +1472 621 1313 404 1088 404 curveto +857 404 704 615 704 934 curveto +704 1238 860 1452 1088 1452 curveto +end_ol grestore +gsave 2.013167 3.850000 translate 0.035278 -0.035278 scale +start_ol +2176 1719 moveto +2176 1941 2121 2088 1990 2220 curveto +1812 2400 1516 2496 1134 2496 curveto +496 2496 128 2231 128 1772 curveto +128 1407 325 1229 837 1139 curveto +1190 1074 lineto +1536 1013 1664 922 1664 732 curveto +1664 535 1477 415 1172 415 curveto +831 415 640 552 640 800 curveto +128 800 lineto +128 282 498 0 1142 0 curveto +1792 0 2176 284 2176 763 curveto +2176 1134 1976 1328 1510 1412 curveto +1116 1483 lineto +747 1551 640 1619 640 1790 curveto +640 1968 823 2081 1111 2081 curveto +1466 2081 1664 1954 1664 1719 curveto +2176 1719 lineto +end_ol grestore +gsave 2.317967 3.850000 translate 0.035278 -0.035278 scale +start_ol +1038 1856 moveto +768 1856 lineto +768 2357 lineto +256 2357 lineto +256 1856 lineto +18 1856 lineto +18 1536 lineto +256 1536 lineto +256 436 lineto +256 144 417 0 747 0 curveto +859 0 948 10 1038 38 curveto +1038 376 lineto +990 369 962 366 927 366 curveto +799 366 768 402 768 562 curveto +768 1536 lineto +1038 1536 lineto +1038 1856 lineto +end_ol grestore +gsave 2.470367 3.850000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +gsave 2.724367 3.850000 translate 0.035278 -0.035278 scale +start_ol +704 1856 moveto +192 1856 lineto +192 -768 lineto +704 -768 lineto +704 304 lineto +820 97 983 0 1215 0 curveto +1657 0 1984 395 1984 926 curveto +1984 1173 1909 1419 1787 1581 curveto +1664 1746 1436 1856 1215 1856 curveto +983 1856 820 1759 704 1557 curveto +704 1856 lineto +1088 1452 moveto +1319 1452 1472 1239 1472 920 curveto +1472 617 1313 404 1088 404 curveto +860 404 704 614 704 926 curveto +704 1239 860 1452 1088 1452 curveto +end_ol grestore +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.764706 0.949020 0.764706 srgb +n 10.250000 2.250000 m 10.250000 1.500000 14.200000 1.525000 14.250000 2.125000 c 14.300000 2.725000 14.250000 5.875000 14.250000 6.375000 c 14.250000 6.875000 10.250000 6.875000 10.250000 6.375000 c 10.250000 5.875000 10.250000 3.000000 10.250000 2.250000 c f +0.768627 0.949020 0.768627 srgb +n 10.250000 2.250000 m 10.250000 1.500000 14.200000 1.525000 14.250000 2.125000 c 14.300000 2.725000 14.250000 5.875000 14.250000 6.375000 c 14.250000 6.875000 10.250000 6.875000 10.250000 6.375000 c 10.250000 5.875000 10.250000 3.000000 10.250000 2.250000 c s +0.000000 0.000000 0.000000 srgb +gsave 13.102067 4.250000 translate 0.035278 -0.035278 scale +start_ol +1152 2496 moveto +1152 722 lineto +1152 541 1049 442 864 442 curveto +661 442 576 534 576 755 curveto +576 985 lineto +64 985 lineto +64 743 lineto +64 487 126 329 275 195 curveto +421 67 615 0 854 0 curveto +1370 0 1664 256 1664 707 curveto +1664 2496 lineto +1152 2496 lineto +end_ol grestore +gsave 13.356067 4.250000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 13.635467 4.250000 translate 0.035278 -0.035278 scale +start_ol +192 2496 moveto +192 0 lineto +704 0 lineto +704 269 lineto +820 86 980 0 1211 0 curveto +1650 0 1984 399 1984 928 curveto +1984 1165 1909 1405 1787 1574 curveto +1661 1746 1436 1856 1211 1856 curveto +983 1856 820 1770 704 1583 curveto +704 2496 lineto +192 2496 lineto +1088 1452 moveto +1313 1452 1472 1235 1472 925 curveto +1472 621 1313 404 1088 404 curveto +857 404 704 615 704 934 curveto +704 1238 860 1452 1088 1452 curveto +end_ol grestore +gsave 13.013167 4.850000 translate 0.035278 -0.035278 scale +start_ol +2176 1719 moveto +2176 1941 2121 2088 1990 2220 curveto +1812 2400 1516 2496 1134 2496 curveto +496 2496 128 2231 128 1772 curveto +128 1407 325 1229 837 1139 curveto +1190 1074 lineto +1536 1013 1664 922 1664 732 curveto +1664 535 1477 415 1172 415 curveto +831 415 640 552 640 800 curveto +128 800 lineto +128 282 498 0 1142 0 curveto +1792 0 2176 284 2176 763 curveto +2176 1134 1976 1328 1510 1412 curveto +1116 1483 lineto +747 1551 640 1619 640 1790 curveto +640 1968 823 2081 1111 2081 curveto +1466 2081 1664 1954 1664 1719 curveto +2176 1719 lineto +end_ol grestore +gsave 13.317967 4.850000 translate 0.035278 -0.035278 scale +start_ol +1038 1856 moveto +768 1856 lineto +768 2357 lineto +256 2357 lineto +256 1856 lineto +18 1856 lineto +18 1536 lineto +256 1536 lineto +256 436 lineto +256 144 417 0 747 0 curveto +859 0 948 10 1038 38 curveto +1038 376 lineto +990 369 962 366 927 366 curveto +799 366 768 402 768 562 curveto +768 1536 lineto +1038 1536 lineto +1038 1856 lineto +end_ol grestore +gsave 13.470367 4.850000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +gsave 13.724367 4.850000 translate 0.035278 -0.035278 scale +start_ol +704 1856 moveto +192 1856 lineto +192 -768 lineto +704 -768 lineto +704 304 lineto +820 97 983 0 1215 0 curveto +1657 0 1984 395 1984 926 curveto +1984 1173 1909 1419 1787 1581 curveto +1664 1746 1436 1856 1215 1856 curveto +983 1856 820 1759 704 1557 curveto +704 1856 lineto +1088 1452 moveto +1319 1452 1472 1239 1472 920 curveto +1472 617 1313 404 1088 404 curveto +860 404 704 614 704 926 curveto +704 1239 860 1452 1088 1452 curveto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l cp s +gsave 4.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l cp s +gsave 7.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l cp s +gsave 4.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l cp s +gsave 7.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l cp s +gsave 4.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l cp s +gsave 7.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l cp s +gsave 4.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 4.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 4.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 4.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l cp s +gsave 7.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 7.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 7.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 7.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l cp s +gsave 11.020633 3.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 3.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 3.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 3.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l cp s +gsave 11.020633 5.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 5.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 5.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 5.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l cp s +gsave 11.020633 7.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 7.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 7.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 7.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l cp s +gsave 11.020633 9.750000 translate 0.035278 -0.035278 scale +start_ol +192 1856 moveto +192 0 lineto +704 0 lineto +704 1089 lineto +704 1304 860 1445 1096 1445 curveto +1304 1445 1408 1334 1408 1119 curveto +1408 0 lineto +1920 0 lineto +1920 1224 lineto +1920 1626 1686 1856 1278 1856 curveto +1020 1856 846 1766 704 1565 curveto +704 1856 lineto +192 1856 lineto +end_ol grestore +gsave 11.300033 9.750000 translate 0.035278 -0.035278 scale +start_ol +1053 1856 moveto +479 1856 128 1502 128 928 curveto +128 350 479 0 1056 0 curveto +1626 0 1984 354 1984 915 curveto +1984 1509 1640 1856 1053 1856 curveto +1056 1465 moveto +1308 1465 1472 1251 1472 922 curveto +1472 608 1302 391 1056 391 curveto +807 391 640 608 640 928 curveto +640 1248 807 1465 1056 1465 curveto +end_ol grestore +gsave 11.579433 9.750000 translate 0.035278 -0.035278 scale +start_ol +1408 0 moveto +1920 0 lineto +1920 2496 lineto +1408 2496 lineto +1408 1583 lineto +1289 1770 1129 1856 901 1856 curveto +462 1856 128 1454 128 925 curveto +128 688 203 448 325 279 curveto +451 110 676 0 901 0 curveto +1129 0 1289 76 1408 236 curveto +1408 0 lineto +1024 1452 moveto +1255 1452 1408 1238 1408 919 curveto +1408 615 1252 404 1024 404 curveto +796 404 640 618 640 925 curveto +640 1235 796 1452 1024 1452 curveto +end_ol grestore +gsave 11.858833 9.750000 translate 0.035278 -0.035278 scale +start_ol +1811 768 moveto +1814 809 1814 826 1814 851 curveto +1814 1033 1787 1201 1742 1328 curveto +1617 1658 1317 1856 940 1856 curveto +404 1856 76 1479 76 871 curveto +76 331 401 0 930 0 curveto +1348 0 1687 221 1794 561 curveto +1317 561 lineto +1258 440 1123 370 947 370 curveto +809 370 698 418 629 502 curveto +584 558 567 625 560 768 curveto +1811 768 lineto +567 1088 moveto +598 1353 719 1486 933 1486 curveto +1054 1486 1165 1431 1234 1340 curveto +1279 1276 1299 1208 1310 1088 curveto +567 1088 lineto +end_ol grestore +0.800000 0.800000 0.800000 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l cp s +showpage diff --git a/executable_names/doc/slides/users/figures/fry.eps b/executable_names/doc/slides/users/figures/fry.eps new file mode 100644 index 0000000000000000000000000000000000000000..b5d72fbbdc0028564eef2f96467f65d53fb8c130 --- /dev/null +++ b/executable_names/doc/slides/users/figures/fry.eps @@ -0,0 +1,1280 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /g/g0/grondo/proj/slurm/doc/slides/users/fry.eps +%%CreationDate: Mon Apr 7 10:24:58 2003 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 182 139 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 124.360993 translate +167.244094 -124.360993 scale +% Image geometry +234 174 8 +% Transformation matrix +[ 234 0 0 174 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 234 string def +/gstr 234 string def +/bstr 234 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 79735 ASCII Bytes +colorimage +JH2#:J,~> +JH2#:J,~> +JH2#:J,~> +JH2#:J,~> +JH2#:J,~> +JH2#:J,~> +NrTXm&Jl6$&i)4"1c-U*.OtEM%kK=`.kiqB4?Yqp69mq,2QHh.~> +NrT1_%/p_N#oag*,U=9C)&XD2(_R;`#7D"O&,lt?%M9j-)QNjg~> +NrT.\qucs,#n[si%gWIJ#QXu"!!E<-)]KQn!.Y~> +OoPbO;c?Rn?!V5hrdFfWp]1>C$]LOCU8"K\X/hAFH)gpq~> +OoPqQ9he,G84ZQ\?=%#7:A=hh9ab$2@:j%[@qfppAlu)6J,~> +OoPqB2`EHC1G_*]8kMiC5PP6Y0+0a/7SZ`X;d3j@?W4!*J,~> +Q2hF8:K:D!=]na)A7U+LQBm[-!"O":RAm[)\Zr9=Ycj:UFliZ("igUn~> +Q2hF;:fC:l91qQ67RgTrD/F(_!"M.t?"e>%F(o)mA8Pgd;!%`X"igUn~> +Q2hF55!1qg0ek($/1a+c='&Gs!"Ku/3Cm4Q=]8*l +PQ:_^$<^J5>&B=]URQdaq#LGF%\0f-YHkF +PQ:_T$;*ZQ5>5a(GAU;Yq#LFa%U +PQ:_9$8!MK+Y?>[>Z3aIq#LF<"#`V762j:X7SH`Z<`pdtmK!7j^Arc~> +PQ:_^$<^J5>&B=]URQdaq#LGF%\0f-YHkF +PQ:_T$;*ZQ5>5a(GAU;Yq#LFa%U +PQ:_9$8!MK+Y?>[>Z3aIq#LF<"#`V762j:X7SH`Z<`pdtmK!7j^Arc~> +Q2hFJ;cQh#>$>j&SXlOE!!"bP!<4,QNhW8NYd_*S\[f#U_83LE3B=)>J,~> +Q2hFH8Oc095!DVIDf9T*!!!r9!<3TB:gmdFASPsrBk_!hE,]Ad+<[ZaJ,~> +Q2hF;/gi"h)&Xec:/4YW!!!T/!<399.lfUQ4$Z&$84Z-G?XHo**#tsYJ,~> +Q2h=G:fULuFEEG6WMu[UqZ%=]QBnS]\@K&\]YM1mZF@N\V0OpUWW7P~> +Q2h=A5sIRq:/5/6EH,\ +Q2h=0+;u.5-RUlF:f'_#qZ% +Q2h=G:fULuFEEG6WMu[UqZ%=]QBnS]\@K&\]YM1mZF@N\V0OpUWW7P~> +Q2h=A5sIRq:/5/6EH,\ +Q2h=0+;u.5-RUlF:f'_#qZ% +Q2h:Q;.*dNSXlFNWiDci!#(En[^NQKZFRca]t1Y\[BZI#LM!IbJ,~> +Q2h:E4$uA.E,]W0CMR;S!")G2DJj/u@qT[mB`;WDB`D<<68,8;J,~> +Q2h:,()n297n5s:84YuB!!Fl?84Z&G3;u,J5t+4;t~> +R/d^26:+FSIX[WdY,SJ%Wg!D^%?d0KWk6$\\[8`T_S3b`ZN[h8K7e#.VuV>~> +R/d^02`Ecb=]oKbH#@A-A4lh$(.M(q?Z0q(BOYF_DJO#tAnGsk6praUVuV>~> +R/d^))]KS50/#Rd:IIT;67Vs7(+q?t5YXjC4YnlR5X@\"84Zf\4$,,@VuV>~> +R/eT_:f(A:P*2l@UT:c"Vh4u3OhnW?['I3O^r=:0]=knd[C*3$8kNWl!.Y~> +R/eTX4Zu).B4lI&BPM?h>rD[I5B1ISAR]4^Ci4-,B5DBtCMRcf,pb=E!.Y~> +R/d4!rZ!.24?Q8!4?u:q3Z%iG.9K;=7R'%!5X@\!3C,r!:/4k`+sJh@!.Y~> +R/eT_:f(A:P*2l@UT:c"Vh4u3OhnW?['I3O^r=:0]=knd[C*3$8kNWl!.Y~> +R/eTX4Zu).B4lI&BPM?h>rD[I5B1ISAR]4^Ci4-,B5DBtCMRcf,pb=E!.Y~> +R/d4!rZ!.24?Q8!4?u:q3Z%iG.9K;=7R'%!5X@\!3C,r!:/4k`+sJh@!.Y~> +lMpnfZ2jng-:CsB0P-D1/_SWjh\$s8sai(a!\%K)TQZsJiV>u,~> +lMpnfZ2jn\*&KoG;IaNZD.I0n@nB6M6!IQ4DJj&m@Ua.nEGYVc#&nHt=@*N/V>u,~> +lMpngZ2jn@";;ap.ldMls"tc\4=)9j-:UI,;GotF4$,_q6U!Fl4\SgS7Q:kfV>u,~> +lMpo#ZN(1O5s\(TB8ung%\g>;\tt1;Qbg__Wk,dUrk]&Y]Y(qkXf]@BY^BfR!.Y~> +lMpo#ZN(=O0ekIV8n`HhEFSoa),i=I5\b4U;e0EQC2%Bm@q0%_?!VSlE'uCU!.Y~> +lMpo%ZN0t6,Rbe<4A8+01dODp/Ir@9:01LV6UO705s[Rm3BBGe3`oHb1FAmtJ,~> +SH'EY3)<=eMi47/YctCG]sF] +SH'Q].m#giB4l7+D/Em"C0=8)9NYb8ART7cBk[BV#A@a_A5Q2c3MZY*~> +SH(&P!!WWL2)RZf6:*e$68U)?.Q0U]6pEt'4[24u6UaF79i+Y^5s[(TU]>o~> +SH'EY3)<=eMi47/YctCG]sF] +SH'Q].m#giB4l7+D/Em"C0=8)9NYb8ART7cBk[BV#A@a_A5Q2c3MZY*~> +SH(&P!!WWL2)RZf6:*e$68U)?.Q0U]6pEt'4[24u6UaF79i+Y^5s[(TU]>o~> +T)em!(-G6#A:^)6UT1W*]"u4t\\#Jlai;?;rl"cTs252Z]t(\ML5'P4U]>o~> +T)em"$9(">9OVgVDes-%rau@?='8[8rb):Brb)4Brac@IB5;9j9M@Z$U]>o~> +T)elq((g`^&1BLt4Zttm5=.[u1c@6V779O-r]:TP5!DA)7nZZ[=&;(E0I!:mJ,~> +T)emO(.2_aJ!Zt,Vl@#/]tqP&`5fp?ai268qnrr``5KR-X/h>)F_kS;.C]BX#4V\D~> +T)emL#<,Id?Z:.1D>n,TBOtaa@V'+aBP1sfqe,k=$"d@E7lWIg4WGHO!<38n!.Y~> +T)em-.M3XI-94@X4ZPVe5sR\"5=.\*770F*4?P\f5!D;%77g6C75Q><-nZ5L\,cO4nGn(~> +T)emO(.2_aJ!Zt,Vl@#/]tqP&`5fp?ai268qnrr``5KR-X/h>)F_kS;.C]BX#4V\D~> +T)emL#<,Id?Z:.1D>n,TBOtaa@V'+aBP1sfqe,k=$"d@E7lWIg4WGHO!<38n!.Y~> +T)em-.M3XI-94@X4ZPVe5sR\"5=.\*770F*4?P\f5!D;%77g6C75Q><-nZ5L\,cO4nGn(~> +TE#E[5!Du"Pa%oAWN<;4\,O)F_oTsA`l.klqnsAl`5KR/['Ys@H$k*aFY#XfB5)$mBjsP$(&It2 +&%M[j~> +TE#`a1G_7+CMS!5FDb]%AS,=X@V07cARk^Kqe,n>s(;:=&k+`<6VgBL*\0NB5XIe)5;+Z"qZ$U( +\H%-~> +TE#fD',)3;2)RTb69dOp4[;+l5=7h,69m^ur]CiU4?bqq77B^>84Y?V+YPi62AI>5/H7:)0J4On +$i9o($Fp.e~> +TE#]g9hfSqTV/*]X0fCL]Y25#`lQ0>_Z%@L_Z%IP`=Bf$R[SM4A85g^>#8=)>5hh+?N+71CB&,R +9.__X/\M.7~> +TE#3L3B9oTD/F+gD%:>oB4PL^A7f@_@UNYSB)ZHBB)Q6JAOT$:*#pF_-n$>kr$2e!-7C8k.OmA; +5!CM:)^QH:!.Y~> +TE#i<()A8]3&io\4?l%o5!1tk5=%Lu4?>Se5Q3bD4V9tI6UXHn-k6=]%i,T`#n@4HrW`r@%1j'a +'bquB/hS=`(*47)!.Y~> +U&b3[$:\Q:Ml!>LVQR)3rP8HS#g19/`l,a4`5hkl!l;ajrkp%u_77"KQ'Io5Pa%8sW2Qi"XJr+p +VPKu^F)Pl2BPD0tFEM`@!.Y~> +U&b3N%PgLC@<$'uAnPalD.mTlrb):ErFGqA!,MRGrac^Q@q0%[?XHQ!860)#=^#3FAn:mN!+Pq9 +s'Q0g/h8G$/1`P:5 +U&b3,*"=#52aKGa2E15<1_`4[VS&5X7V$ +6:+(/72ZsA(]PBU+t5<(^Arc~> +U&b3[$:\Q:Ml!>LVQR)3rP8HS#g19/`l,a4`5hkl!l;ajrkp%u_77"KQ'Io5Pa%8sW2Qi"XJr+p +VPKu^F)Pl2BPD0tFEM`@!.Y~> +U&b3N%PgLC@<$'uAnPalD.mTlrb):ErFGqA!,MRGrac^Q@q0%[?XHQ!860)#=^#3FAn:mN!+Pq9 +s'Q0g/h8G$/1`P:5 +U&b3,*"=#52aKGa2E15<1_`4[VS&5X7V$ +6:+(/72ZsA(]PBU+t5<(^Arc~> +UAtNa77CF0I\ +UAu,i1G_3r=)DegBkM$iB5)!kAnYjjAS,OfrG)=Dral(>'4YQ\?s6lCBPqa,F*VY@Chmg$C&VfG +B+/cq?XH]"76EIa1HlGf!.Y~> +UAt`=%1O(*/j_`]3&`fV48hAC5m0G:5 +UAtT`8kNi\OfPXn[f3i@]>)A*bPoKd`5]g>aMc$5rkJHK!5e]Qs2?8$^qdUmZ*CL=]"5Pf]tV7q +^;%Cr\%9>h_7R=aVO +UAu8f1G_O1@W5snBPD*lA7K4`Bk1aa@V04eCM7Bmrau+?rFGn?s(DFIB)Z +UAu5B$47e32FKPd3]oJc3BB>f69RIo4$Ghp69d^/4T@VF5m0G>6:!g73ZL+:2)@-K2`a&`5=%S! +6VL0M9hdu:3B8iT0/!mT!.Y~> +UAtT`8kNi\OfPXn[f3i@]>)A*bPoKd`5]g>aMc$5rkJHK!5e]Qs2?8$^qdUmZ*CL=]"5Pf]tV7q +^;%Cr\%9>h_7R=aVO +UAu8f1G_O1@W5snBPD*lA7K4`Bk1aa@V04eCM7Bmrau+?rFGn?s(DFIB)Z +UAu5B$47e32FKPd3]oJc3BB>f69RIo4$Ghp69d^/4T@VF5m0G>6:!g73ZL+:2)@-K2`a&`5=%S! +6VL0M9hdu:3B8iT0/!mT!.Y~> +U]:Z]2d0CAT:`*krk&3D"Mhjk_o2Mnrl"lTrkeZMrkeZPrP],]_SX(%]=YYb]tO?Xrk8?DrOr0B +$+mXSWf(t@D_3Q\!.Y~> +U]:ZW-U0h'CMRWurb)7Cs().>!+Pn;ral%?rb)+?rFH(CB4kiUB)u[Yrb2(>!,;7Bs(M[L9fb +U]:Z9!u)G+4?P\gpH.h,s#^-As#^6Ar](QL1,:L;0etL@1c@ +U]:Z_5\XqmTV/HurkAEJs2"`Q!6"iUrl+lS!5e`NrkeZPr5J]R%)Tir^qRLr^:h7p]tXEXs1eHE +$,!m^[],U[Jm2I!!.Y~> +U]:ZY/kS`HCMRZural%=s'l%OcAS5ZSBEDg[B`;WFBk[K[rb)UP +BP;-i<)c7>0ZF*C~> +U]:N3"s+gBr]0[6n3-V0r]:'>r\ss80erY\s"XO/">i"p3]m=(r]^]T7Rg9N6UNd\.)l7;~> +U]:Z[9R;#OU8"s)r4r9I!5nQM"2i!m_#D4K_u.IS`5;Mi#J[sc]=kni^&5M;^&P_N^;@CiRsf^( +&'+a$~> +U]:ZU4'Pp)C2.Qur+5h;!+Yb7!+u+@pLXG;B)Q<@BE2cABE2fABaAKpCi!'85<9+l!.Y~> +U]:T/&1oIp2`LCim5t/*s#9p8!])Ser\=F.r%nC5r]:!>$U$dA93G7p68C;M#fm!r~> +U]:Z[9R;#OU8"s)r4r9I!5nQM"2i!m_#D4K_u.IS`5;Mi#J[sc]=kni^&5M;^&P_N^;@CiRsf^( +&'+a$~> +U]:ZU4'Pp)C2.Qur+5h;!+Yb7!+u+@pLXG;B)Q<@BE2cABE2fABaAKpCi!'85<9+l!.Y~> +U]:T/&1oIp2`LCim5t/*s#9p8!])Ser\=F.r%nC5r]:!>$U$dA93G7p68C;M#fm!r~> +V?$WA#W,M;M4LB8[(?+Lrk\WOpr*'HqSWL^r+")ZB^]$/KPtU!.Y~> +V?$WC#V\\^C3"**DJ8lXrac%?pgj87pLaG:rFGq@pLs>9s(DaOC2Ig":f'=n',/LgJ,~> +V?$W.#7DG34$PS[48(].3qtf73r_2>2uY]82>&j-3;GW84UOPK;,L(R5Vj/g'$:3)~> +V?$WM#VoMANM)u=ZF]nHrkSQMrPJTQs2>&X_o)2brkecR`;[XU^qRPW]`Gp`qS<-J!65#O"N7RM +Li:?7J,~> +V?$WQ#V\nkEHc58DeSuZral+Aqdoe +V?$W3#7;P=5smOg3qbQ,3Uo013W:u<2uGc63<2/>3rM&<3X@i,5s\II;)U)K!.Y~> +V?$WM#VoMANM)u=ZF]nHrkSQMrPJTQs2>&X_o)2brkecR`;[XU^qRPW]`Gp`qS<-J!65#O"N7RM +Li:?7J,~> +V?$WQ#V\nkEHc58DeSuZral+Aqdoe +V?$W3#7;P=5smOg3qbQ,3Uo013W:u<2uGc63<2/>3rM&<3X@i,5s\II;)U)K!.Y~> +V?$W5#Vo>9MP$T9Z+9_Er4W0Hrk\WPrl"iU!5nBErke`OpqHaCr5/EMs2>>j^qRP'^:p"YAS'!a +J,~> +V?$W8#Vo%lE-Q8s(2UP>@(WUE,\f>2E&\X +J,~> +V?$W*#7MS:5=%4e3pScq3X7Z+3&ioZ5 +U]:ZW9n7b`U8"m$qRca?s1SKKrkSlX`5T^6`Poa4rkeHG!PuYP_=tbE_>hFL`W+!YcMtoh^qROe +Me-JB!.Y~> +U]:NU7ql[\rbhdNpLjM"(PeLA,U$=BE)ZAB)uUUraZ"#%h^hBi$ZEaoHq~> +U]:W1(H49;3&iqa3;>Q23sRf/3B9/`6:1Z>s$H]Ns$$NI48q;?3;k`A3'02h;GpL].kAaBJ,~> +U]:ZZ0m.W'S"$7Xrj;[5#.M.R]">SfrkAEJs2"WKrkJKHqS*'F^])"K^])%G_>_@P`VRUS`s]i: +cd0&0\Ab:^DB?t$J,~> +U]:Z[.q2t1EcQ/9rbDFHrb):Erau.@r+,b=rb2=Gr+Q+Cs(;7@rF>e8s'l+>@q5=G%VB9`?>se" +>\%AkAiMa_b5d%~> +U]:Z9&N;X=6ps@+of`(3r]L6GpHAO@s$$ED"$An:7/]IP5la.K4TISC3rV,<2@D*%6ps%+87bjT +/eQ8,J,~> +U]:ZZ0m.W'S"$7Xrj;[5#.M.R]">SfrkAEJs2"WKrkJKHqS*'F^])"K^])%G_>_@P`VRUS`s]i: +cd0&0\Ab:^DB?t$J,~> +U]:Z[.q2t1EcQ/9rbDFHrb):Erau.@r+,b=rb2=Gr+Q+Cs(;7@rF>e8s'l+>@q5=G%VB9`?>se" +>\%AkAiMa_b5d%~> +U]:Z9&N;X=6ps@+of`(3r]L6GpHAO@s$$ED"$An:7/]IP5la.K4TISC3rV,<2@D*%6ps%+87bjT +/eQ8,J,~> +U];/c-X']#P*2>uUSFfdVl?u/['$pK]=e-V#J@RV\%KAc\c0,=\hCe4\[fDi_8!Rj\%',d^W470 +[C*oi`OWOn^V[k+`l?*Ab0%iE_83go\%AJ\G9+j,J,~> +U];#Z,>:dGH?spKD/F +U];/H&Mc+:?=$l%7n63A7R]s@83f[87S!GK#=h-K6:ja>8GkpV8,kjj77Ka74ukVa4[)&!5X7([ +5!D1c0fCrh2ublK4$5Sd3]B)\5tOXM;)'d8b5d%~> +UAtu\!!$&:D1&1XVkK]RV67#*X0Ah6rNQF.Z*F;6!4;a31pjZu[^WB@ZFRNX]XbS_\ur3:\$sQ* +^V@D#`kT=*_8F40a2c3>`PKF.]stS`X+c7A%hHnbJ,~> +UAtWK!!#Z"?tb:GJTh$3!cr="rFu4D");UeD#S2pBkhBsC2.R%@:?>3?FEV8. +@V]aiARo=arFl4G%;TQiBkV'hCgob!1^FB3!.Y~> +UAu8L!!##T:Jb\/>Z43=Ii25=7q2 +S,a!l<)d4?CN4TOK9(nIMuJS5MZ8V^NfoQiQ^aJ:U8"H[\@AiFX/N##Y-b^ge?kpCXLl0Z^;Ik' +^VIYa_Yq@^`59L4_7-nbZBgerDf75Q!.Y~> +S,a!S2E!]e77KdB:01.a9`@Wl928;[;H$Lo=Bo*;raHgVFEDD4An,@cBl.dCL1O.V>%q_dBl@p' +BkV2VB+AZiCi!fp@VTOQ;):9q)pSG6~> +S,b;Y&.f[$+=&9d/iG=7.k)hn.Olu#/i#1=3BK;d5 +S,a!l<)d4?CN4TOK9(nIMuJS5MZ8V^NfoQiQ^aJ:U8"H[\@AiFX/N##Y-b^ge?kpCXLl0Z^;Ik' +^VIYa_Yq@^`59L4_7-nbZBgerDf75Q!.Y~> +S,a!S2E!]e77KdB:01.a9`@Wl928;[;H$Lo=Bo*;raHgVFEDD4An,@cBl.dCL1O.V>%q_dBl@p' +BkV2VB+AZiCi!fp@VTOQ;):9q)pSG6~> +S,b;Y&.f[$+=&9d/iG=7.k)hn.Olu#/i#1=3BK;d5 +SH'daNDcQcHXZ6d/UNs[BZa3U7%F5Nd,emH[CF/St;aSOH?`b_mukQYd_'L +]`,S]^;%Fu^q[Y%_TBp;\$ru]WMt/cF_j/N&((B-~> +SH'd8(ASPjj +CMRWuBP1siAn>OfBPq^'@: +SH'<7&J>]p()@/[,U>m'G'.tPGBe?2H2_.W>>e?j5!CkX(Dm&d'd"qb2`s2M-Uh*<8io1!5Wh.m +4?>P&2ub`70bH9$5s[k%5"\^E8L5i90,t3%d/\[~> +Z2ak.li7b28P)?95XStIR)[Iue(<=-gY:H9g&CCEn*TN-k2ta`roF+A"Q\7Q_PdBt%A'5cS>X!2 +\ui*C\@T9N],JAs^qdh'aiVQ5\\#\e[u5iiHZX.CCM@Ko:Y#Mr~> +Z2ak.li7b/4$,;P/hKJ8GGM:?Xfo%9Za@'FZ2MN=^BD3Z\?iI +Z2ak.li7+l()@M]#Ql8OFo.Nm:BJ,~> +Z2ak.li7b28P)?95XStIR)[Iue(<=-gY:H9g&CCEn*TN-k2ta`roF+A"Q\7Q_PdBt%A'5cS>X!2 +\ui*C\@T9N],JAs^qdh'aiVQ5\\#\e[u5iiHZX.CCM@Ko:Y#Mr~> +Z2ak.li7b/4$,;P/hKJ8GGM:?Xfo%9Za@'FZ2MN=^BD3Z\?iI +Z2ak.li7+l()@M]#Ql8OFo.Nm:BJ,~> +S,br22`F$'bhQd+I".jQ,Oji8ESRio]Fdk2G4am(AUKP+A8=Tr4fm +ZF.*N]=Y_j^qdk'rlP2S&\l?#^O^WSCLLCM=&W$n?Q0s:!.Y~> +S,bQ!0/#7T88!p]WO/q8Za@3N\@AuU[@a(bVld).\[fDf['[0H['mHP[]usF\VX^%>@h>U@:Ne] +B`;`GC&r$`rb2gQD/F0#@qKUoCGIIn-N54g,6K,M&e`gsJ,~> +S,iNq#88C07;@U5OoCF@OoLUDOT0b8JVT/APa@`+Sc4cOO;O.EP*1f`S=FC]5s.P#5Wq4l5 +SH'EYD2aFO[C+'/f%.die^N!pdF-OrfA$;g-fj7Fh:gT8g#qPXg"Fd!e^`XCeC +SH'0PAqYi.W2R5H_SWFe]=GBLZmN5l\[o_t_7d@g['?m>Y.VETXK81jVl-l4W2R&;^UAu'>?5QV +B)ZEFBPM9urb`Wh@r#juAS#IkBk_U)D.mTtC2@[$BlS*2@l;s?J,~> +SH'098RPqPL5)%lTqRC5R[03:P5gdpRA?XQSsYn2Ocb]bS=Gn'Mh6J6L6A'dNLH]?RV=cB0h"Mn +3&NQMr\Y9G2)R-A2E!ZU2EF/j5ta^<62j+T5sIS%?=d\N0A6DV~> +U&b3"!#GP6'n3EmdDs;Cce-n!daHF__o'F7daHeIh>Z.6hVd>PjkAGHrobKchVR&@gt^Z;g",0J +lIN>LU8=okZ+. +U&b3"!#GP6%X"SC_RR+Z]YhY"\[f)Krh]n#Z*C^F[^?"=s0Mp<\ZDm=rjaA]XK8G&['[ +U&b2t!"Jo-(g)HEUR@O4S>;sNR[TG!L5(A`qR@*u<#F1XBR[fP(QN!EfQ][DkOdhi4R$a#( +R[SY*<]N,<2#]?L2E*QN.lB1G1c.*Q3&ifQ1c79X5=@h)8H)ut8fZObJ,~> +U&b3"!#GP6'n3EmdDs;Cce-n!daHF__o'F7daHeIh>Z.6hVd>PjkAGHrobKchVR&@gt^Z;g",0J +lIN>LU8=okZ+. +U&b3"!#GP6%X"SC_RR+Z]YhY"\[f)Krh]n#Z*C^F[^?"=s0Mp<\ZDm=rjaA]XK8G&['[ +U&b2t!"Jo-(g)HEUR@O4S>;sNR[TG!L5(A`qR@*u<#F1XBR[fP(QN!EfQ][DkOdhi4R$a#( +R[SY*<]N,<2#]?L2E*QN.lB1G1c.*Q3&ifQ1c79X5=@h)8H)ut8fZObJ,~> +V?$W&quHaH70&+>V6R)%\C9-aaM,CDhR'YVVTR'>hr!VXg"G-AjlY=Qgu.8Sj5].YjlG(He(<4* +h;7#Kkigs9VP^`9^pgo!beh?s`rF$X`!=3!`PfX*]=IpR#.]SIE-OK-g]2j~> +V?$W&quHaC*<:8EOIVW&TY/(UXeDH%]p"Y%K;PNV[^NfVX/iB%[gfF=WiiS1YH=n-YI(U@rj)X5 +[/R?1ZOE[XA7TV$F_bc=H>I?qB`D]EAcH9QASGjpChd^!Df9cC:JX)H.4O$PJ,~> +V?$W#quHa/'`_K]Fb+g`KUnj3O+W(XSof'TAVPs=RKT:ROcbk,SKsA^PEhN&Q^*f"Q^sV8S=?": +R#mDiMi2jT0JGIK4>ANR4u5"o1B0011B0'@1,_$O3AiZP4$-)E6UNRo,UD.FJ,~> +U]=%l!$`^lH?u=*Unim2P,G_*_p@W5fY*lJJU*QI][5$^k2G:Qh;.)Qhr!MWk3(gcj5o@CaP#Y8 +g!e^1jlbgu_k3QqZ*CU_=]_8*k$^qd[^L5'ks*Zj):J,~> +U];W?!$31ZEcRAHL5'MgGDqueV6\:f[[MJe>#K3SOJ8JQ\$E==WuA4JX/iA+YHFq+WiWJ"U:J.X +[B-U:[Bm3NLAkKYBa\Q]@: +U];o4!"ff+?!ViDDJiEY>]G1KM3P0GRXA@F4Z-#2F,5X;SX>e,P*26'Q'Ia9RN7`\QC+2%NM0%r\FL.r@S[30/#%:2)R9Q3_)k*4#0&5&_mA:~> +U]=%l!$`^lH?u=*Unim2P,G_*_p@W5fY*lJJU*QI][5$^k2G:Qh;.)Qhr!MWk3(gcj5o@CaP#Y8 +g!e^1jlbgu_k3QqZ*CU_=]_8*k$^qd[^L5'ks*Zj):J,~> +U];W?!$31ZEcRAHL5'MgGDqueV6\:f[[MJe>#K3SOJ8JQ\$E==WuA4JX/iA+YHFq+WiWJ"U:J.X +[B-U:[Bm3NLAkKYBa\Q]@: +U];o4!"ff+?!ViDDJiEY>]G1KM3P0GRXA@F4Z-#2F,5X;SX>e,P*26'Q'Ia9RN7`\QC+2%NM0%r\FL.r@S[30/#%:2)R9Q3_)k*4#0&5&_mA:~> +V?$W6,8r1;=fK6Rb0Abuhq-K7imZAiSXkn.Z*DBj\@A]`aj/MsiVqpAkj[ZokPjZbk2bUcj5AkG +eC<=i$Ga]TbG[)XFg]2j~> +V?$W2:)5'K9q&>l[&pmL]=#&W^pLJ +V?$Q(s#3]*R[Te5TqS6OS=l^GR"&IM:fD4JJUVKS@t&lXMNj?oR@0S>R$a>4S=>q5Q^OA;Tph:5 +SY;F +XoJN!*Zk7[!*K4#'fS39:.n5_I&3[Ra2couaN0L!LUGh7gCE?/khs4jWM6r6e_Aj1eGeY2kS<:B +jQ,F^mdAEEbN%g-aK257P,5Rorji'=s0`-I_8*k'_o)Gl&^/58_o'@.]sP/GIXlru4;f$l!.Y~> +XoJN%+!:F]!)WXp'IP=Y3]/cX=F>L`U8#*:VP\W>#87jJWWg]2j~> +XoJMi(`<2O!'C/[-P-k%+rq[O5\=VZLkqS%MMb8$7s()_Q'.Q+SWS#9>ZYf\Lld^VM#NnDS0XSl +R$a>3XK7M?M4C,]GZ.%".lTXU4?#2S0InY11c$pB0/"pV.f_@(0+BZq2` +WrOn)0JEJI0JGaoMi5Eqbh0q&R!bBmbKcr\H`F*cf@&+!jl>CJmdAQCeC +WrO.h.k:T:+`4N=[/R3?]!Si=_83(=WN!PG^q74bZa0S8!jJl3 +rN6()&u'tiAn#UoF*r:[C0OnKB5ML$rG)=Grb<$^C2.HtD/F#s@U(ra7nbKP);G4B~> +WrOmh'bp]X#6tqk=BLQKQCWk6=$9enNKS!i4`"qhP`1Q]R$O%hU8!BgM2@duUS"0IR[O/D'q:Y\ +S!]G)QBd_f@7*CE6:+.87n5E8,Q]SR1As!20eY13r[\%)r\4j=3B9,V1Gg111ccfo'ANS<~> +WrOn)0JEJI0JGaoMi5Eqbh0q&R!bBmbKcr\H`F*cf@&+!jl>CJmdAQCeC +WrO.h.k:T:+`4N=[/R3?]!Si=_83(=WN!PG^q74bZa0S8!jJl3 +rN6()&u'tiAn#UoF*r:[C0OnKB5ML$rG)=Grb<$^C2.HtD/F#s@U(ra7nbKP);G4B~> +WrOmh'bp]X#6tqk=BLQKQCWk6=$9enNKS!i4`"qhP`1Q]R$O%hU8!BgM2@duUS"0IR[O/D'q:Y\ +S!]G)QBd_f@7*CE6:+.87n5E8,Q]SR1As!20eY13r[\%)r\4j=3B9,V1Gg111ccfo'ANS<~> +XoKgu.OmbqA:&B%>>@nPNSiOH`5&.CL5Lk`Tl+a-?=$oTQ'Ji&gY:lifa?Hdg!\0ke)96FiVq^T +ioB(XhqQoLe'jtKUnk>sWiN8)Y->LK_o9L0]=e-Xs1eWPrko>`^qd[u^V@Ln\[$j +XoSGR,XPgDEFVL/1bW]_]=>ACR!X0gBP<'P<)ao,6pXXjF-EE(Ye0n@$FI.GX/2Ym['mELrimKL +Za6p?Y-,C4Ui0FSDL$&7CMRTsB5ML/G&_M:C%uHAB)l`HD?"ATBL,*W6TWp$J,~> +XoSG;,Uu8Q=@t1u)\l=OTq7j0IplbT9MB)01G]"S+WN%.:2b]DNg]m-$':4/MM6bCQ^aKCR/icV +SJR]VOdq/\:,b^7;+!]84#JlN2`Eo`3B@$o(,7Hq/hS\+.kN>-2a';f4Zu(Y1,:O3g&QX~> +Z2ak1rW$(M!!%>DW4KRS^;,t_Iu]SNRYS)M`Oiaq^6Osd`l?*8T:^%'F`jC[XiB/QhUU*(f\YE= +gY1B9hr3POhWO(JUSER.['[<>7hJ& +!.Y~> +Z2ak3rW!-U!!%;%V>WE+4cbUn!sJVLO(_rie5VJUpNP:JZ=qMl+/$^9t5N[^ruY +['I!D[Cu+6[2%'fI!.Y~> +Z2ak/rW!BC!!$;[LQmj[Nf$t)5lOG"=%@.GKmeB"Jm)=tM2@+@>?`Kc.OnJ1AUfu3Q]I)aPQ$ps +Q^F/.SY)OFR@9Rm:f&f+<`W*Z3^#Ga4$l>'3\2O%1G^dA0eb:6r\"j50/#.B4?Pnu78?024")3W +#i#E1~> +Z2ak1rW$(M!!%>DW4KRS^;,t_Iu]SNRYS)M`Oiaq^6Osd`l?*8T:^%'F`jC[XiB/QhUU*(f\YE= +gY1B9hr3POhWO(JUSER.['[<>7hJ& +!.Y~> +Z2ak3rW!-U!!%;%V>WE+4cbUn!sJVLO(_rie5VJUpNP:JZ=qMl+/$^9t5N[^ruY +['I!D[Cu+6[2%'fI!.Y~> +Z2ak/rW!BC!!$;[LQmj[Nf$t)5lOG"=%@.GKmeB"Jm)=tM2@+@>?`Kc.OnJ1AUfu3Q]I)aPQ$ps +Q^F/.SY)OFR@9Rm:f&f+<`W*Z3^#Ga4$l>'3\2O%1G^dA0eb:6r\"j50/#.B4?Pnu78?024")3W +#i#E1~> +XT8B.6(Pj._pl`IgYgQ0^94WZf$`!thr!81V597$db3-rce[g-b+3QnP-i6KdbEO/bhLn*f@Sd7 +iSi\MeC:1AIuK`nOT2$_Tr#'#\@&`L]["g7rk&?J^qdec`"0Z#_SNml['6g?ZFQ?iFACNiJ,~> +XT8B.;jk,([D8oH]Y1;DP(.tLYH=q5^:q@^Mi2_f\@o>RY.;EFUj#X3Eg3GuZ+@NTWOK@DZEggG +\[f2VV58-+:0M45>?PTO@qKOnEGB5tCOLVEC&VlECBS9cCMn%hC]AAXGCsRB8M]!"J,~> +XT8Ai07KF]R\c11TV7I/H"CQ:P)tcjT:_[1BP:5-Q'd_mMj9laJ5[pI95]91NgH)rM>ikAPrG,% +T:_^BM2>%]/iQ$O1GCmP1c%-P4#8ZA1IX_f1GU^?1,:O:0ek==2*=&f5XJ+:=)1c72BpiTJ,~> +cN!qZrW!$Q<)cf^!<5Xj!<6b3Y/\Jge^i=(hWX1hlK[Kai8ESNhVd2*_4]*!dFR%*hr!8GgsFEK +M2[Cqbfn\ii8D&MZddd]f%]-Cj4M`*e'uRa]!/E5GA1cS]Y)%fZEh9]qnEr__SXL([C +cN!qWrVupIr_;\Ys&&drs(=?k]=XiP\[f,V]"5M^[^3$A[(*NO\$_ZnH)IR?Xg,.;Za$d>WMtP[ +AS$UmV6I/6\W;].X0\q1Z2V3JXJDYjWLofBJ:MN%/1aV@G'%;'?tj?QC)(N!Bk_Qm?"8&"FDc,> +F+&C^G%UdTr[Qe*J,~> +cN!qQrW!$@3]].a!<51]!<5eoN1Z_rT:;=)aRTV.g;R@0S5R@BRlI9MMcMiX'cQBmc"PDY6/ +6UjOXL5(hRS=FV +f`;!cs"==M!(m.i#u=Q$<)$(C1c[Sk!<6!u;"anh=V$G/`9+YUc/7R;h;%8Zo\TT/s553`jj_em +f%/L/hr!AMhVR)Nk1mtPUl(4oZdmgbYdV!mg"4j5h#?%-fdtk6io9"WiRb9!QCtUl]Y_t>_SX+( +^V.=q^r!t/]Y)(tXf\7iTpq'tLOjX&!.Y~> +f`;!a"=>?Z5reiD#sLgJ76s3e.ki[P!<6%!;t^4k<=abk[aUqQY.D3HXfA\4^p!aHs0] +CD(ArBkq3gD0U#=F+8[jFDu27A(gp5~> +f`26f%1O9n.k;kD!!t,00et70%1X-hp]1=]!'p5Xs#^g*R@1C5Occ3+QBm`*SZ7tSSc>'&S"5Ls +FH2BCPa@`(R$O&'T:_I$?XH5o8oB`VQ>:J[PE_5nRf/TQPS'+EPa%5`L3?'3,:,-%1cIZbrA+F. +r@e1*%luX.86&Ma<+BEO@q&nQ<8%>&~> +f`;!cs"==M!(m.i#u=Q$<)$(C1c[Sk!<6!u;"anh=V$G/`9+YUc/7R;h;%8Zo\TT/s553`jj_em +f%/L/hr!AMhVR)Nk1mtPUl(4oZdmgbYdV!mg"4j5h#?%-fdtk6io9"WiRb9!QCtUl]Y_t>_SX+( +^V.=q^r!t/]Y)(tXf\7iTpq'tLOjX&!.Y~> +f`;!a"=>?Z5reiD#sLgJ76s3e.ki[P!<6%!;t^4k<=abk[aUqQY.D3HXfA\4^p!aHs0] +CD(ArBkq3gD0U#=F+8[jFDu27A(gp5~> +f`26f%1O9n.k;kD!!t,00et70%1X-hp]1=]!'p5Xs#^g*R@1C5Occ3+QBm`*SZ7tSSc>'&S"5Ls +FH2BCPa@`(R$O&'T:_I$?XH5o8oB`VQ>:J[PE_5nRf/TQPS'+EPa%5`L3?'3,:,-%1cIZbrA+F. +r@e1*%luX.86&Ma<+BEO@q&nQ<8%>&~> +dJsae2`F#p:JX;//Po#*68eW?"?mM`5"YAH*DhKF^u*ese(EdDlf[HchW3bXh;-uNio8PDgYC]b +iW%e'hV6fGkLeG"USF-<^V?8F[+s3`fB:rDgZ.AUh;.5Ul/h$2WhuYoZa7*N^qdk*_83q$^;.S& +_o0@+]:O"^>ZXut7K,OV5!1qd1c.)J!.Y~> +dJsaa-RUQ,5YID$OZEh'Q]XG7tF8fnRB`D`DCB&)JC]eHfC2!TZ% +95;E/i>L>0J+k/0.edT.f_6\!.Y~> +dJsa]'GM?--n$)?"sk<,(DQ`H"=O^0.l?ku*@t>rNMi56Ocu<*TUVF5Q(4A6Q'I]-R[T8#PE_F4 +RK&U#QB[W)TTP@Z>[1&tG^*2)D3^-COJ%l)QCaY +eGpIa='&X);F*ZL<*rs +eGpIQ77Ba24tSES6;:'E:e3Z05AFr.]!J_m>5eO%7KcFW!!#(W!"pqF3Dtj7Vo$EYZDFP"\#Zd= +ZMpp1ZaR +eGpI:/M/V&-5@=J/2o=>3%c?t-Wdd5!_Ct +4#8E=r@n1&%59Uq5Yb'T5q+6<5X6pO!.Y~> +fDtqL,Ar1(S",:j@od_pWmB#$Fu@'`7t23=7Z05YbmGLU>Xpk5ONO +j4iJKiSNGHhrEbXro="=!9=(<"Q8J+ki;Zrs5=4Chg9^(]tNG)ckb^%g"G9@i8a.bjhdRZWjK@K +\@fJnao03Y_?7Wh^VTod$F@7P[?P]PF*2U6q>^R8&ea(%J,~> +fDtqD,@YbPMMQ:n9gE,qQFXQ5[[Wb1J:OlE]tM1B?=$/p8kheg')Vb02An2)1HSYO]XRmCs0W*@ZVOA"Ocd*OU^joAWiE2)YHk^DZ&N:)D>nY` +D/3p+E,'-'C]82ND@UN"CMR$[?t)ei3Cm1O$Mj`((_IA;!.Y~> +fDtq/,>)0ZE,Ac^2(2$fI\EI*S:Q5rB4mO8W2QeI:/3f44[;+>%f?>,(E!br&K3/i7rXN[SXc1= +R?3`#R$Er#QC=83rgNhU!1NnT"IPjTTq)+Gs-a1_Qo$W`G'9ASM&DkQOH>WfOcl#fMISS(5!V:q +1c$pH2DHp>q^i:20f:g=3]]Yb,pbE:6jWVh!YPqOhZ/0~> +fDtqL,Ar1(S",:j@od_pWmB#$Fu@'`7t23=7Z05YbmGLU>Xpk5ONO +j4iJKiSNGHhrEbXro="=!9=(<"Q8J+ki;Zrs5=4Chg9^(]tNG)ckb^%g"G9@i8a.bjhdRZWjK@K +\@fJnao03Y_?7Wh^VTod$F@7P[?P]PF*2U6q>^R8&ea(%J,~> +fDtqD,@YbPMMQ:n9gE,qQFXQ5[[Wb1J:OlE]tM1B?=$/p8kheg')Vb02An2)1HSYO]XRmCs0W*@ZVOA"Ocd*OU^joAWiE2)YHk^DZ&N:)D>nY` +D/3p+E,'-'C]82ND@UN"CMR$[?t)ei3Cm1O$Mj`((_IA;!.Y~> +fDtq/,>)0ZE,Ac^2(2$fI\EI*S:Q5rB4mO8W2QeI:/3f44[;+>%f?>,(E!br&K3/i7rXN[SXc1= +R?3`#R$Er#QC=83rgNhU!1NnT"IPjTTq)+Gs-a1_Qo$W`G'9ASM&DkQOH>WfOcl#fMISS(5!V:q +1c$pH2DHp>q^i:20f:g=3]]Yb,pbE:6jWVh!YPqOhZ/0~> +f`34)KnZJ>aN2cOb,UA^Oh0W7aPl%6\Xf:la4&MlbGM.Z:f.&is%42(*a;irUSGH$OH>$ae'mmO +kf_oCiT0%Zio9^mrSmk4s5a48/(rb7g!>\=W6s#SgXOa-ioB(Xj5]FheC:X`OgV^+['R3L^;7Ot +a2Pp4_>_4K_?nQ5c,6,pFD+39e,Y"~> +f`34$I=7Wi\$s&Y[?Yl[H(iC'Wl)ZhRt?6SXh23a[Zcnc5!JlEs&0h6+';WgQBnM5EcPH-Unkf2 +Z'VW!ZF.'HZa9D5rNlO,s1&*5+0DfQXeT?7I&3[MYGeD'['?m=YctOASXjn&<-<4sC]7iLBP(dc +C27['rGE$[CMS$7F`LPF4$GDTe,Y"~> +f`33eAnH^]S"$.@RX/7J@>hIuOJeqOIq<27PbY"VTn7kq0JND)s#:oR'/qjLF*!%Q:f';UMMe=% +S:QrmR%'P5R@3f]r6P`:ZeR[09=OU@;5G'6J*-Ug6X2Z>610.eS# +/c@7#/Ia?f2E"*';,on3.PN>%e,Y"~> +g&NL)MR9b2ai_cWiSiJ#SXlRj^<>0lkMNqbTWcbj`n&2NLf%"L>A.^L!"18&@:>>1]$AsUdDPsm +"NB0OlK8*,s5a:Ek5OK@jT"9?jT" +g&NL(Lp!no^:V"obfn#!K7f#TU9M>Tbf6EQM42/mZGj;^GsO^r9jqK0!#%"5?=&VoY.VQVZ_*86 +Lm+[3[^?%>s0Da6[/RE1ZN%30ZN%6c[@s:pZFIE\]"4/BL5)M,Y->F?Yc"k<\?iQLYa9EP?X@&Z +DfKc@G^+=JD/F*+DJoDk$>jQo@qK=f<]2iMdK"d~> +g&NKiF-`,dU7RsSZ*C9bCi"3PN0Bm:Y,?r+BmZMGQ`HdPA2,e=5Yk2T!##kT4$.)2LmFQlO*ttb +DL.D+TUYqKs-`tYS,SlTRK&ZSRK&^.Rtlc]R%BnITV-X/Ci"unPa7o,QAq9$S!0"uN,hQa1GCLK +4?GVi5s[Uj1,:H[/,q1%/i +g&NL)MR9b2ai_cWiSiJ#SXlRj^<>0lkMNqbTWcbj`n&2NLf%"L>A.^L!"18&@:>>1]$AsUdDPsm +"NB0OlK8*,s5a:Ek5OK@jT"9?jT" +g&NL(Lp!no^:V"obfn#!K7f#TU9M>Tbf6EQM42/mZGj;^GsO^r9jqK0!#%"5?=&VoY.VQVZ_*86 +Lm+[3[^?%>s0Da6[/RE1ZN%30ZN%6c[@s:pZFIE\]"4/BL5)M,Y->F?Yc"k<\?iQLYa9EP?X@&Z +DfKc@G^+=JD/F*+DJoDk$>jQo@qK=f<]2iMdK"d~> +g&NKiF-`,dU7RsSZ*C9bCi"3PN0Bm:Y,?r+BmZMGQ`HdPA2,e=5Yk2T!##kT4$.)2LmFQlO*ttb +DL.D+TUYqKs-`tYS,SlTRK&ZSRK&^.Rtlc]R%BnITV-X/Ci"unPa7o,QAq9$S!0"uN,hQa1GCLK +4?GVi5s[Uj1,:H[/,q1%/i +g&OKQUr^Wr[*-Y6dF$RbX/iJHakOe[cKN^)SY+$G_qrnmQXs`GO.i7o91q*AQ^>J/ai2QYg#M/P +iSWbYkih$chr3Pljo4<>iWJ6%jlQL('C"T3g=tNBcaV-Bl.at@m,mHYj8S3@l3H=^R@0be`4c/Z +$GaKo^;J1=aMu3 +g&OKSU;Y!aX1c3U]tM:bOcbm1Xhh0O]%"O2NK:]`[aWFCNEoh%LnC;i(t` +ZE::4['['AXfnr+Zi76/YSj^OZa7$J\%B)MXKAb4To#A4]['Zib>?bNdJ9,F: +B)ZQN@qKXtCi+'-rGN$[CMR[&DK]JJ2_!/TJ,~> +g&OK>NN9+SNhW8;U8"QNH?t(-Q_oe2RB`9PBks*'Pd@NqE^iMqFc)&c1G]k)DJkW&Q&C`jQ^sV3 +QB[f*St).6Pa7X5Rf8]RQSOqrR[T_:SY;R:P*;6!LMqj!Tp([tUn408R$3_pOH>0"1,:^a;+*Au +0f1X@.P!80/c@4"/IO0f3B9?!9j^aL/L&UCJ,~> +g&O9;EFi]tS[c2@a2cWb^V?#8Xjk;*_:[&YOGCfoZI@.GQY:&OPc:XJI=4g]NfL`g_TL*MdF[14 +iT'(_jSe';iW/$iq)./j94N%iSWJjga_1Hlf.@#fq=t0^V%4j]t_>!`5KX8aN2QG +_o'=._ns:+^r"%.^metL8^[Th~> +g&Na1F(JorQERKn[^NlhUni7!PJOZ6[*6M.M1ECWYL1\BQYC/TQ`[B\LPJf'N/[bE!P,W:Zi@<2 +Z2Us-Xo>O(YQ1s-Z2h61ZMq-/Yl:j"ZN%<8['I!AY5PL&\IG^P\Y!>;?@-d9DJa3+rbMII!,_^O +"E&0tEGb\is)/$\=Y_`\dK"d~> +g&M.E?N*YJH'4>QR[TtRO,mduI%upgOf"_A?WNJYL8q5PF\58,I$0Y>@U^o9@q5Ls"ceP$NK9;& +QN!6OQ2[*LQN3EPR/i]TRJrTRQi</2E +f`4$+=]o0\SXl[j]=G5/OE$JJQ);:0^n%$7Ha0i`\"]U@@UaA7OH>* +f`4$0?!Ul`R$aJGX/25,F]<[5LS2/e]UG:,IC6Jp^T"2_D/FZaR[T7fJQ,0eH`=?X\@&]NZa@$D +Z2Us-YPbX&Z2V'.Z2_'-YQ(m&ZN%<8['I!AYPkX(Z4=( +f`4#o7RfmPH[C=+Oc4p%@R=U9CjqV5Q>^\,:4n1WNdZ=U77C9tGB[Y#=">7d:OInON/NXRO-,Zk +QN!9KQi*6MRJrTRQi<.b'eV$g/hAM'/2&Y5 +2ENue;Gpgo/1`-r!.Y~> +f`4$+=]o0\SXl[j]=G5/OE$JJQ);:0^n%$7Ha0i`\"]U@@UaA7OH>* +f`4$0?!Ul`R$aJGX/25,F]<[5LS2/e]UG:,IC6Jp^T"2_D/FZaR[T7fJQ,0eH`=?X\@&]NZa@$D +Z2Us-YPbX&Z2V'.Z2_'-YQ(m&ZN%<8['I!AYPkX(Z4=( +f`4#o7RfmPH[C=+Oc4p%@R=U9CjqV5Q>^\,:4n1WNdZ=U77C9tGB[Y#=">7d:OInON/NXRO-,Zk +QN!9KQi*6MRJrTRQi<.b'eV$g/hAM'/2&Y5 +2ENue;Gpgo/1`-r!.Y~> +hZ3Zm4TJ/L@W#:M77prq=(>`WJ9lNLDJiEK=]o!*:IRAt/SAEd:H^g&86/u#FEVh05\4Mo\[fi+ +dF$S$iSihrk546;j8S0>jT"9?iW.s2j8\3CjPo1XrSR\7roX7)$`Kc0\\b\Z]=l"q_YqCP`=g>6 +_SX+*_SO%%^:_>"]ouc/:XT5n~> +hZ3[$2?6f[D0KAq8PNQ!;HHq*CLCO;='&!g=]o'/;G0G;2frqC>u"'e=_DSgJV&J\7V$%oY-,:B +rNuU1!3u='r3-+)rilF+s/l@*p9FY("1#/8YPkU6YdLmFR$_i&GB\@GB5;8]C&VcJBkV0rrb;gW +DJjB0C2.C!DK&PR/^aWL~> +hZ3Zm4TJ&F>[g8r0JZ!_2*F)l<_lLI77Ap`2)R9<,o[Bs!^&Ci-lO*H/3Q?f)/Lr>( +0JG@C4?Pr.;I2jA-nE^GJ,~> +i;c.[:N:A\>$>NL:f(&+GB[P0B5DmDIq`\6:0`X4SDLk^Y->?aK_:/6+hKlTpj=GO8j +air/[fA,?Dj8J->jo=BAj8S$iqDF4j9"B$ir.gJioB@jfs7oRXM2E]\@B/b^VB`` +rk];ia25^/_SX.(]tM%m^UT5*=[(76J,~> +i;bnW=akg;BP;L.?=$lWH?s",?X7;XBMDN.7U1h.TpD">\? +i;a?(:3:Sf>?bZH7n5sL?XNb&&QW"95t+3q5\b%ZC2.^S^*o2^9Y(0j.pn9-bi2;0dGE +M2I1NOT(LDQiNTSRK&WSQi<9NQ2[3NR/`NPQM-^GR0&bBQi33bQ]dGlGYV!i5"\F63]],S1,:O9 +/hHuOs"XO,%PT^r2`Nr`6;pfd6R3p%dK"d~> +i;c.[:N:A\>$>NL:f(&+GB[P0B5DmDIq`\6:0`X4SDLk^Y->?aK_:/6+hKlTpj=GO8j +air/[fA,?Dj8J->jo=BAj8S$iqDF4j9"B$ir.gJioB@jfs7oRXM2E]\@B/b^VB`` +rk];ia25^/_SX.(]tM%m^UT5*=[(76J,~> +i;bnW=akg;BP;L.?=$lWH?s",?X7;XBMDN.7U1h.TpD">\? +i;a?(:3:Sf>?bZH7n5sL?XNb&&QW"95t+3q5\b%ZC2.^S^*o2^9Y(0j.pn9-bi2;0dGE +M2I1NOT(LDQiNTSRK&WSQi<9NQ2[3NR/`NPQM-^GR0&bBQi33bQ]dGlGYV!i5"\F63]],S1,:O9 +/hHuOs"XO,%PT^r2`Nr`6;pfd6R3p%dK"d~> +i;alq?DsfP=BIsX;,M"LEH-)\NeDJ!H%2$AF)6hqV>cu-UmIF4R@Ke/EH+oQ>[3;XRZM2c=a[HX +a3;rYfA,?Dj8S0@kl0cFjoFNBj8e6>kPjWDjo=BAiq)41iWS6"j5]5"jTE,ZPaMHV"Kf8H]>"0W +rkT5g`kfL+_83q%]tM%k]s<8k +i;bo@BXkR6Bk^UJ@q0\5H$ORiM0WQ?@q:"9CM]#kWM6,_YGJ(jWNWM%KnX2NDJkuAVO2:)=a?mA +\$l7Brj)O-!4)U/s0)L,riQ7'riuI,s0)F)o"'sFjHZ*LaI\W('-@s;p4Ao;L$BkV2XC&_iH +C]7uWC2@^'ChRKpCi!`Q-RTDP!.Y~> +i;c&j9heu/@: +i;b-(AR8\dK7dSn7n7&r<)ce8E+r[$FF]1'9/8UlBT.nCVkToWrgXjuR[TP/St;RLUS30F@!/HJ +_p$NUfA,?Dj7qd7jo4HBk5XQ@jS7d4iY:G6jQ>X]h5-'hVRNY.XhDE\]t_>[_#M7`a2Pm2^q[Y" +^:_+l\[eV`;GtmBJ,~> +i;boEEGocRR$`(p>[2Dh?sm)RD.$.G?=e.t5:noWB9&"LYH4h*X0&M.Xf\P&YHP(4Yc3@b?uhm3 +ZaTh>s0D^2pos\"riuI,s0)F)s02:'qlg^ +i;`jXrb!X4O,n$A8P*8j84Z$M>#.C^;d +i;c/HD+I3+Lkp@C2)SNUH[B7BEG/m0HZik-=Cu>aA6iJII]9<@UnXTUS"#q;Q^=G8R\5RMAT"38 +^!+mOfA,?Dj8S3 +i;b-5H!=KtT:_9L:/5_ZM2?"eE+)^YB3e/'8mPt +i;c/IDcKeXQ^G'Q68^VT8o\iaC2%BoB4l!rCMS39Eck\C0fEKM +H%h'1N0'3cPl@'IQi*6MRJrTRQi<T63!q]/5X7q89L^EN*ROk;~> +i;c/HD+I3+Lkp@C2)SNUH[B7BEG/m0HZik-=Cu>aA6iJII]9<@UnXTUS"#q;Q^=G8R\5RMAT"38 +^!+mOfA,?Dj8S3 +i;b-5H!=KtT:_9L:/5_ZM2?"eE+)^YB3e/'8mPt +i;c/IDcKeXQ^G'Q68^VT8o\iaC2%BoB4l!rCMS39Eck\C0fEKM +H%h'1N0'3cPl@'IQi*6MRJrTRQi<T63!q]/5X7q89L^EN*ROk;~> +i;bB:G%bPO>$@#58kMTXDJj$:JU)!`KT1V:GCa=:5t"+9@=s2aRAm0^SXlAOTbsD`OI;)@B5*g' +\'*.Ff%]-@j5f:`j5f;#jT+HBk6'r2kN2^(s5X+ +i;boPJU)N>EH/"C@U`Y]I=6!bJoOq1D/j3$@rPFJ1cmci?A!laT +i;c;TH#n%$Bka2n;Gp+jBP:UjEb%sWASkpe>\6Mt+W_[M0i:eA@s)p7Ci"$1G'8(EC2dT=2)/BB +G(k[*N0'3cPa7W&Q2[*LQN3EPR/i]TRJrTRQh6RDR/E6bQ^F83SXO2(2a'<$5Wq7u1,:mM2)Y@h +(bmZu0f:dC1,V'P4[;A%;,C(W.3K`5"U3BUJ,~> +i;b!9GC+[N;c?b?AnG%uSt;jTUQUCdKn+Jq?uUI>DdQjTr`L@NCOLVlSXlXUV59u\TUBjo94r$U +\AZV8eCiU2h;I5Nroa@Hroj@E''838io8qUhqm2FhWEt`kN:pirT=.<"Q/8"l0&'(-fpheR&-Xg +[%O(g]=Y2R`PoQoY.DT\[_]l"`5Tg=`4`Obb+>2L>L*;"~> +i;a:)J;T54BP;=GJUq[.ric?t15^0fBjk+G6<@W*=A2C[9i+YiBmtMoUSFroXK8CtV4Mj)9kS-Q +Z+%6Q\[SoOYcb.4ricC+ril@+rNQ=*!3lF*ricL.Yct>0YlCg.XKf%>[JmQA7T7r +G\M&CI!&q/DL#i+B`;TOBl.^'B4GG$>[0TOcN&I~> +i;c8`I=m/o?XI8nE,]*@SXlF>Q@Ea_AR8D<5Z:ro:d.'%2)@$L6WR6#GB\UiJ:N3!I +i;b!9GC+[N;c?b?AnG%uSt;jTUQUCdKn+Jq?uUI>DdQjTr`L@NCOLVlSXlXUV59u\TUBjo94r$U +\AZV8eCiU2h;I5Nroa@Hroj@E''838io8qUhqm2FhWEt`kN:pirT=.<"Q/8"l0&'(-fpheR&-Xg +[%O(g]=Y2R`PoQoY.DT\[_]l"`5Tg=`4`Obb+>2L>L*;"~> +i;a:)J;T54BP;=GJUq[.ric?t15^0fBjk+G6<@W*=A2C[9i+YiBmtMoUSFroXK8CtV4Mj)9kS-Q +Z+%6Q\[SoOYcb.4ricC+ril@+rNQ=*!3lF*ricL.Yct>0YlCg.XKf%>[JmQA7T7r +G\M&CI!&q/DL#i+B`;TOBl.^'B4GG$>[0TOcN&I~> +i;c8`I=m/o?XI8nE,]*@SXlF>Q@Ea_AR8D<5Z:ro:d.'%2)@$L6WR6#GB\UiJ:N3!I +i;aC'H[:!W>[10@EH,5iKnYlmWA:6:R>H69G);EHJn\q-BQ%gPLNIWKC2/BjUnk2[QA06R;.a9H +Ye\<"db*=/h;R>Qkl0iGkQ'fFjo=?@ir7m9hZ)@5hWEtaqre"ApuE=Oi4HUfJqB>pY-*q7H\n)] +T;]E8]s>,V^])4Q^&G;B]u@smMMcBecN&I~> +i;c,YJVT#6EcPoIN/Vt'Q^=MKX.ti.J8/1g=)2r$Al;N$\$r]Mr361(ril:)!3lI-rNHC-Z*CM.Yl:p)Z7)u^M2>_;:18HkF]^mo9NYS+ApJZHCM[g* +Ec5l->?bBIH$O(":dPT:!.Y~> +i;c&YIt3&pAnG=lI=5^=LPM(bSsP=[H"C#W +i;b67HZ=%HAS"\AH?sBd=BJQp8O,dU@t9`*It)]fBO>+VDK^3!Q[!cS=;c4:M2A7.UnNEK?uT@U +Q+k8Xce$n)hrEb[qWIqBroO.>$K9q$hVR)EhWEtaqrdq?0BqT[h;IP^jOfNSW4BI;JST%CLkpJM +R$`i/V6$Q&[]?mR_8 +i;c8XKReT.H?s7HQBmA'D/EcZ:d.$>;/1@hB1MJ[3,;GqCaKnZCsTUp[=>\mA= +Mls:gZF$pCZ*:I;qQTh$$F6qAYctC;YHb@9q69n*0=J3nX0/q@[&@DAHAd],;`d'-<)cD$?=$ND +BlId/F_#<0F*)>=C2.U&90ts4+O:%<~> +i;c;XJU;`mEH,2qLPL(<>[1/l5VFi\7:1"Q?t((sQL5_.QOHGZjQhQpHR/`NOQ33>6P*,X)s-3PN0:SE!P*MW1SWQK8?u^0j1)C`I/1_c$0JFV, +2**KU4Y/HW6:OC485E>i4?#2^*mXh:~> +i;b-'GA_;;Bk^[HG'86e/hTV*AqH)(Ne;Y(GBnUbN16<*K5GI+raHjN@q0k8EH,l]Q*QK^A8k%/ +A%T[tce$t-hrWtarTO7DroO.?$fg4(i8 +i;b-0Jpi'"IXZ3NP*25+7n6^'F,,^/L3@6D@ps%aGD:j+E*?F4r_XY-\H2\ +Z*UdDrNQ1(riuR0ZMq*5Yd(I;Z*CM.YlCmZ\$NE>Xh)*LSR5`,:JXo&EH,,@3,"/8 +Q[34SFFeRWIrSt.A8cC/DeE]G5!D?Z!.Y~> +i;b--IX$*cGB[V)K7eq=1,;:*?ZUL6F(JNY>[:iLEe/dlBi@qmr^Rtl84[-!<)c_:FHLB!3'e,g +.!pJpKSk_IO-5ZkQh?dHR/WHOQ33A7P*,X)rKJq)R[T;%TqRs06UNmh0f)6k9/7"g5$_l:9/JIl +9L1s;4uG2Y8P)o_;c>>*1Hs(aJ,~> +i;b-'GA_;;Bk^[HG'86e/hTV*AqH)(Ne;Y(GBnUbN16<*K5GI+raHjN@q0k8EH,l]Q*QK^A8k%/ +A%T[tce$t-hrWtarTO7DroO.?$fg4(i8 +i;b-0Jpi'"IXZ3NP*25+7n6^'F,,^/L3@6D@ps%aGD:j+E*?F4r_XY-\H2\ +Z*UdDrNQ1(riuR0ZMq*5Yd(I;Z*CM.YlCmZ\$NE>Xh)*LSR5`,:JXo&EH,,@3,"/8 +Q[34SFFeRWIrSt.A8cC/DeE]G5!D?Z!.Y~> +i;b--IX$*cGB[V)K7eq=1,;:*?ZUL6F(JNY>[:iLEe/dlBi@qmr^Rtl84[-!<)c_:FHLB!3'e,g +.!pJpKSk_IO-5ZkQh?dHR/WHOQ33A7P*,X)rKJq)R[T;%TqRs06UNmh0f)6k9/7"g5$_l:9/JIl +9L1s;4uG2Y8P)o_;c>>*1Hs(aJ,~> +i;c88DKKu>Ci!i]?snFO()ADt;0J%cP`L`\J9PsOG(P=#J9ZPLPKAaGak%GH@&%J +?G4@ud+I11iTKChqWIk>roF+=s5 +i;`mUHN&QrJMh+gI%=\$1.>bcKU.skNJ3(,AmJ\PDf9]5A7T\+G'7S7C3b2JF&QpmOH"0sDDX1D +VlHc#rNZC.!42F)rj)R1rj)O."0f&8YPGF&WW'4SWiikAXd:q(ArM\,J;/fGUSE*=NfL#RChSH/ +@"!3>F*N%YE)]"b6:F +i;aK`G(>*mI!g3FD/G2*)]L>#8o"?Q06D,NAR8D<>\IeeAR/SVF`MM6AnH11ChuLB=aYsL5LqKNKB6eQh-XER/WESP`h2lqi^uDs,J4hR[TA(T:_Es(DfGQBkCOV?uUL@:G?9gHTjVT +<\lO,r^mMr>$=fe.k +huEacrd+T`6$ZC$8pjl476*.[4]-$3MP6`DUR%4(JUrE9UnkK&Q^<)@F+TjYVj_RDFGPErF[/31 +_TL$Mg>:]GjlP^hjlP\)jo+9?j8Is;i;VU9i90:eqre"As4mV7/)]FLk1[nGS%7%uf[\d4kjIlQ +97;68PEUBlPa%B%V59c@MK1p[;ar2b2pMDR~> +huFL0M2@+BK8s\YAsn$V@oc8s:geKkOoD.(Q\gQGEH,rHNK'TrH[B't;dt'2MhY_OA9i07Ah>T= +WiW;+Za$d>pTa\&s0Va2!4)R.s0)L,q69mu*O2oUY->:?Wgn9WR'a61[Cj/lbflS+>?e7LE*7kn +Et*MLK7% +huFa0L5(P7ItqE5=,1?Y8NJIV0L&Q;DhWn*LO"/]raZjeKnYtWG^*Oo<+UK8MLAE% +huH8HFEE+UF+.7]7X]8,.lUF,EHu209gM'cJ!6(iSt:XSB4l@.E,]Z,B5<'aQE5CY@i>=I@nK@J +a3Mu^gu%#JjQ,FajQ,G%jSe*;j8S'9i;_s?kkjQCk5XHAjSn0Eio&bLf?DIdrn.5$)q`luhJJLA +i1Q`dS!f\+Kl_<=8P)WIFEBGN%F"m'~> +huH#LJ:NZ3JrsqW?CHpH8Q9VHM2ce+?;!q2G_q9DO,nBf;,LLt;,KtR6UY+"FHgKR;&''2;)U=N +Xg#%9['?m>rilC-!3uO/rNlL1rj2R/"0o)7YP5:"Ym7M9Y,eOuV6Bm,rj3WR\[fCLG':`SJlmDM +IscBH?q3%12`P5S/dr05!.Y~> +huH/JIX[<,Iu@l7:kj0G/N-@!AS=q<1aXPI>]+G.H?rsl6UOXG:/4DM77U^-Fc]s;7hG_$3u],8 +N/ipZOH#6WMi3U\pR2#LrgE_P"-o%4Oo(=APlI!KQN!6VQ^*i#O+`1DrfJ7_OcbloQCKO+<1mW, +2I0Wq>?!jQ.2a!G.o9%h$4>#XJ,~> +huH8HFEE+UF+.7]7X]8,.lUF,EHu209gM'cJ!6(iSt:XSB4l@.E,]Z,B5<'aQE5CY@i>=I@nK@J +a3Mu^gu%#JjQ,FajQ,G%jSe*;j8S'9i;_s?kkjQCk5XHAjSn0Eio&bLf?DIdrn.5$)q`luhJJLA +i1Q`dS!f\+Kl_<=8P)WIFEBGN%F"m'~> +huH#LJ:NZ3JrsqW?CHpH8Q9VHM2ce+?;!q2G_q9DO,nBf;,LLt;,KtR6UY+"FHgKR;&''2;)U=N +Xg#%9['?m>rilC-!3uO/rNlL1rj2R/"0o)7YP5:"Ym7M9Y,eOuV6Bm,rj3WR\[fCLG':`SJlmDM +IscBH?q3%12`P5S/dr05!.Y~> +huH/JIX[<,Iu@l7:kj0G/N-@!AS=q<1aXPI>]+G.H?rsl6UOXG:/4DM77U^-Fc]s;7hG_$3u],8 +N/ipZOH#6WMi3U\pR2#LrgE_P"-o%4Oo(=APlI!KQN!6VQ^*i#O+`1DrfJ7_OcbloQCKO+<1mW, +2I0Wq>?!jQ.2a!G.o9%h$4>#XJ,~> +huH/=BP<'?F+7Um9o"3L/3$g:L81]GVQ$PFEc,cHQ'IM\Df;ATbfn\Q^5dAWEhT(rM#]RtIYioq +b0\MfgtpoGiSieWpYu/3s5F%;rnmn +huH,FEH-qcI>`,T@\B,Y7T4DNT=V_L\[JquDJ +huG6%E,^hbI"uB6;iQ;X.l't!G`\)ON/EKr84,aFC2.?Z6pu$YEo +rf[GLP)YJ#M?/^%pR1uKrgEbQ"-o%4Oo(=APlI7#Q^F/.QB@;qS0!!!EGr!!"P"!.Y~> +hZ3[X22-$iIr%\JH]L-GDjH]QO.;`7R[U(?Pa%;KDc:kk]&1c]e*,H:RrN+TJn/Bl!-<4[^qdhd +ed0m\hVR5Li83Gli;_[;i8N\Tj87a4hui!&kir!.s6'F?!9=(?)roo9i8W;;n*oi!f'DY\^:oW- +c-=P(S7lDVGJ=-.~> +hZ3[Z6&'N)Km6[#N2''?KWM8SUp@;6W2Q\]OH>?3Ajp@/V8faGZc98TF%8YfC/\%2!+TN*YHP(B +]=YS^[^NTMZ`ph9ZN%04ZEppF[J-p.Yd(I;q6Bt%!3lI/)mQTMYd:4(_Sa9mXhhiaR@.lKY-+sY +J5&RGA\S4q~> +hZ3[Y&r:XOJSn"LHAXF3@u,qmH%^j+rc]`$?sm5&4Wm4OMQi\LVS'"3EC`GaAkYku!*3-USXl.F +TV.^;P*1q+Mu].BR/`KUR$jD3S+i6OQ'7Dpqih&Fs,mAIrgFdnQBmr,MMe1)UlUY:W1\Wi;fe@p +Rqle!2,R5c!.Y~> +hZ3[X22-$iIr%\JH]L-GDjH]QO.;`7R[U(?Pa%;KDc:kk]&1c]e*,H:RrN+TJn/Bl!-<4[^qdhd +ed0m\hVR5Li83Gli;_[;i8N\Tj87a4hui!&kir!.s6'F?!9=(?)roo9i8W;;n*oi!f'DY\^:oW- +c-=P(S7lDVGJ=-.~> +hZ3[Z6&'N)Km6[#N2''?KWM8SUp@;6W2Q\]OH>?3Ajp@/V8faGZc98TF%8YfC/\%2!+TN*YHP(B +]=YS^[^NTMZ`ph9ZN%04ZEppF[J-p.Yd(I;q6Bt%!3lI/)mQTMYd:4(_Sa9mXhhiaR@.lKY-+sY +J5&RGA\S4q~> +hZ3[Y&r:XOJSn"LHAXF3@u,qmH%^j+rc]`$?sm5&4Wm4OMQi\LVS'"3EC`GaAkYku!*3-USXl.F +TV.^;P*1q+Mu].BR/`KUR$jD3S+i6OQ'7Dpqih&Fs,mAIrgFdnQBmr,MMe1)UlUY:W1\Wi;fe@p +Rqle!2,R5c!.Y~> +hZ3[Q-[pPpO`XT'NL`-mG,;%2R@^"ES=G"bLkp;(I@Idfa3MragZZl*Qi;712>mOTD%`GV_9Bm@ +b0eeng"bNDio/bNi;VU6iVqj6i;MU:j65^kqrn(Cs5*h9ro4sVi8EJMj5]%Ccb7!/_n)hHONQP@ +X`JPg<=KDP!.Y~> +hZ3[M(j^OUOEXo5QDmDGKse=qWirV3W2P6%K7j/D&!!Wr['m +hZ3[J.slSgMf)6`K9Io?As&48J:iK.G'6GR9M@W<6t1k6PFS/EXLY!sC/.]+-N*rE<"FVTTrFNO +S=,b/P`_,lPaMH +hZ3[?.WC&oRrr%DR@I8WFd&#_Ydh39It*'$CMR.#HF1u:`QcujhU&$mEaWEgq>^_9MMdqFbKKk1 +"4>iVi;VU3hu2O2ir.m>jlkpmqrn(Cs5+jUj5].WhVR)HmHs0#k2+(XX.Q)Z^Z*bmM?!VcEP2@&~> +hZ3[6.V*gMP&=H,QCCrWHC1(t[_KSVKnY)*A7SPVE2UIWZb!ul`O1DR<'j/Jq>_"9JUrro]=YV] +ZEggH\@hgMrO2[4pTt%/Z*CP/Z2^mGY-G79Y,n_,Y.;*NZEgNsIXZEeI%J3b\8qWM$X^RIJ,~> +hZ3[4.V*aINFkp\KnhlW>^1LGOHu2]_%-EcQZ,Unj]Q +P*1lkQ("*-RKJq@PEPg,s- +huG3+;,LSAG*I5pG,La=A;[@cWh>fLP)+peJoPddYHQ$tgY:W?b0$K%Fn5S=>*u([[):/5df.Vq +gYL]bhZ)L4i;;R5j9+Q/l0A01s60L@!9=(>(#e'-hV[#>f\G9BjPAYGgt_,4Pa$(b!!!JA!.Y~> +huG2m5!DPJ@tA9+BUXrd>_AiJV4 +huG2f3]]]:?[H-c?&F"u7;7O4Km@]ZC0FeR6SgMlF`ih?WN!2-TV-^1;=abq7"0fBNgQ6&R$O&# +rgE\QrgEMM".>C +huG3+;,LSAG*I5pG,La=A;[@cWh>fLP)+peJoPddYHQ$tgY:W?b0$K%Fn5S=>*u([[):/5df.Vq +gYL]bhZ)L4i;;R5j9+Q/l0A01s60L@!9=(>(#e'-hV[#>f\G9BjPAYGgt_,4Pa$(b!!!JA!.Y~> +huG2m5!DPJ@tA9+BUXrd>_AiJV4 +huG2f3]]]:?[H-c?&F"u7;7O4Km@]ZC0FeR6SgMlF`ih?WN!2-TV-^1;=abq7"0fBNgQ6&R$O&# +rgE\QrgEMM".>C +k5YPt5!JrG/lQ1d?rLTHJ:!66XH?q"Kr_8f\>H-]F`i7PH?ugEe'?.hf]1,ITQ`4L!!!lSo`5"T +"*U6K^&H4[bLP;!g>(K]hYuO6j8\3?joaf3lKe?4s69RE(?XfCk2YFZhr*b`g:k;%]@klpc- +k5YPo/h[,'!''sG.Q9mhARKV%Q$Q+tE1*,qWL90'B4l6iCMTW]_nNe*aj[k`OCp*q!!!cMo`5"P +#B#[,Y.V +k5YPm-78]l/h]CR5Vker?<:fRLMAh0>Ch?gN-T\T6psU$6:-!jT:DIRXLtE\J64-F!!!ZGo`5"C +$X%b;Odhc,PEhK$R/NKQRJ30QR?a&%qj%2Js-=FfS=H(9QBmo,WMuA;J8g:AVm<1sO^tm#J,~> +k5YKXr`K2%"'fA\GQ(tnC2JKOL1t"%@q&nJ;J9a,Za6[0Z*D6seCE!pdDqu(FY`pr![JU"nc0)# +H[DI'_Um)_eCWF.rS@P1ro*k9s5X.@"6Sn6lhfuIl2Tl[kiq?qjl5:Xi8`kfg"D^4I!gWnH*dR%~> +k5YfJ4Ztkb2E='&<;o)e8PEGsA4]$Or^IA[3`&Y!S"#V*S=Hk"^r65h"LjY1Be95`![&9qnc/kl +EH.;P[D`'J#I:bF\$rcQ[/RK2[/@61ZM1[.[C +k5YfB1c.!A0/G[b:B!3r5XSLM=?8&e1bg^2+uV>eIt)N[I=76SV5gMsXf$kY>pfON!Zi$inc/kT +<`XI1Q)+DB#F1[DR[TY4R.m$OR$Er$qj%2Js-OLhSt;LAQ^=,2VP^r"ULZbk;d`a2ZiGU~> +k5YKXr`K2%"'fA\GQ(tnC2JKOL1t"%@q&nJ;J9a,Za6[0Z*D6seCE!pdDqu(FY`pr![JU"nc0)# +H[DI'_Um)_eCWF.rS@P1ro*k9s5X.@"6Sn6lhfuIl2Tl[kiq?qjl5:Xi8`kfg"D^4I!gWnH*dR%~> +k5YfJ4Ztkb2E='&<;o)e8PEGsA4]$Or^IA[3`&Y!S"#V*S=Hk"^r65h"LjY1Be95`![&9qnc/kl +EH.;P[D`'J#I:bF\$rcQ[/RK2[/@61ZM1[.[C +k5YfB1c.!A0/G[b:B!3r5XSLM=?8&e1bg^2+uV>eIt)N[I=76SV5gMsXf$kY>pfON!Zi$inc/kT +<`XI1Q)+DB#F1[DR[TY4R.m$OR$Er$qj%2Js-OLhSt;LAQ^=,2VP^r"ULZbk;d`a2ZiGU~> +k5[)6?smPS@:*GiHZlC2hu;R6iW%p?jQc$rqs+4Gs5j7D$g6R/iSWM*^#@`#Q*(+;~> +k5YKCr^-WI-TF.d<(]YN5!MP-4YdQ[:lUHn?:RM%T:`[*[^NTT]"kn[Y'a[d$h"&q55P<^?B:/O +ri6:.['[9N[C*C@Zi%-.Z2_-1ZMCj,Z37SD[^EC=YQ'dg]=GIpXoNt~> +k5[(i3]]A[1bgd\9g_022)[T\1F<,'5^Rj&8MW&&MMe1(TqS*VVm!+oTl=-A$L[rp1]%.S6?$n+ +rf%,FQBmr-R@3c9".#4;Pl$aEQO]ITSXc(5QC+.qKs7\]C9@Pe~> +lMrG28P)fbCMRj'C1LagCNXuNCiXiJF*i1XBNeS@=A_pg7n6rpDJk>tQA0)3!<6U;KttaLcILIu +gYUf`hZr)si8EV[lKe<3&a8<:k3(phinrYLh +lMrFt1G^mK6psL-4Z"oX5"\XJ5t4UE6qg8H@/h/=r+sK*29hfAKH>Z^@!<6I8HE!pEYHtRD +[^ENLq6Bq'pTt15Z*CXC[Bm+:XTkrH`5.n2?*40X~> +lMqYW/hSe54Zu%h2_ZdB3($8/3^#o#3rVGY0-VS^*Z5h/&.g9A5!E7iDIQ8t!<5Fl?Aa]#P*_N& +rg +lMqn=:JYG;Ci"':H?Nq=DK'`@H$Xa]G&r+]I!L!]rcSTmH[C?c?=$E#9ABLSNk2gK`PomQjlP+n +huMa7i;_[9iTKD"kRm"=jQ#7ZiSieUj5J5+iPWQHXoNt~> +lMr@B/1`kK4$,So76`Oi4?l5%84c?C77'^C9M%fG7Ros?91r,K0JFb!-JSS.K;ki^WiDo)\[e[< +Xotr5Z*Lb.[K!NBZ*:I9YHY79Z_F2+TqP/_!.Y~> +lMr"6-71Q32E!Q[5-QBml(R%0>&Y*G8;XoNt~> +lMqn=:JYG;Ci"':H?Nq=DK'`@H$Xa]G&r+]I!L!]rcSTmH[C?c?=$E#9ABLSNk2gK`PomQjlP+n +huMa7i;_[9iTKD"kRm"=jQ#7ZiSieUj5J5+iPWQHXoNt~> +lMr@B/1`kK4$,So76`Oi4?l5%84c?C77'^C9M%fG7Ros?91r,K0JFb!-JSS.K;ki^WiDo)\[e[< +Xotr5Z*Lb.[K!NBZ*:I9YHY79Z_F2+TqP/_!.Y~> +lMr"6-71Q32E!Q[5-QBml(R%0>&Y*G8;XoNt~> +m/[/=#>nl:Dg-8DGQ*+4FBi'\F)uebJqAJsGB\1RGBJ+OFEM\IIs>aE@+kSfA!E4la2c?Rj5]8# +iVqj:i;_X8hrEbljo=BAj87g@j5SbFk/"lGXoNt~> +m/[/,*%s606:="$4[qn03[Z:05!DY;:f'bR6:+%+6::`=#=(L<7R&gj1"lU7?]0iGZEgU;\$rgF +Xp;/7Yd1XE[^Gh8s0;X0qlg=1ZEC@FSXi +m/[/'(+(aj4[;%h3C6%u2Ba4n3&j?"8P)<7qE4d>#.G=b/6>UJ"PEV&lR[TWCOT^o6 +Q("3ASc>5TRfAcUR/<3TR%0_ +m/[/_%9@4YGC"CSH%CNuH>IEsBc1Z)GB\UlH$O^aI=?WlH[0gZFa&"PE+W]0g]7@e$D>>Uc-4hm +lep^[ro3k7s5N_4s5X.=s5O+?ro+%C]Y%gY!.Y~> +m/[/B#;e_484Pp15Q4.p5W(DU1,:^I6:+:@6:++17S-*>7RB@*4?c(u5s7@Kg]7@b&!s]3[&^I: +^9=`CYHY79Zi7?'ZN%30YlD!.ZN%96]p=sQXoNt~> +m/[,9s#U?M6TdImr^.bi0JG+2/MAqC4@Mk*4[24u6UF%'4ZPMY1H.6Q2`DQ.!<5CkG*J5VN09?t +rfI>JQ'If-rgj(YopPiIs-NbQ#FV*XUp#]73j&I5~> +m/[/_%9@4YGC"CSH%CNuH>IEsBc1Z)GB\UlH$O^aI=?WlH[0gZFa&"PE+W]0g]7@e$D>>Uc-4hm +lep^[ro3k7s5N_4s5X.=s5O+?ro+%C]Y%gY!.Y~> +m/[/B#;e_484Pp15Q4.p5W(DU1,:^I6:+:@6:++17S-*>7RB@*4?c(u5s7@Kg]7@b&!s]3[&^I: +^9=`CYHY79Zi7?'ZN%30YlD!.ZN%96]p=sQXoNt~> +m/[,9s#U?M6TdImr^.bi0JG+2/MAqC4@Mk*4[24u6UF%'4ZPMY1H.6Q2`DQ.!<5CkG*J5VN09?t +rfI>JQ'If-rgj(YopPiIs-NbQ#FV*XUp#]73j&I5~> +m/[/b#@;7aG'S:UGlE.6G_C`sDJiuoBP;F3G'8+UH$Xd^H$=FTEHceXH#@Lsg]7@E$[K%`b/V]N +iSNGLir8!:iqDI5jUUA3j5T(Yj5f7Yi8_G]Bs%Gd~> +m/[/F#<>+;7n,a/55mn`4\A=41c-[1/hT+J4?Pel5PJ,~> +m/[/;#;J;%5sdXp3rV>c3CZJ$0JFh!.Om8:3&ir\4$5Ve4#o2W/i>jX69d[gg]7@&#??P7Q]6r_ +Rf8EUPa.N&S"6+?S"'2@s-aFcR$a5,R$a;4TqSK?KfcF;J,~> +mJmJU='&pKCit+(IK+ctHZo=;)1?^JE+i`uD/ +mJmPE3B9;i5t"106iKCQ4urO.)*g5=1Fje+0J>"0/1iJ,0JP:A5"8"67n5bs!"2b^Lp"(dXg#(8 +YHRr0"0o/;ZhCd*Zi@?2Z2_*8Za-a:[ZcnG"KqfU~> +mJm_A0/#7F3^5ko5<_4n3AgY!)*Ko40IS.t/M&A$.4Qhu/M&G,2EsDp5s[Qc!!b;nBT/.8Nfa7& +$'^^?R[]k=S=Q5GS,SlVRK&ZSR0]7PT:`-?M*;$F!.Y~> +mJmei?!V5bE-Hb_JqJW*I=-["rIb9)It)kFH4"n>F`__LGC"U_IK"QqH?=7?f`;%^&YR1ldE^J" +h;RDSk3(slk32%(kPsZEjnn*HjlYahm)[7oA6`A2Z2fC~> +mJmGH4?Q&"6UguE"@bdI5X#!3"$o+748q5P2`*?I1H%-O4?Pem6psU;84(u0s'u+rrjN?;Z*CO: +Yct=8Z*CUA[.q'/ZiIH0Z4""GZEh!+Q;0S,4tX&?J,~> +mJm_E1G_-V4[)2"6U +mJmei?!V5bE-Hb_JqJW*I=-["rIb9)It)kFH4"n>F`__LGC"U_IK"QqH?=7?f`;%^&YR1ldE^J" +h;RDSk3(slk32%(kPsZEjnn*HjlYahm)[7oA6`A2Z2fC~> +mJmGH4?Q&"6UguE"@bdI5X#!3"$o+748q5P2`*?I1H%-O4?Pem6psU;84(u0s'u+rrjN?;Z*CO: +Yct=8Z*CUA[.q'/ZiIH0Z4""GZEh!+Q;0S,4tX&?J,~> +mJm_E1G_-V4[)2"6U +mJn,$?smqsG'\UgJV&N,JqJu>LOk#)It`T8Oo'nDLl$tGMi37 +mJn+^5!DM-7n#g87R]^56UF:56TmRm4$c/':&@9^6q'O67n6#I6NftU:.Y`D!!dhQ]"4oIZEX>3 +!3Z=)!jK#;osFb*s0D[2!4;a3#IKYW:e"&L*3oQp~> +mJmG@2)RWb5sP<5s$$oS5"8".4?PSa5X7h5qa(c[6psI36p<[s5=J4<8-miJ"BgbRRZ%0/$'^^? +R[]k=S=Q5DS,\rWRK&]`S"6@NW/$-t5=@mXZ2fC~> +mJm>dA7Tf]GpdrdI"-ZsK8G)-Jr#5?Mhm1DJq/B&KnY; +mJn=f5 +mJmG@2E!fd5s5--,We"H4?tha4@)8$6pa4)4?5D`5!D7u5X7Lr4[_M"5Y4dK9cDgfrtbS6%n(r7 +Q\gumPE_>tR%'Y;SG&BMS,\rWRK&]`S"6=LTm_>X7nuegZ2fC~> +mf3AP!<.$=EsQu;It*$&KS>3\LB!)@Ll@7MNf8dMLPgtGMhm1GrIt9!"*]6EF4L +mf3VE!)-'U5s[b#r]pKLs$H`M&O&ED5XIh*6ps4&5N(pj9n~> +mf3h@!(0+:3]]8^3B9,^4$ +mf3AP!<.$=EsQu;It*$&KS>3\LB!)@Ll@7MNf8dMLPgtGMhm1GrIt9!"*]6EF4L +mf3VE!)-'U5s[b#r]pKLs$H`M&O&ED5XIh*6ps4&5N(pj9n~> +mf3h@!(0+:3]]8^3B9,^4$ +mf3ki!,umtG'8.YJ:N9+KnbE_L]coL`R`Vo +i8s(aroX1@!p8\/rojCFs5a1>s5O(=%cld=m.8WPI<(4&DJsG%[/b^~> +mf3\N!(ojN5s[b$5 +mf3G:!'`^I3@?aF3B9,\3BB;c4?bto5XIh*6ps7(5X@\&6:!n&5$UoMnNgQ3" +QC+&.Qi)aYNK$(] +mf3qu!,ldpG'84]JqAZ1L51V?LAlrGLl%"HMi3CIM2I1KMi*CKL5(M@It)coIrO*A!"8c+##^\M +aN_u]ro4+>hrEbrjT4H)qrdt@($4N;j5]4]jlYmpp=%KGIu]P8I!fH&!<3M?!.Y~> +mf3GM!(TQY5la1I5Q="K4T7J]5!M:t5s[[u5Lj:/3nL!<3G=!.Y~> +mf3qL!'NJ(3B9&Y2`E]V3BB2_48qD]5 +mf3qu!,ldpG'84]JqAZ1L51V?LAlrGLl%"HMi3CIM2I1KMi*CKL5(M@It)coIrO*A!"8c+##^\M +aN_u]ro4+>hrEbrjT4H)qrdt@($4N;j5]4]jlYmpp=%KGIu]P8I!fH&!<3M?!.Y~> +mf3GM!(TQY5la1I5Q="K4T7J]5!M:t5s[[u5Lj:/3nL!<3G=!.Y~> +mf3qL!'NJ(3B9&Y2`E]V3BB2_48qD]5 +mf3kD.WKHKG^+UdK7el4L5:ZbLAlr.M#N5FMMR(FMMd=MMMd7FL5:_;J9ucqDV"jn6q)WV`5]gE +rRqS7j5]4\j5f=ak5OQDk5XWIkN:pgro=dTk2bUnaN03hLkpA)I!/]o!(\Of])[?~> +mf3G-*(NNu6N9=M55d_F4T7JD55mb\5X%@r5X7V$5X7Ot5"&"26pj[C7+VDR1,3BQVPL#hZ*(71 +XKSh3Z*CU@[']h?s0Vg7"1>MCZi76EZa?s@]T\OX9N+k[9MA&:!!"es+1hN'~> +mf3G'(HX_W3;tiA3&ruY3BK;cr]UGs%i\df)Q't),3h_Lkq+U +rfIMNR@0M2R$jD4S,SrXS,]#]S=?":rg=IhSXZ+MKnW)d:JXGR9M78D!&,B4])[?~> +o`5"&rrE'l&HGjOEH?JRItE<*KnkG>LkgcbL&Hc+L]<)6LPUbCM26tCre:W8JqAB!IVd^<(+'"] ++@KmVVT[02e^;dqhrEbSio9"[qrS+Ekih3lk2lR&']n?6m(0c_Jq&8pGB\RP$k*e[A1bFoJ,~> +o`5"%rrE'Z%fe[]7mfU05X.Fr5<_7o5Q!\C56!kI4psS?5X@\$5X.Fr6:q/Es%<>Yg&M^$!!!`_ +9MC8AWNWJ'W2d,0[/R91Z*X>7#.(bH[C! +o`5"!rrE'J!rsu948h292Zc!%4T7PC5Q="K57p.H5sdn(5sRY!6V9d97o3#Og&Mm%!!!NF2E#H5 +NffB[MN=*mR[0;,R%!oA#+D*RS=?":rL"@iR[U1"GXY"i7R0C2;EkBk$p[&u]E!H~> +nGrS@$4^roEcl_UItEB.reLN0reC6(s+V,@LkpnELkph?KnG87JpVooCZGHs#ojr`!#oAI!%IsK +2'cR;K[%cke^;dphr?_pX'1b'q!.Y~> +nGrS5#RX0n7RKL/5X501s#pBH!'^3Cs#pWO5X7V$5X>94#"V-M6V9s9j8]5d&eb-C&OQNu(B=FZ +(I15rX/iM0WiE0"[K*H/Yl_5;Zi7?3Zi@H9[Bm3Fr3?:.'"E44:ejGJ69me,5;Fu($k+m=]` +nGrS,$4&aU4#f5\2`E]UrAOg<4Zu%*5lX%\5X@\&6:!n&5 +nGrS@$4^roEcl_UItEB.reLN0reC6(s+V,@LkpnELkph?KnG87JpVooCZGHs#ojr`!#oAI!%IsK +2'cR;K[%cke^;dphr?_pX'1b'q!.Y~> +nGrS5#RX0n7RKL/5X501s#pBH!'^3Cs#pWO5X7V$5X>94#"V-M6V9s9j8]5d&eb-C&OQNu(B=FZ +(I15rX/iM0WiE0"[K*H/Yl_5;Zi7?3Zi@H9[Bm3Fr3?:.'"E44:ejGJ69me,5;Fu($k+m=]` +nGrS,$4&aU4#f5\2`E]UrAOg<4Zu%*5lX%\5X@\&6:!n&5 +nGrS@$6*i$E--JTJ:rW1reCT4LPUc]L]<&?L51P?Lkgb?KnY)6JUr/qHu7dAs%s\HDK'PB!!$nR +@q0Jd[`HqEd*^Y,i7m2JioL!u#3=t1k2bU`rS\+@j5]-gRsg'>I")'="aFp&8OPtY!.Y~> +nGrS5#8B`t6pa7.62j(K55dV;62s.W5X@\&6:!n&5 +nGrS,!=q9k2ubr=3;tl:2?Pco5 +o)K:@!'3.jD/jQ=IXZj$KnY<\LB!/,L_PVuKnbA2LOk#'I!fep!!YF`!)[NLDZ4Pa +Ebp#HAL8aGH>$u(S"$tfcO.tLh;-lDhrEh\k5FKJkN_?qjlPM$i#(>,i8E=LNd$8+I"HWhGCk-e +=Ar-[,=Fr7!.Y~> +o)K16!%B?;76s4)6:*q%r]^9Ds$QTK%RE +o)K%*!$<:!3B&lTr]:!;s#1$<2aKb*64Q:G5 +o)K:@!'3.jD/jQ=IXZj$KnY<\LB!/,L_PVuKnbA2LOk#'I!fep!!YF`!)[NLDZ4Pa +Ebp#HAL8aGH>$u(S"$tfcO.tLh;-lDhrEh\k5FKJkN_?qjlPM$i#(>,i8E=LNd$8+I"HWhGCk-e +=Ar-[,=Fr7!.Y~> +o)K16!%B?;76s4)6:*q%r]^9Ds$QTK%RE +o)K%*!$<:!3B&lTr]:!;s#1$<2aKb*64Q:G5 +nc0"l!!$&;FEDn[It@KMs+UK+!/:E*"GMVdLl)+`re19)!/CK,#)7qiKQD33mK!8%.gldq?ZUO> +IXHHfI=-EeH +nc/tT!!"rE5Z4$,Ju:55XDVld?*ZN%?4Zi@<8Z*:I8Y,SE"ZQ?*CYHP=>]"3o% +nc/b>!!"YN3<2/?3rV5?4T@SD55m\J5!VA!6N0+H4oRVJ5=%S&8H)Eb6i\k-!<3BR"U5/_4[VS) +5Wq7q5[VG*@rHOd2,oOHl)qrfnmuQBmf&Pa%f7U7%CBTr=iiXFE`14?kkf +5rq%l5sn!t.Om>=.k;kNrW)s +nc07u!!$SMF`i+`JV&Q-K7nl0K)UH$L&Zl.Ll)+are:?+$AX@jJV&Q.J8fHonc8\>$T94J)J!`' +GC+spL&Q]SKnP,,FC/BiI=6QiH?sX +nc0@^!!#5K5!D4p4Zkhi4[)(p5sRUtr&t'D!C/sM4T7MC4pjM>5Wh8#7S#^,,Otj7)_3*H%LtH\ +4?Ykq6UX.%4[2+o4$"i@0gnDs5X@[u-n&GaXK9+H['[HQ[Bfe9riZI0Z`gR:ri[ZV\[f,NOc`p4 +4\&+77nZ$06UF.-2_-C?7QNRn3=ZN!#RE?s()G$mJ,~> +nc/b>!!"qV3<25A4T7MC56!kD56!hJ5skQ6r]^SJ@cjTqn`nYcXaVL/9TZ4?u+q +6oR%gr]LiJ,pbB41,:^@$k*+@#;-;s'ZpE+~> +nc0D%!!$kUG'8=cJV&Q-K7nl0JqSi3LAci+L&m'cr.Y3,qhPK.J:iK(Df7N)!(RbU/HA+MB5r9F +JprB+LP1;4L4k5,BOkXnH[C!cJUr#<97 +nc0C`!!#GQ577TL()tO%;%N?>e-9F:S +6psO/r^/n85Vlm2BZEga=Y-+t6ZF%$J[]HL/\A5>QNcCef + +nc/nC!!#)@3]]J(4T7MC55[YD56!hJ5XG<4!'pKKs$QlP6iKXV49-;k!%nTl'*'+01-%Q`6TdY# +69dXt5sIRm,9J!Z2`E]Z77B +nc0D%!!$kUG'8=cJV&Q-K7nl0JqSi3LAci+L&m'cr.Y3,qhPK.J:iK(Df7N)!(RbU/HA+MB5r9F +JprB+LP1;4L4k5,BOkXnH[C!cJUr#<97 +nc0C`!!#GQ577TL()tO%;%N?>e-9F:S +6psO/r^/n85Vlm2BZEga=Y-+t6ZF%$J[]HL/\A5>QNcCef + +nc/nC!!#)@3]]J(4T7MC55[YD56!hJ5XG<4!'pKKs$QlP6iKXV49-;k!%nTl'*'+01-%Q`6TdY# +69dXt5sIRm,9J!Z2`E]Z77B +nc0;$!!$nWG'8=cJV&Q-K7nl0JqX,XrIt9+",D\fL]*#/M>iD4M$f&nLPLM%EDZ]F%JBc4-XgFq +D0'cDIXZm!L5(J:re:B'+*_:1C3k5RFFAgqF_,-(G)D0gcbmZ/c-=Ybf%/O.gATbVhq[#'Ss5JN +lfmYhH$P0eGB\XbH@C3hI +nc07^!!#JS5 +nc/bA!!#.\3WMAC4T7MC56!kI5QF%I56!hL5X@Y#rBUEMr^6]S$:[T\9M.H2-iaJWp&JV;0/#(= +3]]Dg5 +nc0;%!!$qYGB\LeJV&Q-K7nl0JqX,Ys+^K+!JZC-L]E;/M?&V7M$/HNEC(uM!<3E7'akBL!#cbn +F)uMMrdFcq!/(9*!/1?(s*R[`B6/-FI=6'^JUqc_FhQ1iQu.&>T>J4P^r+45ai;?<_8aKkNK'@A +io9M(gt[1!GCaUUG^tBtIXHd#IW07JJ9cEaI>!9)G'7RU!!"S[%F"m'~> +nc0Ie!!#MU5X7Uu4Zkhi4[)(p5sR_%5<_:04TR`2r'16JrBgNP#Y.EY91V-++;4VQrrs)F"pP&- +&.h2q6:=4/6UF"%5!T$5=$T)=6TdIf/NGg^6ps%(:/4&G8XH`5J6QcTQb9]4\%0,_]!o/SYdV!, +JUrllgt_;c`PktY;d2OY84uNG6U*t,5;+ZI5s.7k6;'sF77B +nc/bB!!#1]3rhJD4T7MC56!kI5ls;95Q*bH5=#-4!(-WOs$d8d9MS>T4$+Mrr;cj$&dedG!!!H; +4?GVf5!M7q4Ztnkr]qbn5X7Ur3\MX./Nl0W1."W,5"J5/X`ek`>(hR+R$a>6USF[bU*QD0Vi#P: +K< +nc0;%!!$qYGB\LeJV&Q-K7nl0JqX,Ys+^K+!JZC-L]E;/M?&V7M$/HNEC(uM!<3E7'akBL!#cbn +F)uMMrdFcq!/(9*!/1?(s*R[`B6/-FI=6'^JUqc_FhQ1iQu.&>T>J4P^r+45ai;?<_8aKkNK'@A +io9M(gt[1!GCaUUG^tBtIXHd#IW07JJ9cEaI>!9)G'7RU!!"S[%F"m'~> +nc0Ie!!#MU5X7Uu4Zkhi4[)(p5sR_%5<_:04TR`2r'16JrBgNP#Y.EY91V-++;4VQrrs)F"pP&- +&.h2q6:=4/6UF"%5!T$5=$T)=6TdIf/NGg^6ps%(:/4&G8XH`5J6QcTQb9]4\%0,_]!o/SYdV!, +JUrllgt_;c`PktY;d2OY84uNG6U*t,5;+ZI5s.7k6;'sF77B +nc/bB!!#1]3rhJD4T7MC56!kI5ls;95Q*bH5=#-4!(-WOs$d8d9MS>T4$+Mrr;cj$&dedG!!!H; +4?GVf5!M7q4Ztnkr]qbn5X7Ur3\MX./Nl0W1."W,5"J5/X`ek`>(hR+R$a>6USF[bU*QD0Vi#P: +K< +nc0:k!!$qYGB\OfJV&Q-K7nl0JqX,Ys+^K+s+^Q/reUT2reg`4$AsUmKmmiS9iVT1quHa`&nPp% +FE`(YIXm''KS>,7L5:Y>rdZ#=F`hA:GB\[iJ9-!`Hu!2#_uK?"k1#uoB5)'tEW1%ZE%Z$DI=8*H +fB;2Rip$6EZY4T.J9-3iG(+miItrf3EcQ5LH[C +nc0I[!!#MU5X7Y!4Zkhi4[)(p5sR_%5<_:04o[_G5Q3qJ62j4N6OH7O7n5p)2Ba@N#5eK$-NcJ! +7n(5"MOe5t+415Xn400ekFG3]]Mnr^ZuU!'pNHrVus63R7\U~> +nc/b;!!#1]3rhME4T7MC56!kI5ls;95Q*eG5Q="J62s:N6iTRT8H)3c75d%I,6eAM!<48K3']es +5X.IurB^BIs$@&X4[)%o2)Qa20/*;g+?)PY90YL"T]"PXdDCs*<`N.#>?tNA>[1H8DJkobakQgK +$fgK6OZQ*)9g(s83W;2S4$l7t/M/S72E!TZ5X7Ut4? +o)KF<3XuX=FE_qYJUrE+K7ei0K7\dUM#W5,L&Zo,L]<20M>rAPLP182I;Ngu9j_7ACMn$1GB\C_ +JqAH&JV&T2LPc"greMYLIsl`lDJim.G'8ChKQq]cG\C>e\*iD@ipZR5nDiR,jo=KCkPsBVnbDnI +n+unRm?a/QJ:MukKS4)eH\6g&L4]DF'nCmfMMHk +o)KU<.1$;O6U3n'4Ztni4Zttn5=%P$69m^uq`XsCr]gEJr^$NMr^7>a2)QR$/hT.G5!D;&7S$0E +9)M!P6NfY@69ma65lWYX-pKgV84uTA6q9a23&m>Yf%/RDq"XRJlM]rTkiq?qki(Lmqtp!Xrr3St +L5&?.?WU!& +o)K%'*s`-94?GVhr]L0Cr]^?Hs$?cQ5CmI^&; +lhC/GiHBB+:f'_M91piu4$bqo5s>2tr](3I4#o;^4?Ph,5Q`bZ)%?Kd!# +o)KF<3ZB#WFEi%[JUrE+K7ei0K7\dUM#W51L&Qc*L&?]*L\ur@L4k87J9#[@@VTY#G^b*nK7eaS +I/\m#L]<64MiE^VM26t@I=-EeBk^auFEDn_K6qc`FD,)k[.3_Xl/h!elKmm%k2bUclK[p3m-OB0 +lIt:nq!-7[KOfLZDfgbiBnV.nItNB'Df9WJM2@%CK7epXM@"r`I!917,60bcrbU'aJ,~> +o)KX=.2*@c6U=")4Ztni4Zttn5=%P$69mb"4oRSD4o@MD5Q3qH6N9J:69$qU/2T1M77]sA8P)?9 +4?Pqq5X.Iu5X@b)6pX.+5Wq=r4u+l<6om@r9he)F7RfU+5+19kkiM!mlMgE?na>`/mIB`?q==+Q +nF5E%s8V`>EH+KR>Y@[k=>WZD83fL.4tA-85=S+05X.J!7n63D77B[-3tqZF.p-"[e,Y"~> +o)Jn#*tJlGr]C0Fr]L0Cr]^?Hs$?fR5X7O44o[_D5Q="J62s7e6UXC56T6qS.P`bD6:OF984Z07 +4?Pq.5lX+P6:=41r^%_l4$5Vd/M.r$/1`bJ6UF.284,d5T&AktjQ,Icm-!Qkro6*&lK[s5nF65> +m+UInpZ]V*@Q."U4[)V9/4;ln4$Ghh-n$Q-5X7Fk2E!T\5=@k(5X@7b&HF1+;,^EC!.Y~> +o)KF<3ZB#WFEi%[JUrE+K7ei0K7\dUM#W51L&Qc*L&?]*L\ur@L4k87J9#[@@VTY#G^b*nK7eaS +I/\m#L]<64MiE^VM26t@I=-EeBk^auFEDn_K6qc`FD,)k[.3_Xl/h!elKmm%k2bUclK[p3m-OB0 +lIt:nq!-7[KOfLZDfgbiBnV.nItNB'Df9WJM2@%CK7epXM@"r`I!917,60bcrbU'aJ,~> +o)KX=.2*@c6U=")4Ztni4Zttn5=%P$69mb"4oRSD4o@MD5Q3qH6N9J:69$qU/2T1M77]sA8P)?9 +4?Pqq5X.Iu5X@b)6pX.+5Wq=r4u+l<6om@r9he)F7RfU+5+19kkiM!mlMgE?na>`/mIB`?q==+Q +nF5E%s8V`>EH+KR>Y@[k=>WZD83fL.4tA-85=S+05X.J!7n63D77B[-3tqZF.p-"[e,Y"~> +o)Jn#*tJlGr]C0Fr]L0Cr]^?Hs$?fR5X7O44o[_D5Q="J62s7e6UXC56T6qS.P`bD6:OF984Z07 +4?Pq.5lX+P6:=41r^%_l4$5Vd/M.r$/1`bJ6UF.284,d5T&AktjQ,Icm-!Qkro6*&lK[s5nF65> +m+UInpZ]V*@Q."U4[)V9/4;ln4$Ghh-n$Q-5X7Fk2E!T\5=@k(5X@7b&HF1+;,^EC!.Y~> +o)K%h!"KKVFaA@_re(9*qh+s)reUT0s+^N.!/UB)s+V8EMhHb)EH-;MCMS*=I=6TrJV&T4M>i;1 +M>N/QM2-k3IZKP7>?bcbJUr;mFE;_OGA1DkXmtH3leU^cjSeBDlO*"GmI0Q8o'>Z/rr29ipni"L +F`qqPrH\Ei#_Ie^JVJ,_AV0o7!elA`rJ(W4K7eZ"H>YP +o)K1Z!!rs$6pj=-5X7Lrr]^?Is$QfQ"@,195!Js1!'p9Cs$-u\8OPs)2)RW`1c.E`r^6]O"$f4B +7JoCI4q9eC5rCi*<'DWU1I"B"7fGO`7nH9=5!G4hg=kfOnaZ) +o)JqC!!iim4oRYF5Q!_F56+"K63KS>5X.L45QF+C5S$:U6prmh1d4&W0g%Zd5skQ:!^oLIog&OC +*&KcS:c]^A.l'+F4#SuY85)]I77E[-h;.ATmHso;-g'[[m-jN9p@nCYnF,iElK@@"Q:stC7Rfd4 +5 +o)K%h!"KKVFaA@`re(9*qh4s(",M_fLAlu$M>rD3LAu]7EcZ;NIW9@PH[gNrK7ei4MMhCis,-`5 +!/gc2."$K$MK3!.CjLS\J9uWhH$+7G>?e&nhr!YPjlPLflg4!*mI'B/n*p>Fs7$Bhnb`4CNHB8g +rd4Wl&q,7ZIXuuuL2h3DI=Qj#KS>,8rJ:K.$\EnZGABrK).dAnCt8T:~> +o)K1Z!!rs$6pj=.5X7Lrr]^?Is$QfP"$f(855me>62j1b6p*Re2E!lg2`Eob6:*t&5<_A"6N04L +55[PP5!;1t3'L,64")L96N0LS6kW'^845R&Ol"dEki)"!mI9W5mf)\Tn0RYso();AoCqbOqr3?9 +?!161;c$.]84H'96pO"-1,:.@5s[b$r^$QN!(6]Rr^I,X0JF)085`aE!.Y~> +o)K"E!!iim4[)(/5Q!_F564&:r^$QL!'gHJo0NjQ76Ndh2)RZc2)RK[r^$NK!^fCFp-<.P5s[Fl +91q/e+tkf73^,\i6:jmG9L;(4jk\bXiU6-ulK[X"mdB]>p%S7Up[n%Ip$;/ +o)K%h!#lkpFaA@`re(9*qh,',L5(K_L'39gM2I5aMA:ktG'7_EFFo'eG'JCbJ:W<(K8,;Bre^H. +,)1l.IsuouCggakIhWNSPj5KCmrU0[R+S#$kn+$/Hlh^Y]^2\@@I=$ +o)K1Z!#$#86pj=.5X7Lrr]^?Is$QfO!'gHH"@#1<6::E4$p[!62(^aG7n,R%4[8p2s#pNJ5!_L6 +5P[JQ4@)7s5t4=&0/#LZ5s[^65nZFL6:j*pNS;q5jkoLolL43/mJcPRn,`(Mrp]s\*9d+rs0uTD +>?=a%:eXJR84cB<6U3n-1c-OG5X>04!(6]Qs$m#Zs$d,Z5X7P9ec:4~> +o)K"E!"TT&4[)(/5Q!_F564&:r]pHI"@,:?6U^T7$pZs31Fk:=6UE^j3B[:)r]L4d4mZg?@GZlK@Htl0Id*oC_ePqYp0fp'g!KoCJnZ9he5M7mo]C +62s7p3^,Ve6S9u64#f2W1GgpI3&iu_5 +o)K%h!#lkpFaA@`re(9*qh,',L5(K_L'39gM2I5aMA:ktG'7_EFFo'eG'JCbJ:W<(K8,;Bre^H. +,)1l.IsuouCggakIhWNSPj5KCmrU0[R+S#$kn+$/Hlh^Y]^2\@@I=$ +o)K1Z!#$#86pj=.5X7Lrr]^?Is$QfO!'gHH"@#1<6::E4$p[!62(^aG7n,R%4[8p2s#pNJ5!_L6 +5P[JQ4@)7s5t4=&0/#LZ5s[^65nZFL6:j*pNS;q5jkoLolL43/mJcPRn,`(Mrp]s\*9d+rs0uTD +>?=a%:eXJR84cB<6U3n-1c-OG5X>04!(6]Qs$m#Zs$d,Z5X7P9ec:4~> +o)K"E!"TT&4[)(/5Q!_F564&:r]pHI"@,:?6U^T7$pZs31Fk:=6UE^j3B[:)r]L4d4mZg?@GZlK@Htl0Id*oC_ePqYp0fp'g!KoCJnZ9he5M7mo]C +62s7p3^,Ve6S9u64#f2W1GgpI3&iu_5 +o)K%l!%KI:FaA@are(9*qh,$+Kn]M\"c%nkMN!PfM@PGmF)u2CG_C]mG'\OdJGt*%Jq]&JTuERBP;R8D/Ep$CM@6f@r>.@U$(7fk1eqViqr0CmgSaWnF5oCqX4CYploRnIfF^3 +GBeL_KSYG5JUDitD/EX,I!g?kJUrH/LPc"f$]0RkK7SH!F(JodC=WB8~> +o)JqV!$*(M7/fRR5QO&3r]^?Is$QfNr]UKM5XIe*7J&nS3\N-;3&jDt4$,Sir]pKH!B`O>5Q':RnaVQA?=$Z- +:.RiE7nZQN6UX4+82N.Or^HoV6iKLQ6NTYC6iKIZ7S6?J83T3r8Cdck~> +o)K+J!#QP94[)%p5p%eIXp@7nOj72*eGt:_,8jbs04[2/! +7n5^,4$,b\/Km;=3\rKG1,UsJ3B[:(s#p]S77Tj62`EH]ec:4~> +o)K%f!(TOtFF&7are(9*qh,$+L5,Y^"Gr"nN/mRe%Z>j[F`MeSK7J,gH[UHrrIP*)LPPk`r.k[L6$TBP.glJ:XdjSJ +o)JnP!&62ur^-fV5X7Lrr]^?Is$QfOrBCEN6:+(0ofrpQ3\N-=3]]_t3B98gr^$QJ"$A_25Q3qD +57TtH6V0g.3&3TY75ceP0`F-s0eY1>/M2Y+daI45m-O!*n*TN1mdKZ7o(2PImJ?\Rr6*8t@Tci1 +7n5d,5s\(:9h%W>6:Wjh.n`W47Rm;Es$ZlS!(?fQ#tIZ_91)'-,Tn5^!.Y~> +o)K+F!%B?[4?bqp5^W5W1M^4oR\G4TRZ/oKXll6:+11 +1G^R>2*p%SI\3:->2lg2'g:eXMT76Ndl2**cb +7n5g14$,\Y/0[AF5Vk)K0f(^G3BB8b5!;%m5t4=34Zt_M,UD"BJ,~> +o)K%f!(TOtFF&7are(9*qh,$+L5,Y^"Gr"nN/mRe%Z>j[F`MeSK7J,gH[UHrrIP*)LPPk`r.k[L6$TBP.glJ:XdjSJ +o)JnP!&62ur^-fV5X7Lrr]^?Is$QfOrBCEN6:+(0ofrpQ3\N-=3]]_t3B98gr^$QJ"$A_25Q3qD +57TtH6V0g.3&3TY75ceP0`F-s0eY1>/M2Y+daI45m-O!*n*TN1mdKZ7o(2PImJ?\Rr6*8t@Tci1 +7n5d,5s\(:9h%W>6:Wjh.n`W47Rm;Es$ZlS!(?fQ#tIZ_91)'-,Tn5^!.Y~> +o)K+F!%B?[4?bqp5^W5W1M^4oR\G4TRZ/oKXll6:+11 +1G^R>2*p%SI\3:->2lg2'g:eXMT76Ndl2**cb +7n5g14$,\Y/0[AF5Vk)K0f(^G3BB8b5!;%m5t4=34Zt_M,UD"BJ,~> +o)K%[!*3-=FF&7bre(9*qh4s(rJ1T5MMd@PonO'9JpM`fIt**"G^+XdK7edTK*I$bLP:A5L&Hc+ +LBrWiJqAl3BP:lSD\lblATE3IHu<7sTfUTj`:_C2I[! +B4u.!F*DhXJ9ZDDN/`XLK`6Q.J9cE^AmJ\Cf`6O~> +o)JnG!'EA6r^-fW5X7Lrr]^?Is$QfPrBLKO6:+(/ofj*W3\iHI5!D>"4$,\o6UO1)5ja65s\+50ek@F4[1GO0g/-$90P'b/1W6'e^W+2i9p%"n*f]4n*fc9nauMJp@A(Vs66#B +=D(&k4Z>;T0f1^H4?Q#%5s\%!2(V?p:.IfF8H)*Y7/oUS7/fIW6V'a@84Z-)r[ZY%J,~> +o)K+@!&?;m4?bqq5& +/M]4B5!V.i5V+H15X.Ih0JP:;1c./j3WM>B3sn/>6q'I169$eY1>)YX~> +o`5"##X/6"AT2^:H@u3M!/:<'!/LQ2rJCQ3!K2p/L`(bmIXm*)K7A8rIXm''KS+o1L51P:JqAW- +re:B,s+UK"+GG8Q@:!bd@qTe$H$k!dGACu":/7MLk2u9unaYu6md0rpS,(J,~> +o`5"!$n_NM7n>s66Uj=+5!Am/s$6TOs$QiRrB^HM!CK9J5SZID2`Ec_5X[q'5=7k/7R]X15X7\( +r'LBKs$6TMs#UTZ6n0Z;3]]&Q4Zu=78MN[t4Z"Z>K\"c,lK%L*n*oi8n+#r=oCM\Mp%A7Xq"i-R +E`?@'2D[3J2`EQM1,(CEr]pf_3&iH[7n6-Br^d&Y"%>UF6iKC\5sn(08P;]K68LDJ'\WP;~> +o`5!r$6]C24$G_i5!qP!r'(-F"@5@B6ppo>s$HfT7J/q[4ZG;V3'BDh4ZYVe5=%S#5!D+no0E=9 +!C]9Q-3#bo.4?r,5".n28O,O#0/&(4eCN+Zq\B0eP181,LgHr]:!?$U$a?6:=438No8b=~> +o`5"1#VH*X_Z$\ZPUU[@7-p$))>md9E.rp'LH2 +o`5"-"=!n15"Y`@"@bXA5!Am/s$6TOs$ZuV6:1W:!CB0H63fS33B98j6U^o@$UdHS7n,j55s[n, +62a.L62s7^5sR@f6pN"C-8[P.5tFO9r]:?b*&4$,Vq7SQTI7m8ml1d"&i9fkEe69[U28,YpW7K,^R70lCT8P2oF4tS,8!.Y~> +o`5"$$5ih"1Hmla5!qP!r'(-D#!kRE779L1rB^NP7.inM3ArfT4T7VF4pjM?6:*t&5<_:t62WqE +5Z^9<2`F)g+sJ0`0-`MD5sR@f3_<+C8hr/Yg"4j=hsB^ljlPXglK[j/o(;P>lhKW)gR(/g1bgR6 +2EsDq7R03t0/"n42E!lT0-2u(0/G=<1,CgH2`gq#r]LWR5!D8!6:Y*G75H@G!.Y~> +o`5"1#VH*X_Z$\ZPUU[@7-p$))>md9E.rp'LH2 +o`5"-"=!n15"Y`@"@bXA5!Am/s$6TOs$ZuV6:1W:!CB0H63fS33B98j6U^o@$UdHS7n,j55s[n, +62a.L62s7^5sR@f6pN"C-8[P.5tFO9r]:?b*&4$,Vq7SQTI7m8ml1d"&i9fkEe69[U28,YpW7K,^R70lCT8P2oF4tS,8!.Y~> +o`5"$$5ih"1Hmla5!qP!r'(-D#!kRE779L1rB^NP7.inM3ArfT4T7VF4pjM?6:*t&5<_:t62WqE +5Z^9<2`F)g+sJ0`0-`MD5sR@f3_<+C8hr/Yg"4j=hsB^ljlPXglK[j/o(;P>lhKW)gR(/g1bgR6 +2EsDq7R03t0/"n42E!lT0-2u(0/G=<1,CgH2`gq#r]LWR5!D8!6:Y*G75H@G!.Y~> +o`5""!#kh:$TN0RH[gX!K7nl0K`6Z-L5UtIre:E/rJLW9'TS04Mi*=HLP:G7K8,,;Mi3ILLktn] +rJ(<0"GhheKnKAU-[pi+K5bUAH\6rtK789%It)TeH[BO'::8s;iT9+dm-a9.lfma$mJcMbmIB`= +s8V>-C2-jNG^+UbIf+WoHlQC,G^+CHC1q^CKmS5tItN?)J:N9)LkLG5KSYH`LBiQiJUqrU(`;$. +J,~> +o`5"!!#GP6"scW,7RB:&rB1BL6:+(/6ps<>49.SD5lX7e6pj=-5X%@p5!D(l5X7\*77K^67/B4L +5lX.L63KS@5s[j:5pnif8OYBd/NZs16V'a1-75&!daI%6oCMYEnF#`7nb2tXrqHut +s8V.r>$=6UO@57RTX77ncHE7S$*Br^[8c9hJ#E3=ZPS +!.Y~> +o`5!r!"f,0"69kH2!'U9Fs$R&Y6:*q%4[&d,"?JV.5!f08!^]1=pce^? +rAt]V5!D4t5sde.8k(Th/iuEf4$l(nr^7Me8Pr>S0/&pAe^`R7m-O0)l0%9tmIC2IrpU9]naY"/ +6UN@K5.5j(@-RU2p5X71b3&j#^4#o;a4[M=r4?c"qr]pcW8Ol981^jfJ!.Y~> +mf3_FEI3%]JqAW.K7ejVK`d'gN/IUi!/^]5!/gc:s,IJHN/NUOLkp_E]2DJa6=LPLA5It**$J9_'?"DM=S`TdBc!9=(Cs6fpRs6K[Qs6]j\&+oo%a^f.$ +>\AA/I"$NmI/\QoHiRp\DAI##B5DmJKn=u1K7ni.J:N6'J:E'!KDpZ+M>rA2KEHXAA7XHqJ,~> +mf3>-r^HrV5!Jp."$]+=7/fUT5lNnH5Q3qK5lO4P6jl@K5s[b%5s@M!5stW>!^f:@nj*=B5sbH9 +*C!.g6ng,A4$uA!7RBF26ps+'7RfBt32P'Vg#V8oo)J4Zmf2eWp&=_!p](9er;=?/"O75sn".r^Hu[8P)GO7L_jY84Q-=7nQEI83o6rg]2j~> +mf3J-5<5"?\h35=,98!^T(:pcndA-oa+C +3]]Ac5XIe)6;:0E1G(1@6ps.'4Zu/#6pO=?:dmc?YhIsjjlHF.s6CEalg=*0oCMJ>o^qD8mB8f@ +5V4cV5Q3qK5lNnY4$#DN.Ocem+!2a_4?PVa3]d7&"?S_05!8g+!^/b4rB:ES6ps@%1,@VbJ,~> +mf3_FEI3%]JqAW.K7ejVK`d'gN/IUi!/^]5!/gc:s,IJHN/NUOLkp_E]2DJa6=LPLA5It**$J9_'?"DM=S`TdBc!9=(Cs6fpRs6K[Qs6]j\&+oo%a^f.$ +>\AA/I"$NmI/\QoHiRp\DAI##B5DmJKn=u1K7ni.J:N6'J:E'!KDpZ+M>rA2KEHXAA7XHqJ,~> +mf3>-r^HrV5!Jp."$]+=7/fUT5lNnH5Q3qK5lO4P6jl@K5s[b%5s@M!5stW>!^f:@nj*=B5sbH9 +*C!.g6ng,A4$uA!7RBF26ps+'7RfBt32P'Vg#V8oo)J4Zmf2eWp&=_!p](9er;=?/"O75sn".r^Hu[8P)GO7L_jY84Q-=7nQEI83o6rg]2j~> +mf3J-5<5"?\h35=,98!^T(:pcndA-oa+C +3]]Ac5XIe)6;:0E1G(1@6ps.'4Zu/#6pO=?:dmc?YhIsjjlHF.s6CEalg=*0oCMJ>o^qD8mB8f@ +5V4cV5Q3qK5lNnY4$#DN.Ocem+!2a_4?PVa3]d7&"?S_05!8g+!^/b4rB:ES6ps@%1,@VbJ,~> +nGrS!$W_:oH@CHtK7nl0K`6Z-Ll71KreCW5Mi3ILoo'!.Ll$ufM?A]kLPPY]s,%;CMMd7GL5(A6 +K7SN-LOfA?++8s$JVAQ%Jq8JuH[0mJGB_[3mHs9%kNCsqn*]T/li-;cm-FKCoDJNb=*&FiG'eRb +It)oqrdXrs%tAb:Bk;$oFFf1$Knk>7K):*3GC"RbJqf#8Lkp_=LPLP1EH+b0!.Y~> +nGrRr!''sH!^f.8rB16I6:+*>70#^S5QjDA6pj<670>hB6UUi@"%,C@62!\D5lX.J6iTdd67s`; +4%)J%7R9?>72A!P7Rf=4:Uf3>iTTIonF#i:nF,o;o`"Rtp&G'bq>$XP?!Tis91qiI84Q2L7fPmb +7Q`=W.5*>76V'a:r^6iU77B`G8-D+B5t+9B8,l!`6qL'G9hI`=0&6MX~> +nGrRq!&=F:r]U6B#W,9n6Q+Y,H44$5Ve4$#Gb4T7JH1H%-P4T7PE4U=,;7Rfp94?P"I!.Y~> +nGrS!#AnL,H%(9oKDgK'KaWZlMi3IKLl%%KN/R[lreg`6rf$l:r/1N2!/UW0pko*0reLQ2re:Z2 +K7e`*LPL?XC'K-DM1UD.I/\[&H$aaZ@"O!epAXFuk32$hnaZ)8m-O0-mHa'.o(Dt[QstZ!@s`TN +rdjuts*k<3J9H*VG^+dpreU]6Kn]MV$A3q[IrBOTItEB.reCc2LkgbBKR%iWh#Ms~> +nGrRr#"V0N6pj1'rB16I6:+*>70c1G5sdt.77@,Ar^6]Rr^HiVr'^QP!(-ZNp-emE"$f.=6N'7` +6q^07Q*Fo7K,aa7moa37nQBK9h7f=h#Ms~> +nGrRqs$-NI!'gHGr]:TN4?Pel6UO.(5`2mf)GUHp1V51IOGl +r]pNLr]Mbn3]]Yi/M/D&/2]LP4[)(m4?,A_5!D%i.l/tB4?Yhk4?PVi77Bg>6UNfg!.Y~> +nGrS.#AnI(G(5$mKDgK'Ka3BhMi3ILM2M:k!K2d5L]KRnDoCNt)UJqSf5M2?kALkpnBIXZ?MB& +nGrS'!D>o]7/oLM4Tdo86:CfA"%,CA6iKLT6p^f;s$6ZP6iKLR7K5jW70#^R6N9@F7K#LN5la:N +7/ojZ5Q3/U5=\4/6po`"OnoCV\Mk2peiDf8BO8kT(Q +!(QoUs$ZlVs$coTs$coV*_8ai5XRn283fEq5 +nGrS$"@5784[B!0r]:HJ4?Pel6UO.)5XGB:!CB$M56!hJ5XGB9s$QfSs$HcPrBUBIpd>'I*'#r: +3BB>f5sn"-7SHK?/1W5877B=%3B9>n777&H'ffuBaQ)4:kNM=#kjIm*m-a<2naZ&HlO*"2fO[WY +><,,:5Q3qK5lNnd4$#Dc4Zb_d3&ioY3]]Gi4Zt_a3BoYa2((4;4oRPQ5<_7j5X@\)770F+2`KUo +J,~> +nGrS.#AnI(G(5$mKDgK'Ka3BhMi3ILM2M:k!K2d5L]KRnDoCNt)UJqSf5M2?kALkpnBIXZ?MB& +nGrS'!D>o]7/oLM4Tdo86:CfA"%,CA6iKLT6p^f;s$6ZP6iKLR7K5jW70#^R6N9@F7K#LN5la:N +7/ojZ5Q3/U5=\4/6po`"OnoCV\Mk2peiDf8BO8kT(Q +!(QoUs$ZlVs$coTs$coV*_8ai5XRn283fEq5 +nGrS$"@5784[B!0r]:HJ4?Pel6UO.)5XGB:!CB$M56!hJ5XGB9s$QfSs$HcPrBUBIpd>'I*'#r: +3BB>f5sn"-7SHK?/1W5877B=%3B9>n777&H'ffuBaQ)4:kNM=#kjIm*m-a<2naZ&HlO*"2fO[WY +><,,:5Q3qK5lNnd4$#Dc4Zb_d3&ioY3]]Gi4Zt_a3BoYa2((4;4oRPQ5<_7j5X@\)770F+2`KUo +J,~> +nGrS.#B+U)FaegiK)UB)KSG5:rJCQ1!/gc7",VefLAlr/Ll)%e"HA@tMM_=gre^E.s,?r8.u8t7 +Kn4`'IXd$(H>%)0JVf56Jp_rqJUr)lDf8U/L"bnQiooUmm,d^)mf)Mfm-aTRgHZF.@7R'*s +0/#$B!.Y~> +nGrS'#>IZT6UX.'55m\P5=%S'6pj=.5s[m;70>kA5[h/@<_5m^ +7P$tr6UO7/6T[S)84c6=5X%Fu6qBd:5=7e27QEIb6UOO;6psU;84#a56q'ZG8cM3a6n'W:.Ocf# +k5^#~> +nGrS$"@GC94@&m/r]:HJ4?Pel5s[b#5=,99"$f%54oRVG5=#-4"@Y^F6:(T9r^$82P1#aPYb,jlu4$kNqR$m-X30o()89mHsGO[7 +nGrS.s)7pZrd5'&JqJ]/L5(M@LPPk`!/UW3!Jc@+M#<,0M@,?%MMd7HLl%"IMti20MuJ])MM?b9 +J:2inI=d&sC2Rp?LPL;0H[C3lJ9cEWD,?7Qi9]I_kihC"j6l@%lKdd'n*f]5o^r0bXB'^hEd)k] +JVAi5KnTG[s+LT*K8>>?reCK.re)JQL5(/,ItiAeCN"cTMM-V7MiNgSMMmCMMi*CGH[BaGGB`'I +J,~> +nGrS'&Pkna6Ua:,5<_4n5=%S&6pX-<5QF.M6ifS;r'L[6:hJ,~> +nGrS$"@PI:4@&m/r]:3C4?Ph,5Q3hH5lO(N5mHsP3Q8_hC6NTM;5Q3qK +5lNnR4$#DY2``u]2`EVn1a=tE4Zt\`3C,YQ-S%>C76Wdp6:4+'4Zkhk6:OF76ps:);cD]VJ,~> +nGrS.s)7pZrd5'&JqJ]/L5(M@LPPk`!/UW3!Jc@+M#<,0M@,?%MMd7HLl%"IMti20MuJ])MM?b9 +J:2inI=d&sC2Rp?LPL;0H[C3lJ9cEWD,?7Qi9]I_kihC"j6l@%lKdd'n*f]5o^r0bXB'^hEd)k] +JVAi5KnTG[s+LT*K8>>?reCK.re)JQL5(/,ItiAeCN"cTMM-V7MiNgSMMmCMMi*CGH[BaGGB`'I +J,~> +nGrS'&Pkna6Ua:,5<_4n5=%S&6pX-<5QF.M6ifS;r'L[6:hJ,~> +nGrS$"@PI:4@&m/r]:3C4?Ph,5Q3hH5lO(N5mHsP3Q8_hC6NTM;5Q3qK +5lNnR4$#DY2``u]2`EVn1a=tE4Zt\`3C,YQ-S%>C76Wdp6:4+'4Zkhk6:OF76ps:);cD]VJ,~> +nGrS!%rcE*E-ZeWI=Hj#K8,,:M>W&-L]3,2L4]2Yre^f;Mi!;iL]`NnNK*Xg16%6OM2$V6I=$HZaplre:E, +re;YQL5(M=KnY27L5ChGMLp\>L44Z'L3mQGEeK+*KnG#:OH>D"N!kW+OH>?LIrne-C4tXJJ,~> +nGrRr%o>eb6q9O/5X7Ls5X@\'7/T7L62j4P5Wng1r^6iY770HA63BVF7n<>As$R&\77BU25X><5 +2EjAq7QrI]1Iao+4?tti5t4=27mB3dH@!lqgY:lUn*fE.nF#`7nb2bQq=jFLs-&X9FAYn;r^ZrV +!(?fR!(-ZN#!Y444$>_lr]pNIr^J"p6ps^8/hT.W92eDM6qg +nGrRq"@YO:4$`d.r]:6D4?Pelr&k$Er]pQK3qu)A63BYD5sbK8"%#CE7JK1K56*tI5Q=#35X@\$ +6:aX2/hetC5s[@h2E!`f77Kp>7PB@Ff&kiGkNV +nc07N!!"K=AS$"1H@10lJ:WB,LAlu+M#E21N;e_9MM_7es,?r8reg]3s+^Q/",MhlMuJYNNf8pR +K7JK#H[C'YIt)KPIt*&qH%LYIJ,b*$D0u7as1/0os4\[aleUCelK[Wtlg*s-nFH/Iqt5l*AUerL +IX6TtL4t>9reLW1K7j)YrJLW3$AXIiJqJr=Mi3OPN/WaUMi3FHL4XY]ASU9+ +J,~> +nc0"=!!"&o5#!bI?6UX:/r'^KPs%*,Z!CfNU7/oaU7K,^S6iTFO5m'GA6q.)E#"M*N +6pa.(rBDYf7n5Nk6psL*3^Z1u5XJ"43DD4_2kHVlh::'BmGd."n*f]4naZ>Pq% +nc0"5!!!od2E!``5 +mJm_HAS#q+G'SI`I=Qm"KSBD[s+gW1s,$c5s,$Z0r.k<2repc5reUW0reCT4MMd>jN;nc'LP(,- +I=-EgEHuhHCP%.hGB\[kIt)ouJT#g4;d$iKlK[0[mHWQbnET<'kj.R%nF6#>qtp,GMe.BaH@L3l +Jqeu5LAlu1L4b-VM>`>3M$f#pJqAW3M0irOCArbiK7o#8Ll71MNrG(LNf/gPL5(;,AS#(YB6SXb +!.Y~> +mJm_<6UOC77mo^26:!q)6U^o?s$QfSs$crWs$ciRr'UKRr^HfSr^-ZNr]pWR6psKC7Ku:L6pj:+ +5lO%Q69.=t1GSl!s#V5i69me%8P)'=0/#AaVqKtYf'D\_j7_s1mdBW8pAXk"p\XjWI=5"&<`W +mJm;+3&pn%!'^BE"?JV+4[/j0s$6TMs$H`Qs$HWLr':9Mr^6ZOr]pNJr]^KN6:+'=6ioY@6N'.L +62j563^>qb/O;Zb0JGOJ4$,Vs83Tg*1I/(EhrEAAm-EQdo',E&lL"!/o^q_DoCM*bE^Wkr7RoO( +5!M4p5Q3hL3ArcV3rV/:2[VW13B9/g6T-5;-N61.55meG5l +mJm_HAS#q+G'SI`I=Qm"KSBD[s+gW1s,$c5s,$Z0r.k<2repc5reUW0reCT4MMd>jN;nc'LP(,- +I=-EgEHuhHCP%.hGB\[kIt)ouJT#g4;d$iKlK[0[mHWQbnET<'kj.R%nF6#>qtp,GMe.BaH@L3l +Jqeu5LAlu1L4b-VM>`>3M$f#pJqAW3M0irOCArbiK7o#8Ll71MNrG(LNf/gPL5(;,AS#(YB6SXb +!.Y~> +mJm_<6UOC77mo^26:!q)6U^o?s$QfSs$crWs$ciRr'UKRr^HfSr^-ZNr]pWR6psKC7Ku:L6pj:+ +5lO%Q69.=t1GSl!s#V5i69me%8P)'=0/#AaVqKtYf'D\_j7_s1mdBW8pAXk"p\XjWI=5"&<`W +mJm;+3&pn%!'^BE"?JV+4[/j0s$6TMs$H`Qs$HWLr':9Mr^6ZOr]pNJr]^KN6:+'=6ioY@6N'.L +62j563^>qb/O;Zb0JGOJ4$,Vs83Tg*1I/(EhrEAAm-EQdo',E&lL"!/o^q_DoCM*bE^Wkr7RoO( +5!M4p5Q3hL3ArcV3rV/:2[VW13B9/g6T-5;-N61.55meG5l +nGrRs%fdP=7rWHfFa&.XI=Ha!K`6T'K*?s`LkpnEqh4p%s+gW5repc5re^Z1s+jF,MMd=MN/WUL +Lk^M2IsufoHus7DA8d3WJU)NpJq8K#JUqlb:/50?bjFcRhWj@`i:-$sl0.I!mI9W9o_eX]NK%P$ +H?t-gJqAZ0KnfS^"GMGZLPPb`%>p"!LP^V7KSYG0Bl@qhJJs/oLPL\DMi<[XOH5E]NJ`LHJqA&b +?W^EH6g+N#~> +nGrRq%fd>#1JCA37R][36:4+.7K,UQ63TbG7n6*@qa:5a3&iKL9he,@4\%h(5X.h35t`^Y6FXG\iS*#NlfI7$n*f]4naZ>Pq% +m/[/9(.W:]E-6AKH@:3lJq&9$JqAZ1LkpnFre(6(!/:E,reLN4repc5reUW1reUQ1!/gc6#D\%g +Kn4`'If=a&F_##kFbkj(H?t>FJhD>#Jp23-95`J;mHifjkih'emcs*%kj.R%nF6&Ar;?;KNG!fh +H\6]tJqSc/K`6`/KS"f1reL?,$AXFhJqSl5F_Gl=rdb3)KSP>=rehAINK&mWNK&jQM2$b?LNHm1 +E9@4O~> +m/[/."uAnF84H$:r^6cU7fG[Q5m9VE7n6*Ar^-WP!(?fTr'pZSr^?`Q!($TNr^-ZRr^?lS6:1W: +5X\%07mAX[.R$X(83fF26:!n"8kMNB-n&$7a5Q(7h<=.fkk"93mdBW8pA+OZp\FXQI!e^u<)cjg +7Rfa36::`?#!kC85sR_%qEPBS77'=08kM/u4$3F4!(luWs$m)Z7K,^T6O-%O;Gp"I4B(DCJ,~> +m/[/(""HN"55mYT3]fDd5!(hg4Zu"q6UO71r]^?H!'pNLr^-WQr^6ZOr]pNKr]pHK!(-ZP7mB:* +6:!q)6UjO84Y&$/2b$7u1,;!Q4Ztes8Oc9&/6L*=jlYFVkiq0hn*0*#lL"!/o^q_Do((m_E^Nep +77K@&5!M4p5Q3hL3ArcV3rV/:2[VW03B92e5VOH;0`F6855meG5lO"H4odkI5mBeR:-pis:$2M,~> +l2^iS'4l-(F*DqVI=ZltJ:`B+KnkG?M>i5/LB!&/M#N82N;eb7MZ/J4M#<,.M?\fhKnP#,J,OgY +F'W'[H\R9*IXZm$KnXc&JTkj%98DThlfmHikNM0pmcs*%kj.R%nF6&Aqtp,ING*ljI"H]rJV/Q+ +KDpQ,Jq8K,reC6($&F1bKnP,!BR5"(JHUUYLPL]bMuJM5MMqIos,@;CJrPb=?XICXkQ$,~> +l2^i?'1GG^7n#m:7n,a/5=%S&6q0X:8H)$W7K5jW8,c'Z7fGjU7/fRR6Ms4L6j#\?5sYE85=7n0 +83JFP/4E9-845j95X@[t8P)E=.k>MeeDTBGiTKLllgXB3mdBW8pA+OZp\=ONH[AIo;GpIa7Rfd5 +6iBCW69[S"5sdp75mfqI6:+.482i1f62jCT8btsX7K,dU70#aT7L)4V;+if*6P&A\J,~> +l2^i6!':*A"?JV+4[/j,s#gNM5XIe*7/fIO62s:O6i9@O6iKFO62s4J62a.L5lX.M63K_I7n>`@ +-9+(R69@(`3B02d3(QS16S:!3f@T*Fio9.ckihEul0.F"mIBi@o'l2>jDf0+;aa#B3^,_l5!D41 +4p3l(2EEnu3Vt`B4$>Sa4[)%\,W7R[4o[_F5Q3nQ4?>Md4[2.sr^6uU:f'\:0Kfp0!.Y~> +l2^iS'4l-(F*DqVI=ZltJ:`B+KnkG?M>i5/LB!&/M#N82N;eb7MZ/J4M#<,.M?\fhKnP#,J,OgY +F'W'[H\R9*IXZm$KnXc&JTkj%98DThlfmHikNM0pmcs*%kj.R%nF6&Aqtp,ING*ljI"H]rJV/Q+ +KDpQ,Jq8K,reC6($&F1bKnP,!BR5"(JHUUYLPL]bMuJM5MMqIos,@;CJrPb=?XICXkQ$,~> +l2^i?'1GG^7n#m:7n,a/5=%S&6q0X:8H)$W7K5jW8,c'Z7fGjU7/fRR6Ms4L6j#\?5sYE85=7n0 +83JFP/4E9-845j95X@[t8P)E=.k>MeeDTBGiTKLllgXB3mdBW8pA+OZp\=ONH[AIo;GpIa7Rfd5 +6iBCW69[S"5sdp75mfqI6:+.482i1f62jCT8btsX7K,dU70#aT7L)4V;+if*6P&A\J,~> +l2^i6!':*A"?JV+4[/j,s#gNM5XIe*7/fIO62s:O6i9@O6iKFO62s4J62a.L5lX.M63K_I7n>`@ +-9+(R69@(`3B02d3(QS16S:!3f@T*Fio9.ckihEul0.F"mIBi@o'l2>jDf0+;aa#B3^,_l5!D41 +4p3l(2EEnu3Vt`B4$>Sa4[)%\,W7R[4o[_F5Q3nQ4?>Md4[2.sr^6uU:f'\:0Kfp0!.Y~> +l2^i6'39!kEclVOI"6WnJV&K+Knb>;M#<&,M#N53Mi@Xnreg<(#D\"eK7SN%If=`tCKk"WrdGH/ +KS4i,LPL)'Is,KYOH>$&@Tn!>!.Y~> +l2^i+#Wt^M84Q-=84WYEs$6fT6q'O68,PjT8,c$[7n3JHr^??FqEZAo77B^+-n$oE84Z6C8jkm2 +6TR_-7Q`C[O4i4@iT91`lgO<1rpL'ZnaZ>Kq=ss`#OQkb9jU^q;uT5g6pj=0r^?lT5 +l2^i%!&FO9%lud64[(qh4?Yhk5X@\&6i9:L6i9@O6iKFC62s4M6N9Fd77Ka:2'aG"5 +!2Jr^rtYM5$7]V+E-$2GH@C?nrdb*%KDpN(L&6W'L&Zl.Mi@Xnreg<("G__dK7ElLrd5Sp?!VK$ +GB\OmLjO]0M0FArEF)[H_WpFDj8S3ZlgXE0lK[Tsl07U)nFQ;Lqt?#/BS1\[K7!NH!.k-$"G)#N +K7j)UqhG-&#)7\[C1r9Rrdb<,KSP>=Mi3GkL(B,uN/WdXO,f0[O,.ju@r:E0J,~> +!3GSgrt>;2" +!1WBVrser-#T5Ta4?>Pc4[/d,!BraI5QF+I6Mj(K7/fRQ6M!JC6N0=R6:=6@72eWK-71Z;2)R?Y +5Vb5a68q;#6T@+fYhn6ii;VmKm-jE.l07EsmHsH9o^`"N%c_MI5uL';6odFp5<_7qr]UHF2E!TW +r]0j7s#^6@#!P+1,pY`@r]U9Fr]gEJ!C&aH3rhGC5Q="T6Ua[B9g1a!7-FW$~> +!2Jr^rtYM5$7]V+E-$2GH@C?nrdb*%KDpN(L&6W'L&Zl.Mi@Xnreg<("G__dK7ElLrd5Sp?!VK$ +GB\OmLjO]0M0FArEF)[H_WpFDj8S3ZlgXE0lK[Tsl07U)nFQ;Lqt?#/BS1\[K7!NH!.k-$"G)#N +K7j)UqhG-&#)7\[C1r9Rrdb<,KSP>=Mi3GkL(B,uN/WdXO,f0[O,.ju@r:E0J,~> +!3GSgrt>;2" +!1WBVrser-#T5Ta4?>Pc4[/d,!BraI5QF+I6Mj(K7/fRQ6M!JC6N0=R6:=6@72eWK-71Z;2)R?Y +5Vb5a68q;#6T@+fYhn6ii;VmKm-jE.l07EsmHsH9o^`"N%c_MI5uL';6odFp5<_7qr]UHF2E!TW +r]0j7s#^6@#!P+1,pY`@r]U9Fr]gEJ!C&aH3rhGC5Q="T6Ua[B9g1a!7-FW$~> +k5Yf-<`X*WE-6GQHiABnIXh?I!eH#Xrdt3&rdb<)JqAo>Mi3JlM>i51LPGe^rIb-%$A!_XI=$0^ +G'A.Qr`p"VIrTIUMMc\0MMcV*HuK!e+k>c=g#)&Yk3DO.kiq?qkj.R(oCMYJqYKlCMe.EcH\6\E +JcC<%KDpN+Jq&9&qM"j%s+1H0JUqNJL5,\Y#(qSaLPUkHrJCK2req2BKntPDL5'ebIX^P^J,~> +k5YPu4?WU8"%u6U7f>aU7f>dU8H)*Z7fGd\6UF+07R]a8qaCWW7n,s:qaL]Y7Rfg8r^QoX1Is2P +/k&Jt4\&CJ4Zu8(3^cA%2*=";gY:35l07F#o^qP>n*]W6nb)\Pp\+@Um!k@5=>B9r^6ZOs$QfP#"M*N0.osnr^[#\qa^]Yr_!Ac7moa4r]piT7Rg3Q;b'/Y>Nu3=~> +k5Y\u1,;$V4[8g/!BraH4o[eH56*nH56O/85Xn6B7K5aU6N0:N6N9@L6i9@R6ppr?s$J;'.OHK( +681)R77Asj6UNk$6U +hZ3[f$ZC*-G^=RXF`Dn\K)UE@J:2isM2@.LLkp\:KS>#+I=ZinH?jjaH?oL4s)A$UrbMROrb`'E +?smblH?ssgItIZL$A3D@I7Sg9m,[6hroa=Fs69jTkND'rnaZ5MoF:Beq=05qAq+uIIt*$#r.Y0( +"+l)TK_L0.JrG&'KR\J]Ef,a-rIb-("G_klMi.Llreq>HN/W[\KnY&2KmmudGn]KDJ,~> +hZ3[C$V3o`9h\&I5s.Y-8H)3o77'=39he2L6UO.-6qBg96qU&M8H2?_:&dll:/">S9MS>Zr_WeX +4Zu2)r^d&Y!(HlK%RiH@:F'I]g"P0=kNqR&rpKpZnF6DH!:p*[s8)rfIt(L/r_ +hZ3[>+@/@^6pE[l1FtLF3^,_l4Zkhm9MA/S7Rfa56q'C)4[]37(.1S^84lED8Oc095sn"+5s[^^ +.Om;9r&kBP3'')i4?QIfAS(kq+Q2AFkiqnF?&;lgXE(EcO`R7Rfm64[&a-#\_5!(hK/k/;q5b+5lX+X6W$9@6r-TQ6r6\ilMuG~> +r;Zmb='+Mas()0[rW!'NEcQVardXrus+:9%"+YrRJ,Y!BJ:`B*Jq&8]BlnHGIt)ZX@: +r;Zm[9hjaMs%WP9rW!NL91r2c:/4JU92&)S9M7rK6N0=S6qBjDr_O^t5u(0X?=$c.6psaL +r;ZmY92"CIs$Zo,rW!NF3]]Mq4Ztki4[;A&6q9d=8,c%(6q9a<8Oc0%2+9r1='&6j5X7e28khc? +5Vs]1&L&\S2Ea;jrB13E5!Js6"%k"gHN)\&i8s4fkPjZHlgO<@nc8:\mg\XRn`+b78QnVS8O>^/ +rBLTO4Zteb3'',"3W1o93>=n@2aKMe+>-,Q5X.Ir4?>Mb4?Pe+3r_AB5lO.\7R04.91q`0.k +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/slides/users/figures/fry.jpg b/executable_names/doc/slides/users/figures/fry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3b0c66a9c1bfbd6ef4d7cfcea3b045f41cc856b Binary files /dev/null and b/executable_names/doc/slides/users/figures/fry.jpg differ diff --git a/executable_names/doc/slides/users/figures/hpcs.eps b/executable_names/doc/slides/users/figures/hpcs.eps new file mode 100644 index 0000000000000000000000000000000000000000..bf03f8be2192dd584bdfd2f03bd282ad99e8e9ed --- /dev/null +++ b/executable_names/doc/slides/users/figures/hpcs.eps @@ -0,0 +1,678 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /g/g0/grondo/proj/slurm/doc/slides/users/hpcs.ps +%%CreationDate: Mon Apr 7 09:36:17 2003 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 314 102 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 87.000000 translate +299.000000 -87.000000 scale +% Image geometry +299 87 8 +% Transformation matrix +[ 299 0 0 87 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 299 string def +/gstr 299 string def +/bstr 299 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 38947 ASCII Bytes +colorimage +i;i$Elj;h`g( +i;i$EljDncg(NWcjq?hekmHYYirFT~> +i<&0mlq?MWg5G3ok)8D +i;i$Elj;kafb!B^jUgValj;bWj8a]~> +i;i$EljDqdfb3NbjV$beljDhXj8a]~> +i<&0mlq?PXfo,*njbr> +i;i'Flj;nbf+@*Zjq-bcm0VeVjT'f~> +i;i'FljDtef+R6^jq?ngm0_kWjT'f~> +i<&3nlq?SYf8Jgjk)8J>m7ZIijT9r~> +i;i'Flj;qciXjcWjq-edlj;_VjoBo~> +i;i'FljE"fiY'o[jq?qhljDeWjoBo~> +i<&3nlq?VZieuKgk)8M?lq?CijoU&~> +i;i*Glj;qci=OWUk7Hkdkm?PWjoBo~> +i;i*GljE"fi=acYk7["hkmHVXjoBo~> +i<&6olq?VZiJZ?ekDSS?ktC4jjoU&~> +iW/6Ilj;nbit0`Tjq-bck6^S\!WWB-jT'f~> +iW/6IljDteitBlXjq?ngk6gY]!WWB-jT'f~> +iWABqlq?SYj,;Hdk)8J>k=b7o!Wjl&jT9r~> +iW/6Ilj;qcj:K]Qjq-edjpCJ[rr<$&k5^#~> +iW/6IljE"fj:]iUjq?qhjpLP\rr<$&k5^#~> +iWABqlq?VZjGVEak)8M?k"G.nrrN0Nk5p/~> +iW/9Jm0W%dit0NNjq-bcoEbL$r! +iW/9Jm0`+gitBZRjq?ngoEkR%r!EH.$LJ#s!<35b!.Y~> +iWAErm7Z_[j,;6^k)8J>oLf07r(@&@9C480!rje5!e:~> +iW/i'~> +iW/i'~> +iWAHslq?VZj,;3]kDSS?pIjX!h?&3~> +iW/ +iW/ +iWAHslq?VZjGV3[k_n_Ape0g$rW3'MhZA<~> +j8eHKlj;qcjUfZNrt,2Em1Agsn-T!rr;Zm&)_Cmjpal@IrW!-RCl4L8MJ2l\!A"EB!.Y~> +j8eHKljE"fjV#fRrt>>Im1St"n-]'sr;Zm&+YoTq^h[LrW!3TD2XX:Me>[Ur_ +j9"Tslq?VZjbqB^s,6oUm>LONn4W[0r;m$N.PCWL!\R,=q_%gtrW3?XOKk%TZ"Hg,rc&!7/h?>k +J,~> +joFTKmKr+djUflTrXf#Brt,2ErX]&Dr=JuCq[iQ3p'L^%rVup%qu?^#qZ$X#,5Ebr9IrXa/-%4$ +/-Y_I!A%pVQ2YIsPlR3KBE:dXquD6~> +joFTKmL&1gjV$#XrY#/Frt>>IrXo2Hr=],Gq\&]7p'Ud&rVup%qu?^#qZ$X#*Vh5m9.WL_/-%4$ +/-Y_I!A%mUPl>=qPQ7*JB)tXVquD6~> +joX`smRue[jbqTdrep`Rs,6oUregcTrJU]Sqht8cp.PB8rW3'MquQjKqZ6dK,l'&!:+eX]/cmX, +/h?Vs!A8$WPl>=qPQ5:lB)ta[quVB~> +joFQJn-S:ekn!k0&C;*k&H*:D&01ZXp^$pOr%A%DqG7/crb27H!1@A7B*G9`@N]5m/`.7SHMO/--kErW%H~> +joFQJn-\@hkn4"4'$qBo')`RH&g@5ap^.!Qr%J+GqG@5frb)1H!+u4I!G?9JB)n1qB)n=uPl$gJ +BDn(oR/^e&QtMeNR$dkcraZ(CA6f+,"Y<;>@UEU@9E%B[56NN+78$;L/--bBrW%H~> +joX]rn4Vt\l&,S@MpSC&MuBRTMfAZ2pIkF$!-.jp!-/!NrK%#Hrf@.nOSrelPl>7pAc@qkAH6BA +Pl>5!AnP[fAX$b;rb)49!bYe=r_5D"n49dT!/j)6k:AHLC*%q3lJ,~> +joFQJn-S:el4D&O$QDp"Cjq8K[)98nb5UW'aoo>h[(O'N[/[0.T9X*hQi`P?R/N +joFQJn-\@hl4V2S$Qr<)D1IPLZ.#u"ao:`,aTTT!Z,+9UZ2^^'UQfEjQi`M>R/N9KZ2^?qPc+MO +s/,k%r0.D`SYr``Pa)-6r+?1t@V9=H9E$IB,lT=p,jG@0/G9'o~> +joX]rn4Vt\lANc_$b),#OJ/qZWjf"Ka8XWf`rsSoWj]A8WrJ.^Q]u.^AHJ*-Ac7kmWrJCdP`Ym2 +s,[5\r0.DIQ]S56Pa),Xr+?1t>%_JC:AujG)u_Gi)sRJ)0(o?s~> +joFQJn-S:elO_>Uru(bL!t[W-]`#tVX-K`NTr\.!s/Z0brj;^^Lhp&KU~> +joFQJn-\@hlOqJYru:nP!tmu?_>VIZVj+*DSYuFks/5m]riuL>rR1bEriuLP*3lE+R$a,&Z(/)@ +]Wn`>SWo@OB3\n7/4E3)76UW$r?V(:!'L#V!A$n>!!,25q>^Lgp&KU~> +joX]rn4Vt\l\j&es2k5<",huY[f+5MOHbikQ]V0Gs,d8Fri6",rO2cgri6"-*3,*bAS%*jWhHH5 +[&U-fQ^!_HB2r+t/j)m(4>m*jr>YG3!'9lV!A7.C!Wb>7q>pXlp&]a~> +joFTKmg81dm1@h_!#b>A,S2W0kek<\oX)H.Q'dkNBP1aI_mHda/1a7a9OMOIQBl3"Bk73:s$d5E +66ZC0/1`%A!!,bEp&G=KPlLe/,6/td/-D.g!$g8!J,~> +joFTKmgA7gm1Rtc!#tJE$kb7rmaKY,dBU?TPaMG_$sd%0e$6/j/1a4_94.U0!bl1Sr_*8[#:qtX +!!"Q$,l%E@9.]c:#:u)>!$ifi,lB1qPUle[g]2j~> +joX`smn;k[m>KPo!6Of1,`?Nje[N$.aJuV6P\"H>B3eV7\#QH@/hT7]:0V@DAnG[]?!@5&s#^N= +3[=b./hS+=!Wc%Kp&YIOPQCn*)ZguV/d%=j!ZTnrJ,~> +joFTKmg81dm1@h_r>GPJru(\J$4nbqs24' +joFTKmgA7gm1Rtcr>Y\Nru:hN$5+qqs3pDbaj\?_q#CN%^<'%D!!"SI!<4)=!!/<8rVupLquHaB +"op2e/1a4_rFc.>"(Z&/R/N9KSc>tpVZ<:eYlgngPaMG_"\V9Q4=i&J!.Y~> +joX`smn;k[m>KPorQ5#:s2k/:$B'nDs0pOfa1')Aq#UYu`5bXK!WXkM!rjPF!WeN +li71m!!N?+!9aU[#lkD2$0_lc&ChKn)>t9K)?(q/GoMJ +,5qQNBIj,`+=mKm,>;d9Q2\,j_>^hAb4r=DX8\C_Q3*G=U&).rU&V.uQ(b7ZTp +li71m!!N?+!9aU[$31S5$L&&f'%Icr)uUQO)u^TU)\s2CXo?EFe&g(f6MUW\YlJ&*!!4/l/GoMJ +*W?$IB.O#_*@q0j,YMd7Pl@of]`,29anW+@VuDqZB*+HbSbfVkSc>SmPb"_MSWpCMli;P~> +liI>@!\4=&!pD0.9)rc)9Bg6ZMq+d)ao/1;ao84Aaf).Tf)E\m\&Yte3r&jVWW6&q!WjW"0)PeN +,lRiRB.a5e*%h9o)bt%1Pl@Z_[/R**a7uY7OT(LCAccP.Qhm`^QiE-PPa@JnQ^"M:liM\~> +kPt_h!!!0&l36Y`kmZtkjV7;(rY5;K!>HLP'`T'K'ETO5[/A&J_mE,5!!B: +kPt_h!!!0&l36Yakmm+ojVIG,rYGGO!>ZgW(B5?O('5O2Z2D]Fe$2RA!!B.3Z"Ee3ruM";ruLn8 +![IadqZ-RG"@YsVB;b^Ms3pbJs1AB]]_]bM]`-CWaT/U4!.Y~> +kQ1l;!WjkRl7;?sl"f^Fjf%dmri#e;!N +m/RCq!!N?+!!N?&kQUtmrrr'%p^@62$k*I9%.4\g'_<4A'`Js^'H8SS*=s>-'G(fi&1fB>c,9M& +!OPPr!!B:/Zt/_-ruh+;!%dpG!$M+p"8'b.o_Zc2o_-H-_uImU_Z7(1!.Y~> +m/RCq!!N?+!!N?&kQUtnrrr'&p^RB5%Lrj>%djtk(@rLE(B,6b(*G1\+VGe2((q5q&hP]?n^IHY +!O5;n!!B.(Z"!8(ruUt9!%dpG!$1n9!,)8u"4>6!.Y~> +m/dPD!\4=&!\4W42bc%#_HjW/HS4MiCB0ag_5h +!NJoj!X"OaW`nrprtP81!&"'K!$(h:!,)8\"3AO(aSX!XaS*[S\,XMF[fEGp!e:~> +n,NFlqu?p)!!!0+9MG0a!sqe#$2+Q$#m(8:"o/K$%0$V:00F/L$24kt&EX\r)?(?L)$gof*%rrg +/0H)7/.3R//=",jb0A)OPt^uR"-q$OB__W.,Oka6/F`]@BZg8F"97TWo_-H-_u@gP_Z7(1!.Y~> +n,NFlqu?p)!!!0+:/:Ne!t%n&$MFZ%$3CA<"o/N%%fZk=0LBbV$MP&"''9u!)u^WP)[I2l+YYSi +/K>c0/INO./!.Y~> +n,`S?quR'Q!Wjl&EH1_'"&"W59D0n79*-V:/,;j7C]@$1D3(cX9D<5kMrpu-ao87 +nGj"LMMb(-!%a"i9E6WKX7lc"0'`JsQ +'HJ_X4T8%S0E+':02*oj7f?!\7eo^\BM<)5B_b@%/F`]?/F`]BBZfu>roa@So?%*O_>_UW_Z7jY +_uIRP_Z7(1!.Y~> +nGj"MMi1=1!%j+l:&llPXnMu$0XJ)>pB:UqP+hl +nH'.mZ*A9M!_]fDE<8f%f(UZsD=?q1pF?<)cJniK!N^/69DWE.95s4chp+mhC[d8EW:.h.W;amA +W/ZdRCAr5QD>n8QD/i3D4T/"T4S__TB23)7BDP@)E@rm6!WXkC!X!)UaN4A2!6FcP!OoH8a8`UK +a8WRJ[/RN7WpBe;~> +nGj"LZ)_[E"Y?pZC]seB!;?X#/?uH2"UXu.#uIn-Dg\h3DZp=>#lkD4#m*r.Oo>La$1nZ*&H<1* +&FL8%)%dQ60.\YJ9Irk#4\SO2/5/_gr(I*#r(I0$BUJd4!L7?q9EHb=/GfGI"o/,u+S#L5+DCYp +!U01JaoTDrrlY5X"Mr!n_86,g!3>GdJ,~> +nGj"LZ`S'J"YI'_D$9nC!;?X#/[Mc8"Ub&/#uS%2EIbC8k +!UeA-aT9l'rlP/g"ME44]Y+6m!2o/`J,~> +nH'.Pn(*RN.nf?^O=LA_!r"2K9CM=B.nf[g$'"E)XKqC3_iF@92857r([5tr([#I"LPYI[']hA!0HOKJ,~> +nGjU]X0HIE!%c6s9E55i0*M=Z05jZ<9MbmDZ*>i5O`14&r +nGjU^Xg;jJ!%l@":&kGm0EhF[0QBrA:/M0HZa25;P&^I)r=2?;V&,H9D`iEKVm`&g_IKJl+*0/L=8(%V'Ei%P8;F;/_/2;% +b/fDhF6!(*rhtrYG8J""d7O!<,Uk/cJEB:'>*8@V9!DB)l91BDbC'/SFVS!%dX?!L1_)d/hAWo# +Um:rlP)erk&?^][NeF!.Y~> +nH'b)f'e\N!_`1SE<7Y1D(>Z!n$-_H9.Q"IcE9fUCTah"95TZ*b-"Bsg8f"KXNlf@MlZ=.bDhKsNN94rCZ"U2CQ473Y4(i5 +Y)B?=n,344W6kLbri#V6"-%:N!rbpp9E%]cE%_XJB)l<2BDbL*95!es!&!dC!L1Y'a8s?3 +o#Ca1rl=rGrj2d:['u.`!e:~> +nGjLZX/g.i/5WUV:^&DNYlH>;Z)`bEZ)\$Zag%!-Yl]dd"oS`\:pI8*"]2J/"U1$nCi?S`0+"ng +Dm?QDOg1sE:b7a6Df;nM/.%HDZ&u;0:pI:+rim)_S?]>h$k.ZKDiq<0;%,"\Z'#$j'2]/LHEiuY +Og-QLZ&rsCZ""=Z,Q/M[)u1?S/5.6=9`?U%!;nAJ9_&/`/F`]FQ-.8AoZG>?o#^s>rlY/VrkS]S +_8DQ)!.Y~> +nGjL[XfZRp/Q&j\;$APRZN)S?Z`T.KZ`OB_b-R91ZN?$g"oSc];7!S/"];V4"U1'qD/lng0FG.m +EO2uKP-_9K;([s;EH/=T/IIZIZ]_Y7;7!U2rj*5_S[5Yn%M!rNEK[Z7;%>1aZ]b +nH'Y&f%-oq99&E/N@RZQmfH/-n(+bhn('!^o^C*)mfKaE/,`*oNUQ<;.uj#d.kAp6OK@p>D+j?d +XRGV;cL9>hND%RcXK:mVND%Rcn':C'NUQ>erpLKCjmV["CMW+YXNp;'Y%s$cn':q$' +nGj^`X/iM1^oO`F9E6WKYlIIuX"45SX0DXUX0F;]/??#Z"oS`7:s#sG*0IL`"`1IC"oki$:^+,/ +D]gS79X.Ct"d-'."U/hLYmGc^OY6kE;9=q("`LZN#mmlA$jd=K#mH3kC()c#YqHEgZ#9qGZ*=H9 +#qms:Yq-%^X0EZZ)uUZS)uCKX)]9qq"Y<=ujoGE4q>^Uk/1aKc!!"/3!!ee3b4P>Kb38H>"N.Ua +_ohnprkS]S_82E'!.Y~> +nGj^aXf\q9^TFiK:&llPZN*b&XXsMVXg8!ZXg9\b/Zl>_"oSc8;9H3K+d00i"`:UF"oko&;$F;4 +E?6\8::!e$"d633"U/nPZO1uaOt[%H;9G%*"`^lT$4=,G%LN[Q$3c?oC^r/*ZS2`mZZ-=LZa0f= +$8=0?ZRl=aXg9/d+T38Z+T!)_+<)V%"Y<:tjoGE4q>^Uj/1aHb!!"&0!!eb1ajJMXamScB"OjX) +e&hO:rk&?^]Y'Kq!.Y~> +nH'k,f%0>()Y4U!i/$/4.92"aBCJ/G99.R:9_eX,Xmqk_dn#T0bn*_bW +95SP7mn5/]f'eTseG[MheGI>meB+b2.kXRLjoYQ8q>pao/hToi!WX51!XFt1a2l?Ba49e%"LkD? +\&\EUrj2d:['Z(a!e:~> +nGiYBX0IQ]C`(:!9EcuPYm!tGYlFb-Z*=9[Z,nNs"gP?3"o\f0:pI)"Yma;0Oi^9M0ROZ*=TA0._%4Z,q"m/?uG`$#d(e"`(A>"o\o; +;6dB&Dc!L>/.`Nn)#tWQ)$_)u,tnId9J#N1$>?fh!)*Q]ZqSV9r;cgJ!)2q`!$Le3#F3HSo^p;K +kjuq$_mI>!b/;'p_u@IS_nj0Sli;P~> +nGiYCXg6Wc!)!K[YtN23r;cgJ!))k_!$1S0#F*?PdF$(X +mdnO)e$7BNaj[p%e,Hu^e%E>Xli;P~> +nH&ecf'fmCO;RWYE@X]NmjjCimfEP@n*^;X)TX8:+kl7$>6BZ!_t81W_UT0r;usN!)E(d!$(M1#F*9LaN2EB +eapfc\#QpHa1>\,N`:\$WN,liM\~> +nGjX^X3"$8!!TX49E6WKYlJUFWs&JSZ,ltsZ)]DZ"fnp-"o\f8:pI9DCgB^<"gP?1DalA`Z*=T= +#mjG5:^&DTYttT1:pI83Dm=3a#n0\9M?O<-X3(SSZ*=TAPKAr'MQq(+0Q"V`H!<+ML9]5sVQ-.8AoZG>? +o?%9R[)9f(_nl>irkS]S_82N*!.Y~> +nGjX_XiaB=!!T^8:&llPZN+jKXT\\VZcW8"Z`Pe_"g,-1"o\i9;7!TKD.$*B"gbQ5ECMVcZa0uB +$49Y:;$APXZV^l5;7!S9EO0Wg$4]q>MZjH/XiU_VZa0uGPKK&*MmIC10XJ(h%[+/<$Bh_L$5+X! +9XD'NErL%[+VGpq)u^uZ)uh#b)^S?%*D7sP!!4]EZ2ViLB)k\>P\2QF!<+ML9AojUPf_%pdE0Mu +o>q3LZ.%1De%G\/rk&?^]Y'Wu!.Y~> +nH'e*f(eggepn+6ZSn((,^/(X1g/,i0KNUQ>;OH+<2/+;s)X@@%Wn*`n" +91t95N@RZjmu8hjNUQ=/XRE5@95C^!Yq&J_f#K:Vn*`nBj7LWYZ1"beD=?pDCX2CM9@!!C98fjQ +e*lbKc2OdGE/V4'ao9fhaoBipafCCH,Yfu\!WjuLWrC$CB**'cP\2WH!raeP:>l6ZPfLhcaN)?O +o>_'BWjfIX\$Z.Drj2d:['XE2!e:~> +nGjX^X/eno!%b1O:]N&IWrPi8Ws&YXZ)[jUX0F2Z"gP?3"o\f19X2\>r!!,*!%e!N!irR0rWu.m +Z#9dPZ*A*K#uIn3$#dq("Ukr?Z&/\nDonOV%'d&D$*g`8"cB@!#qrQg"UUtNS)?1W[)'qr[,"sQW!"1?Cb5\jKBE2_2b"VX3r[\%Ci;`kCqoSp2o?%9R +[)9f(_nl>irkS]S_6dnB!.Y~> +nGjX^XfY=u!%k=T;#i2MXT2,=XT\k[Z`O3ZXg9S_"gbQ7"o\i2::&(Cr!!,,!%n'O!j/d4rX)4o +ZZ--UZa4KP$;n.9$?=4."V)/AZ\ntsEQY'a%^WJK$F@&="cKL&$8Afm"U^F!E=,RLE=Ns)*BLj> +/HlUk0Fe^@+<)IE)uUoZ)uh#b)^S5_*D7sQ!"1?BaoAXGB)lS/a\2I1r[\%Bi;`kBqoJico>q3L +Z.%1De%G\/rk&?^]Wl,9!.Y~> +nH'dbf%+gB!__+qN<2c(ecKj`egi7Dn(%P5f'c6^/+;s+/,i0DEUWN$r%%g9!)*2>!nQfjr_#hB +n#S$4n*c>g99&E/9<@ce.r1'[n$+BYXRr_iC[^^b9CMB*)_1a%lI4r[n1Gi;s"Dqo8]Xo>_'B +WjfIX\$Z.Drj2d:[&Rd*!e:~> +nGjX^X/g%:"Y?pZC]t!IYlHH!X-&OFaftgsZ*>h`!3rg."o\f1:pI8*rWW<.>>VSe#mD;B:^OD3 +#mCVADm=3a#uRsi#mla!OTf[.DZpO\;6bu^$u2iT#nXAH"Y?p`"Y>e@D[A)%YltPjZ#9q%Z*@.7 +:l%uRa_r.*09[q-)]9M5*#TV5)u^`T)[70+9HkZS/FWWG/=!Tbs2llds(M0-""XU,9]5sOQ2A]( +o^g6*Zie4^b-_/cs1nlG_83LrB^>_L~> +nGjX_XfZF?"YI'_D$:*LZN)]%XcejLb-M("Za24e!40$2"o\i2;7!S/rWW>__i$3_SJ;$sY9 +$3^bDEO0Wg$;n-m$4;s&Op,j3Er_%W&8d$50\O"YI'e"YGnDE=+D+ZNUhpZZ-=+Za3L= +;1qfQb&JR30UF@7+<)7?*?,q?+T<>[+9ic2:)t?J/FWWG/ +nH'e*f%,oa.nf?^O=MjMmfI@uf$;Rlo^;iSn*`n"!q5UW/,i0DNUQ<;r[\"A>E/*s9.NPQND&a/ +9.NY.XRE5@9l6SPl&K$ +aRdIPWWT`;a/]-Js0Ms0['ZjBBC#\M~> +nGjX^X/eno!%bCs9EcuJYlFr$MMc4dZ*=H`Z+_am"gP?3"o\f2:pI8/"oJZ-:n@Tj"HbeMZ*F66 +##MRC"UPTUrNSD%#mG7PD[?g`Z% +nGjX_XfY=u!%kP":'E5OZN(/(Mi2FhZa0feZb\3s"gbQ7"o\i3;7!S4"oJ].;5*uq"Hl%SZa9T; +##V^H"UY`ZrNeP)$3bFUE=*0g +nH'e*f%+gB!_`"SE@X]5mfG"ZZ*BCPn*_c"n+'+%/+;s+/,i0ENUQeh=&W^CXDP$98i9-92!S!n'95IX@nQAmn7Hcn#U;?Y3>?Cp!.N9 +_XH(En*+VG\((E:!6P2hs2k;j#0Eoc,U?,;mfE_H:1og3W_P2@!Wt&*/l(@,!0mB$!6FcPs/H11 +[)]3G\,Wf=WjK.5[qG%/J,~> +n,NOo!!!3"!<36&!<33+!!N@=YtY-#!!)s$!!*!%rX&T.!=8r,#lk/-$3(/5#mCV=#mi9`$2t>8 +"UPJ=r +n,NOo!!!3"!<36&!<33+!!N@>ZVLK'!!)s$!!*!%rX/Z/!=B#-$318.$NC86$3^b?$48Kc$N:M; +"UYS?r<`l8$4[OY&e56P&e=mJ">()j$4cn>%1Xs"$4\Wt$47C]&e5EM$N:P7$3q%R(*k"C+rgJ' +rYtk["rej`*?@d(li@&:oDetE"Y<=*!!&8\aT0`[aoAXG]E--ZrmUn["gP_QZ+O`9!.Y~> +n,`\B!WjnL!rjeN!rjbS!\4>6mrA=W!!<*L!!<-Mr_*8A!D=s?9)pL@9E-LH9.NXc91s.#9E&]/ +.n`McrC[JJ95A=$Mebs9Mei;b"H@1i95FAs%;Ur=95BN&91t2AMed,,9E&`+9*]6jW6j&RlH0"S +rlP2i#0Eoc,U?,;liR2>oE#+I.kXTU!W\J^`rO3Pa8`1>ZiS4IrjVp7"fer:WjHF*!e:~> +l2Uhg!<*-0!!NNWZ&rk'X0Dg.pBCI$rWW-)!!W-("Uk\G$jd7>$ipYCr!tNR*<-r^)'qs#,"sQD!!=bU,#$qq! +1!H(!;,m*rj2aCb-_/cs1nlG_83LcAF';H~> +l2Uhg!<*-0!!NNXZ]]1-Xg802pBCI%rWW-*!!W-)"V(kL%LNRB%KQnHr!EZ=/Ii*t%MBEQ%K[7Q% +fR+@%KJ*W%f?t>('Pus&f)67r=/lT(+&nlrtYb\,T@[H)uUoY*WI5d)^S6"*D7s>!!=bU*D>>k! +0mB&!7CD[rilO;ag(ios1AN?]Y(MS@dF)F~> +l2gu:!ra\X!\5con'7$Gf'b*jpFH/7r[[h"CB7(Dr(@91NGD1&CQ",LCBBE0 +C]97lCB0@jC]'+jW!05[Ml3l<@~> +m/R+irW)`t#&fBVO`)cNqZ[!+rWVZq":PSC$jlJ5!>#\<&-*.:&-<7O'`J[D'`AUA'EA^D'FPHd +)&*c('H%c-'H?rf#pU<,)&XYD)]9Ok)[m`++<2=>)'qr[,"sQD!!=bP,#$qq!1!H(!;,p+#/dgK +[)'nlrkncP"gl+^['WNn!.Y~> +m/R+irW)`t#'#QZP&W&RqZ[!,rWVZr":bbG%LVb:!>5n@&c`F>&crOU(B+sH(B"mE('#!H((1`j +)\s23()n28(*NMo#p^H4)]L%J+<)9t+93Sa*WI5d)^S5_*D7s>!!=bP*D>>k!0mB&!7CG\#1KiT +Z+S2`rmUn["gP_QZ*?sg!.Y~> +m/d8)7cE'Y?q^_\>r[[A/"D^Y'CJ456!K1alMZ@PjMZR[PW;__TW;VYQVuVbTW!eN^ +af)/IW6*/jW42]H$.-fDaiVoVeB,i1eGnb?j5SS +l2Uqj!!NN+r!!*#!Mr"L(h'H%c&'H7o/'H7o++<)7;)&FD8,9%L<+WD +l2Uqj!!NN+r!!*#!$477M%LNOQ%LN[Q$MY)2')`:@&e=[L!#GMGrtbVI +r>#AGrY>JQr"^4o()n2.(*FP=(*FP5*ZZ@B)]9k@,Tn$F+s7j'+T +l2h)=!\5c&r%%dK!@n6K.fi9nr_*8ApIbs291s%nCJ.<9CJ/G99DE9&Mu@DlMei*G!3#jSs/>sU +rMT^Srhoh=r2:RDW6*/[W78r=W78rSrTVhRalE$Qd+$1ZinqlVeGnb?inrYCe>mR>,YfuJ!Wt%V +.o,%)!0mB$!6FfQ#.K\UWjKgHrjVp7"fer:WiAh\!e:~> +li7:p!!N?+"TS]+oEG7$!!Vcsq@!?1o*kX1!"Ac:!Yc1WrY5ADrtPDCq%NfHr=f5NrYb_Mru:qT +&/uK))]]e8+ +li7:p!!N?+"TS]+oEG7%!!Vctq@3K4o+(d5!"So>!YuC]rYGMHrtbPGq%`rLr>#AUrYtkQruh:[ +&0Mo2*[)IF,9S!L,Tn$F*?tG)ruD(Yr?)7i:&l;-/DU:./-Q2Mi;`k_m)]BpZ*Dd"rR:_X"4Ooq +9CDi^/-#[#~> +liIGC!\4=&.fq4&oIKr7!%[J1qJ-((o5"Aa!,MLj!iV$8ri#jTs/>mSq5=;8rMT_*rlP2=!OpSX +aUltDamnW;eF`b"eBl^eal;Ube.(="l,hH4eC:O=![LMnh#[[2.k=BR!W]7e`rqX,Wjg%I\,EZ9 +\$WM;mfEPC!Wml~> +klC&RrX&Q-nd4[lr=Ju;pCQp1!>$4J'`JsM)u^QO)%df*)^?=?,8;":)]KY6+X%jGp)=/]9E62/ +/DU:./-Q2Ni;`kbm)fBp[']eLs2"]As2"`B!)3+e$7l/WQF' +klC&RrX/W.nd=aor=],?pCd'5!>6OQ(B,6Q+TJ,~> +klU3%r_*5@nk8@crJU\kpP\XA!K4GbW;am=eGcEHaV*LQeBm3sd&>(UhpfctlK[Wnhu;.*huD13 +hpg/VE<7+T0&6R2/h8GIi;s"Zm)K0lWiH$,s0Vd*s0Vg+!)E7i$8)A]Au\T-![IgKJ,~> +mf<@kquHa#!!)EjrX&T.m0W@mr=Jl8!%e*X!tZIa&G-\9&H3C<)#tWT'FYiu'H7u2)&jM4)&sXh +)[.N]!$Frdh#IO."U.TY!!'Cnap5hLX0fd^_85oR'eB>-/-%5dZn*F%!$ahQb"NoX/-#[#~> +mf<@kquHa#!!)EjrX/Z/m0`Fpr=]#*/-%5cYq..#!$j\Ka\*WS/-#[#~> +mfNM>quZmK!!;R=r_*8Am7[%drJUSh!0-tn",i.sMtEtIMuK[LaT0iiW"-r!W41:9ajeh^al;=; +htkh.hpg/VE<7+T0&6R2/h8GIi;s"ZmDfI@P`VoS\$WO;WYI,f*%h:FPc?>T!Wj<%a2^pp!\ONU +J,~> +mf3Oq9WPG!9EkCqnHJq!rriE0"oS`-"n`3%;$&BW$2+c/&.B!G&H<.C/5VJ6Z"koi%0$n6'F#ip +&8kZ8-2eMZ)'^C))%@f.,9%RF)'^@L)]T_?r?2.Yp)=/]9E62//DU:./-Q2Ni;`kbo#^sMrQ5;] +Q)h:0_=k5J/-%4P!)1Q8/-$nG!(R"29HsE8J,~> +mf3Oq:9Ck):'LUsnHJq"rriE1"oSc."n`6&;$&EY$MFr2&e5EM')rFG/Q%\;ZZ%Mq%f[1:('Z&t +&oUr?-2eS\)^H^-)\"&3,Tn3R)^H[Q*??(Er?;4\p)jMb:&l;-/DU:./-Q2Mi;`k_o#Um\rQ,5l +Pc(e8]_8TB/-%4P!)(H6/-$qH!(Hq09-*s2J,~> +mfE\DERsU0E@_"inLOW4s!n+C/,`*@/+lR8Xo`H59D3-&Med,,MuRSmN +rPo)NP`VoS[.^L3/cmXX!`$f9/cltE!^-M':*fc>J,~> +nGigu9WPFUCl59ujot;^"I$)e#mp85!XT8DrX]GG/@!_u@gY_ZuI-[*$4l[))[I(r?7t/-$mp!%aC/!$X[%!!%N~> +nGigu:9Cj\D2YO&jot;_"I$/h$4?G9!X]DIrXoSK/[NT_EH.q`$4\Zb')raF&d8cOZZ-Hfp(du\ +()A#<)]L%A)^>&&p`K_d:&l;-/DU:./-Q2MiW'!"Z1?!:e,IJhdg),8Z,sY`Z+U">(qd,Y9.U&g +,YQ8./-$pq!%a@-!$+3q!!%N~> +nH&tHERsT`OKmC*jt$!q"QSs192"qn!_[F +W2S4maiVoOal<*BqpYo/eC:O=!ZXrfh#[[2.k=BS!Wa:@o#Ca>rl>&J#F(=Ma0_kH[/?p@[&U-$ +/clt2:<0gr!ZM1B/sK*4,YCf5!e:~> +nGiYBaiR6U!!*7\rWNC?Df73+"Z/nL/2(p<"U.S<:^I:3:bN,OHnPd402PIO#qSn(#uIn3D_EXJ +#s +,9n`>9XJL4!<4SU!%^fW9Iq^p!.Y~> +nGiYCb0!KY!!*7]rWNC@EH*T0"Z/tO/MM0A"U.Y@;$mI6;(r>SJhRN=0Mt[S$8#+,$;n.9EA/sO +$:&QV;'?DZ/Q"),/M.J3&d"6&Zi1+a$A&FY;'?E$,u7AN/R!(2;(tkRZ[#DJ,n_MBK5X!f&gVBi +-#\B#,pdJJ,TnBZ!!=bU"\[hT!?JH5aU-G/R%:M(]Wn`SrNZC8$*hrJ +,U=o@9 +nH&eco^m/&!WagVr[S)4XK5(o.iNDe95Ubi.k>V@NCtcpNGV=JbABmFD2jNJ9E'nd99&E/XDNqi +99dQPY&J/lNNS76NK%`QMZV2mn,=gn9?SigY)R4VX2_<#NR[FcY&00en&p^8X,F%Ir9q[aMpUq< +X7-)/X/k^Xd'p'Vh>I<@rQtQ$s3q>3eC:O=!ZXrfh#[[2.k=BS!Wa:@m`,XCZt5T(a0_kH[/I$) +ZjEbA4<#4l!`#b.rW<*P#QdXoB21'3!Wml~> +nGiZ-X2tPD!"oG8/;g^5Z*>h`$*hU0Z,s7I0E/3[9Eba-Z'#$j-r:4'Z*=TAOg039Z*DEUZ#9eC +Z(&#'Q3dk[Yu$Rf$k*[U%$@g""U4l3&-]>D;%,"\YqHNBZ(SA,HZ/hes"+,R*L[NNELO=`\t,': +R^& +nGiZ.Xi^hG!"oG8/W6s;Za24e$F@m5Zc]UO0`JB^:'D!2Z]b1aZS2lCZ^\;-H#`bgs"42U*Lm`TF.pF%aJbR[ +TsLGd+Y@W=S?oP?(*FeE+WVj,+9a&d!$+]`h#IO.*@skB!!(LAaTL#6e'n<<#e\WkPb#)$Z+Tk: +&(<'T1+X\%/-#Z$94pmK/G]?s~> +nH&fSf(:Kk!YR!b9ru-E@X]Nn':q$.#gl:n*`nBcL8V#n*fo;n#S%B +n*BH2lUsmrmu>W]CMSiDCX2D;.kCTl&1d5hpg/VE<7+T0&6R2/gN&Ei;s"gp;[9Ea1&PW`sB&]Wg&jMa/ZNA +WXlQk)ZVK0/hR2,/l$%S/hZu%J,~> +nGiW,Z)dg'Hj'KROh5E5/?>g&"gP=iCi$A]DbuS$DZq\sYu!*9Z#9dsZ*=H=Og/g.09NM9/1_+4 +OU3"tYttUMZ&rs1#mh"O$tHQaZ&rs$0*uC*S-`&tOTeRdD[A'n:bT)YD_EXpZ*>qg:pG``Dmloh +:pI9f;0&qH05@bS/1^m":CnEC+TWQ-r>Pnd9E62//DU:./-Q2Ni;`kqoZI0Ns2tAZ#dfkj[)98e +[))RFr[\+E/56!n!!W&rJ,~> +nGiW-Z`X0+Hj'KRP/(oZZ-.#Za0fBP-]-30Trb>/M.=9 +OpWA+ZV^mQZ]]<9$477U%V)ifZ]]<*0FDX4T*eH%Op+^hE=+Bs;)#>_EA/suZa2=m;6u2kEP\u$ +;7!Tl;0oRT0Pn(Y/M.'%<>$8M+or]0r?)7i:&l;-/DU:./-Q2Mi;`l,oZ@*]s2k;i#dKVbZ.#tj +Z+Tn;r[\.E/P@\p/-#kI!.Y~> +nH&cRn(.F=/h6uRcKpWC9@hZe/+;r3OHAr"XGtNoX=Hs4mu;20n#S$4n*_c"cL7hbD9hU0r_$#T +c:^^fmu8j7n'8"p91s&YCVoQ4n'8"oD+heFn4TqQc7=nCX@mDiNG\.QXDNr6n*b*dNUQ1KXT%[i +NUQ>]Y/0SqD8Yhf91t8^Mokt`$f]O_hpg/VE<7+T0&6R2/h8GIi;s"goZ-s?s2Y/K#ca,UWjf"8 +WjMT%r[n:J928.Z/c[Eq!e:~> +nGi]LX2t>Fr;\u6af>RK!,S]n"gQ0c!!TX4"U0dgDZD?1aT)JqZ*=9[Z*=H9Dm=3a"d-n["U/_C +>q\m6Z#9qe].=*h$2b2nELO/;ag$!q:pI8FZ*A*KDm?R00/!V +nGi]MXi^VIr;\u7b,kgN!,\ir"gc?g!!T^8"U0gjE<%T5aoDSsZa0W`Za0f=EO0Wg"d7"^"U/bF +?nb?=ZZ-=l_(>fo$N(AqF.BSCb-Q=";7!SPZa4KPEO3!70JEh@Za4KU%V)iI:-ha`ZO1]YXU5DT +ZV_&`_6[!XZa50i0Fe^@rZV@c,lJhh,u+F\9.\m!""XTZ9AomGaoBihao9`hao9`jZ':LEYldX3 +9.]N3J,~> +nH&iuf(9"or;o-!o[YNC!g)!gXRGW'D/Dp=n*c?2CUmQj*)8-B!Wt&*.o,%)prEEDrl>#I!6>)J!ihKLo;Vmf +B21)J!e:~> +nGiWJX/l*t0MJaV"TS^BZ*=J;X)%qCX0Dg.Cp@m^$*g`="WXe]!%bC["U/hLDZp<,Yq-%^Doqp^ +#&aZ`YqHCiq$[a0Z'MZ"0/'T8:pI9!"Y]hZ/"A7!Z*A3R$rO:7X0J2"RL*o;aU'MB],V51Z(*?r +_QgA[S3IQ0+WMXE,Q/Pb,tn:]9J#!"""XU,9]6!Gao]K'b5K3Xb5T9][$?o`_tCD&!.Y~> +nGiWKXf_I#0M\s\"TS^CZa0hAX_e4FXg802D6n3c$F@&B"X14g!%kO`"U/nPE;7!T("Yfn]/"J@$Za4WY%T0R=Xg=_-TaGeGapK_F_'':?Z_&g$ +]X+r\TgKG<+rqjM,lJhh,u+F\9.\m!""XU,9AomFaTBr5ao0Zgao9`lZ':KXe+L!3!.Y~> +nH&csf%0^"0QHRM.fq5_n*_dqerVC4f'b*jORK8$9CM=".nK."!_`"N.k@^iX=GgHmn5/]XRuGZ +#-9>Vmqk]jq.gJ"n*'6/D/Jb1NUQ=U.rG7R-KT);n*d>NCTd-pf'hVerCa6\oLk1mrGZP3n*lmQj*)8-B!Wt&*/l(@,pW!?Ea2e.f!6>)J"KI]NWjhZ$lN2S~> +nGiZ-X0Dj,!.#SXX/cC("`1HK"gQ0c!!TXL"U/_IC]H#kYlt:^Z*=H`Z*=H9Dm=3a"e`+R"UT+J +CbIFm0*qf#YqH7e$k*[Y$k*Fq#mE!(YqHEgZ&u<5#mCW3Z,s8UP6nM9:^J[pZ*?DE:b4.(Dm?PU +/:k&W$mj$#/0G@`ao8OL&0i;;+WD[))[.N]!$Frdh#IO.+tQFI!!"/8b4idXX-f0Zb-](\[-I^B~> +nGiZ.Xg830!.#e`XfVa,"`:TP"gc?g!!T^O"U/bLD#c/oZNULaZa0feZa0f=EO0Wg"eW+T"U]7O +D(mXq0F@u'ZS2Oi%Ls*a%Lrh"$3`-+ZS2`mZ]_Z;$3^c6Zc]V\P7"Y=;$nmqZa2qO;(X@,EO2t] +/VCA]%OK9(/K>7`b5S^O&gSJ<+s800+9a&d!$+]`h#IO.*@skC!!"&5anO6gVjN^Rag'=hZ0MC?~> +nH&fSf'b-f!bEj$f%)>Q/!05g/+<+l!\ +nGl!/Z)_[l"YPnd9E681/DU:./-Q2Nnc/Y@nc/Y4qT8oI_og.#_Z7ON +_Z[$-Q)hgrZiI/m!.Y~> +nGl!0Z`S'r"YZNUMPZY]jtZa0feMmIC'/[Mc;0Trb^"U1'q;$@;% +Z\o.o$48HoEO.>+%fR+@%KUBcr\+LQZa0uG;?!mXOp)1i/IDi)Za1"FZZ- +nH)-Pn(*Rn.kYhm9@iQO.kAorE@^M/L+=eCmjfoimuT%mn*_c"Z1"aq9CM=dD9hUO.kAp6N@RYA +n$,M991s+pXRC"!C]97lCB;SZrbVgun*`nBNW/B'c7;PjNCupGn*`pY4(gr91s-)CTR!n +95EVWD/5d4mqo51D+ea7mu+.(imcK)eGe>/X)S1d:+k?(""l)S:@\Gd0(K&D*;[\XWjg$hrO2d6 +r3lfjAX&:cp8S,DlN2S~> +n,PI"X0KdIX0J]/9X1Y'X3"WN"gP=+!!UKL"U0daC]uAj]:Z^?YqH(\X0Jq1aiSH)$#dqjZ&/^' +ao/IJC^G$b0+%La!dMi!rNQ\9"UPKtZ*>qg%#"Vb"M:1#$"Nq=!A&0eYn*?2Dm?PU%#D/>$p:f, +/91Zo$H]PM$ksWu+<;RErYl"e9EbSn/DU:./-RRuo)JhC9J#c8!A).bb4NRSQ'diD_=k59Sc/Th +"n)GA~> +n,PI"Xg?0PXg>,5::%(/Xib#T"gbO1!!UNO"U0gdD$;Mn^n\]OZS2@_Xg>@9b0"]-$?=4pZ\o!, +b5JXMD$k9h0FI[e!dr/,rNch<"UYU"Za2=m%YObe"Mpd/$=j%@!A/ +n,bU&f'i7^f'h0?EUVKIf(=tQ/+;qH!\l"T@>>9>^Yr!KF2Ymgnn\XRGUnC[1AJCR";d +NR7[n$M +n,Oa +n,Oaj\F;7!T+;6t6G"]#''"Dn;o +ENT5H"Y^:'ZO.':%K]LQRJsN,0FA:"$? +n,amd0!X!rmuT%$!ccfBmuT%$/+;qd!\;Rg.k@mnX9(r]oT7YmOT$a:NUQ=qNUNr!.rkRW"HY-, +XOdC>"`6o6mn6=NCBCZ^ir8B\D+eY[9<@U-95BI&oC).nNCupFgA^OWD+fl6o^pG39<@UNCMWt= +E(dA&mu +k5Y\i!!!0&"T\H(!!)ct""^^^!>nL0+%Uh!"Af4 +#Rh7U$k*FN$kW7D!?_gE&-4 +k5Y\i!!!0&"T\H(!!)ct""gjc!H7[0FIdl!"Sr7 +#S%I[%LrgU%MJUJ!?;UC&cjQsrXSr@";W7*+ +k5ki +lMq1o!!NN+!!NN+o*,.##mDlNYlt:;#mCM3#lk/*#lkD5$3(G3$2P)/&-<7O&H3(Q/.<'u&88>7 +"UkqR'G)9*$lp#r+;Fed!#5DY&.g-6'GMZ7'H&,?'I+hA)&2rm!YcRur>P_Sr#5ej9E62),M`>6 +/-#ZD//p,D!1!TXs-3R8"WIUK)tO%0/GdNc_uIRP_uIOUQ"ZGi_=b28!<35k!.Y~> +lMq1o!!NN+!!NN+o*,.$#mDoSZNUL>$3^V4$318+$31S8$NCV6$Mk82&crOU')i@U/IiC'&o4hD +"V).X((qc6%NuT'*>\Ve!#GP[&/$98()@o9()nME(*k.J)]&;r!Yun(r?)(Zr#c.p:&l8&,i&G7 +/H>cD/0QPJ!0mN0s-*L7"X+$Q+nG[6/GdKbe,R)[e,R&`P\65c]_/Q0!<35k!.Y~> +lN.>B!\5c&!\5c&o.0i6#qJ[(mjfn]9.MOl9)pL=9)rc,9E/f*9DWH&MZR[PMuIK,NGFGfMq%4] +.r1'$W/HXpCQ59kZ`*k]!3#mt&J,~> +jT+]P!spW!?2Xs##lkD1$2"`&&H*"F/.`ADCf(KI&.fNirX]&KrY5>X!$h:R%jMr0,8h@D)^?4< ++WD::.K11c,:rR."rS^\+95(dh#J-S!!#\D)]L=Z[/]k"C]u?i/1^cPo)JbAr5o&Xb50$U_>hFP +_$$$:Q*eC#[/U.+"n)GA~> +jT+]P!t$`%@/U9&$31S4$M=o)')`:J/J8\KED[&Q&eYrqrXo2RrYGJZ!$q@U%jW)5,T@[J+=%mF ++s7gD-iP%c,VJg6"rej`*WShah#J-P!!#YC+X&BfZ2`/MD$;Hj/1^cPo)JbAr5euganjKd]`6I[ +]EFI3Pd.moZ2Xh("n)GA~> +jT=j#"&!L4Nr:L%9)rc(9D*)rMu@E!NJi_meZMP\Mi4O4regccri#gs!7:P?&(&G?d)jDVeBl=Z +imc)lmf( +m/[.i!!)?h!XT#:qZZQt!=T;(%.k)4'G(iT%/ph7'`T'L'`T$P'H7ba)$D0')&XCm)#t]V*;g`] +*>oe>+X7pN,Q8Ve)'r*'"\_TTr_3?*!Gn/&Q2bOr9^aM967a>]9H3p6!1!Q`")'5:"oU"D!!"SJ +aoTE&qSW +m/[.i!!)?h!X])jM8"n)GA~> +m/m;!e:~> +o)Jaoq>^O"!:^3s#mCJ="UPA3#lk/&#m:YC#n..,%.4\u'`K!L'_rX7)uh,_+T<;])'quU,5k47 +B_mttBOkXI9P!fi&S, +o)Jaoq>^O"!:^3s$3^S?"UYG4$318'$3UhG$4[F0%dju$(B,9P(ASp;+TE\e*W@/_)^S8Y*WJe4 +:B"o&PQb]/@S9@'q+L`_s%YA3m/-$hd/-RR./ +o)\nBq>p[J!q@cF9.MMc.n_Dl9)pL99*B$'95@2eC[R,PW;ap5BDRhrB3JJ6:0RHgs)J'6&R&109MR2A.S_TH/h8Q=a,lP^0(K&E0":f"!Op,J\,Wi5\,N`9 +B4[>"WWZ&u.fq6i!e:~> +nGiOmqZ-U!rrDftrsAW-!=8r/$2t,%#lkD5$0hrf&F1&/)=&4M*$?4?)]9qu"X5&h!:qcA!!#^h +!<4ST"TSNF,6/r5rW!W99Ip>u/-RRU!!"PM!%^fWQ*d59o`,"D_u7^Y_ohem!l;dlrkSYLQBh*L +!_`Rtm/VY~> +nGiOmqZ-U!rrDftrsJ].!=B#0$N:5&$31S8$L/,i''g>3)s\XG*WI5e)^S>b*?>+[o.9nA!)*.g +s"#5q!!"#b!$ifi!&=^N/-RRU"Y;5*!%\*M/5'W?Z(3H=!!+Y"rQ,)hanaBe][P@/]`2UEPk;3^ +9)o._!.Y~> +nH&\@qZ?aIrrVsGs%E;@!D=sB9E$I89)rc,9Bp<]MsI>?ammmZhuD17ioB%JeB+bN.jQ)9!qS&E +!WZ!l!rjkp.fobl)Zgrt!Wi?P:+e%L/h8PI!WjtU!\R5\PcC'&o`>.H\,F>J\&\ +AsDqf!_reIm/he~> +mf3=kr_3>Cn-'+)0/!J8"YXe4"n2ia%.=bl'^?V<*$P8"%4+[J!$_Ig,:kAj/1`s[/-5fV!;n&A +,5q`T+ohTf!$`]g/-Qu/"WR@>s""IMBU,sIs6.VJ/G/uC/H!Wk_ohhns2"`Q#/S3aBP<[Ios=lr +!!N?&"n2MB~> +mf3=kr_EJFn-'+*0JEY;"Yaq9"n2lb%dt%p(@!"D*?6+!+:TVl!!"9",U=ol,V1K5r[\%$r@A!M +?i^*M!$2%B%35EK,QK)8!%\9sD$;*\!<4SV94sKoaoCeNaXm)b!%e&i!Ro0ee,R)\dg!J6Z"I^6 +]_/N5:&kFt!!VilJ,~> +mfEJ>rc.s2n1+f-eDfiZrmVCXE<61\!#lk0/fQDq3rU`3 +9DpIE!aGg))ZV/_.h*a*!ZM1[)ZhWB.Zc/1quZmN#u5,tWlP.ia2]h*!WXkN`rWZiqR?L3s0i3> +\#O(RPdL+`"`XSo!WjnA!e:~> +nGidtCpC%_afEP^"TSPq"Tg6[Z2On00Tat32c!%e&j!Q3(X_#Uk>_$.`` +BkWdJp9Y"@9E5%r"n)GA~> +nGidtD6p@eb,rhb"TSPq"Tg9^Zi1+20XHoG"n;rb%eUJ6(B"m3(B#0R+<)9n+T<>[+:/u-*?ZID ++>>ANrZM=o/M6ZI!$qODr\FHQ"U,nt/-Q%P"Tg4Y"o^+Q!!5fXZ2;WHdI.&7aXm)b!%e&i!Ro0g +]E#56]EQchA7q.>p9=eM:&k7t"n)GA~> +nH&qGORLcmo[`[5.f]YD.frB4n,=g?D=>b#/+H9tC\eB,i+eGdSie-X7WimcK" +[r"bgr[It%92"t2!#tn=rW)p!"Y1iN/h7#%.fq=R/,i3@!Wl,]Wr'g?aOU=ja"I#d!&"2i!Op,I +ZiI-'Zj!q=?"]D/p8S;*E<61l/+3Oi~> +nGinIaiTDD"d,hh"T\,t!\^g`p]^Bu"9f)O#moo+oFV!9r=JB2oGI`M)&jOj)$h0!+;l%9)&Y"' +;#N'A/->l'!$h4 +nGinJb0#VG"d5tk"T\,t!\gsep]^C!"9f,U$4?)/oFh-=r=\N6oG[lT)^$:!)[IQ**?,q?)]LC, +;>i0N/M&J*q^_gL/-$si!<4SX"X+%$;(uuQ"d,%SrQ5*>qoJrfZ'6g4!!"SJaTBr5e+L?VZ".L3 +]_8T6aXmJm"U4>pJ,~> +nH'%jo^oC=/'c]r.g#;m!c@Dppac)3"=m,a92"SdoS`^IrJU*BoZ73bajei9aTp>;e]Gq_aiXF> +rG;X0/k\k7/cu/-!ZUk8s"4[0.P"/OD6.J&Pa&3Ha8c2:`rjD_PV2V1!&"2i!k64Zos=k%?"]D/ +p8S;:9*,/F/+3Oi~> +nGj)9X/cC-!!"PM"YX\LO`*qm"X7c1OcbMpMQsF)MG,[\C]stqDip6GD_D8#I!dSpOc_:'$1\Mn +&H3CB&G-\')>t]U)?(Q_+;l+;*#p7N'I+;2rY5A`rrq]grriBBr=&]4!\[6)oZ@8L67a8P!!"SJ +ao]K'_u%:M[/IfDZtO-<_>CS>X8TC*b5D;?"n)GA~> +nGj):XfVa1!!"SN"YaeOP&X7r"X7f6P*1_uMmKa0MbYsaD$:(sEKZNKEA.P'Jq>\.P*.L+$M"\q +')i[F'(ct+)uUfT)u^rf*?-+D*??FP(*jY"n)GA~> +nH'5_f%)?%!Wl!r.rCBQcE)$b.jC(\cH`\7Z1%._Z#OWcO=MhuXNokOXDKI\bKFbGcH^9"9Ccle +MuK[RMtEt7ao0cfao9cte]H=jio7#>W6hKPri#jVs"!C:s!n(?rG2F+!c;q^oZ%&H3\DEF!WXkN +`r``j\,3Q4Wr9:-Wb5t/[/6j'OSu0Za8H&>/+3Oi~> +nGiQ&ri6'9/H,et/??$,+L/0T"`MMf9J;9>Dm?Q`Cb.6EOTboNZ&p]EZ#9dLrNQLIZ&o1rmL8Fn +n.b"&ru:tU!#tnT!>HLP'EoF#'H&,,r[\$omOSG?#n.7>&H3(M$(o>cb0A*$b38']b%4%34Y6:, +!Ck!*aoTE&rPAK?qnWEBBP<[Ir3Q[/Q*dU![*%Y6J,~> +nGiQ%riH3ZgW('u*/()nM3/M/M!mOSG?$4[RC')i@Q$D>Q9ammL#amSTEa_!t167hg1 +!CbK9aT9l4rOi-7qn*':B4mIAr36I(Pd.-kZ,u82J,~> +nH&]'rmh+39E$Fd9@iQ)8+5ms/$/C3EG_tBXRGV>O@sHZc7:Ejn'5e=n#S#irU0m]n'3FVmVD0I +n>PKks4%(j!7_"i!N?MuIK(9@rh3a2uBCa48_]a&G/`3\L+- +!Bdji`rWZirNuR(qm6L+B4mI9r2Ks_PcBhFWlOB+J,~> +nGkI/X3%EIX-!PcCpAj$"\c0e"d,i^!!!0A"gP*.!!PKiM?O0gYlFqYZ&o1nZ*?t+Dm>0'#mou- +n.=n"i#)M6rY,PU&0hl,,mET7!\=Wdp^mH6!srecao9Ejs7FItk\EX]9KOdVp](=g_u7^Y_ohkm +!4;X>"LMiUQ,3C*s/Q:0X0eqMl2Z>~> +nGkI6XidcPXc`hfD6o-("\uBe"d5ub!!!0G"gb<2!!PZpMZj9jZN(.\Z]YIqZa3C1EO1Q,$4?/1 +n.P%&i#;Y=rY>\\&gS53,mET7!\=Zgp_*T:!t&nfb5TKjs3\sVmV,*_90t0\p](=fe,@Ahe&hL" +!3uF6"L2TPPe?q!s/-")Vm3/Al2Z>~> +nH(U>f(@P^f$5cIORKG).rk#m/'c_*!Wjl%/+;$j!\8$SYq%?nmfG"4n'3F6n*b6HXREDE92"Yf +n;HV2i5kuKrhp%1MpSEEX"3K;!\R,]pl#/f"&"aJo_ul=s2`72eQk:4:.Quip]:Ik\,F>J\&\BQ +!35q'"KH*IPdL@gs,[A`OK+D_l2lJ~> +n,O^bCi>HXX/ddfafB>uMQohYZ*=94!!!0RZ*=94"\c1Y!)0Y6rWW>,rrrG-rriR"Z&o1r$1//j +&F1%b)$Lrs'GMYnlMpu;"Ut/;rX8o9/51rDqu6Y0qb6u?qZ$[K]Yj`k!Q3(W_#Uk?_$.3HBP<[I +rNuR)rNlRIl2Z>~> +n,O^bD/k`]XfX0lb,oZ'MmH.^Za0W8!!!0SZa0W8"\uC^!)Bk;rWW>.rrrG/rriR$Z]YJ!$LJ>m +''g=f)[.?'()@knlMpu<"V1;?rXK&qZ$[K_:/D*!Ro0f]E#57]EPR~> +n,ajfOK?b"f%*KUo[^+FZ0uZ_n*^<.!WjlFn*^<..rk$_!cd[jr[\$;s""- +nGiOmr;[?3X/g&QX)'=<9Iq^uZ*=<."WdXpZ)[j."]2I]!)0Y6!!NP2Ylt<9aTViAZ&o1r$1//j +&Ejh`)$;)p$jGqs!X/l=rX]&Dq%3N6rs8m=anEjVb%U`I# +rP8ZETkKaW[/-j%ZiJ86!.Y~> +nGiOmr;[?3XfZGWX_fXA:+\%$Za0Z2"WdXqZ`O32"];Ua!)Bk;!!NP4ZNUN=aoqrDZ]YJ!$LJ>m +''L+d)Zq>u%L).u!X/o@rXo2Hq%EZ:rsAs9b0S61a_1QFs$?lX91pfe"o\K%/H3`ne&g(fqn2s6 +rO`<=SS)T"Z21BsYlMo2!.Y~> +nH&\@r;mK[f%,qEerWNtED&qTn*^>W.inabn(%Oj.uj#&!cd[j!\5eimjfpWoIDG3n'3FV9C6Na +Ms.+paTKnJCFe]P!\6oZregcTq2>5fs% +o)Jjr!%\ +o)Jjr!%eBR!"]MZ/^"+9s(D4%s$H`Y$plKr!!"R7Z,tJ:Z.&T_s0;R9 +s02]tB4mI6qPX:s!/p+BJ,~> +o)]"E!_Y'C!Y?m-mr=H?YlZEW!\4?EmjeJ=.iV.MoE$NnNUO,&9CL:Z.nfO'.kC)\.k?VJc7Ale +mVD9Lkc!@["K8A\D(FoRs!n(BrbM4crbMO,"SD`ds(D4(s#U0T$qN!'!Wk!=WlMThWjhl4s/Q(* +s/H3gB4dC.qN1ZU!3tejJ,~> +nGkC^X,:_0OfO?C/?uHrBM=:W!,S^:CgDol"fnnE:eXQfM?O0@Z#=H@Z"sRIZ*=H9:pH,drX&!$ +m1ALrlP]R=q\0,Y02S5)!!ZaK"WRgT%/1;=$kNgR"U-H7ane[27fH'_4%r?H/-S_Sb/:U/q6^.; +s0Mp&BUG'lqQ'V&!Qo6D!.Y~> +nGkC_Xc%%5P-'WG/[Md#B24@[!,\j?D.&8s"g,+J;,0lmMZj9BZZ0iFZY]jLZa0f=;6uDhrX/'' +m1SY!lPo^Dq\B8[0N"Y2!!ZsW"X+3[%egSB%MB6Y"U-K9b"hh,!(Hl[$pmT[/1iD(9 +nH(P/f!12B5t1r!g)!aOH-Sc/(X0NNH&t,Yq%?0n#VVrmuT%Mn*_bWNUP.Cr_)Zp +m>L5-lcK%5qksUtD2kdb!X<'_.nE<+C\N_nCPut$.k=8toPsb'!'L6U$qO,g/k[fL:9)@DWlOq8 +rj;^*"IEb4PcFSAri-">OQlmt~> +nGibECrrs(X%`Km(BnWUX3$5M!!Q'$Z,r+Z"Y>e@a\Y[9MZ*bZDuR!ODZp:NZ*=H9:pGBS"Uk_)% +."Pi'^ch?)\a7i'EB*O'EoEi-#[TNl2Uu=ChR_n$1SH'#m(8]/Gi*O4$>Ye9KP +nGibFD9B3-X\Siq(BnZXXicPR!!Q-(Zc\F_"YGnDb#(p?MuEk[EW39SE646FQ67kMT/~> +nH&nfOSeoCZj(FtTuf(?4?!\89Zn+=mu.ne1VoSmkZZ2Q6RXT%YuX=Geon*_bWNUP%`.r.fF +C[?uDW:%b/e>UmqVuY?HW!0Z/X/qC8l2h,AOCtXf9CZfs9*-V:9D_Hp830:4:.RoK81lNZa2b3h +q5OJ&a8W(AQY2PI\,DEeWWSKj`/s6cJ,~> +n,NRp!!!0+quH[!rW)g!!!)Zq!"&N+rsA]/#71P;#mCVD$1//f&Esnq)%IT")&jG-'I+h:,uH2s +47Z)F48qnZ4"NHT/1aHu$2tA4&H<.=&GHV5#luSBr_3>Cr_*_O9KP +n,NRp!!!0+quH[!rW)g!!!)Zq!"/T,rsJc0#7:V<$3^bH$LJ>i''U1u)\*u+)^$(8(*k.@,uH5t +6N0XX:A7E]6N0U`67kMj/1jU#$N:P7')rFA'))n9$3;_Ar_*8Cr_!YN90trs67a[Paj\)Tp9=hN +Z'8mcPb%cX!1a"P!F5ln!.Y~> +n,`_C!Wjl&quZgIrW;sI!!;gD!)*2>s%EAB#>6Qt9.NYN9C6N]Ms72,aUZh!ajeG2W6iniX0,)G +8H)BaEVE6.8H)?i84uKE/k^179E&`+MuRPmMt_#d9)qT`:B*ud:(/aM84ZBE/hWC/\$id>WWor4 +P\65FQi3oaU&C2VCFeWNJ,~> +irJ0E!=8r'$1&)d&Esnk)%I>u,qK?B/-RR."UQ+O)tX:8)[-EE)[%\q#mh%8&H<1:&H3+;#llOU +9ER@-4&#Q6s""29b5T +irJ0E!=B#($LA8g''U1o)\*W&,qTHI/-RR."UZCV+nPp>+U&&K+Ts>"$47:<')rI>')iC?$3r.X +91qT'6;.5Cs""28ao9cbZ2_K:Ym.k*/5'W?Pl>:s:-C3-!!!2f!.Y~> +ir\ +lN$nfqZ-$f!"&W.nd4Ril4E+mn/29A+;t.m%N?].&.fs,$m?#f&.fs)p^m91!$M1Jp^dQ:&.AsY +q@*9.rriNV9M?ugr&ap0!1!Q$pTtLJ_of@)U6UV$MNpj=!!N?+joBo~> +lN$nfqZ-$f!"/]/nd=Xll4W7qn/DEE*?4tn%Nm&5&eZ0(%NGrg&eZ0-p_*E5!$(nHp_!]>&e5Ba +q@ +lN7&9qZ?19!)*;Ank87`lAOi(nAta1e]Ifh%_&L;Mi3IMCO0c3Mi3IPpl"ua!/g\ipko8jMed*d +qJ6"%s!n4F:/4GTr(-i?!0mJlpSne3\&YMeTp2gHZ'8!6!\4=&joU&~> +k5YMd!:9si$3(2+#lk/.#mh"H#n.+K#mh"Hm0r7kk7mJ)!$hFV!?3?`&H=<]&H!!!0&"T\N*kl?5~> +k5YMd!:9si$NC;,$318/$4.1L$4[CQ$477Mm1/Cok8*V-!$qLY!?`]e')sQ`')rsO/H?di&c`F7 +')rIA*!$Zlr=8i?q$mH5%M&4?qum'Pq*P*4"/F>]e+g3Je,QZ^]ZJLBXctC@!!!0&"T\N*kl?5~> +k5kZ7!pqN<9E-O>9)pLA9*oB,95@1991s%nm;)!FkG[sn!7:\C!Oo-.MuSe:MuS\7N<"k8MZ@Pc +MuRSmM?/WmrG2Fkq.g%)CMWZ;r$qb?q+1N<".-L*\+m!'\,WH;[)_t6es&fX!WjkR.g#]#klQA~> +klBlMm0W(el4E"jp)+GV&1h]-$lfZq0+9L1)_=ZV$2uLT*<$-@*"U[/Zg)_6fJ@/-Q"Rp''^]J,~> +klBlMm0`.hl4W.np)=SZ&hS#3%Nu<*0Ffd6+Y?Ga$N;XV+oVZD+o_`F+TM]F+Ti&T$3gDP!X/oS +rWNNM"X+%9:+\'s/GLds+oVWR/5&W&67kMT/>pt%e+^-ISHlg4P\2QO!!)]rl2Z>~> +klU#um7Zb\lAO`%p;mlEMiI1@CN+'.D/4!J.SFc$rCd,\r[[t=%4WkY.S)$>.Omt^.n_Dl.KV+n +.fLq'.Ouu!89%9qr\!t=!(d)>$nb:M84ZBE/hW6pWjh`&s-EttWg%-h.foeG/*[1d~> +joFTKmKr1fl4Dngq\fDJ3XdQ5s09[>X.Z9r#6Oo#qQ62X)(Ie/-Q=`"URjr/5.SpBXGUn_8H8gs0Vc_!NU&+"m>r:~> +joFTKmL&7il4W%kq]#PN3Y!`:s0KjCXe]UPB?@Dkb*;qJPd/2caXkPrPf52rPf^1gXg%jX"TSNR +!%]l*/-%4$!%\+$+Y78=q]Qga/Hm`.D,-!@"UYD:$;O5G9.U'UZ+SPue,I#[Z2TX^X_mP2kQ$,~> +joX`smRuk]lAOW"qoSl:3bqB.s6oT"f!&fZB?.#boT]BrPcDp3a"GDsPfk]OPfKf/euAdE.foc) +!\OHS/cmX,!\OO,.P>@Hr$iUU91pd.erXmV9.NXc.nakW927)@B<&>J[($%As/Q('!S3A%/*I%b~> +j8eHKmKr1fl4Dngr#,MK$4naSX8i4Bkii&hp\tB=s7ZK8rr3;N/H +j8eHKmL&7il4W%kr#>YO$5+pRXoJFCmdC+sp\tB +j9"TsmRuk]lAOW"r5nu;$B'mYf)Pcje^a]?p\tB:s7lW7rr3<#0)ruloZ,"P0)bne/cl#*)_M0n +/c[@R!\Q),/h6uQ.P(Kk+=dLgP];f1C.g'-9.MMc85:ci:1n.F[uc]9B5;:EZ#T7`joU&~> +j8eHKm0W+fl4Dkfru(bL!YCYKqYpQ&rr<#?$-LB4ai_cJb0'b`aqD)-X3&N1afGFm/8S!hBM<)5 +,5Nhj"oKnO"oJ],"oh6r>lICt>tk5(&HrIE/53+e[$?oDQ'J)/BM9uF"m,f8~> +j8eHKm0`1il4W"jru:nP!YT/uqYpQ#rr<#@$-C?3b/qcJaiXS^aV(lQXiec[b,t[q/8\$cB1ll1 +*Vq;e"oKnO"oJ`-"U@[q?qX6i?r$\.&HrLF/P`FiZ':K?Pa%]&B21#G"m,f8~> +j9"Tsm7Ze]lAOT!s2k5Y]9YNcG%k&M$L)96&P'Wg&`ZPa%l+B5oQl/*6n`~> +j8eHKm0W%dl4D_b!t[+:"oBhN"oKnS9Iq_g/H.p6/-&B9/H8EB/-8Kr5lE569`-FA"o\f2$jd4D +"o83!"o8Q*"U9kaaiXR`@d+'Y!.Y~> +j8eHKm0`+gl4Vkf!tm:>"oBhN"o^%W/M'OG/5%Pn4oQu49DpF?/c@4,/PA_f/1iDG/3Wq`!)*8B +!A"ER$3UhG$3^V0!!!3!$NC86MuUrBs/fSk"m,f8~> +j9"Tsm7Z_[lAOGr",h"h/,Lq!/,h.*9.isl/l"%u9)^FC:AlgD9DpIL92857/k[fl/kZ(8!)EJc +!A5o%9*B$'9.MOh!WXbI9E-LHZ2aIgs41uM/*6n`~> +j8eHKm0W%dkn)Yb!>#S//H5ka/-Q1W!%\+$/-#Z$!!NNWrWN?'/1gc#!!Vlm!A"QU%0$V6"o83# +"UPA/#mCK+af>RFr<30-m02VPJ,~> +j8eHKm0`+gkn;ef!YPhloIU"G%kIkf!!"PM/1^c$/-#hW/H,eS!%]]#!!!2m!!+VXr=8i7!!W3! +!X/o7q?dB0: +j9"Tsm7Z_[l&4Ar!fK]EoIg.o%k]@_!WjtU/hR2,/cmOR0)d@&!\Q,)!WXb@!WaoHrG2F+!%[mI +!\6noqF^uBEV.g4!rXVL9C47l!e:~> +j8eHKlj;qckn)_d!>$:I/-$Xe/-,nSr<33%/H#PN"Y9WWrW!!'!#t2'!?2@D%0$Y6"o85n$0)3O +!.Y~> +j8eHKljE"fkn;kh!YQY.qCDUir%%jP! +j9"Tslq?VZl&4Gt!fN%2qCVatr%8"#!rXVM!\XEQ""Pu*/,fSO.fq3u!WrE(!W_fn!@gb@C]@'- +/,B>A9B.Pb!e:~> +j8eEJm0W%dkn)_d"V;Y))[-ED)uTs.)ZTm:)uTp@)_CO`s""0S$2b5/$3(2#$3(2+$17uY!.Y~> +j8eEJm0`+gkn;kh"VMt1+U&&J+oMT4+TO:r+oMQF+Y<0fs""0S$N(D2$NC;$$NC;,$LS)Z!.Y~> +j9"Qrm7Z_[l&4Gt"cI=m.P!%J.fCmc.KBJI.fCju.PC9Bs"4=&9DiT&9E-O69E-O>9C==l!e:~> +j8eEJm0W%dkRcYdrt#2a*<$6E*9mk-"T\o5oa1O"s"+*PrsAW4q[*9+lNut_jT'f~> +j8eEJm0`+gkRuehrt5>d+oVfK+mKF3"T\r6oa:U#s"40QrsJ]7q[3?,lO*%`jT'f~> +j9"Qrm7Z_[k_nAts,-np8H)6^8ErkF.fi9noh535s%E;@s%E<+qb-r>lV$XrjT9r~> +j8eEJlNukckRc2Wkn*+grX&K2jU(;XjT'f~> +j8eEJlO)qfkRu>[kn<7krX/Q5jU1AYjT'f~> +j9"QrlV$PZk_mogl&4hBr_*0)j\+tkjT9r~> +j8eEJl3Zecjq-;^ck-'_rsAT3rX&T5m0W%]jT'f~> +j8eEJl3ckfjq?Gbck?3crsJZ6rX/Z8m0`+^jT'f~> +j9"Qrl:^JZk)8#nd#7d:s%E9*r_*9,m7Z^pjT9r~> +j8eEJl3Zecjq-A`cOfp]rsAW4r<`K4mKr+]jT'f~> +j8eEJl3ckfjq?MdcP$'arsJ]7r +j9"Qrl:^JZk)8)pc\qX8s%E<+rCd0+mRudpjT9r~> +j8eBIlNukcjq,TJmh"amlNmRq$0_WT!.Y~> +j8eBIlO)qfjq>`Nmh4mqlO!Xr$L%`U!.Y~> +j9"NqlV$PZk)7 +iW/0Gl3Zbbjq,rTkRd%glNubYirFT~> +iW/0Gl3chejq?)XkS!1klO)hZirFT~> +iWA +i;i$Elj;nbk7H5Zit1Sdl3Z\YiW+K~> +i;i$EljDtek7ZA^itC_hl3cbZiW+K~> +i<&0mlq?SYkDRrjj,<;?l:^@liW=W~> +i;i$Elj;nbk7H8[it1Pcl3Z\YiW+K~> +i;i$EljDtek7ZD_itC\gl3cbZiW+K~> +i<&0mlq?SYkDRukj,<8>l:^@liW=W~> +i;i$Elj;kajUg5^iXkDal3Z\YiW+K~> +i;i$EljDqdjV$AbiY(Pel3cbZiW+K~> +i<&0mlq?PXjbqrnif!, +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/slides/users/figures/icchome.eps b/executable_names/doc/slides/users/figures/icchome.eps new file mode 100644 index 0000000000000000000000000000000000000000..6e577dff35ee30da35bda7e0cae55a88969d16ba --- /dev/null +++ b/executable_names/doc/slides/users/figures/icchome.eps @@ -0,0 +1,164 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /tmp/icchome.eps +%%CreationDate: Fri Apr 4 15:15:14 2003 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 54 57 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 42.000000 translate +39.000000 -42.000000 scale +% Image geometry +39 42 8 +% Transformation matrix +[ 39 0 0 42 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 39 string def +/gstr 39 string def +/bstr 39 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 4265 ASCII Bytes +colorimage +g,OT~> +g(Ai~> +g(f,~> +n2LNk?(^9J3.L~> +n.>c[UpfUX&V'~> +n.c&mgW&^N'n?~> +n2LQlKKa+Dn2Pp~> +n.>ft_i03$n.C0~> +n.c*+l-#Lfn.gH~> +ml1L8aFlBaaRV<@~> +mh#a!hnsAahsqA0~> +mhH$)mHL41mID!B~> +m5P9jTft<*l1?rc~> +m1BNrg5KsYq=G8L~> +m1fg)ouirHrU^hT~> +lSo$gKJ[E*of.I~> +lOa9o_f(.moau]~> +lP0R&l(4=3obDu~> +l8SpfTepKGp,IR~> +l4F0ng2DT/p(;f~> +l4jI%oq%T?p(`)~> +kr8geTft +kn+'mg5Kt9pCVo~> +knO@$ouirqpD&2~> +kVr_0TkQ@)pc*d~> +kRdsng4F8#p^r#~> +kS47!opME=p_A;~> +k;WV,TfuiGq)Em~> +k7Ij_g5KG*q%8,~> +k7n-gougt9q%\D~> +n2LRFlJ((2rS%J?i1Xk!q)Em~> +n.>fX]:>C=rL=#&f@kh.q%8,~> +n.c)]^S%6MrLa;.f_(Z#q%\D~> +oJd!=gV_+Dpl#?4T?&j]qDa!~> +oFV5 +oG%MDTR^]Fpa$&1`rDWtqA"M~> +pG`NSgW7IIN)_hsQb~> +pCRbeS7?%r+?U5J4?WOLs#^Hmhqqh,fDH52~> +pD"%jTP/".,s`7\5sbE\s$6g#mHnMQf_cJ7~> +q)A`UgW6s_N&XgET>^]jr]'r?#N3\fT/]igi;P]d~> +q%3tgS7=oM+;$_DQ+R"\rXo1r#M7l/[LkWLfDZA4~> +q%X7lTP-e^,o&^XR(rUgrY>J%#MAGB`YCdif_uV9~> +qD\cGaL\sA3)uU/o/I$?aD!V6M;(!LJ,~> +q@O"F@m`U+&Nl?1o+;9(pOWu>5+E2sJ,~> +q@s:NBLYH;'g\5>o+_Q0s-XTf6_G//J,~> +q`"i8]"3_X +q[j('6UO$L4I,7&&c_Y2haE`p5._DW~> +q\9@/7Rf`[6(%-2('"4:m9l +r&=o8]"3h[?f:?3#O0=%?T?!^3.L~> +r"0.'6UMt.@+XfY#Pn,&?kL$&&V'~> +r"TF/7Re[=B%ZMd#Q=\BAei)5'n?~> +rAXu8]"3h[`9]Gdl,^qQTDgg#~> +r=K4'6UMt.]Bg+4q=icS[f-kh~> +r=oL/7Re[=^[)[ +r\t)H]"3h[i9E9(l,[RGr]#E~> +rXf=G6UMt.fBNqMq=fJKrXjY~> +rY5UO7Re[=f]j1RrVr9trY9q~> +s#:>ZaL\rBT/bSj`9fMgk/`3-`&K`,~> +rt,Rl@m`Tq[Lo$A]Bp17lhA:b]+GX*~> +rtPjqBLYH+`YG._^[2a?n,MW[^D.K6~> +s#:A?]"2Ng39lG^PrSU6pc&QEaP3E0BqI@EJ,~> +rt,U.6UM-2&\B.tAeFjnp^meDA";9IJs?o[J,~> +rtPm67RdcR'u)%0C_cd$p_=(LBV>%uR@"^(J,~> +$TRml\qsGF3&mP&i9rW2\n@;HaB`083.L~> +$PD,\6U!Wa&J::nfC':W6O7;9pS;3_&V'~> +$PhGd7RKJo'c!+'f^BO\7LO%Is4_/S'n?~> +"ZYeY\nAtG3!dE7`9*bH/]9W!~> +"VJ@66O: +"VndA7LQuq'aT +#roi6\i?j/Y>"Q~> +#n_PP6P6a=&_jqb&I:`9lg)IB7$S@7~> +#o.t[7MWoX(#6Rk'aR8Dn*fN6@$h[Z~> +(HBLI\lCTFlFMqm3&pZM]#`eh39nT+lM`dCgBkc1M)aanKJ[C&J,~> +(D1.E6Tf;=]0d^Q&J +(DUUQ7R +-90)X\nNuXgPh*L3&o!VM)[K4N+Y+_PrLasKKa*0J,~> +-4s`T6\95pS0/s+&J8Lq+:,RkS3nD)4qSBS+:&PbAe>X/_i00ZJ,~> +-5C2`7[]j>THto:'btC.,n%I&TLL486PU>d,mtFqC_[]Xl-#J0J,~> +-90)f]#97Y?Y<@u367'DgQab`N5Oq;`&O$@gV[Z:T/\g(>s;s^J,~> +-4s`t6bC6S?jJk,&RurqS7WAF+FLdb]+JWtS9tSJPn=V^Ul9m;J,~> +-5C3-7_e2ZAd^m>'keo.TPP@X-%N`t^D1Q2TR[CXQk^A/gWQ!"J,~> +-9/oaaM^&D?3BAbc-388)`38f`Tl8Ubs?!V/(J,~> +-4tW8A%N>K4:#O2]*N!\lOa^r#hK[?&Y',S&_A-;]+GY/UniSSJ,~> +-5D&EBYP;:5mqKD^C+immhHR,$eQ3H'qbqb("afI^D.LVgY8,2J,~> +%63XoaP/\qN&YN2aCh.E3!.iIs;s^J,~> +%2$3^A"4.g+;'2;@gJA!&H\I.4T5p'f,t@2&Y't+f+AVKUl9m;J,~> +%2HWkBV6+-,o)g_BFC4,'`t$962hT0fHgp?'qcj=fG,.ogWQ!"J,~> +*]Wo3_qR0/N&WE-M)^b[3;:='s;s^J,~> +*YI.SI%1f#+;%#R4qVB=&_h[=4P(/WHjC=r&UXk3rXf:NUl9m;J,~> +*YmI\J=mY0,o'h&6PXDP(#4 +s#;:AgY;JfB4j1UN+Y,]_r09^3/PPkgLk01gPfd1gYh4I>s;s^J,~> +rt-N(S=J?G#RD#1+:&QHI+Oko&O(TSS-TBfS0/)LSCd)EUl9m;J,~> +rtQf0TV1)T$O[\W,mtGWJCpM&'gmMdTF2,sTHst^T\/_tgWQ!"J,~> +s#;:BgZnOkaGH0=/SC$R_`6eDN/Y@B30fG]]"2O5_`5_C>r805J,~> +rt-NgS@dP-@m4LC6jOo&HkG[V+ +rtQfoTYK:7BL?U-?je8MJ/.Nh,pc%9'l50B7Rdb3J/.J+gRcD"J,~> +s#:&Rg]$sI3!JQ"1bEG"rAaiBrAai3$TR(^gGh0G5$^"`3.L~> +rt,:dSGq:C&I&!JDa]3/r=T(Ar=T("$PD! +rtPRiT`3aH'a=R#Sm[u=r>#@Ir>#@*$Ph +r\t"ugGns+3!=mu1gS2m2uq&!4p#H_3.L~> +rXf7ES.XNS&Hp"1Dku:\&HL_fMunV,&V'~> +rY5OMTG?8\'a3dET%iZ&'`dY#b6"+1'n?~> +rAXqPgGns%r\t(74u>*gk4CV6k$@sM!lR&XJ,~> +r=K0tS.XN1rXf=ON,NXClgtbil_ON=!kT$VJ,~> +r=oI&TG?8;rY5V$bFY +r&F_Krosga3&nub4u>HqaS.XpaBed/!2'6MJ,~> +r"8sorjrKk&J +r"]7!rkAcp'c$,jbFZnsmIq=rmG%W`!65!QJ,~> +q`#.ZaMZcel8UccKK_RV5$`j(rAXlCTnNA.!F=je3.L~> +q[jC)@sjf:]+GY@_i0OmN24AWr=K,,g;ElJ!Mo&\&V'~> +q\9[0BRlbK^D.LPl-%8AbM2:Mr=oD4p$)Fu!Sd)B'n?~> +qD\iIQ,q%agZgaXaBe^-r*B4a!JKV63.L~> +q@O(HAn,=uS@]@Fhk^1/r1s7L!Q47%&V'~> +q@s@PChRL4TYD3VmG%Q^r7h.m!U9(O'n?~> +pc&VQM2B +p^mju5!EIdI%7h'[\WeZ!.t0.!MnHH&V'~> +p_=.'6UPO#J=s[4`nUC6!1Ef/!Sd;E'n?~> +pG`64T9]A3!kQIarK[A="BB/AK]`+jJ,~> +pCRJYQ"KtY!^gHbrFZ$m"?_:3_s@.2J,~> +pD!b^Qu)^g!_-imrG;I#"@8I1l0nH`J,~> +oJcrkT:]irPlejg_u>o&T>]me3.L~> +oFV2;Q'Ht"Acd?lI/[^ZQ+QAW&V'~> +oG%JCR$a +g,OT~> +g(Ai~> +g(f,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/slides/users/figures/linux_llnl.eps b/executable_names/doc/slides/users/figures/linux_llnl.eps new file mode 100644 index 0000000000000000000000000000000000000000..5b0907d12cdd37c31a339c2fabf42d80267c2263 --- /dev/null +++ b/executable_names/doc/slides/users/figures/linux_llnl.eps @@ -0,0 +1,2137 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (linux_llnl.eps) +%%CreationDate: (Fri Apr 4 09:42:16 2003) +%%BoundingBox: 0 0 288 216 +%%HiResBoundingBox: 0 0 288 216 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 1 +%%EndComments + +%%BeginDefaults +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Times-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 288 216 +userdict begin +DisplayImage +0 0 +288 216 +12.000000 +288 216 +1 +0 +0 +128 +252424 +040304 +F5BD0C +FDFDFB +3D546A +B29762 +B88209 +848383 +E5E5E5 +797979 +626262 +C6C6C6 +6B4709 +464646 +555555 +DADADA +AB7508 +3A3A3A +EBB20C +979696 +FEFEFC +1C1B1B +E3AA0A +F3DB97 +BAB9B7 +DBA209 +D59809 +F3F3F3 +A7A5A3 +182530 +141313 +2A3846 +F5C60C +9B6806 +C48A08 +425B72 +374B5E +C4A760 +F7D913 +B2A483 +5682AA +2A4054 +CB9309 +2B2C2E +EBC30B +507698 +513808 +4A6D8C +1E1E1E +4F789D +C2B28A +FAFAF9 +F3D62C +855906 +956D27 +FFFFFE +332306 +92805F +D8A72A +F7D50E +BAB2A3 +1F2E3B +436585 +9E9D9B +BE933A +E7AF0D +7C6540 +F5D845 +F7F7F6 +EFB60D +FCFCFA +BE8C1E +547DA1 +425F7B +9D9382 +2D3339 +0E0D0D +34414C +F5CD0C +201605 +A6823B +121C24 +AEAEAD +F3BA0D +DFAC1C +DBB539 +171616 +ECECEB +EDCB0F +0C1218 +F1D019 +BEBEBD +F8EED7 +343434 +8B8B8B +E4DCCD +212831 +090909 +6B6B6B +161515 +F8C00C +181717 +111010 +486A8A +212121 +1A1919 +496E91 +496985 +292929 +272727 +4D6F8F +303030 +776C5A +727272 +74716B +C2C1C1 +FEFEFE +F0F0F0 +CECFCE +F0B803 +EABB0B +6D5B3B +486784 +456787 +919191 +5B8AB5 +262626 +000000 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F010101016161616161 +616161616161616161010101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016161616161616101010101010101 +016161010101010101016161016161616161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161616101010101014C4C1E6369151530303030 +6868686830303030306969631E4C610101610101616161017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016161010161616166631568680000007E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E000000686815636661616101016161017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F0101610101614C661E69687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68156366616101016101017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F6161010161666315687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E681556666101016161017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01610101016669307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30151E61010161 +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +0161610101661568007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068156601 +016161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161 +01614C6368007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068 +5661610161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01610161 +6615007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E001566610161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F010101616161616101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F616101611E30 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E3063610161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F01614C6656693030683015651E666101017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161016156687E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E6856610161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F0101616669006F11110D0D0D0D0D115D6C6865666101017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016156687E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E6863017F01617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F016166156C110D0E62710909090971620A0E0D116C151E61017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016163687E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E007E7E7E684C7F7F01617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +0161567E110E62075E620E0A0E690E0A0A7C5E09620E112B156661017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6101611E687E7E7E7E007E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E0015617F7F7F61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01 +4C696F0D0A07620D4C0101010101017F014C560D095E620E11006361017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C157E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E68634C017F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C +155D0E09075D0101010101010101010101010101011109070A0D2B694C017F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016165007E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E681E4C017F7F7F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016169 +6F0E09096101010101010101010101010101017F7F0101117C710E6F694C017F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01010166687E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E681E61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E2B +0D090D610101010101010101010101010101014C61017F016309090E6F6561017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61016169007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68301E +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D +62090101010101010101010101010101017F4C6C116D66017F010E090D2B1E617F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E306566017F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66017F7F617F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01566F0E +5E1E010101010101010101010101010101011E110A0A111E01016107710D684C017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F61010156007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E694C017F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E7E004C7F7F617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161680D09 +71010101010101010101010101010101017F630D09090E6C6601017E5E0A5D69617F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F610161307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E157F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E65017F017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0E5E +00010101010101010101010101010101017F690D620A116F30617F010D070E6C66017F7F +7F7F7F7F7F7F7F7F7F7F7F7F610166687E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E15017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E30617F01017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F616911620E +01010101010101010101010101010101010169110D6F3056660101016107621169617F7F +7F7F7F7F7F7F7F7F7F7F0161011E007E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E007E7E684C7F7F617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61680D0711 +01010101010101010101010101010101010166301E617F7F010101010111070D7E4C017F +7F7F7F7F7F7F7F7F7F010101697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E4C7F7F617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E5E69 +0101010101010101010101010101010101010161017F0101010101010101090A5D63017F +7F7F7F7F7F7F7F7F610161157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E001E017F7F7F617F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0A134C +0101010101010101010101010101010101017F7F0101010101010101010162710D15617F +7F7F7F7F7F7F7F617F61307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E1E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E65617F7F7F7F7F7F617F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F015611620901 +0101017F7F7F7F010101010101010101010101017F7F010101010101010111070D004C7F +7F7F7F7F7F7F617F7F157E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E007E7E7E15617F7F7F7F7F7F7F7F7F017F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016911710E01 +010101616166617F0101010101010101017F014C30697F010101010101014C5E0E6F6601 +7F7F7F7F7F017F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E0015617F7F7F7F7F7F7F7F7F61017F017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01150D710A01 +0101610101156D667F0101010101017F7F01617F1E117E7F01010101010161070A5D6301 +7F7F7F7F017F7F4C30687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E69617F7F7F7F7F7F7F7F014C300030617F01 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61150D090A01 +017F01682B66666F4C7F010101017F65116207626C015D1E7F0101010101010E71116901 +7F7F7F617F7F7F7F7F01666515007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F01687E7E7E7E00694C7F7F7F7F7F7F7F7F014C687E7E7E7E30017F +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A01 +7F010D3F185E000156010101017F00717C3F520B5B0D7F1E017F01010101010A710D1561 +7F7F617F7F7F7F7F7F7F7F7F7F614C63687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F01157E7E7E0063617F7F7F7F7F7F7F7F011E687E7E7E7E7E7E7E3001 +7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A01 +7F6C7C1876735E6C7F0101017F1571520B0F0F0F0B5E697F010101010101010A090D3061 +7F617F7F4C617F7F7F7F7F7F7F7F7F7F01614C6568007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F01307E00304C017F7F7F7F7F7F7F7F4C56687E7E7E7E7E7E7E7E7E7E30 +017F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A7F +7F0E7357441B085E7F7F017F7F0A0B1B371B0F461B0B0A7F7F01010101010111070D6861 +010161157E6815694C017F7F7F7F7F7F7F7F7F7F01614C6568007E7E7E7E7E7E7E7E007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F0169006561017F7F7F7F7F7F7F011E307E7E7E00007E7E7E7E7E7E7E7E7E +30017F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A7F +011C373F090F3708637F017F7F134637761169621B3776697F01010101010111070D004C +0161307E7E7E7E7E7E006815666101017F7F7F7F7F7F7F7F7F014C6515687E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E00007E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F6166017F7F7F7F7F7F7F014C15007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E697F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01150D710A7F +650F187F5D0E76370D7F4C61011C3733117F110A0937370D7F01010101010111070E0066 +01157E7E7E7E7E7E7E7E7E7E7E7E0068654C61017F7F7F7F7F7F7F7F7F014C1E6515007E +7E7E7E7E7E7E7E7E68651E4C66007E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F01611E687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E637F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016911710A7F +68080E7F110E07370A016D2B631C37187F7F1E0A5D76370A7F01010101010111070D2B4C +697E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E00301E664C017F7F7F7F7F7F7F7F7F614C +6665300068151E4C017F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E00667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F014C63687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E +7E7E30017F01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01651162097F +68765D7F4C0D0E1B0D7F014C617137077F0161614C1C37717F010101010101115E0E7E15 +7E7E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6815691E4C017F7F7F7F7F7F +7F7F0161017F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F615615687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E30017F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E5D0A3F61 +690F0E7F01010D3C2E3535350C110F137F7F7F7F7F1837627F010101010101115E0E6C6C +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068151E017F7F +7F7F7F7F7F7F7F7F7F7F7F6115153068007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F0161666930007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +30017F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E5D0A134C +01180B617F7F0C47162C78412A223A321E7F7F7F0D46370E7F010101010101115E0E116F +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E0030691E61017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01614C6663151530680000007E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F6130007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E30 +017F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F666F0A7C4C +7F0937716635222A45787816062A2C78102E4C4B0F370F687F010101010101685E0A0D6F +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68155666617F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F014C4C6161017F7F7F7F7F7F7F7F010161614C6656656565153030 +303030303030303030306569617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1501 +7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F666F0E7C4C +7F11575F1022164545782C585A34345A3B201A255F57627F7F0101010101014C13710D5D +6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0065664C017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F657E7E7E00301569561E664C616101017F7F7F7F7F7F7F7F016161 +616161616161616161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +307E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F +7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F662B0E5E4C +7F6139472219124578782C5A34344334263B4E2C413A35617F0101010101014C1C090E5D +6C7E7E7E7E7E7E7E7E7E7E7E7E7E7E30564C61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E00006868155665561E1E69696969 +56636363636363636515617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0130 +7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E681E017F7F +7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C2B0E5E4C +7F4F21061A161245782C585A34434326263B2626265A020C7F0101010101014C52070E11 +6C7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01157E +7E007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00304C017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E5E68 +61350622194145452C2C585A434334262626263B195420357F7F0101010101010A070D5D +0030687E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F667E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F657E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E003063017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E5E5D +4F10061A161245782C585A4343343B2626267822062A162E7F01010101010101117C0E2B +6601014C666315687E7E7E7E7E00017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F637E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E301E617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617E0E5E5D +4F212219164553782C583443263B2626582A062A1919192E7F01017F7F7F010101076211 +65017F7F7F7F7F0161665669681E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00151E617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61000E0711 +7F38352A4553782C585A5A262626581906061A19191A064F7F7F660D307F7F0101095E0E +7E4C017F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E007E15017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E +007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00654C617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F1E667F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617E0E5E11 +7F4C0C352245205A34343B582C2A2121221A191A2A4739597F7F4C62090D1E7F01111C09 +0D6F301E4C617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E007E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E007E007E +7E7E7E7E7E7E7E7E7E7E7E0068156661017F7F7F7F7F7F7F0166667F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F1E7E00617F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E7C11 +7F6107503521062A470606061010062A1A2A224032180B0E7F7F7F11075E0E617F01095E +0A0D6F6C7E683030156361017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E00007E +7E7E7E7E7E7E7E0030691E61017F7F7F7F7F7F7F7F611E156830017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F657E007E3061617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0A3F11 +7F691818502121222A2A222A2A2A2A2A22060573760B0B077F7F7F4C0A5E09117F016F3F +090E112B6D7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F017E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E7E7E7E +7E7E683015564C017F7F7F7F7F7F7F7F61616669007E7E7E30017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F01697E7E7E7E7E1E01617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F611511621C68 +7F0052733C36210619191A2A2A220606403C5B180B7676186C7F017F2B090E667F01010A +7C0A0D6F6C7E7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01661E63656800007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E157F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E0068651E +664C017F7F7F7F7F7F7F7F01614C6669007E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F657E7E7E7E7E7E6861617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01666C0E070701 +7F3052735B3C50212110101021211005185B1876081B3357097F7F7F011E667F0101016D +1C090E112B6D7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F010161614C6656651530680000007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6615664C616101017F7F +7F7F7F7F7F7F01614C1E56687E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F01157E7E7E7E7E7E7E7E6501617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01613011625E4C01 +7F157376735B5B273936363650273C5B185B0F1B373737370F007F017F7F7F0101010101 +0913620D5D6C6D7E7E7E307F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F616101017F7F7F7F7F7F7F7F7F7F7F7F0101616161614C4C661E661E691515156930 +0000617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F +01614C63691530007E7E7E7E7E7E7E7E007E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01307E7E7E7E7E7E7E7E7E0061017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61566F0E5E0A0101 +7F0A44080B5B5B7373183C3C5B735B5B0B7657373714143737137F7F0101010101010101 +637C070E116F6C7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F4C7E000000686815651E4C4C61010101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101016161661E693068 +00007E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F01307E7E7E7E7E00007E7E7E7E6501617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6C0D09074C017F +650F37440F5B5B5B5B5B5B735B18737608754637141414143733117F010101010101017F +610A3F710E112B6D7E00017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +01687E7E7E7E7E7E7E7E7E7E7E00006868683015156563634C6161616101614C01010101 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C151568686800007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F01157E7E7E00156661667E7E7E7E684C017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D62136869617F +093737371B0B185B5B5B5B5B180B0F57330337141414141437373F7F7F01010101010101 +0101715E0A0D5D6C6D157F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00007E30 +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E007E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +61307E7E151E617F7F7F1E7E7E7E7E7E6901617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C15110A5E1101617F11 +08371437030873185B18185B76081B0314371414141414141437756D7F01010101010101 +01016F1C070E0D6F6C667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01 +007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E004C +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +683066617F7F7F7F7F7F697E7E7E7E7E684C617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161656F0E5E7101017F7F52 +37141414143308760B0B760F1B03141437141414141414141437370A7F01010101010101 +0101010A3F710E112B617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F65 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +617F7F7F7F7F7F7F011E007E7E7E7E7E7E5601017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161632B0E090A0101017F0D44 +371414141437374408574446371414141414141414141414141437527F7F010101010101 +010101010713620E6F61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6100 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E157F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F011E30687E7E7E7E7E7E7E7E6801017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01667E0D715E1501017F4C7337 +14141414141414033303373714141414141414141414141414143757007F010101010101 +0101010161077C62115661017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F657E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E007E7E00617F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F01614C30007E7E7E7E7E7E7E7E7E7E7E7E617F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C68116213000101017F0E1B03 +37141414141414141414141414141414141414141414141414371437627F010101010101 +0101010101307C070D6C1E617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E4C7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161 +1E30007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161695D0A7C110101017F615E1B46 +37141414141437374646371414141414141414141414143714334437137F7F0101010101 +0101010101014C07620D0066017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F307E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E567F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F616656007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00017F017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E2B0E070D010101017F691C0833 +03371414141433331B1B33141414141414373737371446441B08081B5261010101010101 +0101010101010168070A111561017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E30017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C30007E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D717101010101017F111C0B08 +1B444646334475080808577544333333334475570808080F0F76760F0B157F01017F7F01 +010101010101017F0A070E2B1E017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F65306868 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E00683030691E61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E687F017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01636F0E7C68010101017F010E1C1C73 +0F081B46333344080F08754403030303331B08760B735B737373730B081C617F0101017F +01010101010101017F0E710D3061017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101 +614C661E5669151530000000007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00686830 +65631E4C61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D096201010101017F610A52180F +081B33141437377508333737141414141446441B080F760B0B735B5B0B44077F7F661168 +7F7F010101010101017E5E0E6F1E017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F0101614C4C1E6356656969153015306800007E7E15017F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E681530156965561E664C6101017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01662B0E076601017F7F01011E070B081B +463703034614141B75141403144603030346373737034457080F0B735B0F1B0E7F7F566F +6C4C7F0101010101010107710D30617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61664C610101 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F010101616161614C017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F014C4C4C4C4C616161017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F016166017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E007E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016911620901017F66637F010E76574614 +0303031414031433440303030314030303030346031414371433570F0B73080F637F7F01 +305D567F0101010101015D5E0E2B66017F7F7F7F7F7F7F7F7F7F7F7F7F7F307E7E006868 +306956631E664C61610101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101614C +661E656515007E69017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E00007E7E00667F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61680D090A017F1E114C7F697344030314 +03031403140346461414464603031414034646140303030303031444080B0B1B5E7F7F7F +7F5611017F01010101010109621169617F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E +7E7E7E7E7E7E7E7E006830303015156965654C614C61010101017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01010101614C614C56651515153030687E7E +7E7E7E7E7E7E69017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01662B0E7C11017F6D697F7F0E3703031446 +4646034603030303030314140303034614030314030303030303463746570B76576D7F01 +6101692B017F01010101010A070D004C017F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00000068017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F016530000000000000000000007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E69017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E007E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F015611625E017F4C6F017F1E733714034614 +030314460314460314031403140314030303461414030314031403033703087675627F61 +307E636F697F0101010101667C0A5D1E017F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F01157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E007E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61680D090A017F117E7F7F07371446034603 +034603144603141446030303141403031414144646031403144646030303377533730161 +6F0D2B662B017F01010101010A710D30617F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E657F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E1563687E007E7E68617F7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01662B0E7C5D7F4C5D017F6676371414030303 +141403031403464614031403464614030346034603034603144646030303033737030D61 +110D6C012B2B7F0101010101115E0E6C66017F7F7F7F7F7F7F7F7F4C7E007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F667E7E007E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E +7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +00694C617F7F307E007E68617F7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6169116213667F7E307F7F0A37141403030303 +031446031446444603463303140314030303140314031403461403030303141446370701 +683066016611017F0101010166130A5D56017F7F7F7F7F7F7F7F01307E007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E0030301E01 +017F7F7F7F61007E7E30017F7F7F7F7F7F7F7F7F7F7F4C017F017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C000D070A7F4C0D617F011837030314144603 +46141403143357440314460314460303140303460303141403140346031446034637527F +017F7F017F7E667F01010101010A090D30617F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F61687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E0030691E61017F7F7F +7F7F7F7F01657E7E30017F7F7F7F7F7F7F7F7F7F7F1E00617F017F7F7F7F7F7F7F7F7F7F +7F7F7F7F611D3D29292929293D1D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01635D0A7C1E7F307E7F7F117537030303140314 +14460346371B084646031403030303030314144603030303030303030314034614377661 +7F0101017F30687F01010101017E070E6D4C7F7F7F7F7F7F7F7F307E7E7E007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F307E7E7E7E007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E00 +617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E68156566617F7F7F7F7F7F7F7F +01614C69007E7E30017F7F7F7F7F7F7F7F7F7F7F567E7E4C7F617F7F7F7F7F7F7F7F7F7F +592949287D7D7D7D7D7D7D7D7D7D7D31041F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161680D097101012B617F61523703030346144646 +14030303147557031403140314031403464603030346031414141403461446460337571E +7F0101017F155D017F0101010161070A6F66017F7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E00151E664C017F7F7F7F7F7F7F7F7F616663 +307E7E7E7E7E15017F7F7F7F7F7F7F7F7F7F01657E7E7E697F017F7F7F7F7F7F7F7F1F3E +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D041D7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0A7C5D7F665D017F2B1B3714140314034614 +03034614035757461414030346460303030303031403140303460314034603031437446F +7F0101017F155D7F01010101010109621156017F7F7F7F7F7F24040404044D7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4D042429291F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C4C61017F7F7F7F7F7F7F7F7F0161666330007E7E +7E7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F01157E7E7E7E007F017F7F7F7F7F7F3D317D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D3E597F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D0907017F006C7F7F0A373703464646030303 +03464637460808460303031414031414034646464646334614144646031414460337370E +7F0101017F156C7F01010101010171710D69017F7F7F7F7F7F7B7D7D7D7D245615000000 +00007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E047D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F4C007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C6515307E7E7E7E7E7E7E +7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F61307E7E7E7E7E7E61017F7F7F7F593E7D7D7D7D +7D7D7D7D3E24291D1D1D1D3D29046A7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F61655D0A7C11017F6F667F7F5E370303031414140303 +14030314030857031414034646030346030303140303461403030303140303141437370A +7F0101017F69157F0101010101010A090D30617F7F7F7F7F7F3E7D7D7D7D297F7F7F7F01 +01616166566515151530306800007E7E7E7E047D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068637F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01614C1E1568007E7E7E7E7E7E7E7E7E007E +7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F01687E7E007E7E7E7E1E01017F7F3D287D7D7D7D7D +28043D7F7F7F7F7F7F7F7F7F7F7F7F611F3E7D7D7D7D7D7D3E617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F014C000D090E017F015D4C7F4C73370314031403030303 +031403034608574646334603460303034603034646030303141403031414030314033771 +7F0101017F15667F0101010101010D070D00617F7F7F7F7F013E7D7D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F0161614C4C4C66247D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F157E0000007E7E7E7E0068686868686830656565561E1E1E664C4C6161017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F0161614C653068007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E1E7F7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E7E7E6961017F1F7D7D7D7D7D2829 +617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F59047D7D7D7D7D6A617F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F61655D0A1368017F0111667F5D57374646030314144614 +03031437440F084603460314034603141403034603460303030303140303144646143707 +7F0101017F304C7F0101010101014C070E6C4C7F7F7F7F637E6E7D7D7D7D244C4C616101 +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F01616161616161616161610101010101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F4C687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E1E7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E3001611F7D7D7D7D7D24617F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D6A7D7D7D7D6A617F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F61680D091101017F7F0D1E7F0D44371414144603461403 +46141414330F574603370303141403461414144603030346140303031403031446463707 +7F0101017F00617F0101010101014C5E0E2B4C7F7F7F01307E6E7D7D7D7D047E7E7E6830 +30156965651E664C610101017F7F7F7F7F7F1D292929291F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +667F7F7F7F7F7F7F7F7F7F7F4C007E007E7E7E7E7E7E7E7E68011F7D7D7D7D281D7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61047D7D7D7D047F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F01662B0E096101017F610D697F0A03370303031446031403 +03031414440F57464603030346031403034614030303030303141446031403030303375E +7F7F017F4C2B01010101010101014C5E0E2B667F7F7F4C7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E00000068683015691E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +017F7F7F7F7F7F7F010101010101010101614C4C4C4C661E1E56696969017F7F7F7F7F7F +7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C +7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E001D7D7D7D7D6A597F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F047D7D7D7D3D7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F01635D0A7101017F61000A5D7F7137140303141446141414 +03031414440F57141403030303031446030314031403144646140303140303031403375E +7F7F017F00007F010101010101014C5E0E2B667F7F7F697E006E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0115 +6830303030303030686868686868686868007E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F +7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F +7F7F7F7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E7E2B317D7D7D6A617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F047D7D7D28617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016511620E01017F01300A0D7F0737140303144614144603 +14140337440F57144603141446030314140346030314461446141446461403034614375E +7F7F01016D4C7F010101010101014C5E0E2B4C7F7F617E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F567E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F +7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F +7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E237D7D7D28617F7F7F7F7F7F +7F7F7F59246A7D7D28491F7F7F7F7F7F292929291F7F7F7F7F6A7D7D7D297F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016911710E010101017F6D117F5E37141414460303464603 +03031403440F750314034646140303030314030314144603140303141446031414463709 +7F7F7F4C687F7F7F7F7F010101014C070E6C4C7F7F667E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E +7E7E7E7E7E7E7E4B04496E6E6E04242B7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F +7F7F7F7F7F61687E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F +7F7F7F7F7F7F7F7F637E7E7E7E7E7E7E7E7E7E7E7E7E7E4B7D7D7D7D517F7F7F7F7F7F7F +7F59047D7D7D7D7D7D7D7D6A517F7F1D7D7D7D7D297F7F7F7F517D7D7D7D617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016911710E017F7F7F7F01684C0737141403460314030303 +03461403440F1B030314140303141403030303140303030346140303140303460337370A +7F61656D6961566566617F7F010111070D00617F01307E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F607D7D7D +7D047E7E7E246E7D7D7D7D7D7D7D7D28232B7E7E7E7E7E7E00667F7F7F7F297D7D7D7D1D +7F7F7F7F61687E7E7E7E7E7E7E7E7D7D7D7D6E7E7E7E7E7E1F287D7D7D7D2D1E7F7F7F7F +7F7F7F7F7F7F7F567E7E247D7D7D7D7D247E7E7E7E7E7E6E7D7D7D297F7F7F7F7F7F7F7F +1F287D7D7D7D7D7D7D7D7D7D281F7F297D7D7D7D3D7F7F7F7F7F047D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F61150D71717F61382E4F7F016F5E37374614140303144646 +14144614440F75031403034603141403141403460346030346030346461414461437335D +7F6D3061010161566D5D6F4C7F010A070D00617F61007E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E307F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F011F7D7D7D +7D047E1F6E7D7D7D7D7D7D7D7D7D7D7D7D2D2B7E7E7E7E7E1E7F7F7F7F7F297D7D7D7D1D +7F7F7F61687E7E7E7E007E7E7E7E7D7D7D7D6E7E7E7E7E7E7E247D7D7D7D7D047F7F7F7F +7F7F7F7F7F01157E7E1F287D7D7D7D237E7E7E7E7E7E1F7D7D7D314C7F7F7F7F7F7F7F29 +7D7D7D7D7D7D313E6A7D7D7D7D2851497D7D7D7D617F7F7F7F7F597D7D7D6A7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F61680D09522E0612641235617F0E08371403140303031403 +46140314440F1B0303141403030303030303034614140314030303140303743774370F59 +65617F7F01017F7F014C110E307F09070D68617F697E00007E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F1E4D7D7D7D +7D04047D7D7D7D7D7D7D7D7D7D7D7D7D7D7D2D2B7E7E7E657F7F7F7F7F7F297D7D7D7D1D +7F7F61687E7E7E7E7E7E7E7E7E7E7D7D7D7D6E7E7E7E7E7E7E7E237D7D7D7D7D297F7F7F +7F7F7F7F01307E7E2B2D7D7D7D7D6E7E7E7E7E7E7E7E497D7D7D1F617F7F7F7F7F7F1F7D +7D7D7D7D04597F7F7F59247D7D7D31287D7D7D6A7F7F7F7F7F7F7F6A7D7D7D597F7F7F7F +7F7F7F7F7F7F7F0101016161566F0E5E3C2A126464642021017F0A573714030303031403 +14030314440F1B03141414461446031403140303140303031446031403375C1717172538 +4C7F0101010101017F7F300D2B7F7C070D7E6101007E7E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E567F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F4C004D7D7D7D +7D287D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D047E7E15017F7F7F7F7F7F297D7D7D7D1D +7F61687E7E7E7E7E7E7E7E7E7E7E7D7D7D7D6E7E7E7E7E7E7E30652D7D7D7D7D7D517F7F +7F7F7F01307E7E7E237D7D7D7D482B7E7E7E7E7E7E2B7D7D7D4801617F7F7F7F7F1D7D7D +7D7D7D1F7F7F7F7F7F7F7F1F7D7D7D7D7D7D7D047F7F7F7F7F7F7F297D7D7D3D7F7F7F7F +7F7F7F7F01016166636930005D0D091C4019455302026420104C7F0D7637140303030303 +14031437440F1B140303031414140303034614460303140346370303033355774E4E3B06 +7F7F0101010101017F612B00630C3C7C0E2B66657E7E7E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F1D7D7D7D7D297F7F7F7F7F01007E4D7D7D7D +7D7D7D7D7D7D6B244B7E7E2B24497D7D7D7D7D282B30017F7F7F7F7F7F7F297D7D7D7D1D +01307E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D6E0030651E6661017F61287D7D7D7D31617F +7F7F61307E7E7E247D7D7D7D281F7E7E7E7E7E7E7E247D7D7D0401617F7F7F7F61317D7D +7D7D1F7F7F7F7F7F7F7F7F7F497D7D7D7D7D7D1F7F7F7F7F7F7F7F1D7D7D7D297F7F7F7F +7F7F7F01611E306C5D110D0D0E093F2522191253020202644E217F7F6F76374614140303 +46034614440F75140303030314030303031403140303461414031403371B5477203B2610 +01010101010101017F6615012E2026270A115666633068007E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F157E7E4D7D7D7D +7D7D7D7D494B7E7E7E7E7E7E7E7E247D7D7D7D7D24617F7F7F7F7F7F7F7F297D7D7D7D1D +307E7E7E7E7E7E7E7E7E7E7E7E007D7D7D7D7B61017F7F7F7F7F7F7F1D7D7D7D7D7D497F +7F61687E7E7E4B287D7D7D7D247E7E7E7E7E7E7E7E6E7D7D7D2B61617F7F7F7F297D7D7D +7D247F7F7F7F7F7F7F7F7F7F597D7D7D7D7D7D517F7F7F7F7F7F7F597D7D7D497F7F7F7F +7F7F0161566D110E0A620907135232471A16450202020202642C357F7F2B1C3737030314 +0314461433085746141403031403031403030303030314460303141437443A1202205835 +7F7F01010101010101017F4C063B3B55090D30617F7F0101017B7D7D7D7D243068680000 +7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F1D7D7D7D7D297F7F7F7F1E7E7E7E4D7D7D7D +7D7D6E1F7E7E7E7E7E7E7E7E7E7E7E497D7D7D7D047F7F7F7F7F7F7F7F7F297D7D7D7D1F +7E7E7E7E7E68683030691E6161017D7D7D7D3E7F7F7F7F7F7F7F7F7F7F297D7D7D7D7D29 +61687E7E7E7E2D7D7D7D7D497E7E7E7E7E7E7E7E7E7D7D7D2D6861617F7F7F61287D7D7D +28617F7F7F7F7F7F7F7F7F7F7F6A7D7D7D7D287F7F7F7F7F7F7F7F7F7D7D7D3E7F7F7F7F +7F7F611E6C0D0A394A0505250505222A1912530202020202022016387F7F665E1B370303 +0303140314441B03460346034614030303030303030303141414461437443A1202021235 +7F7F010101010101017F7F352C202054070E004C7F7F7F7F7F3E7D7D7D7D290101010161 +4C4C1E63153030686868667F7F7F7F7F7F7F1D7D7D7D7D297F7F7F61007E7E7E4D7D7D7D +7D6B7E7E7E7E7E7E7E7E7E7E7E7E7E247D7D7D7D3E7F7F7F7F7F7F7F7F7F297D7D7D7D4D +15631E4C4C0101017F7F7F7F7F7F7D7D7D7D3E7F7F014C4C7F7F7F7F7F7F497D7D7D7D7D +4D7E7E7E7E237D7D7D7D2D7E7E7E7E7E7E7E7E7E4D7D7D7D046861617F7F7F297D7D7D7D +297F7F7F7F7F7F7F7F7F7F7F7F047D7D7D7D497F7F7F7F7F7F7F7F7F7D7D7D3E7F7F7F7F +7F014C68116239062A1A1A1A2A2A1A1941530202020202020202202A667F7F7F0E083714 +03141446460337031414140314141414034614031414030346463746750F3A1202451621 +617F0101010101017F0138192C780254130E110066616161013E7D7D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F1D7D7D7D7D297F7F011500007E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E7E7E00307D7D7D7D7D7F7F7F7F7F7F7F7F7F297D7D7D7D1D +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7D7D7D7D6715007E68617F7F7F7F7F7F616A7D7D7D7D +282B7E7E247D7D7D7D282B7E7E7E7E7E7E7E7E7E047D7D7D4D6861617F7F7F317D7D7D7D +617F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D297F7F7F7F7F7F7F7F7F7D7D7D3E7F7F7F7F +7F011E2B0E39221A1641411616161245530202020202020202022058357F7F7F7F117637 +370346370314030314034603031403461403141403030303030314080B733A1253411906 +0C617F7F7F7F7F7F612E2241784553541C620E116C6D7E00682F7D7D7D7D246101017F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F616161614C3D7D7D7D +7D244C4C4C4C4C4C4C4C4C4C4C4C6101287D7D7D7D7F7F7F7F7F7F7F7F7F297D7D7D7D1D +7F7F7F7F7F7F7F0101614C4C1E697D7D7D7D6E7E7E68617F7F7F7F7F7F7F7F51287D7D7D +7D6E7E4B287D7D7D7D1F7E7E7E7E7E7E7E7E7E7E6B7D7D7D2B6861617F7F517D7D7D7D49 +7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F7F517D7D7D497F7F7F7F +7F0165110A052A191245454512455302020202020202020202530258194F7F017F7F681C +4637460303460346031403140314461403030303144614460337447673733A1612411922 +060C384F4F4F4F2E35221916455302413C070A0D6F6C6D7E7E6E7D7D7D7D047E00683063 +1E1E664C4C4C61017F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F297D7D7D7D1D +614C4C661E636530007E7E7E7E7E7D7D7D7D6E7E30017F7F7F7F7F7F7F7F7F7F297D7D7D +7D7D236E7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E6E7D7D7D7E6861617F7F297D7D7D7D1F +7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D7F7F7F7F7F7F7F7F7F3D7D7D7D297F7F7F7F +7F61150D71052A16455302020202020202020202020202020202536458357F7F01017F01 +09373714031414140314034646031414460303140303030303141B0B0B733A161241162A +0606061021101006221A414553020253251C090E116F6C7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E0068017F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F247D7D7D7D1F +007E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D6E30017F7F7F7F7F7F7F7F7F7F6100237D7D +7D7D7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E287D7D2D7E6861617F7F3E7D7D7D7D59 +7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D6A7F7F7F7F7F7F7F7F7F247D7D7D1F7F7F7F7F +7F61300D09402A1645530202020202020202020202020202020202024E192E7F0101017F +7F09373746030303030303034603030346030303030314030314750B0B7347191241161A +2A2222222222222A1941530202020202543213620D116F6C6D6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E657F7F7F7F7F7F7F7F7F7F1D7D7D7D7D2963683030303030151F7D7D7D +7D24636363636363631E1E63636915013E7D7D7D7D7F7F7F7F7F7F7F7F1E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D2F017F7F7F7F7F7F7F7F7F7F66007E7E2D7D +7D7D7D7D7D7D2D7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6861617F7F317D7D7D7D7F +7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D247F7F7F7F7F7F7F7F7F317D7D7D597F7F7F7F +7F61300D09052A164553020202020202020202020202020202020202644E06017F010101 +7F015E37141446031403031446141403030303461403030314371B760B5B471A41124119 +191A1A2A1A1A1A194145020202020253453A3C5E620D116F6C6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F1D7D7D7D7D247E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E7E7E667F3E7D7D7D7D7F7F7F7F7F7F7F4C00047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F7F7F7F66007E7E7E2B28 +7D7D7D7D7D282B7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6861617F7F7D7D7D7D3E7F +7F7F7F7F7F7F7F7F7F7F7F7F597D7D7D7D3D7F7F7F7F7F7F7F7F3D7D7D7D6A7F7F7F7F7F +7F01150D710522191253020202020202020202020202020202020202024E780C7F7F0101 +017F0008371414140314460314030346031414030303030303374476730B472A16124541 +161919191919161612530202020202025377253C5E620E0D5D6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E7E1E7F7F3E7D7D7D7D7F7F7F7F7F7F4C7E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E24 +7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6861617F7F7D7D7D7D3E7F +7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D597F7F7F7F7F7F7F7F3E7D7D7D297F7F7F7F7F +7F01691171052219415302020202020202020202020202020202020253024E19387F0101 +017F610B37030314034603034614031403140303030303034603460F761C062A16124545 +121616161616411245530202020202020253123A187C710E0D6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E657F7F7F3E7D7D7D7D7F7F7F7F7F61007E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F7F667E007E7E7E7E2B48 +7D7D7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6801617F7F7D7D7D7D3E7F +7F7F7F7F7F7F7F7F7F7F7F7F6A7D7D7D317F7F7F7F7F7F7F7F3D7D7D7D28617F7F7F7F7F +7F015611621C221941530202020202020202020202020202020202020202205821617F01 +017F0176370303030314031403141446030314030303034603144608185D101A16125353 +5345121212124545530202020202020202020253543213710E2D7D7D7D7D047E7E7E7E7E +7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E15017F7F7F3E7D7D7D7D7F7F7F7F61687E7E7E047D7D7D7D4D +7E7E7E7E7E007E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F1E7E7E007E7E7E7E6E7D +7D7D7D7D7D7D281F7E7E7E7E7E7E7E7E7E7E7E7E487D7D7D7E3001617F7F6A7D7D7D317F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D497F7F7F7F7F7F7F61287D7D7D297F7F7F7F7F7F +7F01635D0A1C471A41530202020202020202020202020202020202020202024E780C7F7F +7F7F0A4437034646031414034603030303141403030314030303370B0D4F101A16125302 +025353535353020202020202020202020202020264453A4A622D7D7D7D7D047E7E7E7E7E +007E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E68017F7F7F7F3E7D7D7D7D7F7F7F01687E007E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E687D7D7D7D3E7F7F7F7F7F7F1E7E7E7E7E7E7E7E237D7D +7D7D7D7D7D7D7D2D2B7E7E7E7E7E7E7E7E7E7E7E6E7D7D7D7E3001617F7F497D7D7D7D61 +7F7F7F7F7F7F7F7F7F7F7F6A7D7D7D7D297F7F7F7F7F7F7F6A7D7D7D28617F7F7F7F7F7F +7F01635D621C471A1653020202020202020202020202020202020202020202024E2A4F61 +7E3F373714034614031403461403031403030314030346141437085D7F38101A16125302 +02020202020202020202020202020202020202020264023A09487D7D7D7D047E7E7E7E00 +7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E007E7E00617F7F7F7F7F3E7D7D7D7D7F7F01157E7E007E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E007E68617D7D7D7D3E7F7F7F7F01697E7E7E7E7E7E7E247D7D7D +7D484D287D7D7D7D497E7E7E7E7E7E7E7E7E7E7E497D7D7D4D1501617F7F297D7D7D7D1F +7F7F7F7F7F7F7F7F7F7F247D7D7D7D7D1D7F7F7F7F7F61047D7D7D7D3D7F7F7F7F7F7F7F +7F016511621C471A165353020202020202020202020202020202020202020202582C101C +4437370346140314030303030314034603030303030303143776117F7F2E101A16455302 +02020202020202020202020202020202020202020202025407487D7D7D7D047E7E7E7E7E +7E7E7E7E017F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E667F7F7F7F7F7F3E7D7D7D7D7F01157E7E7E7E7E7E047D7D7D7D24 +7E7E7E7E7E7E7E7E7E7E7E68617F7D7D7D7D3E7F7F7F7F66007E7E7E7E7E7E1F287D7D7D +7D1F7E247D7D7D7D7D047E7E7E7E7E7E7E7E7E7E047D7D7D046901017F7F597D7D7D7D31 +7F7F7F7F7F7F7F7F7F1F7D7D7D7D7D7D7F7F7F7F7F596A7D7D7D7D247F7F7F7F7F7F7F7F +7F61150D0927221A415353530202020202020202020202020202020202020253782C1650 +0837140346460303031403140303030346030303141437377C4C7F7F012E101A16455302 +02020202020202020202020202020202020202025353455407487D7D7D7D047E7E7E7E7E +7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F7F607D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E637F7F7F7F7F7F7F3E7D7D7D7D7F697E7E7E7E7E7E7E047D7D7D7D04 +7E7E7E7E7E7E7E7E7E7E68617F7F7D7D7D7D3E7F7F7F0101567E7E7E7E7E2B2D7D7D7D7D +047E7E7E497D7D7D7D7D1F7E7E7E7E7E7E7E7E7E1F7D7D7D6B5661017F7F7F047D7D7D7D +047F7F7F7F7F7F7F297D7D7D7D7D7D7D517F7F7F29287D7D7D7D3E7F7F7F7F7F7F7F7F7F +7F61000D0705221A415353020202020202020202020202020202020202020253532C2C06 +057437030314141446460303031403460303141437370F0A7F7F017F612E101A16455302 +020202020202020202020202020202020202020245411940622D7D7D7D7D047E7E7E7E7E +7E7E7E617F7F7F7F7F7F7F7F7F7F7F7F7F7F1F7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E157F7F7F7F7F7F7F7F3E7D7D7D7D567E00007E7E7E7E7E4D7D7D7D7D2D +7E7E7E7E7E7E7E7E7E68617F7F517D7D7D7D3E7F7F7F7F01307E7E7E7E7E497D7D7D7D6E +7E7E7E7E2B2D7D7D7D7D482B7E7E7E7E7E7E7E7E7E287D7D7D1561017F7F7F597D7D7D7D +7D49597F7F7F3D6A7D7D7D287D7D7D7D282424317D7D7D7D7D6A617F7F7F7F7F7F7F7F7F +01666F0A1340221945530202020202020202020202020202020202020202530253782C19 +21183737140346033714031446030314030374371B5E4C7F7F01017F610C101A41455302 +0202020202020202020202020202020202025345161A40070E6E7D7D7D7D290161666569 +1530567F7F7F7F7F7F7F7F7F7F7F7F7F7F4C4D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E68017F7F7F7F7F7F7F7F3E7D7D7D7D7E7E7E7E7E7E7E7E7E4B7D7D7D7D7D +1F7E68683030155666017F7F29287D7D7D7D3E7F7F7F7F637E7E7E7E7E047D7D7D7D282B +7E7E7E7E7E1F287D7D7D7D6E7E7E7E7E7E7E7E7E7E497D7D7D24617F7F7F7F7F297D7D7D +7D7D7D6A3E287D7D7D7D24497D7D7D7D7D7D7D7D7D7D7D7D3E617F7F7F7F7F7F7F7F7F7F +0165116227062A1253530202020202020202020202020202020202020202020253451219 +100C3F03373737740337031437373737373708076C7F7F7F0101017F660C102A16455302 +02020202020202020202020202020202534541192A05070A5D2F7D7D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F154D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E00617F7F7F7F7F7F7F7F7F3E7D7D7D7D7E7E7E7E7E0068006830487D7D7D7D +6E1E01017F7F7F7F7F7F1F317D7D7D7D7D7D3E0101611E007E7E7E7E1F7D7D7D7D7D4D7E +7E7E7E7E7E7E247D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D31667F7F7F7F7F7F047D7D +7D7D7D7D7D7D7D7D7D1F7F297D7D7D7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +61150D714022191253535302020202020202020202020202020202020202020202451619 +220C610A520F1B14373737371444087652096C7F7F7F01010101017F4F0C102A16125302 +0202020202020202020202020202534516192A40277C710E5D2F7D7D7D7D3E2929292929 +292929292929292929292929291D7F7F7F613D7D7D7D7D2465656969696969691F7D7D7D +7D04303030667F7F7F7F7F7F7F7F7F7F3E7D7D7D7D5665664C4C610101017F297D7D7D7D +7D311F517F7F7F1D24317D7D7D7D7D7D7D7D6768007E7E7E7E7E7E2B287D7D7D7D047E7E +7E7E7E7E7E7E7E497D7D7D7D7D4D7E7E7E7E7E7E7E7E487D7D7D297F7F7F7F7F7F7F1F28 +7D7D7D7D7D7D7D6A517F7F616A7D7D7D7D7D7D7D7D3E517F7F7F7F7F7F7F7F7F7F7F7F7F +61300D7106221A1645535353535302020202020202020202020202020202020202454119 +2235387F7F1E5D0E7107710A0E1165617F7F7F7F010101010101017F4F0C102A16455302 +0202020202020202025353455345411922403C3F07620E115D6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D2901017F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F7F61287D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D287D7D7D7D6E7E7E7E7E7E7E7E7E6E7D7D7D7D2D7E7E7E +7E7E7E7E7E7E7E2B2D7D7D7D7D284B7E7E7E7E7E7E7E247D7D7D7D517F7F7F7F7F7F7F61 +293E7D7D28493D7F7F7F7F7F61296A7D7D7D3E24517F7F7F7F7F7F7F29292929297F7F7F +61150D7106222A1916121245454553535353020202020202020202020202020202454119 +22212E617F7F7F7F7F7F7F7F7F7F7F7F7F010101010101010101017F3835102A16120202 +020202020202020253451241161922503C3F07620E0D115D2B6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F7F7F3D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D6A517D7D7D7D6E7E7E7E7E7E7E7E237D7D7D7D284B7E7E7E +7E7E7E7E7E7E7E7E1F287D7D7D7D2D7E7E7E7E7E7E7E7E6E7D7D7D6A617F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D297F7F7F +61695D0A5006222A1A19191916161641454545535353020202020202020202020245161A +06350C4F7F0101017F7F01010101010101010101010101010101017F3835102219415302 +0202020202535353121619192A47051C5E710A0D0D5D2B6C6D6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D294C6565563D7D7D7D7D29017F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D01010101614C4C1E65691515247D7D +7D7D7D7D7D7D7D7D7D7D28297F7F7D7D7D7D6E7E7E7E7E7E7E247D7D7D7D7D247E7E7E7E +7E7E7E7E7E7E7E7E7E247D7D7D7D7D497E7E7E7E7E7E7E1F287D7D7D6A617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1F7D7D7D7D6A7F7F7F7F +011E6C0D7250501010060622222A1A1A1A19191641124545530253530202025345411A22 +10350C4F7F0101010101010101010101010101010101010101017F01380C21061A191253 +5353535353451216191A2A06501C7C090A0D0D5D6F6C6C6D7E6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D29307E7E7E4D7D7D7D7D0400000000006815691F7D7D7D +7D24617F7F7F7F7F7F7F7F7F7F7F7F662F7D7D7D7D000000007E7E7E7E7E7E7E7E7E1F6E +7D7D7D7D7D7D7D7D2804597F7F7F7D7D7D7D6E7E7E7E7E7E1F287D7D7D7D237E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E497D7D7D7D7D247E7E7E7E007E7E297D7D7D7D6A617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D28617F7F7F7F +0161696F0D62073F05502121101006060606222A2A1A1916414553535353454541192210 +21352E4F7F0101010101010101010101010101010101010101017F01380C2110221A1641 +454553451216191A2206101C7C090A0E0D5D6F6C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E30 +7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E697F7F7F7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +1F04233E3E3E293D617F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0061047D7D7D7D281D7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F613E7D7D7D7D28517F7F7F7F7F +7F014C696C110E0A715E134A05362121211010101006222A1A191916411241161A220621 +350C2E4C014C4C61110A0A0A0A0A0A0A0A0A0A0A0A0A0A604C4C6101380C3510062A1A16 +16414116191A2A2210363F070E0E0D116F2B6C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C +7F7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +30017F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E667F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E306161047D7D7D7D7D49597F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F29287D7D7D7D28517F7F7F7F7F7F +7F0101611E306C5D0D0E0A72075E3F3936363535212121100606222A2A1A1A2A22102135 +0C0C384C71523F5E0707070909090909075E5E5E7C7C13133F527C0A0D2E35211006222A +1A1A1A2A22061021393F710E6F6F5D2B6C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6801 +7F7F7F7F7F7F7F7F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00 +617F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +667F7F7F7F7F7F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6961017F297D7D7D7D7D7D493D +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F611F317D7D7D7D7D6A517F7F7F7F7F7F7F +7F7F7F0101616656306C6F110D0E0A71077C3F39420C0C3521212110101010102135350C +0C2E11077C090A0E0E0D0D0D0D0D0D0D0E0A0A0A0A0A6262710713523F2E0C3521101006 +060606061010214213620D6C65006C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F +7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E66 +7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E007E7E1E +7F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E017F7F7F1D287D7D7D7D7D7D +28041F597F7F7F7F7F7F7F7F7F7F7F7F591F49287D7D7D7D7D7D04617F7F7F7F7F7F7F7F +7F7F7F7F7F7F0101614C1E69682B5D0D0D0E62095E134A390C0C35353521353535350C2E +2E0713090E0D5D2B6D006830303030006D110D110D0D0D0D0D0E62073F792E0C35211010 +101010102135425E620D6C1E61306D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E617F +7F7F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F +7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F +7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C017F7F7F7F61247D7D7D7D7D +7D7D7D7D7D3E3E2929292929293E3E7D7D7D7D7D7D7D7D7D313D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F0161616663157E2B5D0D0E0A71071339790C0C0C0C0C0C0C2E2E +705E0A0D6F3063664C6161616161614C66002B2B2B6F6F6F5D110D0A0913792E0C353535 +213535350C42070A0D001E61016615687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00017F +7F7F7F7F7F7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F +7F7F7F7F7F7F7F7F7F7F157E00007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F +7F7F7F7F7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E3061617F7F7F7F7F7F59047D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D311F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F010161616656306C5D0D0E0A715E1370790C2E2E797009 +710E11001E61017F7F7F7F7F7F7F7F0101657E7E7E7E7E6D6C2B5D0D0E715E07790C2E0C +0C0C79707C090E11681E61017F7F7F014C661E15007E7E7E7E7E7E7E7E7E7E7E7E657F7F +7F7F7F7F7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F +7F7F7F7F7F7F7F7F7F1E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F +7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6901017F7F7F7F7F7F7F7F611F49 +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D491F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101614C1E157E5D0D0E0A7109075E0709620E +0D6F156661017F7F7F7F7F7F7F7F7F7F01667E7E7E7E7E7E7E6D2B5D0D0E0A095E133F3F +3F3F7C07710D6F306661017F7F4C617F7F7F7F7F01614C66693000007E7E7E7E7E4C7F7F +7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F +7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F +7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E017F7F7F7F7F7F7F7F7F7F7F7F +611D293E6A7D7D7D7D7D7D7D7D7D7D283E243D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01614C63306C5D110D0D0E0D0D116F +681E61017F7F7F7F7F7F7F7F7F7F7F7F6161687E7E7E7E7E7E7E6C2B6F110D0E0E0A6262 +62620A0E0E11654C01017F7F7F150030151E017F7F7F7F7F7F0101614C1E690068617F7F +7F7F7F7F7F7F7F7F7F307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E15017F7F7F +7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F +7F7F7F7F7F1E7E7E7E7E7E000068687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E684C4C017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F1D1D1D1D1D1D597F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1F292929291D01614C1E696800000068691E +4C61017F7F7F7F7F7F7F7F1D292929291F01157E7E7E7E7E7E7E7E6D6C2B5D11110D0D0D +0D0D0D11116F66017F7F7F7F7F157E7E7E7E0068156661017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E007E7E7E00007E7E7E00617F7F7F7F +7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E68617F7F7F7F7F +7F7F7F7F4C683015691E4C61017F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E15014C7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F01010161616161616101 +017F7F7F7F7F7F7F7F7F7F297D7D7D7D3E011E7E7E7E7E7E7E7E7E7E7E6D6C6C2B6F6F6F +6F6F6F2B6C6C157F7F7F7F7F7F157E7E7E7E7E7E7E7E0068301E6101017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F4C56656915686800007E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F +7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F +7F7F7F7F01017F7F7F7F7F7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6501617F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E6161687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E007E7E7E00617F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E0015664C017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F010161614C66661E1E65651515151530697F7F7F7F7F7F +7F7F7F7F7F657E7E7E7E7E7E686868686868301515156556561E661E617F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C4C017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E0101307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E157F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F +7F7F7F7F7F614C4C4C4C4C61010161616101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F0166007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68011E7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E7F611E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E4C7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F7F7F +7F7F7F7F7F7F611E4C6101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01614C661E651530007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6301017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D292929291F7F4C61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E007E7E68017F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F +7F7F7F7F7F7F697E7E0068303015155666616101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01 +69303030007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0061617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6101697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E697F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F +7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E7E7E7E7E000000683069667F7F7F7F7F7F7F7F7F +7F7F6161616161616161616161616161614C4C4C4C661E1E617F7F7F7F7F7F7F7F7F6168 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1501617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F010166007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E667F7F01687E7E7E7E007E7E7E7E7E7E7E7E7E7E00617F7F7F7F +7F7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F7F7F7F7F7F7F +7F4C007E0000000000000000000000007E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F61687E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6601017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161307E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E007E00617F7F157E7E7E7E007E7E7E7E007E7E7E7E7E307F7F7F7F7F +7F7F7F7F01687E007E7E7E7E7E7E7E7E7E7E7E007E7E007E7E307F7F7F7F7F7F7F7F7F7F +61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F01307E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E3001617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01011E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E007E68017F657E7E7E7E7E7E7E7E7E7E7E7E7E1F04043E3E3E3E29 +1F617F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F01 +307E7E7E7E7E7E7E7E7E7E7E7E7E1F046B6E6E6B041F617F7F7F7F7F7F7F7F017E24236E +6E6E49044B7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E2B24046E6E6E6E23244B7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F5129243E3E3E3E291F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F61614D7D7D7D7D2D7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E237D7D7D7D24683068007E7E7E7E7E7E7E24487D7D7D7D7D7D7D7D +7D7D4951307E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D047E7E657F7F1F49317D7D7D312465 +7E00004D7D7D7D7D047E7E7E24487D7D7D7D7D7D7D7D3E517F7F7F7F7F7F1D3E7D7D7D7D +7D7D7D7D7D6E4B7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1F497D7D7D7D7D7D7D7D7D7D6E +4D7E7E7E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F7F7F1F49317D7D7D31247F7F7F +7F7F7F7F7F7F7F1F317D7D7D7D7D7D7D7D7D7D49517F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F010165487D7D7D7D1F7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E287D7D7D7D1D00301E636930007E7E4D487D7D7D7D7D7D7D7D7D7D +7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D047E680129287D7D7D7D7D7D7D7B00 +7E7E7E4D7D7D7D7D047E4D487D7D7D7D7D7D7D7D7D7D7D7D1F7F7F7F61047D7D7D7D7D7D +7D7D7D7D7D7D281F7E7E7E7E7E7E7E7E7E7E7E7E7E7E237D7D7D7D7D7D7D7D7D7D7D7D7D +7D6E2B7E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F29287D7D7D7D7D7D7D3E7F7F7F +7F7F7F7F7F1D317D7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F014C047D7D7D7D497E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E247D7D7D7D6E007E7E7E15664C6665247D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E4D7D7D7D7D047E60317D7D7D7D7D7D7D7D7D6E7E +7E7E7E4D7D7D7D7D04237D7D7D7D7D7D7D7D7D7D7D7D7D7D7D517F1D287D7D7D7D7D7D7D +7D7D7D7D7D7D7D282B7E7E7E7E7E7E7E7E7E7E7E2B2D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D481F7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D297F51317D7D7D7D7D7D7D7D7D3E7F7F7F +7F7F7F7F1F7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D047F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F6101607D7D7D7D282B7E7E7E7E7E7E +7E7E7E7E7E7E7E7E6B7D7D7D7D247E7E7E7E7E7E301E1F7D7D7D7D7D7D6B241D1D1D2904 +287D7D7D7D7D047E7E7E7E7E7E7E7E7E4D7D7D7D7D04047D7D7D7D7D7D7D7D7D7D7D6E00 +7E7E7E4D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D6A297D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E7E6E7D7D7D7D7D7D48490404232D7D7D7D +7D7D7D282B7E7E7E7E7E7E7E7E7E4D7D7D7D7D29297D7D7D7D7D7D7D7D7D7D7D3E7F7F7F +7F7F7F1F7D7D7D7D7D7D49291D1D1D2904287D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F01617A7D7D7D7D247E7E7E7E7E7E +7E7E7E7E7E7E7E4B7D7D7D7D287E7E7E7E7E007E7E4D7D7D7D7D7D494C61017F7F7F7F7F +61047D7D7D7D7D1F7E7E7E7E7E7E7E7E4D7D7D7D7D287D7D7D7D7D7D6A3E3E3E487D6E7E +7E7E7E4D7D7D7D7D7D7D7D7D2849242B7E30591F317D7D7D7D7D7D7D7D7D7D48044D7E7E +7E1F04287D7D7D7D7D2B7E7E7E7E7E7E7E7E7E047D7D7D7D7D2D4D7E7E7E7E7E7E4B6B7D +7D7D7D7D6E7E7E7E7E7E7E7E007E4D7D7D7D7D287D7D7D7D7D7D6A3E3E3E317D3E7F7F7F +7F7F1D7D7D7D7D7D49617F7F7F7F7F7F7F61047D7D7D7D7D517F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F61014D7D7D7D7D2D7E7E7E7E7E7E +7E7E7E7E7E7E7E047D7D7D7D237E7E7E7E7E7E7E2B487D7D7D7D4D017F7F7F7F7F7F7F7F +7F7F237D7D7D7D6B7E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D3E1F617F7F7F61007E1F7E +7E7E7E4D7D7D7D7D7D7D7D042B7E7E7E68617F7F616A7D7D7D7D7D7D7D28247E7E7E7E7E +7E7E7E1F7D7D7D7D7D247E7E7E7E7E7E7E7E4B7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E24 +7D7D7D7D7D247E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D3E1F617F7F7F7F7F7F517F7F7F +7F61317D7D7D7D1F7F7F7F7F7F7F7F7F7F7F7F047D7D7D7D497F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F010161487D7D7D7D1F7E7E7E7E7E +7E7E7E7E7E7E7E487D7D7D7D4B7E7E7E7E7E7E7E047D7D7D7D237E0065617F7F7F7F7F7F +7F7F61317D7D7D7D4B7E7E7E7E7E7E7E4D7D7D7D7D7D7D311D7F7F7F7F7F01307E7E7E7E +7E7E7E4D7D7D7D7D7D6E4B7E7E7E7E00617F7F7F7F1D7D7D7D7D7D7D232B7E7E7E7E7E7E +7E7E7E7E047D7D7D7D497E7E7E7E7E7E7E7E497D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E +047D7D7D7D487E7E7E7E7E7E7E7E4D7D7D7D7D7D7D311D7F7F7F7F7F7F7F7F7F7F7F7F7F +7F297D7D7D7D247F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D7D597F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F6101247D7D7D7D497E7E7E7E7E +7E7E7E7E7E7E4D7D7D7D7D6B7E7E7E7E7E7E7E00287D7D7D487E7E7E7E00017F7F7F7F7F +7F7F7F1F7D7D7D7D24661E563000007E4D7D7D7D7D7D24617F7F7F7F7F7F567E7E7E7E7E +7E7E7E4D7D7D7D7D6B7E7E7E7E7E7E667F7F7F7F7F7F287D7D7D7D247E7E7E7E7E7E7E7E +7E7E7E004B7D7D7D7D6E7E7E7E7E7E7E7E4B7D7D7D7D7D4B7E7E7E7E7E7E7E7E7E7E7E7E +7E487D7D7D7D247E7E7E7E7E007E1F7D7D7D7D7D24617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F287D7D7D317F7F7F7F7F7F7F7F7F7F7F7F7F7F1F7D7D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F61157D7D7D7D282B7E7E7E7E +7E7E7E7E7E7E497D7D7D7D247E7E7E7E7E7E7E247D7D7D7D247E7E7E7E7E617F7F7F7F7F +7F7F7F617D7D7D7D047F7F7F7F01614C3D7D7D7D7D247F7F7F7F7F7F7F4C7E7E7E7E7E7E +7E7E7E4D7D7D7D7D047E7E7E7E7E567F7F7F7F7F7F7F3E7D7D7D7D4D7E00683015696366 +4C4C61017F7D7D7D7D7D7E7E7E7E7E7E7E047D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E7E +7E247D7D7D7D6B7E7E7E7E7E7E003D7D7D7D7D247F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +3D7D7D7D7D1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617D7D7D7D047F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F01013E7D7D7D7D247E7E7E7E +7E7E7E7E7E2B7D7D7D7D487E7E7E7E7E7E7E7E497D7D7D7D2B7E7E7E7E7E617F7F7F7F7F +7F56151E317D7D7D3E7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F4C1E6330686868 +6800004D7D7D7D7D040000000015017F7F7F7F7F7F7F047D7D7D7D3D616101017F7F7F7F +7F7F7F7F7F487D7D7D7D7E7E7E7E7E7E7E6B7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E +7E4B7D7D7D7D287E7E7E7E7E7E56607D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +047D7D7D7D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D3E7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F611F7D7D7D7D2D7E7E7E7E +7E7E7E7E7E247D7D7D7D047E7E7E7E7E7E7E7E487D7D7D2D7E7E7E7E7E7E4C7F7F7F7F7F +01007E7E6E7D7D7D7D01017F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F01011D7D7D7D7D29010101017F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F7F +7F7F7F7F016E7D7D7D7D7E7E7E7E7E7E7E287D7D7D7D4B7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E487D7D7D7D1F7E7E7E7E3061607D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +317D7D7D6A7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F0101317D7D7D7D4B7E7E7E +7E7E7E7E7E2D7D7D7D7D4B7E7E7E7E7E7E7E7E7D7D7D7D286E6E6E6E6E6E673E3E3E3E3E +7B6E6E6E287D7D7D7D686830696661011D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F7F +7F7F7F7F666E7D7D7D7D7E7E7E7E7E7E7E7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E6E7D7D7D7D4D7E7E7E001E01607D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7D7D7D7D283E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E287D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F61297D7D7D7D237E7E7E +7E7E7E7E1F7D7D7D7D6B7E7E7E7E7E7E7E7E1F7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F010161614C +66666369006E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E7E7E1501611D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F51 +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F01567D7D7D7D287E7E7E +7E7E7E7E237D7D7D7D247E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F7F666965631E6666664C61 +616161607D7D7D7D29017F7F7F7F7F7F7F7F7F01614C247D7D7D7D1F6515153068007E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E7E004C01011D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F01497D7D7D7D247E7E +7E7E7E7E287D7D7D487E7E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F617E7E7E7E7E7E7E7E7E00 +007E004D7D7D7D7D04157F7F7F7F7F7F7F7F01307E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E7E5601617F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F3D7D7D7D7D6E7E7E +7E7E7E247D7D7D7D047E7E7E7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E007E004C7F7F7F01 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1F7D7D7D7D297F7F7F157E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D04617F7F7F7F7F7F7F7F697E007E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E007E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E3001617F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F01317D7D7D7D4B7E +7E7E7E6B7D7D7D7D4B7E7E7E7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E1E7F7F7F61 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E003D7D7D7D7D297F7F4C007E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D247F7F7F7F7F7F7F7F1E7E7E7E00047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D04004C01017F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D237E +7E7E4B7D7D7D7D6B7E7E7E7E7E7E7E7E7E7E2B7D7D7D7D7D7E7E7E7E7E7E7E157F7F7F4C +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E151D7D7D7D7D297F01687E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F7F7F667E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E6E7D7D7D7D4D6301617F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F597D7D7D7D287E +7E7E047D7D7D7D247E7E7E7E7E7E7E7E7E7E7E287D7D7D7D1F7E7E7E7E7E7E00617F7F1E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C1D7D7D7D7D297F1E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F7F4C7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E287D7D7D7D4B7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E487D7D7D7D4B01617F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +287D7D7D7D517F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F497D7D7D7D24 +7E7E487D7D7D487E7E7E7E7E7E7E7E7E7E7E7E6B7D7D7D7D047E7E7E7E7E7E7E567F7F65 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E68011D7D7D7D7D2961007E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F01687E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E6B7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E +7E4B7D7D7D7D286101017F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +497D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D6E +7E4D7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E7E047D7D7D7D487E7E7E7E7E7E7E00617F01 +15687E7E7E7E7E7E7E7E7E7E7E7E657F1D7D7D7D7D29657E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F157E7E007E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E047D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E047D7D7D7D4901017F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +297D7D7D7D317F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D7D +4B497D7D7D7D2B7E7E7E7E7E7E7E7E7E7E7E7E4B7D7D7D7D7D047E7E7E7E7E7E7E657F61 +664C1E1568007E7E7E7E7E7E7E7E617F1D7D7D7D7D29007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F637E7E7E7E007E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E4B7D7D7D7D7D1F7E7E7E7E7E7E7E7E7E7E7E7E +2B487D7D7D7D1F617F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +597D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D +497D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E7E7E497D7D7D7D7D247E7E007E7E7E7E6115 +7E694C01611E6904047E7E7E7E00017F1D7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F4C7E7E7E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E6B7D7D7D7D2D7E7E7E7E7E7E7E7E7E7E7E7E +237D7D7D7D31617F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F047D7D7D7D7D1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F29297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F617D7D7D7D +7D7D7D7D7D4D7E7E7E7E7E7E7E7E7E7E7E7E7E7E4B287D7D7D7D7D047E7E7E7E7E7E0000 +7E7E0069661F317D294C666500567F7F1D7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E3D7D7D7D7D297F7F01687E7E7E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E1F7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E24 +7D7D7D7D7D1F017F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F59287D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F1F317D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D3E292929292929292929292929 +2929292929291D7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F047D7D7D +7D7D7D7D487E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E247D7D7D7D7D7D6E247E7E7E7E7E7E +7E7E1F04487D7D7D297F7F7F017F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E00007E +7E7E151D7D7D7D7D297F01307E7E007E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E047D7D7D7D7D2D4D7E7E7E7E7E7E4B6B7D +7D7D7D7D7B017F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F1F7D7D7D7D7D7D3E3D7F7F7F7F7F7F7F7F5129317D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D +7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E497D7D7D7D7D7D7D286E23040404 +6E287D7D7D7D7D7D24017F7F7F7F7F7F1D7D7D7D7D2415680000007E7E7E7E7E7E7E7E7E +7E00611D7D7D7D7D297F567E7E7E7E7E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E0000 +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E6E7D7D7D7D7D7D48490404232D7D7D7D +7D7D7D28667F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F047D7D7D7D7D7D7D283E242929293E287D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D +7D7D7D7D2B007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E047D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D0400154C017F7F7F1D7D7D7D7D297F7F7F0101614C63691515153030 +30667F1D7D7D7D7D294C7E7E7E7E7E7E7E7E7E7E0068047D7D7D7D1F156565564C61611E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E2B2D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D311D7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F297D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D +7D7D7D23687E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4D2D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D6B1F7E7E7E1E7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D294C664C664C6161616161616101297D7D7D7D1D7F7F7F7F7F7F7F66 +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E237D7D7D7D7D7D7D7D7D7D7D7D7D +7D3E667F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F1D6A7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D49517F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617D7D +7D7D7D1D66007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E246B7D7D7D7D7D7D7D7D +7D7D7D7D6E044B7E7E7E7E7E667F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F65 +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E1F497D7D7D7D7D7D7D7D7D7D67 +1D617F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F3D497D7D7D7D7D7D7D7D7D7D7D7D3E29597F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F61011E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E2B4D04496E6E6E6E +23044D2B7E7E7E7E7E7E7E7E617F7F7F7F01687E003069656661017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F15 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E2B24046E6E6E6E23240001 +617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F611D29043E3E3E3E24291D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F61011E007E00007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F4C7E7E7E7E7E7E7E00003015651E664C4C017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101016168 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00630161 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F610166007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E617F +7F7F7F7F7F0156696969651E1E1E1E1E1E1E1E636569696969691530303030686868007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E001E01617F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F610166007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E307F7F +7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E001E01617F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F610166687E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E307F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F +7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E006601617F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F61014C307E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E657F7F7F7F307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F7F +7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E304C01617F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F610161157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E157F7F7F017E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F +7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E306101617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F010101657E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F +7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E696101617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F01610163687E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F657E00007E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F +7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E00630101017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F610166687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F307E7E7E7E7E7E007E7E7E7E7E7E7E637F7F7F7F7F +7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68660161017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F610161157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F01307E7E7E7E7E7E007E7E7E7E7E7E7E017F7F7F7F7F +01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E156101617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101011E687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E667F7F016615687E7E7E7E7E7E7E7E7E7E657F7F7F7F7F7F +567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00630101017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E300101017F7F014C563000007E7E7E7E00617F7F7F7F7F61 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E304C0161017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61010163687E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E611E7E1E017F7F7F7F014C65153000157F7F7F7F7F7F15 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00560101617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C157E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E30307E7E6866017F7F7F7F7F7F7F61017F7F7F7F7F6100 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E154C0161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61010166687E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00564C017F7F7F7F7F7F7F7F7F7F7F0161 +4C4C1E636569691530303030687E000000000000000000007E006830303030301515007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E681E6101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016156007E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E007E007E7E7E7E7E7E7E30654C017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F0101010101616161616161616161616161610101010101017F7F307E +7E7E7E7E7E7E7E7E7E7E7E7E0065610161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101016169007E7E007E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6815617F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F657E +7E7E7E7E7E7E7E7E7E7E00154C0101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161014C15007E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F0161017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F567E +7E7E7E7E7E7E7E7E00154C0101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161014C15007E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E157F7F7F7F7F157E0068 +151E664C4C6101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E +7E7E7E7E7E7E00154C0101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016101014C6900 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F7F7F617E7E7E7E +7E7E7E7E7E7E68301515156565561E1E666666661E66616161616161616161661E66157E +7E7E7E7E00694C010161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161010161 +1E68007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F1E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0000007E00007E7E7E7E7E7E +7E00686361010161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6101 +01616615007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00017F7F7F01687E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00 +1566610101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +01610101615630007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F61007E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00305661 +010161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F01616101014C5615687E7E7E7E7E7E7E7E7E7E7E7E7E7E687F7F7F7F157E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0015654C010161 +61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F011E4C01014C1E69307E7E7E7E7E7E7E7E7E7E7E307F7F7F01007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68691E4C0101611E017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F0161614C0101614C1E69687E7E7E7E7E7E7E157F7F7F4C007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068151E4C610101614C61017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F017F01610101616161665615683068157F7F7F157E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E68683015634C01016161010161017F017F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01616161016101017F01017F7F7F1E691530686868 +68686868686868301569651E664C01017F7F7F7F7F016161017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01616101017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101616161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101616161616101010101 +010101010101010161616161610101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F + +end +%%PageTrailer +%%Trailer +%%EOF diff --git a/executable_names/doc/slides/users/figures/linux_llnl.png b/executable_names/doc/slides/users/figures/linux_llnl.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3d74b01eb0680be54091e541623399dd0f6601 Binary files /dev/null and b/executable_names/doc/slides/users/figures/linux_llnl.png differ diff --git a/executable_names/doc/slides/users/figures/linux_llnl2.png b/executable_names/doc/slides/users/figures/linux_llnl2.png new file mode 100644 index 0000000000000000000000000000000000000000..2a84084f2621392feef93246e8b952977e0fa7e8 Binary files /dev/null and b/executable_names/doc/slides/users/figures/linux_llnl2.png differ diff --git a/executable_names/doc/slides/users/figures/llnl.ps b/executable_names/doc/slides/users/figures/llnl.ps new file mode 100644 index 0000000000000000000000000000000000000000..589a9e0fc2b062f304979756eac33d123e99be5c --- /dev/null +++ b/executable_names/doc/slides/users/figures/llnl.ps @@ -0,0 +1,577 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/garlick/projects/project-slides/llnl.ps +%%Creator: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) - by John Bradley +%%BoundingBox: 270 362 342 430 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 216 string def + +% define space for color conversions +/grays 72 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +270 362 translate + +% size of image (on paper, in 1/72inch coords) +72.00000 67.96800 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +72 68 8 % dimensions of data +[72 0 0 -68 0 68] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff1c1c1c000000616161fefefefffffffefefefffffffffffffcfcfcfffffffcfcfc +d8d8d8000000000000020202000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffff0909090c0c0c5d5d5dfafafafffffffcfcfcfffffff8f8f8fffffffcfcfcf5f5f5 +dedede0000000a0a0a000000010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010101010000000f0f0f0202020000000c0c0c050505000000050505 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +eaeaea4c4c4c000000535353f7f7f7ffffffffffffffffffffffffffffffffffffffffff +dedede000000010101010101000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000c0c0c000000000000060606000000000000060606000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffffd2d2d2030303646464fffffffffffffdfdfdfbfbfbfcfcfcfffffffdfdfdffffff +dbdbdb000000000000040404000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000010101000000010101050505030303000000010101080808 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fffffffcfcfc000000616161fffffffefefefffffffdfdfdfffffffffffffbfbfbfefefe +cbcbcb0f0f0f000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000050505040404000000000000020202000000000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fafafaececec0000005d5d5dfcfcfcfbfbfbffffffffffffffffffffffffffffffffffff +e6e6e67d7d7d787878737373757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +7575757575757575757575757b7b7b6c6c6c7878787373736565658282826e6e6e111111 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +ffffffededed0f0f0f676767fefefefcfcfcfffffffdfdfdfcfcfcfffffffefefeffffff +fffffff0f0f0fffffffcfcfcfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfffffff9f9f9fafafafffffffffffff8f8f8939393181818 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fcfcfce7e7e7000000606060f8f8f8fffffffffffffffffffffffffffffffcfcfcfefefe +fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff7f7f7fffffffdfdfdfffffffafafa9595951a1a1a000000 + +000000010101000000000000020202212121ffffffffffffffffffffffffffffffffffff +fefefeffffff383838020202414141fefefefefefefffffffcfcfcfffffffffffffefefe +fefefeffffff000000636363f9f9f9fffffffcfcfcfffffffdfdfdfafafafefefeffffff +fdfdfdfffffffffffff9f9f9ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff6f6f6fffffffafafa979797141414000000111111 + +000000010101000000000000020202212121fffffffffffffffffffefefefdfdfdffffff +f7f7f7ffffff383838040404404040f8f8f8fffffffffffffffffff6f6f6fffffffefefe +fffffff3f3f3000000787878edededfefefefffffffffffffefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefffffffbfbfbffffffffffff +fafafafffffffffffff9f9f9fefefefffffffafafa949494070707000000131313000000 + +000000010101000000000000020202212121fffffffffffffdfdfdfafafafffffffcfcfc +ffffffffffff2e2e2e000000464646fafafafffffffdfdfdfafafafefefefcfcfcffffff +fafafaebebeb0d0d0d333333cdcdcdfffffff6f6f6f8f8f8fefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefffffffffffffffffffefefe +f5f5f5f2f2f2f7f7f7ffffffffffffffffff919191151515020202050505000000030303 + +000000010101000000000000020202212121fffffffffffffdfdfdf9f9f9fffffff5f5f5 +ffffffffffff505050010101434343fefefefffffffcfcfcfafafafffffff9f9f9ffffff +fffffff0f0f0000000000000949494fffffffbfbfbffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffff9f9f9fffffffbfbfbfefefe +fffffffffffffffffffffffffcfcfc9494941d1d1d000000000000000000000000070707 + +000000010101000000000000020202212121fffffffffffffffffffefefefffffff7f7f7 +ffffffffffffababab1717173a3a3afffffffcfcfcffffffffffffffffffffffffffffff +fffffffdfdfd0000001717177d7d7df7f7f7fffffffdfdfdffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8 +ebebebf7f7f7fffffff7f7f79898981616160000000f0f0f0000000000000f0f0f000000 + +000000010101000000000000020202212121fffffffffffffefefefffffffefefeffffff +fcfcfcfdfdfdffffff1616163e3e3efffffff7f7f7fffffffffffffafafafffffffafafa +f7f7f7eeeeee1818180000000d0d0db5b5b5fffffffffffffcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfffffff0f0f0ffffffffffff +fffffffffffff7f7f79c9c9c101010000000000000020202030303010101000000000000 + +000000010101000000000000020202212121fffffffffffffafafafffffffdfdfdffffff +f6f6f6f8f8f8ffffff030303474747fbfbfbfffffffffffffffffff2f2f2fffffffdfdfd +ffffffffffffc3c3c31b1b1b0505058b8b8bc9c9c9b6b6b6c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d5d5d5bcbcbcc7c7c7cecece +c4c4c4c7c7c78989890e0e0e000000040404000000000000060606000000000000060606 + +000000010101000000000000020202212121fffffffffffffafafafffffffcfcfcffffff +f8f8f8fcfcfcffffff0707072a2a2abebebefffffffefefefffffffafafaffffffffffff +fcfcfcf9f9f9e2e2e2313131000000000000070707030303000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000101010b0b0b010101 +0000000000000606060000000e0e0e0000000000000a0a0a000000000000030303080808 + +000000010101000000000000020202212121fffffffffffffdfdfdfefefefafafafcfcfc +fefefefffffff1f1f11c1c1c000000777777fffffff4f4f4fffffffffffff9f9f9ffffff +fffffffffffff7f7f7d4d4d4979797292929000000020202000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000202020d0d0d000000000000 +0d0d0d0707070000000404040000000000000505050000000000000606060c0c0c000000 + +0202020000000101010000000000002c2c2cf6f6f6fffffffffffffffffff9f9f9fafafa +fefefefffffff6f6f6adadad070707676767fffffff9f9f9fffffff4f4f4fcfcfcffffff +fefefefcfcfcfffffffefefeefefefd3d3d3bbbbbbb0b0b0b2b2b2b2b2b2b2b2b2b2b2b2 +b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2 +b1b1b1b0b0b0b8b8b8b3b3b3a7a7a7b2b2b2bcbcbcafafafacacacc0c0c0b2b2b2535353 +0000000000000d0d0d000000000000000000000000000000000000000000000000000000 + +0000000000000f0f0f000000000000040404727272f9f9f9fcfcfcfcfcfcffffffffffff +fdfdfdf4f4f4fafafae4e4e40000002222229e9e9efafafaefefefffffffffffffffffff +fffffffffffffffffffffffffffffffefefef9f9f9fafafaffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffefefefffffff6f6f6ffffff8c8c8c111111 +0a0a0a090909000000101010000000000000000000000000000000000000000000000000 + +0404040000000a0a0a000000010101000000444444fffffffffffffefefefafafaffffff +fffffff5f5f5fefefef4f4f43131310000007d7d7df3f3f3fbfbfbf9f9f9e7e7e7ffffff +fdfdfdf9f9f9f8f8f8fbfbfbfdfdfdfffffffffffffffffffbfbfbfbfbfbfbfbfbfbfbfb +fbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfb +fefefefffffff4f4f4f9f9f9fffffff8f8f8efefefffffffffffff929292171717000000 +010101000000000000020202000000000000000000000000000000000000000000000000 + +070707000000000000090909000000040404595959f6f6f6fcfcfcfffffff9f9f9fafafa +fefefeffffffffffffedededb5b5b5171717000000c9c9c9fffffffbfbfbffffffffffff +fffffffffffffffffffffffffdfdfdfbfbfbfbfbfbfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffbfbfbffffffffffffffffffffffff9b9b9b0909090000000d0d0d +000000000000101010000000000000000000000000000000000000000000000000000000 + +0000000101010000000606060000000202022a2a2aabababf3f3f3fffffffefefefafafa +fbfbfbfdfdfdffffffffffffe4e4e42d2d2d0e0e0e555555e2e2e2fcfcfcffffffffffff +fffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fbfbfbfafafafffffffbfbfbfdfdfdffffffeeeeeea7a7a70a0a0a020202080808090909 +000000010101070707000000000000000000000000000000000000000000000000000000 + +000000000000060606000000020202080808000000919191fffffffffffff7f7f7fdfdfd +fffffffafafaffffffffffffffffff8b8b8b0404040000005c5c5cfffffff4f4f4f0f0f0 +fcfcfcfefefefdfdfdf9f9f9fafafaffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffbfbfbffffffffffffffffffefefef959595242424000000090909040404000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +0606060000000606060000000505050a0a0a000000666666f3f3f3fffffff5f5f5fcfcfc +fffffffffffffcfcfcfafafaf6f6f6fcfcfc555555000000060606545454ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffbfbfbffffffffffffa9a9a92b2b2b000000101010000000000000000000 +090909040404000000030303000000000000000000000000000000000000000000000000 + +0202020000000000000f0f0f0000000000000c0c0c010101acacacf4f4f4fffffffefefe +fdfdfdfdfdfdfffffffffffffffffffafafaf9f9f95f5f5f000000000000646464cecece +f5f5f5fdfdfdfffffffffffffffffffffffffffffff7f7f7ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f9f9f9fffffffafafafffffffcfcfc7878780000000b0b0b000000030303000000000000 +030303030303000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000717171f0f0f0ffffffffffff +fffffff4f4f4fffffffbfbfbf9f9f9fffffffffffffcfcfc646464363636010101000000 +7b7b7bb0b0b0b8b8b8fffffffbfbfbfbfbfbffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff9f9f9fffffffcfcfcf4f4f4fffffffffffffdfdfdfbfbfb +ffffffecececffffffb4b4b4898989000000000000090909000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +0000000000000000000000000000000000000000000000000202026d6d6df2f2f2ffffff +f8f8f8fffffffffffffffffffffffff4f4f4f4f4f4fffffff3f3f3dcdcdc8585852e2e2e +0000001a1a1a1e1e1e787878888888919191848484707070888888888888888888888888 +8888888888888888888888889393938181818686869292928585857b7b7b888888949494 +9090908d8d8d7d7d7d090909000000000000111111000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000030303646464ffffff +fffffff1f1f1fffffffffffffffffff7f7f7fffffffefefefffffffffffffbfbfbc7c7c7 +adadad7d7d7d1313130707070000000000000c0c0c0d0d0d000000000000000000000000 +000000000000000000000000020202000000000000010101000000000000000000000000 +0000000000000d0d0d0202020000000c0c0c060606000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000020202000000252525ffffff +fafafafffffffffffff9f9f9fefefef6f6f6fffffff2f2f2fffffffbfbfbfffffff9f9f9 +fffffff8f8f8cacacad5d5d5c7c7c7c7c7c7c2c2c2bcbcbccccccccccccccccccccccccc +ccccccccccccccccccccccccc9c9c9d5d5d5c8c8c8c2c2c2d5d5d5d2d2d2c6c6c6cfcfcf +d5d5d54a4a4a0000000a0a0a0000000000000000000c0c0c000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000060606000000000000272727 +686868fffffffffffff8f8f8fffffffbfbfbfffffffffffffffffffbfbfbfffffff8f8f8 +fffffffffffff4f4f4fffffff9f9f9fefefefffffffffffffcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcfffffffbfbfbfafafafbfbfbf9f9f9fcfcfcfcfcfcf3f3f3 +818181131313000000000000030303020202000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000030303010101000000 +4e4e4eb5b5b5eaeaeafffffffffffffffffffffffffffffffbfbfbf6f6f6fcfcfcffffff +fffffffffffffcfcfcfefefefdfdfdffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff2f2f2fffffffffffff6f6f6fffffff6f6f67d7d7d +0000000000000f0f0f050505040404000000060606050505000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +0000000000000000000000000000000000000000000000000000000c0c0c000000000000 +1010100000006f6f6ff7f7f7fbfbfbf9f9f9f8f8f8fbfbfbfffffffffffffefefef2f2f2 +fafafaf8f8f8fefefefffffffffffffffffffdfdfdf8f8f8fefefefefefefefefefefefe +fefefefefefefefefefefefefbfbfbfbfbfbfffffffffffffdfdfdeeeeee8d8d8d060606 +0c0c0c000000040404000000080808040404000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000040404000000000000070707 +0000000707070000006e6e6efefefeffffffffffffefefeffdfdfdf9f9f9ffffffffffff +fffffffffffffffffffbfbfbfbfbfbffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffff6f6f6ffffffffffff868686020202010101 +000000010101040404000000000000020202000000070707000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000737373f7f7f7fffffffffffffffffffefefeffffffffffff +fffffffdfdfdfffffffffffff7f7f7fafafafffffffefefeffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffbfbfb898989090909000000040404 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000404041e1e1e878787f8f8f8d9d9d9ffffffffffffffffff +fffffffafafafbfbfbfffffffffffffffffffdfdfdfffffffefefefefefefefefefefefe +fefefefefefefefefefefefef4f4f4f5f5f5ffffff8282820101010a0a0a0a0a0a000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000606060404040707070000000e0e0ebdbdbdc8c8c8d5d5d5 +fcfcfcfffffffffffff5f5f5fafafaf9f9f9f8f8f8ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff828282060606000000000000000000050505 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000030303161616000000656565 +979797eaeaeafffffffafafaffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff9f9f98585850202020000000c0c0c0000000b0b0b000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000808080000000808080000000000000b0b0b000000000000 +0606065858587979796969697171717a7a7a7070706e6e6e6f6f6f6f6f6f6f6f6f6f6f6f +6f6f6f6f6f6f6f6f6f6f6f6f767676050505000000000000000000090909000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000001010100e0e0e000000000000121212040404 +0000000d0d0d040404000000000000000000000000080808020202020202020202020202 +020202020202020202020202030303000000000000000000000000000000000000060606 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000707070000000000000000000e0e0e060606000000000000 +0000000000000000000505050a0a0a010101000000000000000000000000000000000000 +0000000000000000000000000505050000000000001d1d1d0000000000001c1c1c000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000606060505050000000000000a0a0a000000060606 +010101000000030303010101000000000000030303000000020202020202020202020202 +0202020202020202020202020000000606060404040000000303030e0e0e000000080808 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer diff --git a/executable_names/doc/slides/users/figures/penguin.eps b/executable_names/doc/slides/users/figures/penguin.eps new file mode 100644 index 0000000000000000000000000000000000000000..46819fc95ef19371934999910391bd01a47c0eee --- /dev/null +++ b/executable_names/doc/slides/users/figures/penguin.eps @@ -0,0 +1,1041 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(TM) 3.2 +%%For: (Neal Tucker) (ntucker@adobe.com) +%%Title: (penguin.eps) +%%CreationDate: (4/29/96) (8:20 AM) +%%BoundingBox: 4 2 221 258 +%%DocumentProcessColors: Black +%%DocumentSuppliedResources: procset Adobe_packedarray 2.0 0 +%%+ procset Adobe_cshow 1.1 0 +%%+ procset Adobe_customcolor 1.0 0 +%%+ procset Adobe_IllustratorA_AI3 1.0 1 +%AI3_ColorUsage: Black&White +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 31 31 583 761 +%AI3_DocumentPreview: Header +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_packedarray 2.0 0 +%%Title: (Packed Array Operators) +%%Version: 2.0 +%%CreationDate: (8/2/90) () +%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_packedarray 5 dict dup begin put +/initialize +{ +/packedarray where + { + pop + } + { + Adobe_packedarray begin + Adobe_packedarray + { + dup xcheck + { + bind + } if + userdict 3 1 roll put + } forall + end + } ifelse +} def +/terminate +{ +} def +/packedarray +{ +array astore readonly +} def +/setpacking +{ +pop +} def +/currentpacking +{ +false +} def +currentdict readonly pop end +%%EndResource +Adobe_packedarray /initialize get exec +%%BeginResource: procset Adobe_cshow 1.1 0 +%%Title: (cshow Operator) +%%Version: 1.1 +%%CreationDate: (1/23/89) () +%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_cshow 3 dict dup begin put +/initialize +{ +/cshow where + { + pop + } + { + userdict /Adobe_cshow_vars 1 dict dup begin put + /_cshow + {} def + Adobe_cshow begin + Adobe_cshow + { + dup xcheck + { + bind + } if + userdict 3 1 roll put + } forall + end + end + } ifelse +} def +/terminate +{ +} def +/cshow +{ +exch +Adobe_cshow_vars + exch /_cshow + exch put + { + 0 0 Adobe_cshow_vars /_cshow get exec + } forall +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_customcolor 1.0 0 +%%Title: (Custom Color Operators) +%%Version: 1.0 +%%CreationDate: (5/9/88) () +%%Copyright: ((C) 1987-1990 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_customcolor 5 dict dup begin put +/initialize +{ +/setcustomcolor where + { + pop + } + { + Adobe_customcolor begin + Adobe_customcolor + { + dup xcheck + { + bind + } if + pop pop + } forall + end + Adobe_customcolor begin + } ifelse +} def +/terminate +{ +currentdict Adobe_customcolor eq + { + end + } if +} def +/findcmykcustomcolor +{ +5 packedarray +} def +/setcustomcolor +{ +exch +aload pop pop +4 + { + 4 index mul 4 1 roll + } repeat +5 -1 roll pop +setcmykcolor +} def +/setoverprint +{ +pop +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_IllustratorA_AI3 1.1 3 +%%Title: (Adobe Illustrator (R) Version 3.0 Abbreviated Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_IllustratorA_AI3 61 dict dup begin put +/initialize +{ +userdict /Adobe_IllustratorA_AI3_vars 58 dict dup begin put +/_lp /none def +/_pf {} def +/_ps {} def +/_psf {} def +/_pss {} def +/_pjsf {} def +/_pjss {} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart [/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0] def +/_renderEnd [null null null null /i1 /i1 /i1 /i1] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading [0 0] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx {} def +/Tj {} def +/CRender {} def +/_AI3_savepage {} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc {} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc {} def +/_i null def +Adobe_IllustratorA_AI3 begin +Adobe_IllustratorA_AI3 + { + dup xcheck + { + bind + } if + pop pop + } forall +end +end +Adobe_IllustratorA_AI3 begin +Adobe_IllustratorA_AI3_vars begin +newpath +} def +/terminate +{ +end +end +} def +/_ +null def +/ddef +{ +Adobe_IllustratorA_AI3_vars 3 1 roll put +} def +/xput +{ +dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if +load begin def end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ +dup length exch stringwidth +exch 5 -1 roll 3 index mul add +4 1 roll 3 1 roll mul add +} def +/swj +{ +dup 4 1 roll +dup length exch stringwidth +exch 5 -1 roll 3 index mul add +4 1 roll 3 1 roll mul add +6 2 roll /_cnt 0 ddef +{1 index eq {/_cnt _cnt 1 add ddef} if} forall pop +exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ +4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow +3 npop +} def +/jss +{ +4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + }ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow +6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow +2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + }ifelse + 2 copy rmoveto + } exch cshow +5 npop +} def +/pl +{ +transform +0.25 sub round 0.25 add exch +0.25 sub round 0.25 add exch +itransform +} def +/setstrokeadjust where + { + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def + } + { + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def + }ifelse +/d +{ +setdash +} def +/cf {} def +/i +{ +dup 0 eq + { + pop cf + } if +setflat +} def +/j +{ +setlinejoin +} def +/J +{ +setlinecap +} def +/M +{ +setmiterlimit +} def +/w +{ +setlinewidth +} def +/H +{} def +/h +{ +closepath +} def +/N +{ +_pola 0 eq + { + _doClip 1 eq {clip /_doClip 0 ddef} if + newpath + } + { + /CRender {N} ddef + }ifelse +} def +/n +{N} def +/F +{ +_pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore clip newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + }ifelse + } + { + /CRender {F} ddef + }ifelse +} def +/f +{ +closepath +F +} def +/S +{ +_pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore clip newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + }ifelse + } + { + /CRender {S} ddef + }ifelse +} def +/s +{ +closepath +S +} def +/B +{ +_pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore clip newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + }ifelse + } + { + /CRender {B} ddef + }ifelse +} def +/b +{ +closepath +B +} def +/W +{ +/_doClip 1 ddef +} def +/* +{ +count 0 ne + { + dup type (stringtype) eq {pop} if + } if +_pola 0 eq {newpath} if +} def +/u +{} def +/U +{} def +/q +{ +_pola 0 eq {gsave} if +} def +/Q +{ +_pola 0 eq {grestore} if +} def +/*u +{ +_pola 1 add /_pola exch ddef +} def +/*U +{ +_pola 1 sub /_pola exch ddef +_pola 0 eq {CRender} if +} def +/D +{pop} def +/*w +{} def +/*W +{} def +/` +{ +/_i save ddef +6 1 roll 4 npop +concat pop +userdict begin +/showpage {} def +0 setgray +0 setlinecap +1 setlinewidth +0 setlinejoin +10 setmiterlimit +[] 0 setdash +/setstrokeadjust where {pop false setstrokeadjust} if +newpath +0 setgray +false setoverprint +} def +/~ +{ +end +_i restore +} def +/O +{ +0 ne +/_of exch ddef +/_lp /none ddef +} def +/R +{ +0 ne +/_os exch ddef +/_lp /none ddef +} def +/g +{ +/_gf exch ddef +/_fc +{ +_lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if +} ddef +/_pf +{ +_fc +fill +} ddef +/_psf +{ +_fc +ashow +} ddef +/_pjsf +{ +_fc +awidthshow +} ddef +/_lp /none ddef +} def +/G +{ +/_gs exch ddef +/_sc +{ +_lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if +} ddef +/_ps +{ +_sc +stroke +} ddef +/_pss +{ +_sc +ss +} ddef +/_pjss +{ +_sc +jss +} ddef +/_lp /none ddef +} def +/k +{ +_cf astore pop +/_fc +{ +_lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if +} ddef +/_pf +{ +_fc +fill +} ddef +/_psf +{ +_fc +ashow +} ddef +/_pjsf +{ +_fc +awidthshow +} ddef +/_lp /none ddef +} def +/K +{ +_cs astore pop +/_sc +{ +_lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if +} ddef +/_ps +{ +_sc +stroke +} ddef +/_pss +{ +_sc +ss +} ddef +/_pjss +{ +_sc +jss +} ddef +/_lp /none ddef +} def +/x +{ +/_gf exch ddef +findcmykcustomcolor +/_if exch ddef +/_fc +{ +_lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if +} ddef +/_pf +{ +_fc +fill +} ddef +/_psf +{ +_fc +ashow +} ddef +/_pjsf +{ +_fc +awidthshow +} ddef +/_lp /none ddef +} def +/X +{ +/_gs exch ddef +findcmykcustomcolor +/_is exch ddef +/_sc +{ +_lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if +} ddef +/_ps +{ +_sc +stroke +} ddef +/_pss +{ +_sc +ss +} ddef +/_pjss +{ +_sc +jss +} ddef +/_lp /none ddef +} def +/A +{ +pop +} def +currentdict readonly pop end +setpacking +/annotatepage +{ +} def +%%EndResource +%%EndProlog +%%BeginSetup +Adobe_cshow /initialize get exec +Adobe_customcolor /initialize get exec +Adobe_IllustratorA_AI3 /initialize get exec +%%EndSetup +0 A +u +*u +0 O +0 g +0 i +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +74.8907 215.0693 m +74.041 243.9622 85.304 256.7226 108.6809 257.1476 c +132.0577 257.5727 146.7214 245.2467 149.6966 229.0954 c +152.6719 212.9441 150.9717 191.6925 156.9222 180.6416 c +162.8727 169.5907 166.698 161.09 176.8988 148.339 c +187.0996 135.588 193.4751 122.6245 196.4503 106.8983 c +199.4255 91.172 201.1257 83.7339 193.4751 75.6583 c +185.8245 67.5827 172.2234 54.4066 162.0226 69.2828 c +156.9158 76.7302 156.362 85.9914 164.9978 87.9843 c +170.5233 89.2594 174.4902 88.8343 178.5989 86.7092 c +182.7076 84.584 183.6993 85.5757 178.7406 89.2594 c +173.7819 92.943 172.7901 89.5427 174.4902 95.4932 c +176.1904 101.4437 178.4436 112.1015 173.7682 123.8608 c +171.6149 129.2767 164.3121 144.122 157.4349 147.7774 C +156.799 148.1155 154.9871 148.8579 156.2138 147.3473 c +158.0807 145.0483 167.9587 130.4785 170.7682 121.7774 c +173.7716 112.4762 174.2069 103.5688 172.6484 97.9017 c +171.09 92.2346 168.3981 89.9678 165.1395 89.9678 c +161.8809 89.9678 158.9057 88.4093 158.9057 95.9182 c +158.9057 103.4272 159.6849 114.7614 155.6471 124.3246 c +151.6093 133.8879 146.7214 140.4759 145.6588 144.5137 c +144.5962 148.5515 142.2585 159.3899 137.3706 165.5529 c +132.4828 171.7159 130.3576 175.7537 132.9078 182.7667 c +135.458 189.7798 133.5453 191.6925 128.4449 193.1801 c +123.3445 194.6677 116.544 196.7929 114.8439 200.1931 c +113.1437 203.5934 114.2063 210.3939 118.0316 212.0941 c +121.8569 213.7942 128.2324 211.4565 128.4449 206.5686 c +128.6575 201.6807 126.3198 199.1305 126.9573 198.068 c +127.5949 197.0054 130.9951 195.3052 132.6953 197.2179 c +134.3954 199.1305 134.8204 205.081 133.1203 210.6064 c +131.4202 216.1319 130.5701 219.9572 124.4071 221.2323 c +118.2441 222.5074 115.4814 222.0823 112.5062 218.257 c +109.531 214.4317 108.2559 208.2688 109.1059 203.8059 c +109.956 199.3431 108.2559 201.8933 105.2806 202.1058 c +102.3054 202.3183 103.1555 202.5308 100.1802 202.3183 c +97.205 202.1058 98.2676 204.0184 98.055 207.2062 c +97.8425 210.3939 97.4175 216.9819 92.9546 219.5321 c +88.4918 222.0823 80.8412 219.1071 81.0537 208.4813 c +81.2662 197.8554 84.879 192.755 87.0042 196.5803 c +89.1293 200.4056 88.0668 198.493 85.9416 200.1931 c +83.8164 201.8933 82.3288 208.9063 84.6665 211.0315 c +87.0042 213.1566 89.7669 213.1566 91.2545 211.8815 c +92.7421 210.6064 95.0798 206.3561 94.6548 203.5934 c +94.2297 200.8307 94.0172 200.6182 91.2545 198.7055 c +88.4918 196.7929 87.4292 195.0927 84.2415 192.9676 c +81.0537 190.8424 79.7786 185.9545 82.3288 184.6794 c +84.879 183.4043 85.0915 183.6168 87.2167 180.4291 c +89.3419 177.2413 92.9546 175.7537 101.8804 177.2413 c +110.8061 178.7289 114.472 180.8449 121.2194 183.1918 c +126.1073 184.8919 124.4071 184.6794 126.1073 186.5921 c +127.8074 188.5047 130.5701 185.742 128.0199 184.0419 c +125.4697 182.3417 119.7318 180.6416 115.4814 179.154 c +111.2311 177.6663 106.3432 173.416 97.4175 173.841 c +88.4918 174.2661 94.6548 174.0536 91.8921 174.2661 c +89.1293 174.4786 87.8542 174.0536 90.8295 171.9284 c +93.8047 169.8032 93.5922 169.1657 96.1424 168.3156 c +98.6926 167.4655 102.0929 167.4655 106.1307 168.9532 c +110.1685 170.4408 120.3693 174.9036 123.5571 177.0288 c +126.7448 179.154 129.295 176.3912 126.1073 174.2661 c +122.9195 172.1409 122.0694 172.7785 119.0942 170.8658 c +116.119 168.9532 110.5935 165.7654 106.9808 162.3651 c +103.368 158.9649 102.5179 158.7523 98.055 158.5398 c +93.5922 158.3273 90.8295 163.0027 88.9168 165.1278 c +87.0042 167.253 87.2167 168.5281 84.879 171.0783 c +82.5413 173.6285 82.3288 172.991 81.9038 170.2283 c +81.4787 167.4655 78.291 160.4525 75.5283 155.7771 c +72.7655 151.1017 72.553 145.3638 72.9781 141.326 c +73.4031 137.2882 72.3405 136.8631 69.1528 132.1878 c +65.965 127.5124 60.6521 113.6988 59.802 109.2359 c +58.952 104.7731 57.8894 95.6349 58.3144 90.3219 c +58.7394 85.009 57.2518 83.9464 53.4265 87.5592 c +49.6012 91.172 48.3261 95.2098 48.5386 100.5227 c +48.7204 105.068 49.3516 108.2774 49.9349 109.9441 c +50.5182 111.6108 49.9557 112.7983 48.7512 110.7236 c +46.1324 106.2131 45.9884 98.3976 46.626 95.6349 c +47.2635 92.8721 47.4761 87.9843 54.4891 81.3962 c +61.5022 74.8082 71.703 65.67 80.2036 59.507 c +88.7043 53.344 91.6795 45.6934 79.141 40.168 C +87.0042 29.5421 91.2545 24.0167 87.8542 17.0037 C +94.8673 21.0415 92.1685 30.5606 88.7682 33.1108 c +85.368 35.661 87.4292 37.6178 90.4044 35.7051 c +93.3797 33.7925 94.4423 29.9672 106.1307 30.1797 c +117.8191 30.3922 130.4218 31.5766 137.4349 41.7774 c +144.4479 51.9783 145.8017 43.3946 144.1016 37.4441 c +142.4014 31.4936 138.2207 18.0662 144.8087 19.3413 C +145.6588 27.2045 147.5715 34.005 147.5715 42.5057 c +147.5715 51.0063 148.4349 55.1108 147.7682 67.4441 c +147.1259 79.3277 152.2468 80.1211 157.5597 80.1211 c +162.8727 80.1211 161.1725 76.7209 157.7723 76.9334 c +154.372 77.1459 150.7592 75.8708 150.5467 67.1576 c +150.3342 58.4444 150.5467 59.2945 152.0343 51.4314 c +153.5219 43.5682 153.7344 41.2306 152.4593 32.5174 c +151.1842 23.8042 150.1217 19.1288 155.8596 13.8159 c +161.5976 8.503 170.3108 9.9906 174.7736 13.3909 c +179.2365 16.7911 187.7371 24.6543 195.3877 27.2045 c +203.0383 29.7547 211.114 31.6673 215.3643 35.9176 c +219.6147 40.168 218.5521 43.1432 214.0892 45.4809 c +209.6264 47.8186 205.376 46.756 201.9757 50.5813 c +198.5755 54.4066 196.8753 62.9073 198.1504 67.3701 c +199.4255 71.833 200.9132 69.9203 200.9132 66.7326 c +200.9132 63.5448 201.1257 60.5696 204.3134 56.5318 c +207.5012 52.494 210.4764 50.5813 215.5768 47.3936 c +220.6772 44.2058 223.865 39.1054 217.4895 34.6425 c +211.114 30.1797 207.5012 27.6295 202.1883 25.5043 c +196.8753 23.3792 188.1622 18.2788 182.8492 12.9658 c +177.5363 7.6529 174.5611 2.9776 164.1478 2.9776 c +153.7344 2.9776 148.9787 5.4759 145.8713 11.6907 c +143.7462 15.9411 142.6836 15.3035 137.7957 15.516 c +132.9078 15.7286 116.544 15.9411 103.793 15.7286 c +91.042 15.516 86.7917 13.3909 81.0537 8.7155 c +75.3157 4.0401 73.1906 0.4273 62.3522 4.0401 c +51.5139 7.6529 45.7759 11.6907 29.6246 14.8785 c +13.4734 18.0662 22.1865 16.5786 12.4108 18.7038 c +2.635 20.829 3.2726 25.5043 4.5477 29.3296 c +5.8228 33.1549 9.0105 39.1054 6.2478 46.9685 c +3.4851 54.8316 4.5477 62.9073 11.9857 62.9073 c +19.4238 62.9073 26.4369 61.4197 29.4121 71.1954 c +32.3874 80.9712 33.2374 73.3206 32.3874 70.7704 c +31.5373 68.2202 31.1123 61.2071 24.5242 60.1446 c +17.9362 59.082 16.4486 60.5696 12.4108 60.5696 c +8.373 60.5696 6.6728 57.8069 8.798 53.1315 c +10.9232 48.4561 13.2608 43.5682 12.8358 39.5304 c +12.4108 35.4926 11.9857 34.005 9.0105 30.1797 c +6.0353 26.3544 6.4603 24.4417 11.7732 23.1666 c +17.0861 21.8915 26.6494 19.3413 35.5751 17.2162 c +44.5008 15.091 45.1384 15.091 60.6521 11.0532 c +76.1658 7.0154 80.4161 14.2409 81.6912 22.9541 c +82.9664 31.6673 77.0159 39.9555 71.4904 48.2436 c +65.965 56.5318 60.0145 66.095 52.789 74.8082 c +45.5634 83.5214 41.3131 84.159 37.7003 82.2463 c +34.0875 80.3337 33.4499 80.7587 33.2374 85.6466 c +33.0249 90.5345 32.5999 93.7222 36.6377 100.9478 c +40.6755 108.1734 44.2883 116.0365 48.5386 128.1499 c +52.789 140.2634 56.6143 142.6011 63.8398 153.0144 c +71.0654 163.4277 67.8777 159.3899 72.9781 166.4029 c +78.0785 173.416 76.5908 172.1409 76.1658 183.1918 c +75.7408 194.2427 75.3157 200.6182 74.8907 215.0693 c +f +1 D +54.5971 128.6793 m +55.6961 127.3382 57.2428 130.4814 58.871 131.6548 c +60.3363 132.9959 60.9469 134.8818 60.6213 136.7258 c +60.4584 137.7316 58.8303 137.3963 58.5046 137.0611 c +57.5278 136.0552 57.7262 134.4523 57.0393 133.0378 c +56.2252 131.3615 53.498 130.0204 54.5971 128.6793 c +f +145.951 173.0707 m +148.2714 171.137 149.6701 169.4579 150.9452 172.3269 c +152.2203 175.1958 152.2203 176.3647 149.1388 177.5335 c +146.0573 178.7024 144.6759 179.9775 143.2946 181.5713 c +141.9132 183.1652 141.4224 180.4368 142.5507 177.746 c +143.9321 174.452 144.7375 174.0819 145.951 173.0707 c +f +98.0873 199.4234 m +96.4935 199.7421 94.5808 199.6359 93.5182 198.3608 c +93.0932 197.9357 93.3057 196.7669 94.0495 196.4481 c +95.0058 196.0231 95.6434 196.9794 95.8559 197.7232 c +95.9622 198.042 96.0684 198.467 96.3872 198.5733 c +96.8122 198.7858 97.4336 198.6093 97.8748 198.7858 c +98.4061 198.9983 98.1936 199.4234 98.0873 199.4234 c +f +105.5994 199.1305 m +106.2369 198.1742 107.4058 198.1742 108.3621 197.7492 c +108.8934 197.5367 109.956 197.2179 110.2748 197.9617 c +111.0186 200.2994 107.8346 199.5556 106.3432 199.5556 c +106.0244 199.5556 105.2806 199.6618 105.5994 199.1305 c +f +121.1016 209.4441 m +122.5269 209.3691 124.5182 206.7774 124.7124 203.8036 c +124.7431 203.3336 125.9489 203.3623 126.2015 203.838 c +126.8964 205.0116 126.4187 206.3414 126.0992 207.7666 c +125.8436 208.9067 124.4549 210.1084 123.2792 210.6309 c +122.4954 211.0229 121.7116 211.1535 120.6665 211.0229 c +120.4052 210.8922 119.5182 209.5274 121.1016 209.4441 c +f +89.4377 210.1679 m +88.1053 210.0672 88.5823 209.0454 88.6441 208.2274 C +90.4855 207.1912 90.6621 204.8539 91.0372 203.0018 c +91.0901 202.3005 92.1243 202.6138 92.2235 202.8563 c +93.0524 204.3294 92.0434 206.0161 91.6772 207.7514 c +91.3728 208.6687 90.7674 209.6807 89.8964 210.3201 c +89.7707 210.4281 89.5546 210.1767 89.4377 210.1679 c +f +130.0182 242.7358 m +128.7024 243.8124 126.6432 244.2358 126.0182 242.4858 c +125.3932 240.9858 125.6432 239.4858 125.2682 237.8608 c +125.2682 237.3608 124.6432 237.2358 124.2682 236.7358 c +123.7682 236.1108 123.8932 235.3608 124.1432 235.1108 c +125.3932 233.8608 127.6432 236.3608 129.2682 237.2358 c +130.5182 237.9858 132.2682 236.9858 133.6432 237.8608 c +134.0182 238.1108 134.1432 238.7358 133.7682 239.2358 c +132.8932 240.7358 131.3932 241.6108 130.0182 242.7358 c +f +*U +0 D +168.2848 73.7743 m +168.5016 74.6532 168.9399 76.3409 169.7682 76.6108 c +170.0768 76.7112 170.3298 76.5961 170.4302 76.2876 c +170.6103 75.7354 170.0485 72.6062 170.2761 71.9079 c +170.5247 71.1445 171.3895 71.2465 172.023 71.4529 c +173.4685 71.9237 174.2959 73.6304 174.2429 73.7927 c +174.2219 73.8576 174.1949 73.8848 174.1464 73.869 c +173.9189 73.7949 173.7245 73.013 173.0585 72.7962 c +172.6525 72.6638 172.3397 72.7417 172.2023 73.164 c +172.0594 73.6024 172.6218 76.8395 172.3784 77.5868 c +172.1352 78.3338 171.3801 78.5011 170.698 78.2789 c +169.1062 77.7604 168.4145 75.3615 168.0211 73.922 C +167.9833 73.9276 L +168.1952 77.2482 L +166.2463 76.6135 L +166.145 69.7539 L +167.9804 70.3516 L +168.0209 71.5506 168.0627 72.9115 168.2848 73.7743 c +f +176.8278 73.0178 m +178.4034 73.5309 179.1132 75.4328 179.0445 75.644 c +179.0232 75.709 178.9751 75.7472 178.9263 75.7312 c +178.7964 75.6889 178.4863 74.6 177.593 74.309 c +177.2032 74.182 176.8475 74.2816 176.7627 74.5416 c +176.6359 74.9313 176.7162 75.6223 176.7309 76.1839 C +176.7792 79.2896 L +178.9394 79.993 L +178.9284 80.7439 L +176.7519 80.0351 L +176.8533 82.9783 L +174.9009 81.8573 L +174.8182 75.3274 L +174.8024 74.6037 174.7658 73.9989 174.8716 73.6741 c +175.1466 72.8296 176.0159 72.7535 176.8278 73.0178 c +f +U +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_IllustratorA_AI3 /terminate get exec +Adobe_customcolor /terminate get exec +Adobe_cshow /terminate get exec +Adobe_packedarray /terminate get exec +%%EOF diff --git a/executable_names/doc/slides/users/figures/rule-glow.ps b/executable_names/doc/slides/users/figures/rule-glow.ps new file mode 100644 index 0000000000000000000000000000000000000000..9a45a394426daae8dddda0ed082b57ff24b35aa3 --- /dev/null +++ b/executable_names/doc/slides/users/figures/rule-glow.ps @@ -0,0 +1,230 @@ +%!PS-Adobe-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /g/g0/grondo/proj/slurm/doc/slides/users/rule-glow.ps +%%CreationDate: Fri Apr 4 12:50:20 2003 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 513 49 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 34.560000 translate +498.240000 -34.560000 scale +% Image geometry +692 48 8 +% Transformation matrix +[ 692 0 0 48 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 692 string def +/gstr 692 string def +/bstr 692 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 9049 ASCII Bytes +colorimage +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +!!*!"#6P)3"U52:#lY,7$4I=P%1WmH&,d&j&V1OF&V1OO&cE:>%fd+=%K?h:$N:>:#R:S="U"r1 +rW<*"J,~> +'`\FC#71bG%1a'a'GhQ'*$-.D+s\H5-35MDq^V1fJLl@'JLl@'X=Wrnq^MUq./kP/,U+ET*Zc:= +(Ddbu&e>EZ$OI%C"onXR~> +JH16$JH16$JH3ppJ,~> +!rrB)"9&H0"pYD>$4@4M%K6n;&cNCC'D`F7'nI-O(4d6P(9A;C(&AUE'E/XD&cN:H%1EUP$4$nB +#6"f+!s/N(!.Y~> +'`\IF#n.:R&JGoq)B9_=+snWb.P*.M0*F!b1G^le21[Z:2M!c;2NTir2$>`l1GU]a0,?)g.OZVj ++s.dE)AX)%&Io9Z#mgh:!.Y~> +JH16$JH16$JH3ppJ,~> +(]XXA"U52:#RLkH$k]i'GV>u(Dm#er>C/)JJs(XJJsUgr>GPNrtcIe'bh>q&eYce%LrmT +$OI(D#6k>8!rr=O~> +*<6BS$kEs`'Gqf0+!W!X.P<>.1c@6O4$,Pg5 +JH16$JH16$JH3ppJ,~> +(]XXA"U52:#RLkH$k]i'GV>u(Dm#er>C/)JJs(XJJsUgr>GPNrtcIe'bh>q&eYce%LrmT +$OI(D#6k>8!rr=O~> +*<6BS$kEs`'Gqf0+!W!X.P<>.1c@6O4$,Pg5 +JH16$JH16$JH3ppJ,~> +)up*F"U>;=#n%1O%hK9b'G_H#(`=20)]Kb:*?G&!JKKFbJKKFbOrsTCruM+Zru2am)&O2,()@Ss +&.f?]%1 +)upBW%MBHi(`X\B-7UJu1H%-P5!_J%77B^;8kT(Us%N&ZJPLbkJPLbkXA8C^s%NDbs%45$7n#j6 +5s@In2E!?E.Olbg+WM=5'G:lc$ig9X~> +JH16$JH16$JH3ppJ,~> +)#sgF#7(VB$k3^X&JPoo(`=21*$-.C+ ++TMua&JQ'!*?ljY/2At=4@)8$85)]Q;,L7m='&L,=^##$>Cg%1>_-.2>c_3&>Q7n,=WU[H=&r6s +;,9kV845a04>nrM/12eh*>fV-&J5KQ!.Y~> +JH16$JH16$JH3ppJ,~> +)#sgF#7(VB$k3^X&JPoo(`=21*$-.C+ ++TMua&JQ'!*?ljY/2At=4@)8$85)]Q;,L7m='&L,=^##$>Cg%1>_-.2>c_3&>Q7n,=WU[H=&r6s +;,9kV845a04>nrM/12eh*>fV-&J5KQ!.Y~> +JH16$JH16$JH3ppJ,~> +*<69K#71bG%1a'a'GhQ')]]q@+X/*U,palb-RU>@.=it".Y0(#.Zu:[.39lb-RL/d,pXZX+Wh^F +)]9G.'G;#h%1 ++TN#d',V]/+t,&r1cdZ_77p0J<*37-?=%&LAS#IdB4tuNBn:#MC4U,NC921BC&_lHB-(YrAR](S +?',(lV!.Y~> +JH16$JH16$JH3ppJ,~> +)up3L#RV"M%h]Qj(E+23+!DdQ-7:/i.Olr"/M6rSJM2R-JM2R-N\CAas",0@.k3"t-RL/c+X%pI +)B'D+'G:oc%13@H#64aS~> ++TN,j()nD?-S@864$l8):K1:t?XmSZCMRg,EcQ5CFEVj"GCb!iG_(*jGcZ/^GQ2jdF<5LDEc>o3 +CM73b?X$K/:Imf=4#JlJ-QsWP()@M_!.Y~> +JH16$JH16$JH3ppJ,~> +)#spK#n.=T&JQ#t)BBh@,:4`c.P*,'0/#$Y1&s-/2"WYV2M!c;2M!cf2Y8m*1]T?21)_i"0.ne* +.OZVj,9S!I)Aa2(&J#B\#mgk;!.Y~> ++TN2o)':1P/2TFM6:sjI=^PNJCN+67G^+RaIt*$%K7npMKn5&2Lk1A5LocF)L&Zi+K-#SnIsu`h +G][n?CM$p\=]%d`69@7c/1)\c)&X+g!.Y~> +JH16$JH16$JH3ppJ,~> +)#spK#n.=T&JQ#t)BBh@,:4`c.P*,'0/#$Y1&s-/2"WYV2M!c;2M!cf2Y8m*1]T?21)_i"0.ne* +.OZVj,9S!I)Aa2(&J#B\#mgk;!.Y~> ++TN2o)':1P/2TFM6:sjI=^PNJCN+67G^+RaIt*$%K7npMKn5&2Lk1A5LocF)L&Zi+K-#SnIsu`h +G][n?CM$p\=]%d`69@7c/1)\c)&X+g!.Y~> +o`0ODJH:<&JH:<&kQ1\doDjC~> +$NLJ@$OmXY',DK)*J"6B!J(9&!J(:8!WN92*?#h3'+b]a$O[7@!.Y~> +$NLt_*$Qj^0f_Qe8q@"o!J(9&!J(:8!WN928jYj)0e+Xs*#oap!.Y~> +o`5!mJHUN,JHUN,JHY9A!XJo3oDjC~> +%0-\C$kEs`'c7o1*ruCn"G$],"G$],"R?1$#Qt8P*#oe1&eY]`$jcn6J,~> +%0.7f+!rTm2Es]%:]UTJ"G$],"G$],"R?1$#Qt9,7n5d%/hSIm*uP%YJ,~> +o`5!m!!IiYJI$f4JI$f4m0Ee'#Qt;&!.Y~> +%KHhF%1j0d(E+A;+oq]IJI$f4JI$f4JI(WK&.JmJ" +%KIFl+t56$3^ZV9 +o`5!m!!IiYJI$f4JI$f4m0Ee'#Qt;&!.Y~> +%KHhF%1j0d(E+A;+oq]IJI$f4JI$f4JI(WK&.JmJ" +%KIFl+t56$3^ZV9 +o`5!m!<`[Z%=nt>%=nt>%Iai,&H`IJ"9e>sJ,~> +%fctI%M9Bh(`XY@,ln#L#_%=nuX%K@"O%1!(>,p4 +%fdRp,V1f15"JRL>las/#_%=nuX%K@"O%1!(>>uFQk4uG2K,U=?0!.Y~> +o`5!m!sAl=%=o+B&V1OF&V1Pc&I'$`&If!K"S;\E~> +&HE4M%h]Wn)BL(H-34,M#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt8W+sJ'H()@Mn%h&F +&HEn"-8.;:6;(B]@0$B3#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt9=='&$]2`EB:-6E3fJ,~> +o`5!m!sAl=%=o+B&V1OF&V1Pc&I'$`&If!K"S;\E~> +&HE4M%h]Wn)BL(H-34,M#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt8W+sJ'H()@Mn%h&F +&HEn"-8.;:6;(B]@0$B3#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt9=='&$]2`EB:-6E3fJ,~> +o`5!m"9\u>%2".-JJWkRJJWkRp)!`L"r@j`%1!(>oDjC~> +&c`=N%h]Wn)BU1K-ij>O#Rq4TJJWkRJJWkRJJ\"rruDah&J5HX"9^+t,9Ig>((q,g$ig9X~> +&ca"$-SIJ?6V^fgAH;f7#Rq4TJJWkRJJWkRJJ\"rruDah&J5HX"9`:>>#%FF3A2a-*rl:k~> +o`5!m"U#)?%1sD-*J#5^*J#5^*V^W],TRmA&J5HX"9e>sJ,~> +'*&IP%hf`q)]p=N.00GP#Rq4T(P*TX*J#5^*J#7+*>Tn@*>];"%1!(>.3p/\)]';(%hB*L!.Y~> +'*'.'-o!eF78R5oB)r#9#Rq4T(P*TX*J#5^*J#7+*>Tn@*>];"%1!(>B3\\<76 +o`5!m#6Y;A%1sBs*J#Je,_74l,_76<,RQ%I*?>q.&If!K"S;\E~> +'`\[S&/5ru*$?OR.KKPQ#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt8[,paZR(`3qu&.JU> +J,~> +'`]C+.5F"J7T!GsB`S5;#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt9E?!U;s4?PAJ.3SZk +J,~> +o`5!m#6Y;A%1sBs*J#Je,_74l,_76<,RQ%I*?>q.&If!K"S;\E~> +'`\[S&/5ru*$?OR.KKPQ#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt8[,paZR(`3qu&.JU> +J,~> +'`]C+.5F"J7T!GsB`S5;#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt9E?!U;s4?PAJ.3SZk +J,~> +o`5!m#6Y;A%1sBs*J#_l.tK4%.tK5I.g[IA*>];"%1!(>oDjC~> +'`\[S&/5ru*$?OR.KKPQ#Rq4T(EFNI.tK4%.tK4%/,Cb3,TRmA&J5HX"9^2#,p40E(_dMm%0-BY~> +'`]C+.5F"J7T!GsB`S5;#Rq4T(EFNI.tK4%.tK4%/,Cb3,TRmA&J5HX"9`FE>u='R4>J?7+TMLm~> +o`5!m"U#)?%1sD-,_74l,_74l,kiSa* +'*&IP%hf`q)]p=N.00GP#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt8Z,U=HN(Dd_q%h/L=J,~> +'*'.'-o!eF78R5oB)r#9#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt9C>[1)o4$,/F-m/KiJ,~> +o`5!m"U#)?%1sD-,_74l,_74l,kiSa* +'*&IP%hf`q)]p=N.00GP#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt8Z,U=HN(Dd_q%h/L=J,~> +'*'.'-o!eF78R5oB)r#9#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt9C>[1)o4$,/F-m/KiJ,~> +o`5!m"9\u>%2".3JK9:^JK9:^oGn,P&J5HX"9e>sJ,~> +&c`=N%h]Wn)BU1K-ij>O#Rq4TJK9:^JK9:^JK=A'',M5m%1!(>-mKrY)AX)$%hB'K!.Y~> +&ca"$-SIJ?6V^fgAH;f7#Rq4TJK9:^JK9:^JK=A'',M5m%1!(>AQi846TI.[-RTu9!.Y~> +o`5!m!sAl=%=o=H(P*BR(P*Cn(]P'L%1!(>oDjC~> +&HE4M%h]Wn)BL(H-34,M#Rq5o(P*BR(P*BR(\/CB&J,BW"9^%q+s%X<((q,g$ig9X~> +&HEn"-8.;:6;(B]@0$B3#Rq5o(P*BR(P*BR(\/CB&J,BW"9`.7=%bk=2_QL)*rl:k~> +o`5!m!<`[Z&V1OF&V1OF&ag55%1!(>oDjC~> +%fctI%M9Bh(`XY@,ln#L#_ +%fdRp,V1f15"JRL>las/#_ +o`5!m!<`[Z&V1OF&V1OF&ag55%1!(>oDjC~> +%fctI%M9Bh(`XY@,ln#L#_ +%fdRp,V1f15"JRL>las/#_ +o`5!m!!Ii^JIR/>JIR/>ljX"%"9e>sJ,~> +%KHhF%1j0d(E+A;+oq]IJIR/>JIR/>JIUrT%gW:@+s.mF(D@Gn%1NXE!.Y~> +%KIFl+t56$3^ZV9JIR/>JIUrT%gW:@=%uCV3\`?<+sIs+!.Y~> +o`5!mJI$f4JI$f4JI(NHrrhroJ,~> +%0-\C$kEs`'c7o1*ruCn#_<84#_<84#jM]q":Q@l*#KD'&e>BZ#ljsU~> +%0.7f+!rTm2Es]%:]UTJ#_<84#_<84#jM]q":S*s7mAma/g_Y^)#sYe~> +o`5!mJI$f4JI$f4JI(NHrrhroJ,~> +%0-\C$kEs`'c7o1*ruCn#_<84#_<84#jM]q":Q@l*#KD'&e>BZ#ljsU~> +%0.7f+!rTm2Es]%:]UTJ#_<84#_<84#jM]q":S*s7mAma/g_Y^)#sYe~> +o`0OGJHUN,JHUN,jok;VJ,~> +$NLJ@$OmXY',DK)*J"?E"G$],"G$^<":Q:h)AWtt&.K!T#ljsU~> +$NLt_*$Qj^0f_Qe8q@+r"G$],"G$^<":Rmh69-bM.O#iP(B=Gc~> +JH16$JH16$JH3ppJ,~> +)#spK#n.=T&JQ#t)BBh@,:4`c.P*,'0/#$Y1&s-/2"WYV2M!c;2M!cf2Y8m*1]T?21)_i"0.ne* +.OZVj,9S!I)Aa2(&J#B\#mgk;!.Y~> ++TN2o)':1P/2TFM6:sjI=^PNJCN+67G^+RaIt*$%K7npMKn5&2Lk1A5LocF)L&Zi+K-#SnIsu`h +G][n?CM$p\=]%d`69@7c/1)\c)&X+g!.Y~> +JH16$JH16$JH3ppJ,~> +)up3L#RV"M%h]Qj(E+23+!DdQ-7:/i.Olr"/M6rSJM2R-JM2R-N\CAas",0@.k3"t-RL/c+X%pI +)B'D+'G:oc%13@H#64aS~> ++TN,j()nD?-S@864$l8):K1:t?XmSZCMRg,EcQ5CFEVj"GCb!iG_(*jGcZ/^GQ2jdF<5LDEc>o3 +CM73b?X$K/:Imf=4#JlJ-QsWP()@M_!.Y~> +JH16$JH16$JH3ppJ,~> +)up3L#RV"M%h]Qj(E+23+!DdQ-7:/i.Olr"/M6rSJM2R-JM2R-N\CAas",0@.k3"t-RL/c+X%pI +)B'D+'G:oc%13@H#64aS~> ++TN,j()nD?-S@864$l8):K1:t?XmSZCMRg,EcQ5CFEVj"GCb!iG_(*jGcZ/^GQ2jdF<5LDEc>o3 +CM73b?X$K/:Imf=4#JlJ-QsWP()@M_!.Y~> +JH16$JH16$JH3ppJ,~> +*<69K#71bG%1a'a'GhQ')]]q@+X/*U,palb-RU>@.=it".Y0(#.Zu:[.39lb-RL/d,pXZX+Wh^F +)]9G.'G;#h%1 ++TN#d',V]/+t,&r1cdZ_77p0J<*37-?=%&LAS#IdB4tuNBn:#MC4U,NC921BC&_lHB-(YrAR](S +?',(lV!.Y~> +JH16$JH16$JH3ppJ,~> +)#sgF#7(VB$k3^X&JPoo(`=21*$-.C+ ++TMua&JQ'!*?ljY/2At=4@)8$85)]Q;,L7m='&L,=^##$>Cg%1>_-.2>c_3&>Q7n,=WU[H=&r6s +;,9kV845a04>nrM/12eh*>fV-&J5KQ!.Y~> +JH16$JH16$JH3ppJ,~> +)up*F"U>;=#n%1O%hK9b'G_H#(`=20)]Kb:*?G&!JKKFbJKKFbOrsTCruM+Zru2am)&O2,()@Ss +&.f?]%1 +)upBW%MBHi(`X\B-7UJu1H%-P5!_J%77B^;8kT(Us%N&ZJPLbkJPLbkXA8C^s%NDbs%45$7n#j6 +5s@In2E!?E.Olbg+WM=5'G:lc$ig9X~> +JH16$JH16$JH3ppJ,~> +)up*F"U>;=#n%1O%hK9b'G_H#(`=20)]Kb:*?G&!JKKFbJKKFbOrsTCruM+Zru2am)&O2,()@Ss +&.f?]%1 +)upBW%MBHi(`X\B-7UJu1H%-P5!_J%77B^;8kT(Us%N&ZJPLbkJPLbkXA8C^s%NDbs%45$7n#j6 +5s@In2E!?E.Olbg+WM=5'G:lc$ig9X~> +JH16$JH16$JH3ppJ,~> +(]XXA"U52:#RLkH$k]i'GV>u(Dm#er>C/)JJs(XJJsUgr>GPNrtcIe'bh>q&eYce%LrmT +$OI(D#6k>8!rr=O~> +*<6BS$kEs`'Gqf0+!W!X.P<>.1c@6O4$,Pg5 +JH16$JH16$JH3ppJ,~> +!rrB)"9&H0"pYD>$4@4M%K6n;&cNCC'D`F7'nI-O(4d6P(9A;C(&AUE'E/XD&cN:H%1EUP$4$nB +#6"f+!s/N(!.Y~> +'`\IF#n.:R&JGoq)B9_=+snWb.P*.M0*F!b1G^le21[Z:2M!c;2NTir2$>`l1GU]a0,?)g.OZVj ++s.dE)AX)%&Io9Z#mgh:!.Y~> +JH16$JH16$JH3ppJ,~> +!rrB)"9&H0"pYD>$4@4M%K6n;&cNCC'D`F7'nI-O(4d6P(9A;C(&AUE'E/XD&cN:H%1EUP$4$nB +#6"f+!s/N(!.Y~> +'`\IF#n.:R&JGoq)B9_=+snWb.P*.M0*F!b1G^le21[Z:2M!c;2NTir2$>`l1GU]a0,?)g.OZVj ++s.dE)AX)%&Io9Z#mgh:!.Y~> +JH16$JH16$JH3ppJ,~> +!!*!"#6P)3"U52:#lY,7$4I=P%1WmH&,d&j&V1OF&V1OO&cE:>%fd+=%K?h:$N:>:#R:S="U"r1 +rW<*"J,~> +'`\FC#71bG%1a'a'GhQ'*$-.D+s\H5-35MDq^V1fJLl@'JLl@'X=Wrnq^MUq./kP/,U+ET*Zc:= +(Ddbu&e>EZ$OI%C"onXR~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/slides/users/figures/slides.ps b/executable_names/doc/slides/users/figures/slides.ps new file mode 100644 index 0000000000000000000000000000000000000000..19110208332d854652f5daa506bd42e01021de29 --- /dev/null +++ b/executable_names/doc/slides/users/figures/slides.ps @@ -0,0 +1,6719 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software +%%Title: slides.dvi +%%Pages: 2 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%DocumentFonts: AvantGarde-Demi AvantGarde-DemiOblique Helvetica +%%+ Courier +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips -K slides +%DVIPSParameters: dpi=600, compressed, comments removed +%DVIPSSource: TeX output 2003.04.07:0945 +%%BeginProcSet: texc.pro +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 +1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx +0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx +sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ +rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp +gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B +/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ +/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ +A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy +get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} +ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp +fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 +{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add +chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ +1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} +forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: pstricks.pro +% PostScript prologue for pstricks.tex. +% Version 97 patch 3, 98/06/01 +% For distribution, see pstricks.tex. +% +/tx@Dict 200 dict def tx@Dict begin +/ADict 25 dict def +/CM { matrix currentmatrix } bind def +/SLW /setlinewidth load def +/CLW /currentlinewidth load def +/CP /currentpoint load def +/ED { exch def } bind def +/L /lineto load def +/T /translate load def +/TMatrix { } def +/RAngle { 0 } def +/Atan { /atan load stopped { pop pop 0 } if } def +/Div { dup 0 eq { pop } { div } ifelse } def +/NET { neg exch neg exch T } def +/Pyth { dup mul exch dup mul add sqrt } def +/PtoC { 2 copy cos mul 3 1 roll sin mul } def +/PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def } +def +/PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def +} { /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ } +/pathforall load stopped { pop pop pop pop } if z } def +/STP { .996264 dup scale } def +/STV { SDict begin normalscale end STP } def +/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def +PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y +mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul +/y ED x mul /x ED x 0 gt y 0 gt and { [ y x ] 1 a sub y mul } { [ 1 0 ] +0 } ifelse setdash stroke } def +/DotLine { /b PathLength def /a ED /z ED /y CLW def /z y z add def a 0 gt +{ /b b a div def } { a 0 eq { /b b y sub def } { a -3 eq { /b b y add +def } if } ifelse } ifelse [ 0 b b z Div round Div dup 0 le { pop 1 } if +] a 0 gt { 0 } { y 2 div a -2 gt { neg } if } ifelse setdash 1 +setlinecap stroke } def +/LineFill { gsave abs CLW add /a ED a 0 dtransform round exch round exch +2 copy idtransform exch Atan rotate idtransform pop /a ED .25 .25 +% DG/SR modification begin - Dec. 12, 1997 - Patch 2 +%itransform translate pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a +itransform pathbbox /y2 ED a Div ceiling cvi /x2 ED /y1 ED a +% DG/SR modification end +Div cvi /x1 ED /y2 y2 y1 sub def clip newpath 2 setlinecap systemdict +/setstrokeadjust known { true setstrokeadjust } if x2 x1 sub 1 add { x1 +% DG/SR modification begin - Jun. 1, 1998 - Patch 3 (from Michael Vulis) +% a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore } +% def +a mul y1 moveto 0 y2 rlineto stroke /x1 x1 1 add def } repeat grestore +pop pop } def +% DG/SR modification end +/BeginArrow { ADict begin /@mtrx CM def gsave 2 copy T 2 index sub neg +exch 3 index sub exch Atan rotate newpath } def +/EndArrow { @mtrx setmatrix CP grestore end } def +/Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED { 0 h T 1 -1 +scale } if w neg h moveto 0 0 L w h L w neg a neg rlineto gsave fill +grestore } def +/Tbar { CLW mul add /z ED z -2 div CLW 2 div moveto z 0 rlineto stroke 0 +CLW moveto } def +/Bracket { CLW mul add dup CLW sub 2 div /x ED mul CLW add /y ED /z CLW 2 +div def x neg y moveto x neg CLW 2 div L x CLW 2 div L x y L stroke 0 +CLW moveto } def +/RoundBracket { CLW mul add dup 2 div /x ED mul /y ED /mtrx CM def 0 CLW +2 div T x y mul 0 ne { x y scale } if 1 1 moveto .85 .5 .35 0 0 0 +curveto -.35 0 -.85 .5 -1 1 curveto mtrx setmatrix stroke 0 CLW moveto } +def +/SD { 0 360 arc fill } def +/EndDot { { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS +CLW sub SD } if 0 DS z add CLW 4 div sub moveto } def +/Shadow { [ { /moveto load } { /lineto load } { /curveto load } { +/closepath load } /pathforall load stopped { pop pop pop pop CP /moveto +load } if ] cvx newpath 3 1 roll T exec } def +/NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch +cvi def } def +/NArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if +f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def +/Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub +def n { Lineto } repeat CP 4 2 roll ArrowB L pop pop } if } def +/Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 } +ifelse { pop } repeat a } def +/CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq +and { pop pop /n n 1 sub def } if } def +/Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop } +repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1 +ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1 +moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto +Lineto pop pop closepath } ifelse } def +/Diamond { /mtrx CM def T rotate /h ED /w ED dup 0 eq { pop } { CLW mul +neg /d ED /a w h Atan def /h d a sin Div h add def /w d a cos Div w add +def } ifelse mark w 2 div h 2 div w 0 0 h neg w neg 0 0 h w 2 div h 2 +div /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx +setmatrix } def +% DG modification begin - Jan. 15, 1997 +%/Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup 0 eq { +%pop } { CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2 +%div dup cos exch sin Div mul sub def } ifelse mark 0 d w neg d 0 h w d 0 +%d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx +%setmatrix } def +/Triangle { /mtrx CM def translate rotate /h ED 2 div /w ED dup +CLW mul /d ED /h h d w h Atan sin Div sub def /w w d h w Atan 2 +div dup cos exch sin Div mul sub def mark 0 d w neg d 0 h w d 0 +d /ArrowA { moveto } def /ArrowB { } def false Line closepath mtrx +% DG/SR modification begin - Jun. 1, 1998 - Patch 3 (from Michael Vulis) +% setmatrix } def +setmatrix pop } def +% DG/SR modification end +/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth +def } def +/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth +def } def +/CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1 +def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp +mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos +abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def +/y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul +m mul neg def } def +/IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if } +ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def } +def +/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def +/NC { CC x1 y1 x2 y2 x y curveto } def +/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def +/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def +/NAC { x2 y2 x y curveto CC x1 y1 } def +/EAC { x2 y2 x y ArrowB curveto pop pop } def +/OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def +n { NC } repeat EOC } ifelse } def +/AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload +/Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop +pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def +/ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt { +CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC } +repeat closepath pop pop } ifelse } def +/SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def +/ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def +/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore } +def +/FontDot { DS 2 mul dup matrix scale matrix concatmatrix exch matrix +rotate matrix concatmatrix exch findfont exch makefont setfont } def +/Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto +x1 y1 lineto closepath } def +/OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1 +y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div +exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse +/b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto +x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath } +ifelse } def +/Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add +/y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq { +pop pop Rect } { OvalFrame } ifelse } def +/BezierNArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop +} if n 1 sub neg 3 mod 3 add 3 mod { 0 0 /n n 1 add def } repeat f { ] +aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def +/OpenBezier { BezierNArray n 1 eq { pop pop } { ArrowA n 4 sub 3 idiv { 6 +2 roll 4 2 roll curveto } repeat 6 2 roll 4 2 roll ArrowB curveto } +ifelse } def +/ClosedBezier { BezierNArray n 1 eq { pop pop } { moveto n 1 sub 3 idiv { +6 2 roll 4 2 roll curveto } repeat closepath } ifelse } def +/BezierShowPoints { gsave Points aload length 2 div cvi /n ED moveto n 1 +sub { lineto } repeat CLW 2 div SLW [ 4 4 ] 0 setdash stroke grestore } +def +/Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1 +sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA +x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0 +y0 x0 2 mul x1 sub y1 ] def } def +/Grid { newpath /a 4 string def /b ED /c ED /n ED cvi dup 1 lt { pop 1 } +if /s ED s div dup 0 eq { pop 1 } if /dy ED s div dup 0 eq { pop 1 } if +/dx ED dy div round dy mul /y0 ED dx div round dx mul /x0 ED dy div +round cvi /y2 ED dx div round cvi /x2 ED dy div round cvi /y1 ED dx div +round cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse def /w x2 x1 sub +0 gt { 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2 div add def +/Helvetica findfont b scalefont setfont /b b .95 mul CLW 2 div add def } +if systemdict /setstrokeadjust known { true setstrokeadjust /t { } def } +{ /t { transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add +exch itransform } bind def } ifelse gsave n 0 gt { 1 setlinecap [ 0 dy n +div ] dy n div 2 div setdash } { 2 setlinecap } ifelse /i x1 def /f y1 +dy mul n 0 gt { dy n div 2 div h mul sub } if def /g y2 dy mul n 0 gt { +dy n div 2 div h mul add } if def x2 x1 sub w mul 1 add dup 1000 gt { +pop 1000 } if { i dx mul dup y0 moveto b 0 gt { gsave c i a cvs dup +stringwidth pop /z2 ED w 0 gt {z1} {z1 z2 add neg} ifelse h 0 gt {b neg} +{z1} ifelse rmoveto show grestore } if dup t f moveto g t L stroke /i i +w add def } repeat grestore gsave n 0 gt +% DG/SR modification begin - Nov. 7, 1997 - Patch 1 +%{ 1 setlinecap [ 0 dx n div ] dy n div 2 div setdash } +{ 1 setlinecap [ 0 dx n div ] dx n div 2 div setdash } +% DG/SR modification end +{ 2 setlinecap } ifelse /i y1 def /f x1 dx mul +n 0 gt { dx n div 2 div w mul sub } if def /g x2 dx mul n 0 gt { dx n +div 2 div w mul add } if def y2 y1 sub h mul 1 add dup 1000 gt { pop +1000 } if { newpath i dy mul dup x0 exch moveto b 0 gt { gsave c i a cvs +dup stringwidth pop /z2 ED w 0 gt {z1 z2 add neg} {z1} ifelse h 0 gt +{z1} {b neg} ifelse rmoveto show grestore } if dup f exch t moveto g +exch t L stroke /i i h add def } repeat grestore } def +/ArcArrow { /d ED /b ED /a ED gsave newpath 0 -1000 moveto clip newpath 0 +1 0 0 b grestore c mul /e ED pop pop pop r a e d PtoC y add exch x add +exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c +mul neg d } def +/Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def +/Rot { CP CP translate 3 -1 roll neg rotate NET } def +/RotBegin { tx@Dict /TMatrix known not { /TMatrix { } def /RAngle { 0 } +def } if /TMatrix [ TMatrix CM ] cvx def /a ED a Rot /RAngle [ RAngle +dup a add ] cvx def } def +/RotEnd { /TMatrix [ TMatrix setmatrix ] cvx def /RAngle [ RAngle pop ] +cvx def } def +/PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def +/PutBegin { /TMatrix [ TMatrix CM ] cvx def CP 4 2 roll T moveto } def +/PutEnd { CP /TMatrix [ TMatrix setmatrix ] cvx def moveto } def +/Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s +abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b +div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } { +h1 abs h sub dup s mul abs } ifelse } def +/UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s +mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q +{ x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add +exch } def +/BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { Visible +/IfVisible true def } if } { IfVisible { Invisible /IfVisible false def +} if } ifelse } def +/InitOL { /OLUnit [ 3000 3000 matrix defaultmatrix dtransform ] cvx def +/Visible { CP OLUnit idtransform T moveto } def /Invisible { CP OLUnit +neg exch neg exch idtransform T moveto } def /BOL { BeginOL } def +/IfVisible true def } def +end +% END pstricks.pro + +%%EndProcSet +%%BeginProcSet: pst-dots.pro +10 dict dup begin + /FontType 3 def + /FontMatrix [ .001 0 0 .001 0 0 ] def + /FontBBox [ 0 0 0 0 ] def + /Encoding 256 array def + 0 1 255 { Encoding exch /.notdef put } for + Encoding + dup (b) 0 get /Bullet put + dup (c) 0 get /Circle put + dup (C) 0 get /BoldCircle put + dup (u) 0 get /SolidTriangle put + dup (t) 0 get /Triangle put + dup (T) 0 get /BoldTriangle put + dup (r) 0 get /SolidSquare put + dup (s) 0 get /Square put + dup (S) 0 get /BoldSquare put + dup (q) 0 get /SolidPentagon put + dup (p) 0 get /Pentagon put + dup (P) 0 get /BoldPentagon put +% DG/SR modification begin - Dec. 16, 1999 - From Etienne Riga + dup (l) 0 get /SolidDiamond put + dup (d) 0 get /Diamond put + (D) 0 get /BoldDiamond put +% DG/SR modification end + /Metrics 13 dict def + Metrics begin + /Bullet 1000 def + /Circle 1000 def + /BoldCircle 1000 def + /SolidTriangle 1344 def + /Triangle 1344 def + /BoldTriangle 1344 def + /SolidSquare 886 def + /Square 886 def + /BoldSquare 886 def + /SolidPentagon 1093.2 def + /Pentagon 1093.2 def + /BoldPentagon 1093.2 def +% DG/SR modification begin - Dec. 16, 1999 - From Etienne Riga + /SolidDiamond 1008 def + /Diamond 1008 def + /BoldDiamond 1008 def +% DG/SR modification end + /.notdef 0 def + end + /BBoxes 13 dict def + BBoxes begin + /Circle { -550 -550 550 550 } def + /BoldCircle /Circle load def + /Bullet /Circle load def + /Triangle { -571.5 -330 571.5 660 } def + /BoldTriangle /Triangle load def + /SolidTriangle /Triangle load def + /Square { -450 -450 450 450 } def + /BoldSquare /Square load def + /SolidSquare /Square load def + /Pentagon { -546.6 -465 546.6 574.7 } def + /BoldPentagon /Pentagon load def + /SolidPentagon /Pentagon load def +% DG/SR modification begin - Dec. 16, 1999 - From Etienne Riga + /Diamond { -428.5 -742.5 428.5 742.5 } def + /BoldDiamond /Diamond load def + /SolidDiamond /Diamond load def +% DG/SR modification end + /.notdef { 0 0 0 0 } def + end + /CharProcs 20 dict def + CharProcs begin + /Adjust { + 2 copy dtransform floor .5 add exch floor .5 add exch idtransform + 3 -1 roll div 3 1 roll exch div exch scale + } def + /CirclePath { 0 0 500 0 360 arc closepath } def + /Bullet { 500 500 Adjust CirclePath fill } def + /Circle { 500 500 Adjust CirclePath .9 .9 scale CirclePath + eofill } def + /BoldCircle { 500 500 Adjust CirclePath .8 .8 scale CirclePath + eofill } def + /BoldCircle { CirclePath .8 .8 scale CirclePath eofill } def + /TrianglePath { 0 660 moveto -571.5 -330 lineto 571.5 -330 lineto + closepath } def + /SolidTriangle { TrianglePath fill } def + /Triangle { TrianglePath .85 .85 scale TrianglePath eofill } def + /BoldTriangle { TrianglePath .7 .7 scale TrianglePath eofill } def + /SquarePath { -450 450 moveto 450 450 lineto 450 -450 lineto + -450 -450 lineto closepath } def + /SolidSquare { SquarePath fill } def + /Square { SquarePath .89 .89 scale SquarePath eofill } def + /BoldSquare { SquarePath .78 .78 scale SquarePath eofill } def + /PentagonPath { + -337.8 -465 moveto + 337.8 -465 lineto + 546.6 177.6 lineto + 0 574.7 lineto + -546.6 177.6 lineto + closepath + } def + /SolidPentagon { PentagonPath fill } def + /Pentagon { PentagonPath .89 .89 scale PentagonPath eofill } def + /BoldPentagon { PentagonPath .78 .78 scale PentagonPath eofill } def +% DG/SR modification begin - Dec. 16, 1999 - From Etienne Riga + /DiamondPath { 0 742.5 moveto -428.5 0 lineto 0 -742.5 lineto + 428.5 0 lineto closepath } def + /SolidDiamond { DiamondPath fill } def + /Diamond { DiamondPath .85 .85 scale DiamondPath eofill } def + /BoldDiamond { DiamondPath .7 .7 scale DiamondPath eofill } def +% DG/SR modification end + /.notdef { } def + end + /BuildGlyph { + exch + begin + Metrics 1 index get exec 0 + BBoxes 3 index get exec + setcachedevice + CharProcs begin load exec end + end + } def + /BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec + } bind def +end +/PSTricksDotFont exch definefont pop +%END pst-dots.pro + +%%EndProcSet +%%BeginProcSet: pst-grad.pro +% PostScript prologue for pst-grad.tex. +% Version 97, 93/05/12 +% For distribution, see pstricks.tex. +% +% For the PSTricks gradient fillstyle. +% +% Based on some EPS files by leeweyr!bill@nuchat.sccsi.com (W. R. Lee). +% +% Syntax: +% R0 G0 B0 R1 G1 B1 NumLines MidPoint Angle GradientFill + +/tx@GradientDict 40 dict def +tx@GradientDict begin +/GradientFill { + rotate + /MidPoint ED + /NumLines ED + /LastBlue ED + /LastGreen ED + /LastRed ED + /FirstBlue ED + /FirstGreen ED + /FirstRed ED + % This avoids gaps due to rounding errors: + clip + pathbbox %leave llx,lly,urx,ury on stack + /y ED /x ED + 2 copy translate + y sub neg /y ED + x sub neg /x ED + % This avoids gaps due to rounding errors: + LastRed FirstRed add 2 div + LastGreen FirstGreen add 2 div + LastBlue FirstBlue add 2 div + setrgbcolor + fill + /YSizePerLine y NumLines div def + /CurrentY 0 def + /MidLine NumLines 1 MidPoint sub mul abs cvi def + MidLine NumLines 2 sub gt + { /MidLine NumLines def } + { MidLine 2 lt { /MidLine 0 def } if } + ifelse + MidLine 0 gt + { + /Red FirstRed def + /Green FirstGreen def + /Blue FirstBlue def + /RedIncrement LastRed FirstRed sub MidLine 1 sub div def + /GreenIncrement LastGreen FirstGreen sub MidLine 1 sub div def + /BlueIncrement LastBlue FirstBlue sub MidLine 1 sub div def + MidLine { GradientLoop } repeat + } if + MidLine NumLines lt + { + /Red LastRed def + /Green LastGreen def + /Blue LastBlue def + /RedIncrement FirstRed LastRed sub NumLines MidLine sub 1 sub div def + /GreenIncrement FirstGreen LastGreen sub NumLines MidLine sub 1 sub div def + /BlueIncrement FirstBlue LastBlue sub NumLines MidLine sub 1 sub div def + NumLines MidLine sub { GradientLoop } repeat + } if +} def +/GradientLoop { + 0 CurrentY moveto + x 0 rlineto + 0 YSizePerLine rlineto + x neg 0 rlineto + closepath + Red Green Blue setrgbcolor fill + /CurrentY CurrentY YSizePerLine add def + /Blue Blue BlueIncrement add def + /Green Green GreenIncrement add def + /Red Red RedIncrement add def +} def + +end +% END pst-grad.pro + +%%EndProcSet +%%BeginProcSet: 8r.enc +% File 8r.enc as of 2002-03-12 for PSNFSS 9 +% +% This is the encoding vector for Type1 and TrueType fonts to be used +% with TeX. This file is part of the PSNFSS bundle, version 9 +% +% Authors: S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry, W. Schmidt +% +% Idea is to have all the characters normally included in Type 1 fonts +% available for typesetting. This is effectively the characters in Adobe +% Standard Encoding + ISO Latin 1 + extra characters from Lucida + Euro. +% +% Character code assignments were made as follows: +% +% (1) the Windows ANSI characters are almost all in their Windows ANSI +% positions, because some Windows users cannot easily reencode the +% fonts, and it makes no difference on other systems. The only Windows +% ANSI characters not available are those that make no sense for +% typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen +% (173). quotesingle and grave are moved just because it's such an +% irritation not having them in TeX positions. +% +% (2) Remaining characters are assigned arbitrarily to the lower part +% of the range, avoiding 0, 10 and 13 in case we meet dumb software. +% +% (3) Y&Y Lucida Bright includes some extra text characters; in the +% hopes that other PostScript fonts, perhaps created for public +% consumption, will include them, they are included starting at 0x12. +% +% (4) Remaining positions left undefined are for use in (hopefully) +% upward-compatible revisions, if someday more characters are generally +% available. +% +% (5) hyphen appears twice for compatibility with both ASCII and Windows. +% +% (6) /Euro is assigned to 128, as in Windows ANSI +% +/TeXBase1Encoding [ +% 0x00 (encoded characters from Adobe Standard not in Windows 3.1) + /.notdef /dotaccent /fi /fl + /fraction /hungarumlaut /Lslash /lslash + /ogonek /ring /.notdef + /breve /minus /.notdef +% These are the only two remaining unencoded characters, so may as +% well include them. + /Zcaron /zcaron +% 0x10 + /caron /dotlessi +% (unusual TeX characters available in, e.g., Lucida Bright) + /dotlessj /ff /ffi /ffl + /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef + % very contentious; it's so painful not having quoteleft and quoteright + % at 96 and 145 that we move the things normally found there down to here. + /grave /quotesingle +% 0x20 (ASCII begins) + /space /exclam /quotedbl /numbersign + /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash +% 0x30 + /zero /one /two /three /four /five /six /seven + /eight /nine /colon /semicolon /less /equal /greater /question +% 0x40 + /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O +% 0x50 + /P /Q /R /S /T /U /V /W + /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore +% 0x60 + /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o +% 0x70 + /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde + /.notdef % rubout; ASCII ends +% 0x80 + /Euro /.notdef /quotesinglbase /florin + /quotedblbase /ellipsis /dagger /daggerdbl + /circumflex /perthousand /Scaron /guilsinglleft + /OE /.notdef /.notdef /.notdef +% 0x90 + /.notdef /.notdef /.notdef /quotedblleft + /quotedblright /bullet /endash /emdash + /tilde /trademark /scaron /guilsinglright + /oe /.notdef /.notdef /Ydieresis +% 0xA0 + /.notdef % nobreakspace + /exclamdown /cent /sterling + /currency /yen /brokenbar /section + /dieresis /copyright /ordfeminine /guillemotleft + /logicalnot + /hyphen % Y&Y (also at 45); Windows' softhyphen + /registered + /macron +% 0xD0 + /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered + /cedilla /onesuperior /ordmasculine /guillemotright + /onequarter /onehalf /threequarters /questiondown +% 0xC0 + /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis + /Igrave /Iacute /Icircumflex /Idieresis +% 0xD0 + /Eth /Ntilde /Ograve /Oacute + /Ocircumflex /Otilde /Odieresis /multiply + /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls +% 0xE0 + /agrave /aacute /acircumflex /atilde + /adieresis /aring /ae /ccedilla + /egrave /eacute /ecircumflex /edieresis + /igrave /iacute /icircumflex /idieresis +% 0xF0 + /eth /ntilde /ograve /oacute + /ocircumflex /otilde /odieresis /divide + /oslash /ugrave /uacute /ucircumflex + /udieresis /yacute /thorn /ydieresis +] def + +%%EndProcSet +%%BeginProcSet: texps.pro +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginProcSet: special.pro +TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N +/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N +/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N +/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ +/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho +X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B +/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ +/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known +{userdict/md get type/dicttype eq{userdict begin md length 10 add md +maxlength ge{/md md dup length 20 add dict copy def}if end md begin +/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S +atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ +itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll +transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll +curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf +pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} +if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 +-1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 +get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip +yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub +neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ +noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop +90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get +neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr +1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr +2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 +-1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S +TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ +Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale +}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState +save N userdict maxlength dict begin/magscale true def normalscale +currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts +/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x +psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx +psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub +TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def +@MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll +newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto +closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N +/@beginspecial{SDict begin/SpecialSave save N gsave normalscale +currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} +N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs +neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate +rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse +scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg +lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx +ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N +/setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ +pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave +restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B +/rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 +setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY +moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix +matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc +savematrix setmatrix}N end + +%%EndProcSet +TeXDict begin @defspecial + + /DvipsToPDF { 72.27 mul Resolution div } def /PDFToDvips { 72.27 div +Resolution mul } def /HyperBorder { 1 PDFToDvips } def /H.V {pdf@hoff +pdf@voff null} def /H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def +/H.S { currentpoint HyperBorder add /pdf@lly exch def dup DvipsToPDF +/pdf@hoff exch def HyperBorder sub /pdf@llx exch def } def /H.L { 2 +sub dup /HyperBasePt exch def PDFToDvips /HyperBaseDvips exch def currentpoint +HyperBaseDvips sub /pdf@ury exch def /pdf@urx exch def } def /H.A { +H.L currentpoint exch pop vsize 72 sub exch DvipsToPDF HyperBasePt +sub sub /pdf@voff exch def } def /H.R { currentpoint HyperBorder sub +/pdf@ury exch def HyperBorder add /pdf@urx exch def currentpoint exch +pop vsize 72 sub exch DvipsToPDF sub /pdf@voff exch def } def systemdict +/pdfmark known not {userdict /pdfmark systemdict /cleartomark get put} +if + +@fedspecial end TeXDict begin +40258431 52099146 2074 600 600 (slides.dvi) @start /Fa +134[124 124 2[138 69 124 83 138 138 138 138 207 55 1[55 +55 138 138 69 138 1[124 138 138 13[165 179 1[165 80[{ + TeXBase1Encoding ReEncodeFont }24 247.95 /Helvetica +rf /Fb 105[39 37[39 26[51 1[47 51 4[59 39 25[39 39 1[20 +20 46[{ TeXBase1Encoding ReEncodeFont }11 70.5976 /Helvetica +rf /Fc 137[71 3[71 2[71 71 71 71 4[71 2[71 2[71 32[71 +17[71 46[{ TeXBase1Encoding ReEncodeFont }11 118.723 +/Courier rf /Fd 141[47 2[79 79 2[71 6[79 2[79 19[118 +5[110 5[94 18[39 46[{ TeXBase1Encoding ReEncodeFont }10 +141.195 /Helvetica rf /Fe 134[160 154 2[165 83 121 88 +1[182 176 165 259 66 2[66 165 182 77 176 1[176 1[182 +11[176 116 143 160 4[248 121 76[{ TeXBase1Encoding ReEncodeFont }24 +275.5 /AvantGarde-DemiOblique rf /Ff 139[107 157 9[86 +214 6[236 9[321 1[229 1[186 207 4[321 157 12[200 63[{ + TeXBase1Encoding ReEncodeFont }12 357.117 /AvantGarde-Demi +rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop -600 6000 a +SDict begin [ /Page 1 /View [ /Fit ] /PageMode /UseOutlines /DOCVIEW +pdfmark end + -600 6000 a -600 6000 +a +SDict begin [ {Catalog} << /ViewerPreferences << /FitWindow true /CenterWindow +true >> >> /PUT pdfmark end + -600 6000 a -600 6000 a +SDict begin H.S end + -600 6000 a -600 6000 a +SDict begin 12 H.A end + -600 +6000 a -600 6000 a +SDict begin [ /View [/XYZ H.V] /Dest (Doc-Start) cvn H.B /DEST pdfmark +end + -600 6000 a 4500 6000 a + tx@Dict begin 90 Rot end + 4500 6000 +a 5073 5340 a @beginspecial @setspecial + tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.25 true -25.60728 +-25.60728 348.5461 253.94081 .5 Frame gsave 0. setgray fill grestore +gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end + +@endspecial +4828 2192 a @beginspecial 14 @llx 14 @lly 513 @urx 49 +@ury 3401 @rwi 99 @rhi @setspecial +%%BeginDocument: rule-glow.ps +% Use own dictionary to avoid conflicts +10 dict begin +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 34.560000 translate +498.240000 -34.560000 scale +% Image geometry +692 48 8 +% Transformation matrix +[ 692 0 0 48 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 692 string def +/gstr 692 string def +/bstr 692 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 9049 ASCII Bytes +colorimage +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +!!*!"#6P)3"U52:#lY,7$4I=P%1WmH&,d&j&V1OF&V1OO&cE:>%fd+=%K?h:$N:>:#R:S="U"r1 +rW<*"J,~> +'`\FC#71bG%1a'a'GhQ'*$-.D+s\H5-35MDq^V1fJLl@'JLl@'X=Wrnq^MUq./kP/,U+ET*Zc:= +(Ddbu&e>EZ$OI%C"onXR~> +JH16$JH16$JH3ppJ,~> +!rrB)"9&H0"pYD>$4@4M%K6n;&cNCC'D`F7'nI-O(4d6P(9A;C(&AUE'E/XD&cN:H%1EUP$4$nB +#6"f+!s/N(!.Y~> +'`\IF#n.:R&JGoq)B9_=+snWb.P*.M0*F!b1G^le21[Z:2M!c;2NTir2$>`l1GU]a0,?)g.OZVj ++s.dE)AX)%&Io9Z#mgh:!.Y~> +JH16$JH16$JH3ppJ,~> +(]XXA"U52:#RLkH$k]i'GV>u(Dm#er>C/)JJs(XJJsUgr>GPNrtcIe'bh>q&eYce%LrmT +$OI(D#6k>8!rr=O~> +*<6BS$kEs`'Gqf0+!W!X.P<>.1c@6O4$,Pg5 +JH16$JH16$JH3ppJ,~> +(]XXA"U52:#RLkH$k]i'GV>u(Dm#er>C/)JJs(XJJsUgr>GPNrtcIe'bh>q&eYce%LrmT +$OI(D#6k>8!rr=O~> +*<6BS$kEs`'Gqf0+!W!X.P<>.1c@6O4$,Pg5 +JH16$JH16$JH3ppJ,~> +)up*F"U>;=#n%1O%hK9b'G_H#(`=20)]Kb:*?G&!JKKFbJKKFbOrsTCruM+Zru2am)&O2,()@Ss +&.f?]%1 +)upBW%MBHi(`X\B-7UJu1H%-P5!_J%77B^;8kT(Us%N&ZJPLbkJPLbkXA8C^s%NDbs%45$7n#j6 +5s@In2E!?E.Olbg+WM=5'G:lc$ig9X~> +JH16$JH16$JH3ppJ,~> +)#sgF#7(VB$k3^X&JPoo(`=21*$-.C+ ++TMua&JQ'!*?ljY/2At=4@)8$85)]Q;,L7m='&L,=^##$>Cg%1>_-.2>c_3&>Q7n,=WU[H=&r6s +;,9kV845a04>nrM/12eh*>fV-&J5KQ!.Y~> +JH16$JH16$JH3ppJ,~> +)#sgF#7(VB$k3^X&JPoo(`=21*$-.C+ ++TMua&JQ'!*?ljY/2At=4@)8$85)]Q;,L7m='&L,=^##$>Cg%1>_-.2>c_3&>Q7n,=WU[H=&r6s +;,9kV845a04>nrM/12eh*>fV-&J5KQ!.Y~> +JH16$JH16$JH3ppJ,~> +*<69K#71bG%1a'a'GhQ')]]q@+X/*U,palb-RU>@.=it".Y0(#.Zu:[.39lb-RL/d,pXZX+Wh^F +)]9G.'G;#h%1 ++TN#d',V]/+t,&r1cdZ_77p0J<*37-?=%&LAS#IdB4tuNBn:#MC4U,NC921BC&_lHB-(YrAR](S +?',(lV!.Y~> +JH16$JH16$JH3ppJ,~> +)up3L#RV"M%h]Qj(E+23+!DdQ-7:/i.Olr"/M6rSJM2R-JM2R-N\CAas",0@.k3"t-RL/c+X%pI +)B'D+'G:oc%13@H#64aS~> ++TN,j()nD?-S@864$l8):K1:t?XmSZCMRg,EcQ5CFEVj"GCb!iG_(*jGcZ/^GQ2jdF<5LDEc>o3 +CM73b?X$K/:Imf=4#JlJ-QsWP()@M_!.Y~> +JH16$JH16$JH3ppJ,~> +)#spK#n.=T&JQ#t)BBh@,:4`c.P*,'0/#$Y1&s-/2"WYV2M!c;2M!cf2Y8m*1]T?21)_i"0.ne* +.OZVj,9S!I)Aa2(&J#B\#mgk;!.Y~> ++TN2o)':1P/2TFM6:sjI=^PNJCN+67G^+RaIt*$%K7npMKn5&2Lk1A5LocF)L&Zi+K-#SnIsu`h +G][n?CM$p\=]%d`69@7c/1)\c)&X+g!.Y~> +JH16$JH16$JH3ppJ,~> +)#spK#n.=T&JQ#t)BBh@,:4`c.P*,'0/#$Y1&s-/2"WYV2M!c;2M!cf2Y8m*1]T?21)_i"0.ne* +.OZVj,9S!I)Aa2(&J#B\#mgk;!.Y~> ++TN2o)':1P/2TFM6:sjI=^PNJCN+67G^+RaIt*$%K7npMKn5&2Lk1A5LocF)L&Zi+K-#SnIsu`h +G][n?CM$p\=]%d`69@7c/1)\c)&X+g!.Y~> +o`0ODJH:<&JH:<&kQ1\doDjC~> +$NLJ@$OmXY',DK)*J"6B!J(9&!J(:8!WN92*?#h3'+b]a$O[7@!.Y~> +$NLt_*$Qj^0f_Qe8q@"o!J(9&!J(:8!WN928jYj)0e+Xs*#oap!.Y~> +o`5!mJHUN,JHUN,JHY9A!XJo3oDjC~> +%0-\C$kEs`'c7o1*ruCn"G$],"G$],"R?1$#Qt8P*#oe1&eY]`$jcn6J,~> +%0.7f+!rTm2Es]%:]UTJ"G$],"G$],"R?1$#Qt9,7n5d%/hSIm*uP%YJ,~> +o`5!m!!IiYJI$f4JI$f4m0Ee'#Qt;&!.Y~> +%KHhF%1j0d(E+A;+oq]IJI$f4JI$f4JI(WK&.JmJ" +%KIFl+t56$3^ZV9 +o`5!m!!IiYJI$f4JI$f4m0Ee'#Qt;&!.Y~> +%KHhF%1j0d(E+A;+oq]IJI$f4JI$f4JI(WK&.JmJ" +%KIFl+t56$3^ZV9 +o`5!m!<`[Z%=nt>%=nt>%Iai,&H`IJ"9e>sJ,~> +%fctI%M9Bh(`XY@,ln#L#_%=nuX%K@"O%1!(>,p4 +%fdRp,V1f15"JRL>las/#_%=nuX%K@"O%1!(>>uFQk4uG2K,U=?0!.Y~> +o`5!m!sAl=%=o+B&V1OF&V1Pc&I'$`&If!K"S;\E~> +&HE4M%h]Wn)BL(H-34,M#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt8W+sJ'H()@Mn%h&F +&HEn"-8.;:6;(B]@0$B3#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt9=='&$]2`EB:-6E3fJ,~> +o`5!m!sAl=%=o+B&V1OF&V1Pc&I'$`&If!K"S;\E~> +&HE4M%h]Wn)BL(H-34,M#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt8W+sJ'H()@Mn%h&F +&HEn"-8.;:6;(B]@0$B3#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt9=='&$]2`EB:-6E3fJ,~> +o`5!m"9\u>%2".-JJWkRJJWkRp)!`L"r@j`%1!(>oDjC~> +&c`=N%h]Wn)BU1K-ij>O#Rq4TJJWkRJJWkRJJ\"rruDah&J5HX"9^+t,9Ig>((q,g$ig9X~> +&ca"$-SIJ?6V^fgAH;f7#Rq4TJJWkRJJWkRJJ\"rruDah&J5HX"9`:>>#%FF3A2a-*rl:k~> +o`5!m"U#)?%1sD-*J#5^*J#5^*V^W],TRmA&J5HX"9e>sJ,~> +'*&IP%hf`q)]p=N.00GP#Rq4T(P*TX*J#5^*J#7+*>Tn@*>];"%1!(>.3p/\)]';(%hB*L!.Y~> +'*'.'-o!eF78R5oB)r#9#Rq4T(P*TX*J#5^*J#7+*>Tn@*>];"%1!(>B3\\<76 +o`5!m#6Y;A%1sBs*J#Je,_74l,_76<,RQ%I*?>q.&If!K"S;\E~> +'`\[S&/5ru*$?OR.KKPQ#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt8[,paZR(`3qu&.JU> +J,~> +'`]C+.5F"J7T!GsB`S5;#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt9E?!U;s4?PAJ.3SZk +J,~> +o`5!m#6Y;A%1sBs*J#Je,_74l,_76<,RQ%I*?>q.&If!K"S;\E~> +'`\[S&/5ru*$?OR.KKPQ#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt8[,paZR(`3qu&.JU> +J,~> +'`]C+.5F"J7T!GsB`S5;#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt9E?!U;s4?PAJ.3SZk +J,~> +o`5!m#6Y;A%1sBs*J#_l.tK4%.tK5I.g[IA*>];"%1!(>oDjC~> +'`\[S&/5ru*$?OR.KKPQ#Rq4T(EFNI.tK4%.tK4%/,Cb3,TRmA&J5HX"9^2#,p40E(_dMm%0-BY~> +'`]C+.5F"J7T!GsB`S5;#Rq4T(EFNI.tK4%.tK4%/,Cb3,TRmA&J5HX"9`FE>u='R4>J?7+TMLm~> +o`5!m"U#)?%1sD-,_74l,_74l,kiSa* +'*&IP%hf`q)]p=N.00GP#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt8Z,U=HN(Dd_q%h/L=J,~> +'*'.'-o!eF78R5oB)r#9#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt9C>[1)o4$,/F-m/KiJ,~> +o`5!m"U#)?%1sD-,_74l,_74l,kiSa* +'*&IP%hf`q)]p=N.00GP#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt8Z,U=HN(Dd_q%h/L=J,~> +'*'.'-o!eF78R5oB)r#9#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt9C>[1)o4$,/F-m/KiJ,~> +o`5!m"9\u>%2".3JK9:^JK9:^oGn,P&J5HX"9e>sJ,~> +&c`=N%h]Wn)BU1K-ij>O#Rq4TJK9:^JK9:^JK=A'',M5m%1!(>-mKrY)AX)$%hB'K!.Y~> +&ca"$-SIJ?6V^fgAH;f7#Rq4TJK9:^JK9:^JK=A'',M5m%1!(>AQi846TI.[-RTu9!.Y~> +o`5!m!sAl=%=o=H(P*BR(P*Cn(]P'L%1!(>oDjC~> +&HE4M%h]Wn)BL(H-34,M#Rq5o(P*BR(P*BR(\/CB&J,BW"9^%q+s%X<((q,g$ig9X~> +&HEn"-8.;:6;(B]@0$B3#Rq5o(P*BR(P*BR(\/CB&J,BW"9`.7=%bk=2_QL)*rl:k~> +o`5!m!<`[Z&V1OF&V1OF&ag55%1!(>oDjC~> +%fctI%M9Bh(`XY@,ln#L#_ +%fdRp,V1f15"JRL>las/#_ +o`5!m!<`[Z&V1OF&V1OF&ag55%1!(>oDjC~> +%fctI%M9Bh(`XY@,ln#L#_ +%fdRp,V1f15"JRL>las/#_ +o`5!m!!Ii^JIR/>JIR/>ljX"%"9e>sJ,~> +%KHhF%1j0d(E+A;+oq]IJIR/>JIR/>JIUrT%gW:@+s.mF(D@Gn%1NXE!.Y~> +%KIFl+t56$3^ZV9JIR/>JIUrT%gW:@=%uCV3\`?<+sIs+!.Y~> +o`5!mJI$f4JI$f4JI(NHrrhroJ,~> +%0-\C$kEs`'c7o1*ruCn#_<84#_<84#jM]q":Q@l*#KD'&e>BZ#ljsU~> +%0.7f+!rTm2Es]%:]UTJ#_<84#_<84#jM]q":S*s7mAma/g_Y^)#sYe~> +o`5!mJI$f4JI$f4JI(NHrrhroJ,~> +%0-\C$kEs`'c7o1*ruCn#_<84#_<84#jM]q":Q@l*#KD'&e>BZ#ljsU~> +%0.7f+!rTm2Es]%:]UTJ#_<84#_<84#jM]q":S*s7mAma/g_Y^)#sYe~> +o`0OGJHUN,JHUN,jok;VJ,~> +$NLJ@$OmXY',DK)*J"?E"G$],"G$^<":Q:h)AWtt&.K!T#ljsU~> +$NLt_*$Qj^0f_Qe8q@+r"G$],"G$^<":Rmh69-bM.O#iP(B=Gc~> +JH16$JH16$JH3ppJ,~> +)#spK#n.=T&JQ#t)BBh@,:4`c.P*,'0/#$Y1&s-/2"WYV2M!c;2M!cf2Y8m*1]T?21)_i"0.ne* +.OZVj,9S!I)Aa2(&J#B\#mgk;!.Y~> ++TN2o)':1P/2TFM6:sjI=^PNJCN+67G^+RaIt*$%K7npMKn5&2Lk1A5LocF)L&Zi+K-#SnIsu`h +G][n?CM$p\=]%d`69@7c/1)\c)&X+g!.Y~> +JH16$JH16$JH3ppJ,~> +)up3L#RV"M%h]Qj(E+23+!DdQ-7:/i.Olr"/M6rSJM2R-JM2R-N\CAas",0@.k3"t-RL/c+X%pI +)B'D+'G:oc%13@H#64aS~> ++TN,j()nD?-S@864$l8):K1:t?XmSZCMRg,EcQ5CFEVj"GCb!iG_(*jGcZ/^GQ2jdF<5LDEc>o3 +CM73b?X$K/:Imf=4#JlJ-QsWP()@M_!.Y~> +JH16$JH16$JH3ppJ,~> +)up3L#RV"M%h]Qj(E+23+!DdQ-7:/i.Olr"/M6rSJM2R-JM2R-N\CAas",0@.k3"t-RL/c+X%pI +)B'D+'G:oc%13@H#64aS~> ++TN,j()nD?-S@864$l8):K1:t?XmSZCMRg,EcQ5CFEVj"GCb!iG_(*jGcZ/^GQ2jdF<5LDEc>o3 +CM73b?X$K/:Imf=4#JlJ-QsWP()@M_!.Y~> +JH16$JH16$JH3ppJ,~> +*<69K#71bG%1a'a'GhQ')]]q@+X/*U,palb-RU>@.=it".Y0(#.Zu:[.39lb-RL/d,pXZX+Wh^F +)]9G.'G;#h%1 ++TN#d',V]/+t,&r1cdZ_77p0J<*37-?=%&LAS#IdB4tuNBn:#MC4U,NC921BC&_lHB-(YrAR](S +?',(lV!.Y~> +JH16$JH16$JH3ppJ,~> +)#sgF#7(VB$k3^X&JPoo(`=21*$-.C+ ++TMua&JQ'!*?ljY/2At=4@)8$85)]Q;,L7m='&L,=^##$>Cg%1>_-.2>c_3&>Q7n,=WU[H=&r6s +;,9kV845a04>nrM/12eh*>fV-&J5KQ!.Y~> +JH16$JH16$JH3ppJ,~> +)up*F"U>;=#n%1O%hK9b'G_H#(`=20)]Kb:*?G&!JKKFbJKKFbOrsTCruM+Zru2am)&O2,()@Ss +&.f?]%1 +)upBW%MBHi(`X\B-7UJu1H%-P5!_J%77B^;8kT(Us%N&ZJPLbkJPLbkXA8C^s%NDbs%45$7n#j6 +5s@In2E!?E.Olbg+WM=5'G:lc$ig9X~> +JH16$JH16$JH3ppJ,~> +)up*F"U>;=#n%1O%hK9b'G_H#(`=20)]Kb:*?G&!JKKFbJKKFbOrsTCruM+Zru2am)&O2,()@Ss +&.f?]%1 +)upBW%MBHi(`X\B-7UJu1H%-P5!_J%77B^;8kT(Us%N&ZJPLbkJPLbkXA8C^s%NDbs%45$7n#j6 +5s@In2E!?E.Olbg+WM=5'G:lc$ig9X~> +JH16$JH16$JH3ppJ,~> +(]XXA"U52:#RLkH$k]i'GV>u(Dm#er>C/)JJs(XJJsUgr>GPNrtcIe'bh>q&eYce%LrmT +$OI(D#6k>8!rr=O~> +*<6BS$kEs`'Gqf0+!W!X.P<>.1c@6O4$,Pg5 +JH16$JH16$JH3ppJ,~> +!rrB)"9&H0"pYD>$4@4M%K6n;&cNCC'D`F7'nI-O(4d6P(9A;C(&AUE'E/XD&cN:H%1EUP$4$nB +#6"f+!s/N(!.Y~> +'`\IF#n.:R&JGoq)B9_=+snWb.P*.M0*F!b1G^le21[Z:2M!c;2NTir2$>`l1GU]a0,?)g.OZVj ++s.dE)AX)%&Io9Z#mgh:!.Y~> +JH16$JH16$JH3ppJ,~> +!rrB)"9&H0"pYD>$4@4M%K6n;&cNCC'D`F7'nI-O(4d6P(9A;C(&AUE'E/XD&cN:H%1EUP$4$nB +#6"f+!s/N(!.Y~> +'`\IF#n.:R&JGoq)B9_=+snWb.P*.M0*F!b1G^le21[Z:2M!c;2NTir2$>`l1GU]a0,?)g.OZVj ++s.dE)AX)%&Io9Z#mgh:!.Y~> +JH16$JH16$JH3ppJ,~> +!!*!"#6P)3"U52:#lY,7$4I=P%1WmH&,d&j&V1OF&V1OO&cE:>%fd+=%K?h:$N:>:#R:S="U"r1 +rW<*"J,~> +'`\FC#71bG%1a'a'GhQ'*$-.D+s\H5-35MDq^V1fJLl@'JLl@'X=Wrnq^MUq./kP/,U+ET*Zc:= +(Ddbu&e>EZ$OI%C"onXR~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +%%EndData +end + +%%EndDocument + @endspecial 3393 x @beginspecial 0 @llx 0 @lly 288 @urx +216 @ury 576 @rwi @setspecial +%%BeginDocument: linux_llnl.eps + + +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Times-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +userdict begin +DisplayImage +0 0 +288 216 +12.000000 +288 216 +1 +0 +0 +128 +252424 +040304 +F5BD0C +FDFDFB +3D546A +B29762 +B88209 +848383 +E5E5E5 +797979 +626262 +C6C6C6 +6B4709 +464646 +555555 +DADADA +AB7508 +3A3A3A +EBB20C +979696 +FEFEFC +1C1B1B +E3AA0A +F3DB97 +BAB9B7 +DBA209 +D59809 +F3F3F3 +A7A5A3 +182530 +141313 +2A3846 +F5C60C +9B6806 +C48A08 +425B72 +374B5E +C4A760 +F7D913 +B2A483 +5682AA +2A4054 +CB9309 +2B2C2E +EBC30B +507698 +513808 +4A6D8C +1E1E1E +4F789D +C2B28A +FAFAF9 +F3D62C +855906 +956D27 +FFFFFE +332306 +92805F +D8A72A +F7D50E +BAB2A3 +1F2E3B +436585 +9E9D9B +BE933A +E7AF0D +7C6540 +F5D845 +F7F7F6 +EFB60D +FCFCFA +BE8C1E +547DA1 +425F7B +9D9382 +2D3339 +0E0D0D +34414C +F5CD0C +201605 +A6823B +121C24 +AEAEAD +F3BA0D +DFAC1C +DBB539 +171616 +ECECEB +EDCB0F +0C1218 +F1D019 +BEBEBD +F8EED7 +343434 +8B8B8B +E4DCCD +212831 +090909 +6B6B6B +161515 +F8C00C +181717 +111010 +486A8A +212121 +1A1919 +496E91 +496985 +292929 +272727 +4D6F8F +303030 +776C5A +727272 +74716B +C2C1C1 +FEFEFE +F0F0F0 +CECFCE +F0B803 +EABB0B +6D5B3B +486784 +456787 +919191 +5B8AB5 +262626 +000000 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F010101016161616161 +616161616161616161010101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016161616161616101010101010101 +016161010101010101016161016161616161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161616101010101014C4C1E6369151530303030 +6868686830303030306969631E4C610101610101616161017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016161010161616166631568680000007E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E000000686815636661616101016161017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F0101610101614C661E69687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68156366616101016101017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F6161010161666315687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E681556666101016161017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01610101016669307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30151E61010161 +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +0161610101661568007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068156601 +016161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161 +01614C6368007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068 +5661610161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01610161 +6615007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E001566610161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F010101616161616101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F616101611E30 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E3063610161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F01614C6656693030683015651E666101017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161016156687E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E6856610161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F0101616669006F11110D0D0D0D0D115D6C6865666101017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016156687E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E6863017F01617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F016166156C110D0E62710909090971620A0E0D116C151E61017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016163687E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E007E7E7E684C7F7F01617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +0161567E110E62075E620E0A0E690E0A0A7C5E09620E112B156661017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6101611E687E7E7E7E007E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E0015617F7F7F61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01 +4C696F0D0A07620D4C0101010101017F014C560D095E620E11006361017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C157E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E68634C017F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C +155D0E09075D0101010101010101010101010101011109070A0D2B694C017F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016165007E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E681E4C017F7F7F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016169 +6F0E09096101010101010101010101010101017F7F0101117C710E6F694C017F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01010166687E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E681E61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E2B +0D090D610101010101010101010101010101014C61017F016309090E6F6561017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61016169007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68301E +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D +62090101010101010101010101010101017F4C6C116D66017F010E090D2B1E617F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E306566017F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66017F7F617F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01566F0E +5E1E010101010101010101010101010101011E110A0A111E01016107710D684C017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F61010156007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E694C017F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E7E004C7F7F617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161680D09 +71010101010101010101010101010101017F630D09090E6C6601017E5E0A5D69617F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F610161307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E157F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E65017F017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0E5E +00010101010101010101010101010101017F690D620A116F30617F010D070E6C66017F7F +7F7F7F7F7F7F7F7F7F7F7F7F610166687E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E15017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E30617F01017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F616911620E +01010101010101010101010101010101010169110D6F3056660101016107621169617F7F +7F7F7F7F7F7F7F7F7F7F0161011E007E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E007E7E684C7F7F617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61680D0711 +01010101010101010101010101010101010166301E617F7F010101010111070D7E4C017F +7F7F7F7F7F7F7F7F7F010101697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E4C7F7F617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E5E69 +0101010101010101010101010101010101010161017F0101010101010101090A5D63017F +7F7F7F7F7F7F7F7F610161157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E001E017F7F7F617F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0A134C +0101010101010101010101010101010101017F7F0101010101010101010162710D15617F +7F7F7F7F7F7F7F617F61307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E1E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E65617F7F7F7F7F7F617F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F015611620901 +0101017F7F7F7F010101010101010101010101017F7F010101010101010111070D004C7F +7F7F7F7F7F7F617F7F157E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E007E7E7E15617F7F7F7F7F7F7F7F7F017F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016911710E01 +010101616166617F0101010101010101017F014C30697F010101010101014C5E0E6F6601 +7F7F7F7F7F017F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E0015617F7F7F7F7F7F7F7F7F61017F017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01150D710A01 +0101610101156D667F0101010101017F7F01617F1E117E7F01010101010161070A5D6301 +7F7F7F7F017F7F4C30687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E69617F7F7F7F7F7F7F7F014C300030617F01 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61150D090A01 +017F01682B66666F4C7F010101017F65116207626C015D1E7F0101010101010E71116901 +7F7F7F617F7F7F7F7F01666515007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F01687E7E7E7E00694C7F7F7F7F7F7F7F7F014C687E7E7E7E30017F +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A01 +7F010D3F185E000156010101017F00717C3F520B5B0D7F1E017F01010101010A710D1561 +7F7F617F7F7F7F7F7F7F7F7F7F614C63687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F01157E7E7E0063617F7F7F7F7F7F7F7F011E687E7E7E7E7E7E7E3001 +7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A01 +7F6C7C1876735E6C7F0101017F1571520B0F0F0F0B5E697F010101010101010A090D3061 +7F617F7F4C617F7F7F7F7F7F7F7F7F7F01614C6568007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F01307E00304C017F7F7F7F7F7F7F7F4C56687E7E7E7E7E7E7E7E7E7E30 +017F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A7F +7F0E7357441B085E7F7F017F7F0A0B1B371B0F461B0B0A7F7F01010101010111070D6861 +010161157E6815694C017F7F7F7F7F7F7F7F7F7F01614C6568007E7E7E7E7E7E7E7E007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F0169006561017F7F7F7F7F7F7F011E307E7E7E00007E7E7E7E7E7E7E7E7E +30017F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A7F +011C373F090F3708637F017F7F134637761169621B3776697F01010101010111070D004C +0161307E7E7E7E7E7E006815666101017F7F7F7F7F7F7F7F7F014C6515687E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E00007E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F6166017F7F7F7F7F7F7F014C15007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E697F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01150D710A7F +650F187F5D0E76370D7F4C61011C3733117F110A0937370D7F01010101010111070E0066 +01157E7E7E7E7E7E7E7E7E7E7E7E0068654C61017F7F7F7F7F7F7F7F7F014C1E6515007E +7E7E7E7E7E7E7E7E68651E4C66007E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F01611E687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E637F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016911710A7F +68080E7F110E07370A016D2B631C37187F7F1E0A5D76370A7F01010101010111070D2B4C +697E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E00301E664C017F7F7F7F7F7F7F7F7F614C +6665300068151E4C017F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E00667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F014C63687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E +7E7E30017F01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01651162097F +68765D7F4C0D0E1B0D7F014C617137077F0161614C1C37717F010101010101115E0E7E15 +7E7E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6815691E4C017F7F7F7F7F7F +7F7F0161017F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F615615687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E30017F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E5D0A3F61 +690F0E7F01010D3C2E3535350C110F137F7F7F7F7F1837627F010101010101115E0E6C6C +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068151E017F7F +7F7F7F7F7F7F7F7F7F7F7F6115153068007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F0161666930007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +30017F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E5D0A134C +01180B617F7F0C47162C78412A223A321E7F7F7F0D46370E7F010101010101115E0E116F +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E0030691E61017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01614C6663151530680000007E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F6130007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E30 +017F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F666F0A7C4C +7F0937716635222A45787816062A2C78102E4C4B0F370F687F010101010101685E0A0D6F +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68155666617F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F014C4C6161017F7F7F7F7F7F7F7F010161614C6656656565153030 +303030303030303030306569617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1501 +7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F666F0E7C4C +7F11575F1022164545782C585A34345A3B201A255F57627F7F0101010101014C13710D5D +6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0065664C017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F657E7E7E00301569561E664C616101017F7F7F7F7F7F7F7F016161 +616161616161616161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +307E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F +7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F662B0E5E4C +7F6139472219124578782C5A34344334263B4E2C413A35617F0101010101014C1C090E5D +6C7E7E7E7E7E7E7E7E7E7E7E7E7E7E30564C61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E00006868155665561E1E69696969 +56636363636363636515617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0130 +7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E681E017F7F +7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C2B0E5E4C +7F4F21061A161245782C585A34434326263B2626265A020C7F0101010101014C52070E11 +6C7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01157E +7E007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00304C017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E5E68 +61350622194145452C2C585A434334262626263B195420357F7F0101010101010A070D5D +0030687E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F667E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F657E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E003063017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E5E5D +4F10061A161245782C585A4343343B2626267822062A162E7F01010101010101117C0E2B +6601014C666315687E7E7E7E7E00017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F637E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E301E617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617E0E5E5D +4F212219164553782C583443263B2626582A062A1919192E7F01017F7F7F010101076211 +65017F7F7F7F7F0161665669681E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00151E617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61000E0711 +7F38352A4553782C585A5A262626581906061A19191A064F7F7F660D307F7F0101095E0E +7E4C017F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E007E15017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E +007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00654C617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F1E667F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617E0E5E11 +7F4C0C352245205A34343B582C2A2121221A191A2A4739597F7F4C62090D1E7F01111C09 +0D6F301E4C617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E007E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E007E007E +7E7E7E7E7E7E7E7E7E7E7E0068156661017F7F7F7F7F7F7F0166667F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F1E7E00617F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E7C11 +7F6107503521062A470606061010062A1A2A224032180B0E7F7F7F11075E0E617F01095E +0A0D6F6C7E683030156361017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E00007E +7E7E7E7E7E7E7E0030691E61017F7F7F7F7F7F7F7F611E156830017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F657E007E3061617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0A3F11 +7F691818502121222A2A222A2A2A2A2A22060573760B0B077F7F7F4C0A5E09117F016F3F +090E112B6D7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F017E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E7E7E7E +7E7E683015564C017F7F7F7F7F7F7F7F61616669007E7E7E30017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F01697E7E7E7E7E1E01617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F611511621C68 +7F0052733C36210619191A2A2A220606403C5B180B7676186C7F017F2B090E667F01010A +7C0A0D6F6C7E7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01661E63656800007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E157F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E0068651E +664C017F7F7F7F7F7F7F7F01614C6669007E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F657E7E7E7E7E7E6861617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01666C0E070701 +7F3052735B3C50212110101021211005185B1876081B3357097F7F7F011E667F0101016D +1C090E112B6D7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F010161614C6656651530680000007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6615664C616101017F7F +7F7F7F7F7F7F01614C1E56687E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F01157E7E7E7E7E7E7E7E6501617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01613011625E4C01 +7F157376735B5B273936363650273C5B185B0F1B373737370F007F017F7F7F0101010101 +0913620D5D6C6D7E7E7E307F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F616101017F7F7F7F7F7F7F7F7F7F7F7F0101616161614C4C661E661E691515156930 +0000617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F +01614C63691530007E7E7E7E7E7E7E7E007E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01307E7E7E7E7E7E7E7E7E0061017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61566F0E5E0A0101 +7F0A44080B5B5B7373183C3C5B735B5B0B7657373714143737137F7F0101010101010101 +637C070E116F6C7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F4C7E000000686815651E4C4C61010101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101016161661E693068 +00007E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F01307E7E7E7E7E00007E7E7E7E6501617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6C0D09074C017F +650F37440F5B5B5B5B5B5B735B18737608754637141414143733117F010101010101017F +610A3F710E112B6D7E00017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +01687E7E7E7E7E7E7E7E7E7E7E00006868683015156563634C6161616101614C01010101 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C151568686800007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F01157E7E7E00156661667E7E7E7E684C017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D62136869617F +093737371B0B185B5B5B5B5B180B0F57330337141414141437373F7F7F01010101010101 +0101715E0A0D5D6C6D157F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00007E30 +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E007E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +61307E7E151E617F7F7F1E7E7E7E7E7E6901617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C15110A5E1101617F11 +08371437030873185B18185B76081B0314371414141414141437756D7F01010101010101 +01016F1C070E0D6F6C667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01 +007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E004C +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +683066617F7F7F7F7F7F697E7E7E7E7E684C617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161656F0E5E7101017F7F52 +37141414143308760B0B760F1B03141437141414141414141437370A7F01010101010101 +0101010A3F710E112B617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F65 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +617F7F7F7F7F7F7F011E007E7E7E7E7E7E5601017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161632B0E090A0101017F0D44 +371414141437374408574446371414141414141414141414141437527F7F010101010101 +010101010713620E6F61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6100 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E157F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F011E30687E7E7E7E7E7E7E7E6801017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01667E0D715E1501017F4C7337 +14141414141414033303373714141414141414141414141414143757007F010101010101 +0101010161077C62115661017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F657E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E007E7E00617F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F01614C30007E7E7E7E7E7E7E7E7E7E7E7E617F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C68116213000101017F0E1B03 +37141414141414141414141414141414141414141414141414371437627F010101010101 +0101010101307C070D6C1E617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E4C7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161 +1E30007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161695D0A7C110101017F615E1B46 +37141414141437374646371414141414141414141414143714334437137F7F0101010101 +0101010101014C07620D0066017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F307E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E567F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F616656007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00017F017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E2B0E070D010101017F691C0833 +03371414141433331B1B33141414141414373737371446441B08081B5261010101010101 +0101010101010168070A111561017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E30017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C30007E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D717101010101017F111C0B08 +1B444646334475080808577544333333334475570808080F0F76760F0B157F01017F7F01 +010101010101017F0A070E2B1E017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F65306868 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E00683030691E61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E687F017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01636F0E7C68010101017F010E1C1C73 +0F081B46333344080F08754403030303331B08760B735B737373730B081C617F0101017F +01010101010101017F0E710D3061017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101 +614C661E5669151530000000007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00686830 +65631E4C61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D096201010101017F610A52180F +081B33141437377508333737141414141446441B080F760B0B735B5B0B44077F7F661168 +7F7F010101010101017E5E0E6F1E017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F0101614C4C1E6356656969153015306800007E7E15017F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E681530156965561E664C6101017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01662B0E076601017F7F01011E070B081B +463703034614141B75141403144603030346373737034457080F0B735B0F1B0E7F7F566F +6C4C7F0101010101010107710D30617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61664C610101 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F010101616161614C017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F014C4C4C4C4C616161017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F016166017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E007E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016911620901017F66637F010E76574614 +0303031414031433440303030314030303030346031414371433570F0B73080F637F7F01 +305D567F0101010101015D5E0E2B66017F7F7F7F7F7F7F7F7F7F7F7F7F7F307E7E006868 +306956631E664C61610101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101614C +661E656515007E69017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E00007E7E00667F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61680D090A017F1E114C7F697344030314 +03031403140346461414464603031414034646140303030303031444080B0B1B5E7F7F7F +7F5611017F01010101010109621169617F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E +7E7E7E7E7E7E7E7E006830303015156965654C614C61010101017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01010101614C614C56651515153030687E7E +7E7E7E7E7E7E69017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01662B0E7C11017F6D697F7F0E3703031446 +4646034603030303030314140303034614030314030303030303463746570B76576D7F01 +6101692B017F01010101010A070D004C017F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00000068017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F016530000000000000000000007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E69017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E007E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F015611625E017F4C6F017F1E733714034614 +030314460314460314031403140314030303461414030314031403033703087675627F61 +307E636F697F0101010101667C0A5D1E017F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F01157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E007E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61680D090A017F117E7F7F07371446034603 +034603144603141446030303141403031414144646031403144646030303377533730161 +6F0D2B662B017F01010101010A710D30617F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E657F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E1563687E007E7E68617F7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01662B0E7C5D7F4C5D017F6676371414030303 +141403031403464614031403464614030346034603034603144646030303033737030D61 +110D6C012B2B7F0101010101115E0E6C66017F7F7F7F7F7F7F7F7F4C7E007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F667E7E007E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E +7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +00694C617F7F307E007E68617F7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6169116213667F7E307F7F0A37141403030303 +031446031446444603463303140314030303140314031403461403030303141446370701 +683066016611017F0101010166130A5D56017F7F7F7F7F7F7F7F01307E007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E0030301E01 +017F7F7F7F61007E7E30017F7F7F7F7F7F7F7F7F7F7F4C017F017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C000D070A7F4C0D617F011837030314144603 +46141403143357440314460314460303140303460303141403140346031446034637527F +017F7F017F7E667F01010101010A090D30617F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F61687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E0030691E61017F7F7F +7F7F7F7F01657E7E30017F7F7F7F7F7F7F7F7F7F7F1E00617F017F7F7F7F7F7F7F7F7F7F +7F7F7F7F611D3D29292929293D1D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01635D0A7C1E7F307E7F7F117537030303140314 +14460346371B084646031403030303030314144603030303030303030314034614377661 +7F0101017F30687F01010101017E070E6D4C7F7F7F7F7F7F7F7F307E7E7E007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F307E7E7E7E007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E00 +617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E68156566617F7F7F7F7F7F7F7F +01614C69007E7E30017F7F7F7F7F7F7F7F7F7F7F567E7E4C7F617F7F7F7F7F7F7F7F7F7F +592949287D7D7D7D7D7D7D7D7D7D7D31041F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161680D097101012B617F61523703030346144646 +14030303147557031403140314031403464603030346031414141403461446460337571E +7F0101017F155D017F0101010161070A6F66017F7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E00151E664C017F7F7F7F7F7F7F7F7F616663 +307E7E7E7E7E15017F7F7F7F7F7F7F7F7F7F01657E7E7E697F017F7F7F7F7F7F7F7F1F3E +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D041D7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0A7C5D7F665D017F2B1B3714140314034614 +03034614035757461414030346460303030303031403140303460314034603031437446F +7F0101017F155D7F01010101010109621156017F7F7F7F7F7F24040404044D7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4D042429291F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C4C61017F7F7F7F7F7F7F7F7F0161666330007E7E +7E7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F01157E7E7E7E007F017F7F7F7F7F7F3D317D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D3E597F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D0907017F006C7F7F0A373703464646030303 +03464637460808460303031414031414034646464646334614144646031414460337370E +7F0101017F156C7F01010101010171710D69017F7F7F7F7F7F7B7D7D7D7D245615000000 +00007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E047D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F4C007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C6515307E7E7E7E7E7E7E +7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F61307E7E7E7E7E7E61017F7F7F7F593E7D7D7D7D +7D7D7D7D3E24291D1D1D1D3D29046A7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F61655D0A7C11017F6F667F7F5E370303031414140303 +14030314030857031414034646030346030303140303461403030303140303141437370A +7F0101017F69157F0101010101010A090D30617F7F7F7F7F7F3E7D7D7D7D297F7F7F7F01 +01616166566515151530306800007E7E7E7E047D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068637F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01614C1E1568007E7E7E7E7E7E7E7E7E007E +7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F01687E7E007E7E7E7E1E01017F7F3D287D7D7D7D7D +28043D7F7F7F7F7F7F7F7F7F7F7F7F611F3E7D7D7D7D7D7D3E617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F014C000D090E017F015D4C7F4C73370314031403030303 +031403034608574646334603460303034603034646030303141403031414030314033771 +7F0101017F15667F0101010101010D070D00617F7F7F7F7F013E7D7D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F0161614C4C4C66247D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F157E0000007E7E7E7E0068686868686830656565561E1E1E664C4C6161017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F0161614C653068007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E1E7F7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E7E7E6961017F1F7D7D7D7D7D2829 +617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F59047D7D7D7D7D6A617F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F61655D0A1368017F0111667F5D57374646030314144614 +03031437440F084603460314034603141403034603460303030303140303144646143707 +7F0101017F304C7F0101010101014C070E6C4C7F7F7F7F637E6E7D7D7D7D244C4C616101 +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F01616161616161616161610101010101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F4C687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E1E7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E3001611F7D7D7D7D7D24617F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D6A7D7D7D7D6A617F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F61680D091101017F7F0D1E7F0D44371414144603461403 +46141414330F574603370303141403461414144603030346140303031403031446463707 +7F0101017F00617F0101010101014C5E0E2B4C7F7F7F01307E6E7D7D7D7D047E7E7E6830 +30156965651E664C610101017F7F7F7F7F7F1D292929291F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +667F7F7F7F7F7F7F7F7F7F7F4C007E007E7E7E7E7E7E7E7E68011F7D7D7D7D281D7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61047D7D7D7D047F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F01662B0E096101017F610D697F0A03370303031446031403 +03031414440F57464603030346031403034614030303030303141446031403030303375E +7F7F017F4C2B01010101010101014C5E0E2B667F7F7F4C7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E00000068683015691E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +017F7F7F7F7F7F7F010101010101010101614C4C4C4C661E1E56696969017F7F7F7F7F7F +7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C +7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E001D7D7D7D7D6A597F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F047D7D7D7D3D7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F01635D0A7101017F61000A5D7F7137140303141446141414 +03031414440F57141403030303031446030314031403144646140303140303031403375E +7F7F017F00007F010101010101014C5E0E2B667F7F7F697E006E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0115 +6830303030303030686868686868686868007E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F +7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F +7F7F7F7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E7E2B317D7D7D6A617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F047D7D7D28617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016511620E01017F01300A0D7F0737140303144614144603 +14140337440F57144603141446030314140346030314461446141446461403034614375E +7F7F01016D4C7F010101010101014C5E0E2B4C7F7F617E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F567E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F +7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F +7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E237D7D7D28617F7F7F7F7F7F +7F7F7F59246A7D7D28491F7F7F7F7F7F292929291F7F7F7F7F6A7D7D7D297F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016911710E010101017F6D117F5E37141414460303464603 +03031403440F750314034646140303030314030314144603140303141446031414463709 +7F7F7F4C687F7F7F7F7F010101014C070E6C4C7F7F667E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E +7E7E7E7E7E7E7E4B04496E6E6E04242B7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F +7F7F7F7F7F61687E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F +7F7F7F7F7F7F7F7F637E7E7E7E7E7E7E7E7E7E7E7E7E7E4B7D7D7D7D517F7F7F7F7F7F7F +7F59047D7D7D7D7D7D7D7D6A517F7F1D7D7D7D7D297F7F7F7F517D7D7D7D617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016911710E017F7F7F7F01684C0737141403460314030303 +03461403440F1B030314140303141403030303140303030346140303140303460337370A +7F61656D6961566566617F7F010111070D00617F01307E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F607D7D7D +7D047E7E7E246E7D7D7D7D7D7D7D7D28232B7E7E7E7E7E7E00667F7F7F7F297D7D7D7D1D +7F7F7F7F61687E7E7E7E7E7E7E7E7D7D7D7D6E7E7E7E7E7E1F287D7D7D7D2D1E7F7F7F7F +7F7F7F7F7F7F7F567E7E247D7D7D7D7D247E7E7E7E7E7E6E7D7D7D297F7F7F7F7F7F7F7F +1F287D7D7D7D7D7D7D7D7D7D281F7F297D7D7D7D3D7F7F7F7F7F047D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F61150D71717F61382E4F7F016F5E37374614140303144646 +14144614440F75031403034603141403141403460346030346030346461414461437335D +7F6D3061010161566D5D6F4C7F010A070D00617F61007E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E307F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F011F7D7D7D +7D047E1F6E7D7D7D7D7D7D7D7D7D7D7D7D2D2B7E7E7E7E7E1E7F7F7F7F7F297D7D7D7D1D +7F7F7F61687E7E7E7E007E7E7E7E7D7D7D7D6E7E7E7E7E7E7E247D7D7D7D7D047F7F7F7F +7F7F7F7F7F01157E7E1F287D7D7D7D237E7E7E7E7E7E1F7D7D7D314C7F7F7F7F7F7F7F29 +7D7D7D7D7D7D313E6A7D7D7D7D2851497D7D7D7D617F7F7F7F7F597D7D7D6A7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F61680D09522E0612641235617F0E08371403140303031403 +46140314440F1B0303141403030303030303034614140314030303140303743774370F59 +65617F7F01017F7F014C110E307F09070D68617F697E00007E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F1E4D7D7D7D +7D04047D7D7D7D7D7D7D7D7D7D7D7D7D7D7D2D2B7E7E7E657F7F7F7F7F7F297D7D7D7D1D +7F7F61687E7E7E7E7E7E7E7E7E7E7D7D7D7D6E7E7E7E7E7E7E7E237D7D7D7D7D297F7F7F +7F7F7F7F01307E7E2B2D7D7D7D7D6E7E7E7E7E7E7E7E497D7D7D1F617F7F7F7F7F7F1F7D +7D7D7D7D04597F7F7F59247D7D7D31287D7D7D6A7F7F7F7F7F7F7F6A7D7D7D597F7F7F7F +7F7F7F7F7F7F7F0101016161566F0E5E3C2A126464642021017F0A573714030303031403 +14030314440F1B03141414461446031403140303140303031446031403375C1717172538 +4C7F0101010101017F7F300D2B7F7C070D7E6101007E7E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E567F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F4C004D7D7D7D +7D287D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D047E7E15017F7F7F7F7F7F297D7D7D7D1D +7F61687E7E7E7E7E7E7E7E7E7E7E7D7D7D7D6E7E7E7E7E7E7E30652D7D7D7D7D7D517F7F +7F7F7F01307E7E7E237D7D7D7D482B7E7E7E7E7E7E2B7D7D7D4801617F7F7F7F7F1D7D7D +7D7D7D1F7F7F7F7F7F7F7F1F7D7D7D7D7D7D7D047F7F7F7F7F7F7F297D7D7D3D7F7F7F7F +7F7F7F7F01016166636930005D0D091C4019455302026420104C7F0D7637140303030303 +14031437440F1B140303031414140303034614460303140346370303033355774E4E3B06 +7F7F0101010101017F612B00630C3C7C0E2B66657E7E7E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F1D7D7D7D7D297F7F7F7F7F01007E4D7D7D7D +7D7D7D7D7D7D6B244B7E7E2B24497D7D7D7D7D282B30017F7F7F7F7F7F7F297D7D7D7D1D +01307E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D6E0030651E6661017F61287D7D7D7D31617F +7F7F61307E7E7E247D7D7D7D281F7E7E7E7E7E7E7E247D7D7D0401617F7F7F7F61317D7D +7D7D1F7F7F7F7F7F7F7F7F7F497D7D7D7D7D7D1F7F7F7F7F7F7F7F1D7D7D7D297F7F7F7F +7F7F7F01611E306C5D110D0D0E093F2522191253020202644E217F7F6F76374614140303 +46034614440F75140303030314030303031403140303461414031403371B5477203B2610 +01010101010101017F6615012E2026270A115666633068007E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F157E7E4D7D7D7D +7D7D7D7D494B7E7E7E7E7E7E7E7E247D7D7D7D7D24617F7F7F7F7F7F7F7F297D7D7D7D1D +307E7E7E7E7E7E7E7E7E7E7E7E007D7D7D7D7B61017F7F7F7F7F7F7F1D7D7D7D7D7D497F +7F61687E7E7E4B287D7D7D7D247E7E7E7E7E7E7E7E6E7D7D7D2B61617F7F7F7F297D7D7D +7D247F7F7F7F7F7F7F7F7F7F597D7D7D7D7D7D517F7F7F7F7F7F7F597D7D7D497F7F7F7F +7F7F0161566D110E0A620907135232471A16450202020202642C357F7F2B1C3737030314 +0314461433085746141403031403031403030303030314460303141437443A1202205835 +7F7F01010101010101017F4C063B3B55090D30617F7F0101017B7D7D7D7D243068680000 +7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F1D7D7D7D7D297F7F7F7F1E7E7E7E4D7D7D7D +7D7D6E1F7E7E7E7E7E7E7E7E7E7E7E497D7D7D7D047F7F7F7F7F7F7F7F7F297D7D7D7D1F +7E7E7E7E7E68683030691E6161017D7D7D7D3E7F7F7F7F7F7F7F7F7F7F297D7D7D7D7D29 +61687E7E7E7E2D7D7D7D7D497E7E7E7E7E7E7E7E7E7D7D7D2D6861617F7F7F61287D7D7D +28617F7F7F7F7F7F7F7F7F7F7F6A7D7D7D7D287F7F7F7F7F7F7F7F7F7D7D7D3E7F7F7F7F +7F7F611E6C0D0A394A0505250505222A1912530202020202022016387F7F665E1B370303 +0303140314441B03460346034614030303030303030303141414461437443A1202021235 +7F7F010101010101017F7F352C202054070E004C7F7F7F7F7F3E7D7D7D7D290101010161 +4C4C1E63153030686868667F7F7F7F7F7F7F1D7D7D7D7D297F7F7F61007E7E7E4D7D7D7D +7D6B7E7E7E7E7E7E7E7E7E7E7E7E7E247D7D7D7D3E7F7F7F7F7F7F7F7F7F297D7D7D7D4D +15631E4C4C0101017F7F7F7F7F7F7D7D7D7D3E7F7F014C4C7F7F7F7F7F7F497D7D7D7D7D +4D7E7E7E7E237D7D7D7D2D7E7E7E7E7E7E7E7E7E4D7D7D7D046861617F7F7F297D7D7D7D +297F7F7F7F7F7F7F7F7F7F7F7F047D7D7D7D497F7F7F7F7F7F7F7F7F7D7D7D3E7F7F7F7F +7F014C68116239062A1A1A1A2A2A1A1941530202020202020202202A667F7F7F0E083714 +03141446460337031414140314141414034614031414030346463746750F3A1202451621 +617F0101010101017F0138192C780254130E110066616161013E7D7D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F1D7D7D7D7D297F7F011500007E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E7E7E00307D7D7D7D7D7F7F7F7F7F7F7F7F7F297D7D7D7D1D +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7D7D7D7D6715007E68617F7F7F7F7F7F616A7D7D7D7D +282B7E7E247D7D7D7D282B7E7E7E7E7E7E7E7E7E047D7D7D4D6861617F7F7F317D7D7D7D +617F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D297F7F7F7F7F7F7F7F7F7D7D7D3E7F7F7F7F +7F011E2B0E39221A1641411616161245530202020202020202022058357F7F7F7F117637 +370346370314030314034603031403461403141403030303030314080B733A1253411906 +0C617F7F7F7F7F7F612E2241784553541C620E116C6D7E00682F7D7D7D7D246101017F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F616161614C3D7D7D7D +7D244C4C4C4C4C4C4C4C4C4C4C4C6101287D7D7D7D7F7F7F7F7F7F7F7F7F297D7D7D7D1D +7F7F7F7F7F7F7F0101614C4C1E697D7D7D7D6E7E7E68617F7F7F7F7F7F7F7F51287D7D7D +7D6E7E4B287D7D7D7D1F7E7E7E7E7E7E7E7E7E7E6B7D7D7D2B6861617F7F517D7D7D7D49 +7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F7F517D7D7D497F7F7F7F +7F0165110A052A191245454512455302020202020202020202530258194F7F017F7F681C +4637460303460346031403140314461403030303144614460337447673733A1612411922 +060C384F4F4F4F2E35221916455302413C070A0D6F6C6D7E7E6E7D7D7D7D047E00683063 +1E1E664C4C4C61017F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F297D7D7D7D1D +614C4C661E636530007E7E7E7E7E7D7D7D7D6E7E30017F7F7F7F7F7F7F7F7F7F297D7D7D +7D7D236E7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E6E7D7D7D7E6861617F7F297D7D7D7D1F +7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D7F7F7F7F7F7F7F7F7F3D7D7D7D297F7F7F7F +7F61150D71052A16455302020202020202020202020202020202536458357F7F01017F01 +09373714031414140314034646031414460303140303030303141B0B0B733A161241162A +0606061021101006221A414553020253251C090E116F6C7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E0068017F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F247D7D7D7D1F +007E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D6E30017F7F7F7F7F7F7F7F7F7F6100237D7D +7D7D7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E287D7D2D7E6861617F7F3E7D7D7D7D59 +7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D6A7F7F7F7F7F7F7F7F7F247D7D7D1F7F7F7F7F +7F61300D09402A1645530202020202020202020202020202020202024E192E7F0101017F +7F09373746030303030303034603030346030303030314030314750B0B7347191241161A +2A2222222222222A1941530202020202543213620D116F6C6D6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E657F7F7F7F7F7F7F7F7F7F1D7D7D7D7D2963683030303030151F7D7D7D +7D24636363636363631E1E63636915013E7D7D7D7D7F7F7F7F7F7F7F7F1E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D2F017F7F7F7F7F7F7F7F7F7F66007E7E2D7D +7D7D7D7D7D7D2D7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6861617F7F317D7D7D7D7F +7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D247F7F7F7F7F7F7F7F7F317D7D7D597F7F7F7F +7F61300D09052A164553020202020202020202020202020202020202644E06017F010101 +7F015E37141446031403031446141403030303461403030314371B760B5B471A41124119 +191A1A2A1A1A1A194145020202020253453A3C5E620D116F6C6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F1D7D7D7D7D247E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E7E7E667F3E7D7D7D7D7F7F7F7F7F7F7F4C00047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F7F7F7F66007E7E7E2B28 +7D7D7D7D7D282B7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6861617F7F7D7D7D7D3E7F +7F7F7F7F7F7F7F7F7F7F7F7F597D7D7D7D3D7F7F7F7F7F7F7F7F3D7D7D7D6A7F7F7F7F7F +7F01150D710522191253020202020202020202020202020202020202024E780C7F7F0101 +017F0008371414140314460314030346031414030303030303374476730B472A16124541 +161919191919161612530202020202025377253C5E620E0D5D6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E7E1E7F7F3E7D7D7D7D7F7F7F7F7F7F4C7E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E24 +7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6861617F7F7D7D7D7D3E7F +7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D597F7F7F7F7F7F7F7F3E7D7D7D297F7F7F7F7F +7F01691171052219415302020202020202020202020202020202020253024E19387F0101 +017F610B37030314034603034614031403140303030303034603460F761C062A16124545 +121616161616411245530202020202020253123A187C710E0D6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E657F7F7F3E7D7D7D7D7F7F7F7F7F61007E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F7F667E007E7E7E7E2B48 +7D7D7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6801617F7F7D7D7D7D3E7F +7F7F7F7F7F7F7F7F7F7F7F7F6A7D7D7D317F7F7F7F7F7F7F7F3D7D7D7D28617F7F7F7F7F +7F015611621C221941530202020202020202020202020202020202020202205821617F01 +017F0176370303030314031403141446030314030303034603144608185D101A16125353 +5345121212124545530202020202020202020253543213710E2D7D7D7D7D047E7E7E7E7E +7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E15017F7F7F3E7D7D7D7D7F7F7F7F61687E7E7E047D7D7D7D4D +7E7E7E7E7E007E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F1E7E7E007E7E7E7E6E7D +7D7D7D7D7D7D281F7E7E7E7E7E7E7E7E7E7E7E7E487D7D7D7E3001617F7F6A7D7D7D317F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D497F7F7F7F7F7F7F61287D7D7D297F7F7F7F7F7F +7F01635D0A1C471A41530202020202020202020202020202020202020202024E780C7F7F +7F7F0A4437034646031414034603030303141403030314030303370B0D4F101A16125302 +025353535353020202020202020202020202020264453A4A622D7D7D7D7D047E7E7E7E7E +007E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E68017F7F7F7F3E7D7D7D7D7F7F7F01687E007E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E687D7D7D7D3E7F7F7F7F7F7F1E7E7E7E7E7E7E7E237D7D +7D7D7D7D7D7D7D2D2B7E7E7E7E7E7E7E7E7E7E7E6E7D7D7D7E3001617F7F497D7D7D7D61 +7F7F7F7F7F7F7F7F7F7F7F6A7D7D7D7D297F7F7F7F7F7F7F6A7D7D7D28617F7F7F7F7F7F +7F01635D621C471A1653020202020202020202020202020202020202020202024E2A4F61 +7E3F373714034614031403461403031403030314030346141437085D7F38101A16125302 +02020202020202020202020202020202020202020264023A09487D7D7D7D047E7E7E7E00 +7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E007E7E00617F7F7F7F7F3E7D7D7D7D7F7F01157E7E007E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E007E68617D7D7D7D3E7F7F7F7F01697E7E7E7E7E7E7E247D7D7D +7D484D287D7D7D7D497E7E7E7E7E7E7E7E7E7E7E497D7D7D4D1501617F7F297D7D7D7D1F +7F7F7F7F7F7F7F7F7F7F247D7D7D7D7D1D7F7F7F7F7F61047D7D7D7D3D7F7F7F7F7F7F7F +7F016511621C471A165353020202020202020202020202020202020202020202582C101C +4437370346140314030303030314034603030303030303143776117F7F2E101A16455302 +02020202020202020202020202020202020202020202025407487D7D7D7D047E7E7E7E7E +7E7E7E7E017F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E667F7F7F7F7F7F3E7D7D7D7D7F01157E7E7E7E7E7E047D7D7D7D24 +7E7E7E7E7E7E7E7E7E7E7E68617F7D7D7D7D3E7F7F7F7F66007E7E7E7E7E7E1F287D7D7D +7D1F7E247D7D7D7D7D047E7E7E7E7E7E7E7E7E7E047D7D7D046901017F7F597D7D7D7D31 +7F7F7F7F7F7F7F7F7F1F7D7D7D7D7D7D7F7F7F7F7F596A7D7D7D7D247F7F7F7F7F7F7F7F +7F61150D0927221A415353530202020202020202020202020202020202020253782C1650 +0837140346460303031403140303030346030303141437377C4C7F7F012E101A16455302 +02020202020202020202020202020202020202025353455407487D7D7D7D047E7E7E7E7E +7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F7F607D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E637F7F7F7F7F7F7F3E7D7D7D7D7F697E7E7E7E7E7E7E047D7D7D7D04 +7E7E7E7E7E7E7E7E7E7E68617F7F7D7D7D7D3E7F7F7F0101567E7E7E7E7E2B2D7D7D7D7D +047E7E7E497D7D7D7D7D1F7E7E7E7E7E7E7E7E7E1F7D7D7D6B5661017F7F7F047D7D7D7D +047F7F7F7F7F7F7F297D7D7D7D7D7D7D517F7F7F29287D7D7D7D3E7F7F7F7F7F7F7F7F7F +7F61000D0705221A415353020202020202020202020202020202020202020253532C2C06 +057437030314141446460303031403460303141437370F0A7F7F017F612E101A16455302 +020202020202020202020202020202020202020245411940622D7D7D7D7D047E7E7E7E7E +7E7E7E617F7F7F7F7F7F7F7F7F7F7F7F7F7F1F7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E157F7F7F7F7F7F7F7F3E7D7D7D7D567E00007E7E7E7E7E4D7D7D7D7D2D +7E7E7E7E7E7E7E7E7E68617F7F517D7D7D7D3E7F7F7F7F01307E7E7E7E7E497D7D7D7D6E +7E7E7E7E2B2D7D7D7D7D482B7E7E7E7E7E7E7E7E7E287D7D7D1561017F7F7F597D7D7D7D +7D49597F7F7F3D6A7D7D7D287D7D7D7D282424317D7D7D7D7D6A617F7F7F7F7F7F7F7F7F +01666F0A1340221945530202020202020202020202020202020202020202530253782C19 +21183737140346033714031446030314030374371B5E4C7F7F01017F610C101A41455302 +0202020202020202020202020202020202025345161A40070E6E7D7D7D7D290161666569 +1530567F7F7F7F7F7F7F7F7F7F7F7F7F7F4C4D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E68017F7F7F7F7F7F7F7F3E7D7D7D7D7E7E7E7E7E7E7E7E7E4B7D7D7D7D7D +1F7E68683030155666017F7F29287D7D7D7D3E7F7F7F7F637E7E7E7E7E047D7D7D7D282B +7E7E7E7E7E1F287D7D7D7D6E7E7E7E7E7E7E7E7E7E497D7D7D24617F7F7F7F7F297D7D7D +7D7D7D6A3E287D7D7D7D24497D7D7D7D7D7D7D7D7D7D7D7D3E617F7F7F7F7F7F7F7F7F7F +0165116227062A1253530202020202020202020202020202020202020202020253451219 +100C3F03373737740337031437373737373708076C7F7F7F0101017F660C102A16455302 +02020202020202020202020202020202534541192A05070A5D2F7D7D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F154D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E00617F7F7F7F7F7F7F7F7F3E7D7D7D7D7E7E7E7E7E0068006830487D7D7D7D +6E1E01017F7F7F7F7F7F1F317D7D7D7D7D7D3E0101611E007E7E7E7E1F7D7D7D7D7D4D7E +7E7E7E7E7E7E247D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D31667F7F7F7F7F7F047D7D +7D7D7D7D7D7D7D7D7D1F7F297D7D7D7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +61150D714022191253535302020202020202020202020202020202020202020202451619 +220C610A520F1B14373737371444087652096C7F7F7F01010101017F4F0C102A16125302 +0202020202020202020202020202534516192A40277C710E5D2F7D7D7D7D3E2929292929 +292929292929292929292929291D7F7F7F613D7D7D7D7D2465656969696969691F7D7D7D +7D04303030667F7F7F7F7F7F7F7F7F7F3E7D7D7D7D5665664C4C610101017F297D7D7D7D +7D311F517F7F7F1D24317D7D7D7D7D7D7D7D6768007E7E7E7E7E7E2B287D7D7D7D047E7E +7E7E7E7E7E7E7E497D7D7D7D7D4D7E7E7E7E7E7E7E7E487D7D7D297F7F7F7F7F7F7F1F28 +7D7D7D7D7D7D7D6A517F7F616A7D7D7D7D7D7D7D7D3E517F7F7F7F7F7F7F7F7F7F7F7F7F +61300D7106221A1645535353535302020202020202020202020202020202020202454119 +2235387F7F1E5D0E7107710A0E1165617F7F7F7F010101010101017F4F0C102A16455302 +0202020202020202025353455345411922403C3F07620E115D6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D2901017F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F7F61287D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D287D7D7D7D6E7E7E7E7E7E7E7E7E6E7D7D7D7D2D7E7E7E +7E7E7E7E7E7E7E2B2D7D7D7D7D284B7E7E7E7E7E7E7E247D7D7D7D517F7F7F7F7F7F7F61 +293E7D7D28493D7F7F7F7F7F61296A7D7D7D3E24517F7F7F7F7F7F7F29292929297F7F7F +61150D7106222A1916121245454553535353020202020202020202020202020202454119 +22212E617F7F7F7F7F7F7F7F7F7F7F7F7F010101010101010101017F3835102A16120202 +020202020202020253451241161922503C3F07620E0D115D2B6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F7F7F3D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D6A517D7D7D7D6E7E7E7E7E7E7E7E237D7D7D7D284B7E7E7E +7E7E7E7E7E7E7E7E1F287D7D7D7D2D7E7E7E7E7E7E7E7E6E7D7D7D6A617F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D297F7F7F +61695D0A5006222A1A19191916161641454545535353020202020202020202020245161A +06350C4F7F0101017F7F01010101010101010101010101010101017F3835102219415302 +0202020202535353121619192A47051C5E710A0D0D5D2B6C6D6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D294C6565563D7D7D7D7D29017F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D01010101614C4C1E65691515247D7D +7D7D7D7D7D7D7D7D7D7D28297F7F7D7D7D7D6E7E7E7E7E7E7E247D7D7D7D7D247E7E7E7E +7E7E7E7E7E7E7E7E7E247D7D7D7D7D497E7E7E7E7E7E7E1F287D7D7D6A617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1F7D7D7D7D6A7F7F7F7F +011E6C0D7250501010060622222A1A1A1A19191641124545530253530202025345411A22 +10350C4F7F0101010101010101010101010101010101010101017F01380C21061A191253 +5353535353451216191A2A06501C7C090A0D0D5D6F6C6C6D7E6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D29307E7E7E4D7D7D7D7D0400000000006815691F7D7D7D +7D24617F7F7F7F7F7F7F7F7F7F7F7F662F7D7D7D7D000000007E7E7E7E7E7E7E7E7E1F6E +7D7D7D7D7D7D7D7D2804597F7F7F7D7D7D7D6E7E7E7E7E7E1F287D7D7D7D237E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E497D7D7D7D7D247E7E7E7E007E7E297D7D7D7D6A617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D28617F7F7F7F +0161696F0D62073F05502121101006060606222A2A1A1916414553535353454541192210 +21352E4F7F0101010101010101010101010101010101010101017F01380C2110221A1641 +454553451216191A2206101C7C090A0E0D5D6F6C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E30 +7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E697F7F7F7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +1F04233E3E3E293D617F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0061047D7D7D7D281D7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F613E7D7D7D7D28517F7F7F7F7F +7F014C696C110E0A715E134A05362121211010101006222A1A191916411241161A220621 +350C2E4C014C4C61110A0A0A0A0A0A0A0A0A0A0A0A0A0A604C4C6101380C3510062A1A16 +16414116191A2A2210363F070E0E0D116F2B6C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C +7F7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +30017F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E667F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E306161047D7D7D7D7D49597F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F29287D7D7D7D28517F7F7F7F7F7F +7F0101611E306C5D0D0E0A72075E3F3936363535212121100606222A2A1A1A2A22102135 +0C0C384C71523F5E0707070909090909075E5E5E7C7C13133F527C0A0D2E35211006222A +1A1A1A2A22061021393F710E6F6F5D2B6C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6801 +7F7F7F7F7F7F7F7F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00 +617F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +667F7F7F7F7F7F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6961017F297D7D7D7D7D7D493D +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F611F317D7D7D7D7D6A517F7F7F7F7F7F7F +7F7F7F0101616656306C6F110D0E0A71077C3F39420C0C3521212110101010102135350C +0C2E11077C090A0E0E0D0D0D0D0D0D0D0E0A0A0A0A0A6262710713523F2E0C3521101006 +060606061010214213620D6C65006C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F +7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E66 +7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E007E7E1E +7F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E017F7F7F1D287D7D7D7D7D7D +28041F597F7F7F7F7F7F7F7F7F7F7F7F591F49287D7D7D7D7D7D04617F7F7F7F7F7F7F7F +7F7F7F7F7F7F0101614C1E69682B5D0D0D0E62095E134A390C0C35353521353535350C2E +2E0713090E0D5D2B6D006830303030006D110D110D0D0D0D0D0E62073F792E0C35211010 +101010102135425E620D6C1E61306D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E617F +7F7F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F +7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F +7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C017F7F7F7F61247D7D7D7D7D +7D7D7D7D7D3E3E2929292929293E3E7D7D7D7D7D7D7D7D7D313D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F0161616663157E2B5D0D0E0A71071339790C0C0C0C0C0C0C2E2E +705E0A0D6F3063664C6161616161614C66002B2B2B6F6F6F5D110D0A0913792E0C353535 +213535350C42070A0D001E61016615687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00017F +7F7F7F7F7F7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F +7F7F7F7F7F7F7F7F7F7F157E00007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F +7F7F7F7F7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E3061617F7F7F7F7F7F59047D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D311F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F010161616656306C5D0D0E0A715E1370790C2E2E797009 +710E11001E61017F7F7F7F7F7F7F7F0101657E7E7E7E7E6D6C2B5D0D0E715E07790C2E0C +0C0C79707C090E11681E61017F7F7F014C661E15007E7E7E7E7E7E7E7E7E7E7E7E657F7F +7F7F7F7F7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F +7F7F7F7F7F7F7F7F7F1E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F +7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6901017F7F7F7F7F7F7F7F611F49 +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D491F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101614C1E157E5D0D0E0A7109075E0709620E +0D6F156661017F7F7F7F7F7F7F7F7F7F01667E7E7E7E7E7E7E6D2B5D0D0E0A095E133F3F +3F3F7C07710D6F306661017F7F4C617F7F7F7F7F01614C66693000007E7E7E7E7E4C7F7F +7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F +7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F +7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E017F7F7F7F7F7F7F7F7F7F7F7F +611D293E6A7D7D7D7D7D7D7D7D7D7D283E243D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01614C63306C5D110D0D0E0D0D116F +681E61017F7F7F7F7F7F7F7F7F7F7F7F6161687E7E7E7E7E7E7E6C2B6F110D0E0E0A6262 +62620A0E0E11654C01017F7F7F150030151E017F7F7F7F7F7F0101614C1E690068617F7F +7F7F7F7F7F7F7F7F7F307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E15017F7F7F +7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F +7F7F7F7F7F1E7E7E7E7E7E000068687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E684C4C017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F1D1D1D1D1D1D597F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1F292929291D01614C1E696800000068691E +4C61017F7F7F7F7F7F7F7F1D292929291F01157E7E7E7E7E7E7E7E6D6C2B5D11110D0D0D +0D0D0D11116F66017F7F7F7F7F157E7E7E7E0068156661017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E007E7E7E00007E7E7E00617F7F7F7F +7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E68617F7F7F7F7F +7F7F7F7F4C683015691E4C61017F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E15014C7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F01010161616161616101 +017F7F7F7F7F7F7F7F7F7F297D7D7D7D3E011E7E7E7E7E7E7E7E7E7E7E6D6C6C2B6F6F6F +6F6F6F2B6C6C157F7F7F7F7F7F157E7E7E7E7E7E7E7E0068301E6101017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F4C56656915686800007E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F +7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F +7F7F7F7F01017F7F7F7F7F7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6501617F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E6161687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E007E7E7E00617F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E0015664C017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F010161614C66661E1E65651515151530697F7F7F7F7F7F +7F7F7F7F7F657E7E7E7E7E7E686868686868301515156556561E661E617F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C4C017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E0101307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E157F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F +7F7F7F7F7F614C4C4C4C4C61010161616101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F0166007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68011E7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E7F611E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E4C7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F7F7F +7F7F7F7F7F7F611E4C6101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01614C661E651530007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6301017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D292929291F7F4C61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E007E7E68017F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F +7F7F7F7F7F7F697E7E0068303015155666616101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01 +69303030007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0061617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6101697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E697F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F +7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E7E7E7E7E000000683069667F7F7F7F7F7F7F7F7F +7F7F6161616161616161616161616161614C4C4C4C661E1E617F7F7F7F7F7F7F7F7F6168 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1501617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F010166007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E667F7F01687E7E7E7E007E7E7E7E7E7E7E7E7E7E00617F7F7F7F +7F7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F7F7F7F7F7F7F +7F4C007E0000000000000000000000007E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F61687E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6601017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161307E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E007E00617F7F157E7E7E7E007E7E7E7E007E7E7E7E7E307F7F7F7F7F +7F7F7F7F01687E007E7E7E7E7E7E7E7E7E7E7E007E7E007E7E307F7F7F7F7F7F7F7F7F7F +61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F01307E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E3001617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01011E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E007E68017F657E7E7E7E7E7E7E7E7E7E7E7E7E1F04043E3E3E3E29 +1F617F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F01 +307E7E7E7E7E7E7E7E7E7E7E7E7E1F046B6E6E6B041F617F7F7F7F7F7F7F7F017E24236E +6E6E49044B7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E2B24046E6E6E6E23244B7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F5129243E3E3E3E291F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F61614D7D7D7D7D2D7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E237D7D7D7D24683068007E7E7E7E7E7E7E24487D7D7D7D7D7D7D7D +7D7D4951307E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D047E7E657F7F1F49317D7D7D312465 +7E00004D7D7D7D7D047E7E7E24487D7D7D7D7D7D7D7D3E517F7F7F7F7F7F1D3E7D7D7D7D +7D7D7D7D7D6E4B7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1F497D7D7D7D7D7D7D7D7D7D6E +4D7E7E7E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F7F7F1F49317D7D7D31247F7F7F +7F7F7F7F7F7F7F1F317D7D7D7D7D7D7D7D7D7D49517F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F010165487D7D7D7D1F7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E287D7D7D7D1D00301E636930007E7E4D487D7D7D7D7D7D7D7D7D7D +7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D047E680129287D7D7D7D7D7D7D7B00 +7E7E7E4D7D7D7D7D047E4D487D7D7D7D7D7D7D7D7D7D7D7D1F7F7F7F61047D7D7D7D7D7D +7D7D7D7D7D7D281F7E7E7E7E7E7E7E7E7E7E7E7E7E7E237D7D7D7D7D7D7D7D7D7D7D7D7D +7D6E2B7E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F29287D7D7D7D7D7D7D3E7F7F7F +7F7F7F7F7F1D317D7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F014C047D7D7D7D497E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E247D7D7D7D6E007E7E7E15664C6665247D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E4D7D7D7D7D047E60317D7D7D7D7D7D7D7D7D6E7E +7E7E7E4D7D7D7D7D04237D7D7D7D7D7D7D7D7D7D7D7D7D7D7D517F1D287D7D7D7D7D7D7D +7D7D7D7D7D7D7D282B7E7E7E7E7E7E7E7E7E7E7E2B2D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D481F7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D297F51317D7D7D7D7D7D7D7D7D3E7F7F7F +7F7F7F7F1F7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D047F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F6101607D7D7D7D282B7E7E7E7E7E7E +7E7E7E7E7E7E7E7E6B7D7D7D7D247E7E7E7E7E7E301E1F7D7D7D7D7D7D6B241D1D1D2904 +287D7D7D7D7D047E7E7E7E7E7E7E7E7E4D7D7D7D7D04047D7D7D7D7D7D7D7D7D7D7D6E00 +7E7E7E4D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D6A297D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E7E6E7D7D7D7D7D7D48490404232D7D7D7D +7D7D7D282B7E7E7E7E7E7E7E7E7E4D7D7D7D7D29297D7D7D7D7D7D7D7D7D7D7D3E7F7F7F +7F7F7F1F7D7D7D7D7D7D49291D1D1D2904287D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F01617A7D7D7D7D247E7E7E7E7E7E +7E7E7E7E7E7E7E4B7D7D7D7D287E7E7E7E7E007E7E4D7D7D7D7D7D494C61017F7F7F7F7F +61047D7D7D7D7D1F7E7E7E7E7E7E7E7E4D7D7D7D7D287D7D7D7D7D7D6A3E3E3E487D6E7E +7E7E7E4D7D7D7D7D7D7D7D7D2849242B7E30591F317D7D7D7D7D7D7D7D7D7D48044D7E7E +7E1F04287D7D7D7D7D2B7E7E7E7E7E7E7E7E7E047D7D7D7D7D2D4D7E7E7E7E7E7E4B6B7D +7D7D7D7D6E7E7E7E7E7E7E7E007E4D7D7D7D7D287D7D7D7D7D7D6A3E3E3E317D3E7F7F7F +7F7F1D7D7D7D7D7D49617F7F7F7F7F7F7F61047D7D7D7D7D517F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F61014D7D7D7D7D2D7E7E7E7E7E7E +7E7E7E7E7E7E7E047D7D7D7D237E7E7E7E7E7E7E2B487D7D7D7D4D017F7F7F7F7F7F7F7F +7F7F237D7D7D7D6B7E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D3E1F617F7F7F61007E1F7E +7E7E7E4D7D7D7D7D7D7D7D042B7E7E7E68617F7F616A7D7D7D7D7D7D7D28247E7E7E7E7E +7E7E7E1F7D7D7D7D7D247E7E7E7E7E7E7E7E4B7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E24 +7D7D7D7D7D247E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D3E1F617F7F7F7F7F7F517F7F7F +7F61317D7D7D7D1F7F7F7F7F7F7F7F7F7F7F7F047D7D7D7D497F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F010161487D7D7D7D1F7E7E7E7E7E +7E7E7E7E7E7E7E487D7D7D7D4B7E7E7E7E7E7E7E047D7D7D7D237E0065617F7F7F7F7F7F +7F7F61317D7D7D7D4B7E7E7E7E7E7E7E4D7D7D7D7D7D7D311D7F7F7F7F7F01307E7E7E7E +7E7E7E4D7D7D7D7D7D6E4B7E7E7E7E00617F7F7F7F1D7D7D7D7D7D7D232B7E7E7E7E7E7E +7E7E7E7E047D7D7D7D497E7E7E7E7E7E7E7E497D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E +047D7D7D7D487E7E7E7E7E7E7E7E4D7D7D7D7D7D7D311D7F7F7F7F7F7F7F7F7F7F7F7F7F +7F297D7D7D7D247F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D7D597F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F6101247D7D7D7D497E7E7E7E7E +7E7E7E7E7E7E4D7D7D7D7D6B7E7E7E7E7E7E7E00287D7D7D487E7E7E7E00017F7F7F7F7F +7F7F7F1F7D7D7D7D24661E563000007E4D7D7D7D7D7D24617F7F7F7F7F7F567E7E7E7E7E +7E7E7E4D7D7D7D7D6B7E7E7E7E7E7E667F7F7F7F7F7F287D7D7D7D247E7E7E7E7E7E7E7E +7E7E7E004B7D7D7D7D6E7E7E7E7E7E7E7E4B7D7D7D7D7D4B7E7E7E7E7E7E7E7E7E7E7E7E +7E487D7D7D7D247E7E7E7E7E007E1F7D7D7D7D7D24617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F287D7D7D317F7F7F7F7F7F7F7F7F7F7F7F7F7F1F7D7D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F61157D7D7D7D282B7E7E7E7E +7E7E7E7E7E7E497D7D7D7D247E7E7E7E7E7E7E247D7D7D7D247E7E7E7E7E617F7F7F7F7F +7F7F7F617D7D7D7D047F7F7F7F01614C3D7D7D7D7D247F7F7F7F7F7F7F4C7E7E7E7E7E7E +7E7E7E4D7D7D7D7D047E7E7E7E7E567F7F7F7F7F7F7F3E7D7D7D7D4D7E00683015696366 +4C4C61017F7D7D7D7D7D7E7E7E7E7E7E7E047D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E7E +7E247D7D7D7D6B7E7E7E7E7E7E003D7D7D7D7D247F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +3D7D7D7D7D1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617D7D7D7D047F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F01013E7D7D7D7D247E7E7E7E +7E7E7E7E7E2B7D7D7D7D487E7E7E7E7E7E7E7E497D7D7D7D2B7E7E7E7E7E617F7F7F7F7F +7F56151E317D7D7D3E7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F4C1E6330686868 +6800004D7D7D7D7D040000000015017F7F7F7F7F7F7F047D7D7D7D3D616101017F7F7F7F +7F7F7F7F7F487D7D7D7D7E7E7E7E7E7E7E6B7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E +7E4B7D7D7D7D287E7E7E7E7E7E56607D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +047D7D7D7D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D3E7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F611F7D7D7D7D2D7E7E7E7E +7E7E7E7E7E247D7D7D7D047E7E7E7E7E7E7E7E487D7D7D2D7E7E7E7E7E7E4C7F7F7F7F7F +01007E7E6E7D7D7D7D01017F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F01011D7D7D7D7D29010101017F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F7F +7F7F7F7F016E7D7D7D7D7E7E7E7E7E7E7E287D7D7D7D4B7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E487D7D7D7D1F7E7E7E7E3061607D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +317D7D7D6A7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F0101317D7D7D7D4B7E7E7E +7E7E7E7E7E2D7D7D7D7D4B7E7E7E7E7E7E7E7E7D7D7D7D286E6E6E6E6E6E673E3E3E3E3E +7B6E6E6E287D7D7D7D686830696661011D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F7F +7F7F7F7F666E7D7D7D7D7E7E7E7E7E7E7E7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E6E7D7D7D7D4D7E7E7E001E01607D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7D7D7D7D283E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E287D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F61297D7D7D7D237E7E7E +7E7E7E7E1F7D7D7D7D6B7E7E7E7E7E7E7E7E1F7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F010161614C +66666369006E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E7E7E1501611D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F51 +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F01567D7D7D7D287E7E7E +7E7E7E7E237D7D7D7D247E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F7F666965631E6666664C61 +616161607D7D7D7D29017F7F7F7F7F7F7F7F7F01614C247D7D7D7D1F6515153068007E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E7E004C01011D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F01497D7D7D7D247E7E +7E7E7E7E287D7D7D487E7E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F617E7E7E7E7E7E7E7E7E00 +007E004D7D7D7D7D04157F7F7F7F7F7F7F7F01307E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E7E5601617F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F3D7D7D7D7D6E7E7E +7E7E7E247D7D7D7D047E7E7E7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E007E004C7F7F7F01 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1F7D7D7D7D297F7F7F157E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D04617F7F7F7F7F7F7F7F697E007E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E007E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E3001617F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F01317D7D7D7D4B7E +7E7E7E6B7D7D7D7D4B7E7E7E7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E1E7F7F7F61 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E003D7D7D7D7D297F7F4C007E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D247F7F7F7F7F7F7F7F1E7E7E7E00047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D04004C01017F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D237E +7E7E4B7D7D7D7D6B7E7E7E7E7E7E7E7E7E7E2B7D7D7D7D7D7E7E7E7E7E7E7E157F7F7F4C +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E151D7D7D7D7D297F01687E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F7F7F667E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E6E7D7D7D7D4D6301617F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F597D7D7D7D287E +7E7E047D7D7D7D247E7E7E7E7E7E7E7E7E7E7E287D7D7D7D1F7E7E7E7E7E7E00617F7F1E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C1D7D7D7D7D297F1E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F7F4C7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E287D7D7D7D4B7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E487D7D7D7D4B01617F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +287D7D7D7D517F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F497D7D7D7D24 +7E7E487D7D7D487E7E7E7E7E7E7E7E7E7E7E7E6B7D7D7D7D047E7E7E7E7E7E7E567F7F65 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E68011D7D7D7D7D2961007E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F01687E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E6B7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E +7E4B7D7D7D7D286101017F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +497D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D6E +7E4D7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E7E047D7D7D7D487E7E7E7E7E7E7E00617F01 +15687E7E7E7E7E7E7E7E7E7E7E7E657F1D7D7D7D7D29657E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F157E7E007E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E047D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E047D7D7D7D4901017F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +297D7D7D7D317F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D7D +4B497D7D7D7D2B7E7E7E7E7E7E7E7E7E7E7E7E4B7D7D7D7D7D047E7E7E7E7E7E7E657F61 +664C1E1568007E7E7E7E7E7E7E7E617F1D7D7D7D7D29007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F637E7E7E7E007E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E4B7D7D7D7D7D1F7E7E7E7E7E7E7E7E7E7E7E7E +2B487D7D7D7D1F617F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +597D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D +497D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E7E7E497D7D7D7D7D247E7E007E7E7E7E6115 +7E694C01611E6904047E7E7E7E00017F1D7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F4C7E7E7E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E6B7D7D7D7D2D7E7E7E7E7E7E7E7E7E7E7E7E +237D7D7D7D31617F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F047D7D7D7D7D1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F29297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F617D7D7D7D +7D7D7D7D7D4D7E7E7E7E7E7E7E7E7E7E7E7E7E7E4B287D7D7D7D7D047E7E7E7E7E7E0000 +7E7E0069661F317D294C666500567F7F1D7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E3D7D7D7D7D297F7F01687E7E7E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E1F7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E24 +7D7D7D7D7D1F017F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F59287D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F1F317D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D3E292929292929292929292929 +2929292929291D7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F047D7D7D +7D7D7D7D487E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E247D7D7D7D7D7D6E247E7E7E7E7E7E +7E7E1F04487D7D7D297F7F7F017F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E00007E +7E7E151D7D7D7D7D297F01307E7E007E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E047D7D7D7D7D2D4D7E7E7E7E7E7E4B6B7D +7D7D7D7D7B017F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F1F7D7D7D7D7D7D3E3D7F7F7F7F7F7F7F7F5129317D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D +7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E497D7D7D7D7D7D7D286E23040404 +6E287D7D7D7D7D7D24017F7F7F7F7F7F1D7D7D7D7D2415680000007E7E7E7E7E7E7E7E7E +7E00611D7D7D7D7D297F567E7E7E7E7E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E0000 +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E6E7D7D7D7D7D7D48490404232D7D7D7D +7D7D7D28667F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F047D7D7D7D7D7D7D283E242929293E287D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D +7D7D7D7D2B007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E047D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D0400154C017F7F7F1D7D7D7D7D297F7F7F0101614C63691515153030 +30667F1D7D7D7D7D294C7E7E7E7E7E7E7E7E7E7E0068047D7D7D7D1F156565564C61611E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E2B2D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D311D7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F297D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D +7D7D7D23687E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4D2D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D6B1F7E7E7E1E7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D294C664C664C6161616161616101297D7D7D7D1D7F7F7F7F7F7F7F66 +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E237D7D7D7D7D7D7D7D7D7D7D7D7D +7D3E667F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F1D6A7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D49517F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617D7D +7D7D7D1D66007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E246B7D7D7D7D7D7D7D7D +7D7D7D7D6E044B7E7E7E7E7E667F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F65 +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E1F497D7D7D7D7D7D7D7D7D7D67 +1D617F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F3D497D7D7D7D7D7D7D7D7D7D7D7D3E29597F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F61011E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E2B4D04496E6E6E6E +23044D2B7E7E7E7E7E7E7E7E617F7F7F7F01687E003069656661017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F15 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E2B24046E6E6E6E23240001 +617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F611D29043E3E3E3E24291D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F61011E007E00007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F4C7E7E7E7E7E7E7E00003015651E664C4C017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101016168 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00630161 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F610166007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E617F +7F7F7F7F7F0156696969651E1E1E1E1E1E1E1E636569696969691530303030686868007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E001E01617F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F610166007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E307F7F +7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E001E01617F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F610166687E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E307F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F +7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E006601617F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F61014C307E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E657F7F7F7F307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F7F +7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E304C01617F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F610161157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E157F7F7F017E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F +7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E306101617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F010101657E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F +7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E696101617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F01610163687E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F657E00007E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F +7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E00630101017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F610166687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F307E7E7E7E7E7E007E7E7E7E7E7E7E637F7F7F7F7F +7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68660161017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F610161157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F01307E7E7E7E7E7E007E7E7E7E7E7E7E017F7F7F7F7F +01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E156101617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101011E687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E667F7F016615687E7E7E7E7E7E7E7E7E7E657F7F7F7F7F7F +567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00630101017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E300101017F7F014C563000007E7E7E7E00617F7F7F7F7F61 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E304C0161017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61010163687E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E611E7E1E017F7F7F7F014C65153000157F7F7F7F7F7F15 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00560101617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C157E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E30307E7E6866017F7F7F7F7F7F7F61017F7F7F7F7F6100 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E154C0161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61010166687E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00564C017F7F7F7F7F7F7F7F7F7F7F0161 +4C4C1E636569691530303030687E000000000000000000007E006830303030301515007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E681E6101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016156007E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E007E007E7E7E7E7E7E7E30654C017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F0101010101616161616161616161616161610101010101017F7F307E +7E7E7E7E7E7E7E7E7E7E7E7E0065610161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101016169007E7E007E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6815617F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F657E +7E7E7E7E7E7E7E7E7E7E00154C0101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161014C15007E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F0161017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F567E +7E7E7E7E7E7E7E7E00154C0101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161014C15007E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E157F7F7F7F7F157E0068 +151E664C4C6101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E +7E7E7E7E7E7E00154C0101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016101014C6900 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F7F7F617E7E7E7E +7E7E7E7E7E7E68301515156565561E1E666666661E66616161616161616161661E66157E +7E7E7E7E00694C010161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161010161 +1E68007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F1E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0000007E00007E7E7E7E7E7E +7E00686361010161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6101 +01616615007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00017F7F7F01687E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00 +1566610101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +01610101615630007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F61007E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00305661 +010161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F01616101014C5615687E7E7E7E7E7E7E7E7E7E7E7E7E7E687F7F7F7F157E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0015654C010161 +61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F011E4C01014C1E69307E7E7E7E7E7E7E7E7E7E7E307F7F7F01007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68691E4C0101611E017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F0161614C0101614C1E69687E7E7E7E7E7E7E157F7F7F4C007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068151E4C610101614C61017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F017F01610101616161665615683068157F7F7F157E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E68683015634C01016161010161017F017F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01616161016101017F01017F7F7F1E691530686868 +68686868686868301569651E664C01017F7F7F7F7F016161017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01616101017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101616161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101616161616101010101 +010101010101010161616161610101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F + +end + +%%EndDocument + @endspecial 5073 3450 a +SDict begin /product where{pop product(Distiller)search{pop pop pop +version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto +closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show +grestore}if}{pop}ifelse}{pop}ifelse}if end + 5073 3450 a 5073 3450 a +SDict begin H.S end + 5073 +3450 a 5073 3450 a +SDict begin H.R end + 5073 3450 a 5073 3450 a +SDict begin [ /View [/XYZ H.V] /Dest (page.1) cvn H.B /DEST pdfmark +end + 5073 3450 +a 5073 3450 a +SDict begin [ {ThisPage}<> >> /PUT pdfmark +end + 5073 3450 a 5073 3450 a +SDict begin [ /Title () /Subject () /Creator (LaTeX with hyperref and prosper packages) +/Author () /Producer (dvips + Distiller) /Keywords () /DOCINFO pdfmark +end + 5073 3450 a 5045 +2274 a + 0.357 0.541 0.710 setrgbcolor + 5045 2274 a 5045 2446 a + 0.257 0.441 0.61 setrgbcolor + 5045 2446 a 7189 2811 +a Ff(SLURM)5045 2816 y + 0.357 0.541 0.710 setrgbcolor + 5045 2816 a 5045 2816 a + 0.257 0.441 0.61 setrgbcolor + 5045 2816 +a 6056 3226 a Fe(The)77 b(Simple)h(Linux)g(Utility)f(f)-6 +b(or)6263 3551 y(Resour)n(ce)79 b(Mangement)5045 3613 +y + 0.357 0.541 0.710 setrgbcolor + 5045 3613 a 7161 3955 a Fd(Mar)r(k)38 b(A.)i(Grondona)7098 +4203 y Fc(mgrondona@llnl.gov)6702 5061 y @beginspecial +14 @llx 14 @lly 314 @urx 102 @ury 1200 @rwi @setspecial +%%BeginDocument: hpcs.eps +% Use own dictionary to avoid conflicts +10 dict begin +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 87.000000 translate +299.000000 -87.000000 scale +% Image geometry +299 87 8 +% Transformation matrix +[ 299 0 0 87 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 299 string def +/gstr 299 string def +/bstr 299 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 38947 ASCII Bytes +colorimage +i;i$Elj;h`g( +i;i$EljDncg(NWcjq?hekmHYYirFT~> +i<&0mlq?MWg5G3ok)8D +i;i$Elj;kafb!B^jUgValj;bWj8a]~> +i;i$EljDqdfb3NbjV$beljDhXj8a]~> +i<&0mlq?PXfo,*njbr> +i;i'Flj;nbf+@*Zjq-bcm0VeVjT'f~> +i;i'FljDtef+R6^jq?ngm0_kWjT'f~> +i<&3nlq?SYf8Jgjk)8J>m7ZIijT9r~> +i;i'Flj;qciXjcWjq-edlj;_VjoBo~> +i;i'FljE"fiY'o[jq?qhljDeWjoBo~> +i<&3nlq?VZieuKgk)8M?lq?CijoU&~> +i;i*Glj;qci=OWUk7Hkdkm?PWjoBo~> +i;i*GljE"fi=acYk7["hkmHVXjoBo~> +i<&6olq?VZiJZ?ekDSS?ktC4jjoU&~> +iW/6Ilj;nbit0`Tjq-bck6^S\!WWB-jT'f~> +iW/6IljDteitBlXjq?ngk6gY]!WWB-jT'f~> +iWABqlq?SYj,;Hdk)8J>k=b7o!Wjl&jT9r~> +iW/6Ilj;qcj:K]Qjq-edjpCJ[rr<$&k5^#~> +iW/6IljE"fj:]iUjq?qhjpLP\rr<$&k5^#~> +iWABqlq?VZjGVEak)8M?k"G.nrrN0Nk5p/~> +iW/9Jm0W%dit0NNjq-bcoEbL$r! +iW/9Jm0`+gitBZRjq?ngoEkR%r!EH.$LJ#s!<35b!.Y~> +iWAErm7Z_[j,;6^k)8J>oLf07r(@&@9C480!rje5!e:~> +iW/i'~> +iW/i'~> +iWAHslq?VZj,;3]kDSS?pIjX!h?&3~> +iW/ +iW/ +iWAHslq?VZjGV3[k_n_Ape0g$rW3'MhZA<~> +j8eHKlj;qcjUfZNrt,2Em1Agsn-T!rr;Zm&)_Cmjpal@IrW!-RCl4L8MJ2l\!A"EB!.Y~> +j8eHKljE"fjV#fRrt>>Im1St"n-]'sr;Zm&+YoTq^h[LrW!3TD2XX:Me>[Ur_ +j9"Tslq?VZjbqB^s,6oUm>LONn4W[0r;m$N.PCWL!\R,=q_%gtrW3?XOKk%TZ"Hg,rc&!7/h?>k +J,~> +joFTKmKr+djUflTrXf#Brt,2ErX]&Dr=JuCq[iQ3p'L^%rVup%qu?^#qZ$X#,5Ebr9IrXa/-%4$ +/-Y_I!A%pVQ2YIsPlR3KBE:dXquD6~> +joFTKmL&1gjV$#XrY#/Frt>>IrXo2Hr=],Gq\&]7p'Ud&rVup%qu?^#qZ$X#*Vh5m9.WL_/-%4$ +/-Y_I!A%mUPl>=qPQ7*JB)tXVquD6~> +joX`smRue[jbqTdrep`Rs,6oUregcTrJU]Sqht8cp.PB8rW3'MquQjKqZ6dK,l'&!:+eX]/cmX, +/h?Vs!A8$WPl>=qPQ5:lB)ta[quVB~> +joFQJn-S:ekn!k0&C;*k&H*:D&01ZXp^$pOr%A%DqG7/crb27H!1@A7B*G9`@N]5m/`.7SHMO/--kErW%H~> +joFQJn-\@hkn4"4'$qBo')`RH&g@5ap^.!Qr%J+GqG@5frb)1H!+u4I!G?9JB)n1qB)n=uPl$gJ +BDn(oR/^e&QtMeNR$dkcraZ(CA6f+,"Y<;>@UEU@9E%B[56NN+78$;L/--bBrW%H~> +joX]rn4Vt\l&,S@MpSC&MuBRTMfAZ2pIkF$!-.jp!-/!NrK%#Hrf@.nOSrelPl>7pAc@qkAH6BA +Pl>5!AnP[fAX$b;rb)49!bYe=r_5D"n49dT!/j)6k:AHLC*%q3lJ,~> +joFQJn-S:el4D&O$QDp"Cjq8K[)98nb5UW'aoo>h[(O'N[/[0.T9X*hQi`P?R/N +joFQJn-\@hl4V2S$Qr<)D1IPLZ.#u"ao:`,aTTT!Z,+9UZ2^^'UQfEjQi`M>R/N9KZ2^?qPc+MO +s/,k%r0.D`SYr``Pa)-6r+?1t@V9=H9E$IB,lT=p,jG@0/G9'o~> +joX]rn4Vt\lANc_$b),#OJ/qZWjf"Ka8XWf`rsSoWj]A8WrJ.^Q]u.^AHJ*-Ac7kmWrJCdP`Ym2 +s,[5\r0.DIQ]S56Pa),Xr+?1t>%_JC:AujG)u_Gi)sRJ)0(o?s~> +joFQJn-S:elO_>Uru(bL!t[W-]`#tVX-K`NTr\.!s/Z0brj;^^Lhp&KU~> +joFQJn-\@hlOqJYru:nP!tmu?_>VIZVj+*DSYuFks/5m]riuL>rR1bEriuLP*3lE+R$a,&Z(/)@ +]Wn`>SWo@OB3\n7/4E3)76UW$r?V(:!'L#V!A$n>!!,25q>^Lgp&KU~> +joX]rn4Vt\l\j&es2k5<",huY[f+5MOHbikQ]V0Gs,d8Fri6",rO2cgri6"-*3,*bAS%*jWhHH5 +[&U-fQ^!_HB2r+t/j)m(4>m*jr>YG3!'9lV!A7.C!Wb>7q>pXlp&]a~> +joFTKmg81dm1@h_!#b>A,S2W0kek<\oX)H.Q'dkNBP1aI_mHda/1a7a9OMOIQBl3"Bk73:s$d5E +66ZC0/1`%A!!,bEp&G=KPlLe/,6/td/-D.g!$g8!J,~> +joFTKmgA7gm1Rtc!#tJE$kb7rmaKY,dBU?TPaMG_$sd%0e$6/j/1a4_94.U0!bl1Sr_*8[#:qtX +!!"Q$,l%E@9.]c:#:u)>!$ifi,lB1qPUle[g]2j~> +joX`smn;k[m>KPo!6Of1,`?Nje[N$.aJuV6P\"H>B3eV7\#QH@/hT7]:0V@DAnG[]?!@5&s#^N= +3[=b./hS+=!Wc%Kp&YIOPQCn*)ZguV/d%=j!ZTnrJ,~> +joFTKmg81dm1@h_r>GPJru(\J$4nbqs24' +joFTKmgA7gm1Rtcr>Y\Nru:hN$5+qqs3pDbaj\?_q#CN%^<'%D!!"SI!<4)=!!/<8rVupLquHaB +"op2e/1a4_rFc.>"(Z&/R/N9KSc>tpVZ<:eYlgngPaMG_"\V9Q4=i&J!.Y~> +joX`smn;k[m>KPorQ5#:s2k/:$B'nDs0pOfa1')Aq#UYu`5bXK!WXkM!rjPF!WeN +li71m!!N?+!9aU[#lkD2$0_lc&ChKn)>t9K)?(q/GoMJ +,5qQNBIj,`+=mKm,>;d9Q2\,j_>^hAb4r=DX8\C_Q3*G=U&).rU&V.uQ(b7ZTp +li71m!!N?+!9aU[$31S5$L&&f'%Icr)uUQO)u^TU)\s2CXo?EFe&g(f6MUW\YlJ&*!!4/l/GoMJ +*W?$IB.O#_*@q0j,YMd7Pl@of]`,29anW+@VuDqZB*+HbSbfVkSc>SmPb"_MSWpCMli;P~> +liI>@!\4=&!pD0.9)rc)9Bg6ZMq+d)ao/1;ao84Aaf).Tf)E\m\&Yte3r&jVWW6&q!WjW"0)PeN +,lRiRB.a5e*%h9o)bt%1Pl@Z_[/R**a7uY7OT(LCAccP.Qhm`^QiE-PPa@JnQ^"M:liM\~> +kPt_h!!!0&l36Y`kmZtkjV7;(rY5;K!>HLP'`T'K'ETO5[/A&J_mE,5!!B: +kPt_h!!!0&l36Yakmm+ojVIG,rYGGO!>ZgW(B5?O('5O2Z2D]Fe$2RA!!B.3Z"Ee3ruM";ruLn8 +![IadqZ-RG"@YsVB;b^Ms3pbJs1AB]]_]bM]`-CWaT/U4!.Y~> +kQ1l;!WjkRl7;?sl"f^Fjf%dmri#e;!N +m/RCq!!N?+!!N?&kQUtmrrr'%p^@62$k*I9%.4\g'_<4A'`Js^'H8SS*=s>-'G(fi&1fB>c,9M& +!OPPr!!B:/Zt/_-ruh+;!%dpG!$M+p"8'b.o_Zc2o_-H-_uImU_Z7(1!.Y~> +m/RCq!!N?+!!N?&kQUtnrrr'&p^RB5%Lrj>%djtk(@rLE(B,6b(*G1\+VGe2((q5q&hP]?n^IHY +!O5;n!!B.(Z"!8(ruUt9!%dpG!$1n9!,)8u"4>6!.Y~> +m/dPD!\4=&!\4W42bc%#_HjW/HS4MiCB0ag_5h +!NJoj!X"OaW`nrprtP81!&"'K!$(h:!,)8\"3AO(aSX!XaS*[S\,XMF[fEGp!e:~> +n,NFlqu?p)!!!0+9MG0a!sqe#$2+Q$#m(8:"o/K$%0$V:00F/L$24kt&EX\r)?(?L)$gof*%rrg +/0H)7/.3R//=",jb0A)OPt^uR"-q$OB__W.,Oka6/F`]@BZg8F"97TWo_-H-_u@gP_Z7(1!.Y~> +n,NFlqu?p)!!!0+:/:Ne!t%n&$MFZ%$3CA<"o/N%%fZk=0LBbV$MP&"''9u!)u^WP)[I2l+YYSi +/K>c0/INO./!.Y~> +n,`S?quR'Q!Wjl&EH1_'"&"W59D0n79*-V:/,;j7C]@$1D3(cX9D<5kMrpu-ao87 +nGj"LMMb(-!%a"i9E6WKX7lc"0'`JsQ +'HJ_X4T8%S0E+':02*oj7f?!\7eo^\BM<)5B_b@%/F`]?/F`]BBZfu>roa@So?%*O_>_UW_Z7jY +_uIRP_Z7(1!.Y~> +nGj"MMi1=1!%j+l:&llPXnMu$0XJ)>pB:UqP+hl +nH'.mZ*A9M!_]fDE<8f%f(UZsD=?q1pF?<)cJniK!N^/69DWE.95s4chp+mhC[d8EW:.h.W;amA +W/ZdRCAr5QD>n8QD/i3D4T/"T4S__TB23)7BDP@)E@rm6!WXkC!X!)UaN4A2!6FcP!OoH8a8`UK +a8WRJ[/RN7WpBe;~> +nGj"LZ)_[E"Y?pZC]seB!;?X#/?uH2"UXu.#uIn-Dg\h3DZp=>#lkD4#m*r.Oo>La$1nZ*&H<1* +&FL8%)%dQ60.\YJ9Irk#4\SO2/5/_gr(I*#r(I0$BUJd4!L7?q9EHb=/GfGI"o/,u+S#L5+DCYp +!U01JaoTDrrlY5X"Mr!n_86,g!3>GdJ,~> +nGj"LZ`S'J"YI'_D$9nC!;?X#/[Mc8"Ub&/#uS%2EIbC8k +!UeA-aT9l'rlP/g"ME44]Y+6m!2o/`J,~> +nH'.Pn(*RN.nf?^O=LA_!r"2K9CM=B.nf[g$'"E)XKqC3_iF@92857r([5tr([#I"LPYI[']hA!0HOKJ,~> +nGjU]X0HIE!%c6s9E55i0*M=Z05jZ<9MbmDZ*>i5O`14&r +nGjU^Xg;jJ!%l@":&kGm0EhF[0QBrA:/M0HZa25;P&^I)r=2?;V&,H9D`iEKVm`&g_IKJl+*0/L=8(%V'Ei%P8;F;/_/2;% +b/fDhF6!(*rhtrYG8J""d7O!<,Uk/cJEB:'>*8@V9!DB)l91BDbC'/SFVS!%dX?!L1_)d/hAWo# +Um:rlP)erk&?^][NeF!.Y~> +nH'b)f'e\N!_`1SE<7Y1D(>Z!n$-_H9.Q"IcE9fUCTah"95TZ*b-"Bsg8f"KXNlf@MlZ=.bDhKsNN94rCZ"U2CQ473Y4(i5 +Y)B?=n,344W6kLbri#V6"-%:N!rbpp9E%]cE%_XJB)l<2BDbL*95!es!&!dC!L1Y'a8s?3 +o#Ca1rl=rGrj2d:['u.`!e:~> +nGjLZX/g.i/5WUV:^&DNYlH>;Z)`bEZ)\$Zag%!-Yl]dd"oS`\:pI8*"]2J/"U1$nCi?S`0+"ng +Dm?QDOg1sE:b7a6Df;nM/.%HDZ&u;0:pI:+rim)_S?]>h$k.ZKDiq<0;%,"\Z'#$j'2]/LHEiuY +Og-QLZ&rsCZ""=Z,Q/M[)u1?S/5.6=9`?U%!;nAJ9_&/`/F`]FQ-.8AoZG>?o#^s>rlY/VrkS]S +_8DQ)!.Y~> +nGjL[XfZRp/Q&j\;$APRZN)S?Z`T.KZ`OB_b-R91ZN?$g"oSc];7!S/"];V4"U1'qD/lng0FG.m +EO2uKP-_9K;([s;EH/=T/IIZIZ]_Y7;7!U2rj*5_S[5Yn%M!rNEK[Z7;%>1aZ]b +nH'Y&f%-oq99&E/N@RZQmfH/-n(+bhn('!^o^C*)mfKaE/,`*oNUQ<;.uj#d.kAp6OK@p>D+j?d +XRGV;cL9>hND%RcXK:mVND%Rcn':C'NUQ>erpLKCjmV["CMW+YXNp;'Y%s$cn':q$' +nGj^`X/iM1^oO`F9E6WKYlIIuX"45SX0DXUX0F;]/??#Z"oS`7:s#sG*0IL`"`1IC"oki$:^+,/ +D]gS79X.Ct"d-'."U/hLYmGc^OY6kE;9=q("`LZN#mmlA$jd=K#mH3kC()c#YqHEgZ#9qGZ*=H9 +#qms:Yq-%^X0EZZ)uUZS)uCKX)]9qq"Y<=ujoGE4q>^Uk/1aKc!!"/3!!ee3b4P>Kb38H>"N.Ua +_ohnprkS]S_82E'!.Y~> +nGj^aXf\q9^TFiK:&llPZN*b&XXsMVXg8!ZXg9\b/Zl>_"oSc8;9H3K+d00i"`:UF"oko&;$F;4 +E?6\8::!e$"d633"U/nPZO1uaOt[%H;9G%*"`^lT$4=,G%LN[Q$3c?oC^r/*ZS2`mZZ-=LZa0f= +$8=0?ZRl=aXg9/d+T38Z+T!)_+<)V%"Y<:tjoGE4q>^Uj/1aHb!!"&0!!eb1ajJMXamScB"OjX) +e&hO:rk&?^]Y'Kq!.Y~> +nH'k,f%0>()Y4U!i/$/4.92"aBCJ/G99.R:9_eX,Xmqk_dn#T0bn*_bW +95SP7mn5/]f'eTseG[MheGI>meB+b2.kXRLjoYQ8q>pao/hToi!WX51!XFt1a2l?Ba49e%"LkD? +\&\EUrj2d:['Z(a!e:~> +nGiYBX0IQ]C`(:!9EcuPYm!tGYlFb-Z*=9[Z,nNs"gP?3"o\f0:pI)"Yma;0Oi^9M0ROZ*=TA0._%4Z,q"m/?uG`$#d(e"`(A>"o\o; +;6dB&Dc!L>/.`Nn)#tWQ)$_)u,tnId9J#N1$>?fh!)*Q]ZqSV9r;cgJ!)2q`!$Le3#F3HSo^p;K +kjuq$_mI>!b/;'p_u@IS_nj0Sli;P~> +nGiYCXg6Wc!)!K[YtN23r;cgJ!))k_!$1S0#F*?PdF$(X +mdnO)e$7BNaj[p%e,Hu^e%E>Xli;P~> +nH&ecf'fmCO;RWYE@X]NmjjCimfEP@n*^;X)TX8:+kl7$>6BZ!_t81W_UT0r;usN!)E(d!$(M1#F*9LaN2EB +eapfc\#QpHa1>\,N`:\$WN,liM\~> +nGjX^X3"$8!!TX49E6WKYlJUFWs&JSZ,ltsZ)]DZ"fnp-"o\f8:pI9DCgB^<"gP?1DalA`Z*=T= +#mjG5:^&DTYttT1:pI83Dm=3a#n0\9M?O<-X3(SSZ*=TAPKAr'MQq(+0Q"V`H!<+ML9]5sVQ-.8AoZG>? +o?%9R[)9f(_nl>irkS]S_82N*!.Y~> +nGjX_XiaB=!!T^8:&llPZN+jKXT\\VZcW8"Z`Pe_"g,-1"o\i9;7!TKD.$*B"gbQ5ECMVcZa0uB +$49Y:;$APXZV^l5;7!S9EO0Wg$4]q>MZjH/XiU_VZa0uGPKK&*MmIC10XJ(h%[+/<$Bh_L$5+X! +9XD'NErL%[+VGpq)u^uZ)uh#b)^S?%*D7sP!!4]EZ2ViLB)k\>P\2QF!<+ML9AojUPf_%pdE0Mu +o>q3LZ.%1De%G\/rk&?^]Y'Wu!.Y~> +nH'e*f(eggepn+6ZSn((,^/(X1g/,i0KNUQ>;OH+<2/+;s)X@@%Wn*`n" +91t95N@RZjmu8hjNUQ=/XRE5@95C^!Yq&J_f#K:Vn*`nBj7LWYZ1"beD=?pDCX2CM9@!!C98fjQ +e*lbKc2OdGE/V4'ao9fhaoBipafCCH,Yfu\!WjuLWrC$CB**'cP\2WH!raeP:>l6ZPfLhcaN)?O +o>_'BWjfIX\$Z.Drj2d:['XE2!e:~> +nGjX^X/eno!%b1O:]N&IWrPi8Ws&YXZ)[jUX0F2Z"gP?3"o\f19X2\>r!!,*!%e!N!irR0rWu.m +Z#9dPZ*A*K#uIn3$#dq("Ukr?Z&/\nDonOV%'d&D$*g`8"cB@!#qrQg"UUtNS)?1W[)'qr[,"sQW!"1?Cb5\jKBE2_2b"VX3r[\%Ci;`kCqoSp2o?%9R +[)9f(_nl>irkS]S_6dnB!.Y~> +nGjX^XfY=u!%k=T;#i2MXT2,=XT\k[Z`O3ZXg9S_"gbQ7"o\i2::&(Cr!!,,!%n'O!j/d4rX)4o +ZZ--UZa4KP$;n.9$?=4."V)/AZ\ntsEQY'a%^WJK$F@&="cKL&$8Afm"U^F!E=,RLE=Ns)*BLj> +/HlUk0Fe^@+<)IE)uUoZ)uh#b)^S5_*D7sQ!"1?BaoAXGB)lS/a\2I1r[\%Bi;`kBqoJico>q3L +Z.%1De%G\/rk&?^]Wl,9!.Y~> +nH'dbf%+gB!__+qN<2c(ecKj`egi7Dn(%P5f'c6^/+;s+/,i0DEUWN$r%%g9!)*2>!nQfjr_#hB +n#S$4n*c>g99&E/9<@ce.r1'[n$+BYXRr_iC[^^b9CMB*)_1a%lI4r[n1Gi;s"Dqo8]Xo>_'B +WjfIX\$Z.Drj2d:[&Rd*!e:~> +nGjX^X/g%:"Y?pZC]t!IYlHH!X-&OFaftgsZ*>h`!3rg."o\f1:pI8*rWW<.>>VSe#mD;B:^OD3 +#mCVADm=3a#uRsi#mla!OTf[.DZpO\;6bu^$u2iT#nXAH"Y?p`"Y>e@D[A)%YltPjZ#9q%Z*@.7 +:l%uRa_r.*09[q-)]9M5*#TV5)u^`T)[70+9HkZS/FWWG/=!Tbs2llds(M0-""XU,9]5sOQ2A]( +o^g6*Zie4^b-_/cs1nlG_83LrB^>_L~> +nGjX_XfZF?"YI'_D$:*LZN)]%XcejLb-M("Za24e!40$2"o\i2;7!S/rWW>__i$3_SJ;$sY9 +$3^bDEO0Wg$;n-m$4;s&Op,j3Er_%W&8d$50\O"YI'e"YGnDE=+D+ZNUhpZZ-=+Za3L= +;1qfQb&JR30UF@7+<)7?*?,q?+T<>[+9ic2:)t?J/FWWG/ +nH'e*f%,oa.nf?^O=MjMmfI@uf$;Rlo^;iSn*`n"!q5UW/,i0DNUQ<;r[\"A>E/*s9.NPQND&a/ +9.NY.XRE5@9l6SPl&K$ +aRdIPWWT`;a/]-Js0Ms0['ZjBBC#\M~> +nGjX^X/eno!%bCs9EcuJYlFr$MMc4dZ*=H`Z+_am"gP?3"o\f2:pI8/"oJZ-:n@Tj"HbeMZ*F66 +##MRC"UPTUrNSD%#mG7PD[?g`Z% +nGjX_XfY=u!%kP":'E5OZN(/(Mi2FhZa0feZb\3s"gbQ7"o\i3;7!S4"oJ].;5*uq"Hl%SZa9T; +##V^H"UY`ZrNeP)$3bFUE=*0g +nH'e*f%+gB!_`"SE@X]5mfG"ZZ*BCPn*_c"n+'+%/+;s+/,i0ENUQeh=&W^CXDP$98i9-92!S!n'95IX@nQAmn7Hcn#U;?Y3>?Cp!.N9 +_XH(En*+VG\((E:!6P2hs2k;j#0Eoc,U?,;mfE_H:1og3W_P2@!Wt&*/l(@,!0mB$!6FcPs/H11 +[)]3G\,Wf=WjK.5[qG%/J,~> +n,NOo!!!3"!<36&!<33+!!N@=YtY-#!!)s$!!*!%rX&T.!=8r,#lk/-$3(/5#mCV=#mi9`$2t>8 +"UPJ=r +n,NOo!!!3"!<36&!<33+!!N@>ZVLK'!!)s$!!*!%rX/Z/!=B#-$318.$NC86$3^b?$48Kc$N:M; +"UYS?r<`l8$4[OY&e56P&e=mJ">()j$4cn>%1Xs"$4\Wt$47C]&e5EM$N:P7$3q%R(*k"C+rgJ' +rYtk["rej`*?@d(li@&:oDetE"Y<=*!!&8\aT0`[aoAXG]E--ZrmUn["gP_QZ+O`9!.Y~> +n,`\B!WjnL!rjeN!rjbS!\4>6mrA=W!!<*L!!<-Mr_*8A!D=s?9)pL@9E-LH9.NXc91s.#9E&]/ +.n`McrC[JJ95A=$Mebs9Mei;b"H@1i95FAs%;Ur=95BN&91t2AMed,,9E&`+9*]6jW6j&RlH0"S +rlP2i#0Eoc,U?,;liR2>oE#+I.kXTU!W\J^`rO3Pa8`1>ZiS4IrjVp7"fer:WjHF*!e:~> +l2Uhg!<*-0!!NNWZ&rk'X0Dg.pBCI$rWW-)!!W-("Uk\G$jd7>$ipYCr!tNR*<-r^)'qs#,"sQD!!=bU,#$qq! +1!H(!;,m*rj2aCb-_/cs1nlG_83LcAF';H~> +l2Uhg!<*-0!!NNXZ]]1-Xg802pBCI%rWW-*!!W-)"V(kL%LNRB%KQnHr!EZ=/Ii*t%MBEQ%K[7Q% +fR+@%KJ*W%f?t>('Pus&f)67r=/lT(+&nlrtYb\,T@[H)uUoY*WI5d)^S6"*D7s>!!=bU*D>>k! +0mB&!7CD[rilO;ag(ios1AN?]Y(MS@dF)F~> +l2gu:!ra\X!\5con'7$Gf'b*jpFH/7r[[h"CB7(Dr(@91NGD1&CQ",LCBBE0 +C]97lCB0@jC]'+jW!05[Ml3l<@~> +m/R+irW)`t#&fBVO`)cNqZ[!+rWVZq":PSC$jlJ5!>#\<&-*.:&-<7O'`J[D'`AUA'EA^D'FPHd +)&*c('H%c-'H?rf#pU<,)&XYD)]9Ok)[m`++<2=>)'qr[,"sQD!!=bP,#$qq!1!H(!;,p+#/dgK +[)'nlrkncP"gl+^['WNn!.Y~> +m/R+irW)`t#'#QZP&W&RqZ[!,rWVZr":bbG%LVb:!>5n@&c`F>&crOU(B+sH(B"mE('#!H((1`j +)\s23()n28(*NMo#p^H4)]L%J+<)9t+93Sa*WI5d)^S5_*D7s>!!=bP*D>>k!0mB&!7CG\#1KiT +Z+S2`rmUn["gP_QZ*?sg!.Y~> +m/d8)7cE'Y?q^_\>r[[A/"D^Y'CJ456!K1alMZ@PjMZR[PW;__TW;VYQVuVbTW!eN^ +af)/IW6*/jW42]H$.-fDaiVoVeB,i1eGnb?j5SS +l2Uqj!!NN+r!!*#!Mr"L(h'H%c&'H7o/'H7o++<)7;)&FD8,9%L<+WD +l2Uqj!!NN+r!!*#!$477M%LNOQ%LN[Q$MY)2')`:@&e=[L!#GMGrtbVI +r>#AGrY>JQr"^4o()n2.(*FP=(*FP5*ZZ@B)]9k@,Tn$F+s7j'+T +l2h)=!\5c&r%%dK!@n6K.fi9nr_*8ApIbs291s%nCJ.<9CJ/G99DE9&Mu@DlMei*G!3#jSs/>sU +rMT^Srhoh=r2:RDW6*/[W78r=W78rSrTVhRalE$Qd+$1ZinqlVeGnb?inrYCe>mR>,YfuJ!Wt%V +.o,%)!0mB$!6FfQ#.K\UWjKgHrjVp7"fer:WiAh\!e:~> +li7:p!!N?+"TS]+oEG7$!!Vcsq@!?1o*kX1!"Ac:!Yc1WrY5ADrtPDCq%NfHr=f5NrYb_Mru:qT +&/uK))]]e8+ +li7:p!!N?+"TS]+oEG7%!!Vctq@3K4o+(d5!"So>!YuC]rYGMHrtbPGq%`rLr>#AUrYtkQruh:[ +&0Mo2*[)IF,9S!L,Tn$F*?tG)ruD(Yr?)7i:&l;-/DU:./-Q2Mi;`k_m)]BpZ*Dd"rR:_X"4Ooq +9CDi^/-#[#~> +liIGC!\4=&.fq4&oIKr7!%[J1qJ-((o5"Aa!,MLj!iV$8ri#jTs/>mSq5=;8rMT_*rlP2=!OpSX +aUltDamnW;eF`b"eBl^eal;Ube.(="l,hH4eC:O=![LMnh#[[2.k=BR!W]7e`rqX,Wjg%I\,EZ9 +\$WM;mfEPC!Wml~> +klC&RrX&Q-nd4[lr=Ju;pCQp1!>$4J'`JsM)u^QO)%df*)^?=?,8;":)]KY6+X%jGp)=/]9E62/ +/DU:./-Q2Ni;`kbm)fBp[']eLs2"]As2"`B!)3+e$7l/WQF' +klC&RrX/W.nd=aor=],?pCd'5!>6OQ(B,6Q+TJ,~> +klU3%r_*5@nk8@crJU\kpP\XA!K4GbW;am=eGcEHaV*LQeBm3sd&>(UhpfctlK[Wnhu;.*huD13 +hpg/VE<7+T0&6R2/h8GIi;s"Zm)K0lWiH$,s0Vd*s0Vg+!)E7i$8)A]Au\T-![IgKJ,~> +mf<@kquHa#!!)EjrX&T.m0W@mr=Jl8!%e*X!tZIa&G-\9&H3C<)#tWT'FYiu'H7u2)&jM4)&sXh +)[.N]!$Frdh#IO."U.TY!!'Cnap5hLX0fd^_85oR'eB>-/-%5dZn*F%!$ahQb"NoX/-#[#~> +mf<@kquHa#!!)EjrX/Z/m0`Fpr=]#*/-%5cYq..#!$j\Ka\*WS/-#[#~> +mfNM>quZmK!!;R=r_*8Am7[%drJUSh!0-tn",i.sMtEtIMuK[LaT0iiW"-r!W41:9ajeh^al;=; +htkh.hpg/VE<7+T0&6R2/h8GIi;s"ZmDfI@P`VoS\$WO;WYI,f*%h:FPc?>T!Wj<%a2^pp!\ONU +J,~> +mf3Oq9WPG!9EkCqnHJq!rriE0"oS`-"n`3%;$&BW$2+c/&.B!G&H<.C/5VJ6Z"koi%0$n6'F#ip +&8kZ8-2eMZ)'^C))%@f.,9%RF)'^@L)]T_?r?2.Yp)=/]9E62//DU:./-Q2Ni;`kbo#^sMrQ5;] +Q)h:0_=k5J/-%4P!)1Q8/-$nG!(R"29HsE8J,~> +mf3Oq:9Ck):'LUsnHJq"rriE1"oSc."n`6&;$&EY$MFr2&e5EM')rFG/Q%\;ZZ%Mq%f[1:('Z&t +&oUr?-2eS\)^H^-)\"&3,Tn3R)^H[Q*??(Er?;4\p)jMb:&l;-/DU:./-Q2Mi;`k_o#Um\rQ,5l +Pc(e8]_8TB/-%4P!)(H6/-$qH!(Hq09-*s2J,~> +mfE\DERsU0E@_"inLOW4s!n+C/,`*@/+lR8Xo`H59D3-&Med,,MuRSmN +rPo)NP`VoS[.^L3/cmXX!`$f9/cltE!^-M':*fc>J,~> +nGigu9WPFUCl59ujot;^"I$)e#mp85!XT8DrX]GG/@!_u@gY_ZuI-[*$4l[))[I(r?7t/-$mp!%aC/!$X[%!!%N~> +nGigu:9Cj\D2YO&jot;_"I$/h$4?G9!X]DIrXoSK/[NT_EH.q`$4\Zb')raF&d8cOZZ-Hfp(du\ +()A#<)]L%A)^>&&p`K_d:&l;-/DU:./-Q2MiW'!"Z1?!:e,IJhdg),8Z,sY`Z+U">(qd,Y9.U&g +,YQ8./-$pq!%a@-!$+3q!!%N~> +nH&tHERsT`OKmC*jt$!q"QSs192"qn!_[F +W2S4maiVoOal<*BqpYo/eC:O=!ZXrfh#[[2.k=BS!Wa:@o#Ca>rl>&J#F(=Ma0_kH[/?p@[&U-$ +/clt2:<0gr!ZM1B/sK*4,YCf5!e:~> +nGiYBaiR6U!!*7\rWNC?Df73+"Z/nL/2(p<"U.S<:^I:3:bN,OHnPd402PIO#qSn(#uIn3D_EXJ +#s +,9n`>9XJL4!<4SU!%^fW9Iq^p!.Y~> +nGiYCb0!KY!!*7]rWNC@EH*T0"Z/tO/MM0A"U.Y@;$mI6;(r>SJhRN=0Mt[S$8#+,$;n.9EA/sO +$:&QV;'?DZ/Q"),/M.J3&d"6&Zi1+a$A&FY;'?E$,u7AN/R!(2;(tkRZ[#DJ,n_MBK5X!f&gVBi +-#\B#,pdJJ,TnBZ!!=bU"\[hT!?JH5aU-G/R%:M(]Wn`SrNZC8$*hrJ +,U=o@9 +nH&eco^m/&!WagVr[S)4XK5(o.iNDe95Ubi.k>V@NCtcpNGV=JbABmFD2jNJ9E'nd99&E/XDNqi +99dQPY&J/lNNS76NK%`QMZV2mn,=gn9?SigY)R4VX2_<#NR[FcY&00en&p^8X,F%Ir9q[aMpUq< +X7-)/X/k^Xd'p'Vh>I<@rQtQ$s3q>3eC:O=!ZXrfh#[[2.k=BS!Wa:@m`,XCZt5T(a0_kH[/I$) +ZjEbA4<#4l!`#b.rW<*P#QdXoB21'3!Wml~> +nGiZ-X2tPD!"oG8/;g^5Z*>h`$*hU0Z,s7I0E/3[9Eba-Z'#$j-r:4'Z*=TAOg039Z*DEUZ#9eC +Z(&#'Q3dk[Yu$Rf$k*[U%$@g""U4l3&-]>D;%,"\YqHNBZ(SA,HZ/hes"+,R*L[NNELO=`\t,': +R^& +nGiZ.Xi^hG!"oG8/W6s;Za24e$F@m5Zc]UO0`JB^:'D!2Z]b1aZS2lCZ^\;-H#`bgs"42U*Lm`TF.pF%aJbR[ +TsLGd+Y@W=S?oP?(*FeE+WVj,+9a&d!$+]`h#IO.*@skB!!(LAaTL#6e'n<<#e\WkPb#)$Z+Tk: +&(<'T1+X\%/-#Z$94pmK/G]?s~> +nH&fSf(:Kk!YR!b9ru-E@X]Nn':q$.#gl:n*`nBcL8V#n*fo;n#S%B +n*BH2lUsmrmu>W]CMSiDCX2D;.kCTl&1d5hpg/VE<7+T0&6R2/gN&Ei;s"gp;[9Ea1&PW`sB&]Wg&jMa/ZNA +WXlQk)ZVK0/hR2,/l$%S/hZu%J,~> +nGiW,Z)dg'Hj'KROh5E5/?>g&"gP=iCi$A]DbuS$DZq\sYu!*9Z#9dsZ*=H=Og/g.09NM9/1_+4 +OU3"tYttUMZ&rs1#mh"O$tHQaZ&rs$0*uC*S-`&tOTeRdD[A'n:bT)YD_EXpZ*>qg:pG``Dmloh +:pI9f;0&qH05@bS/1^m":CnEC+TWQ-r>Pnd9E62//DU:./-Q2Ni;`kqoZI0Ns2tAZ#dfkj[)98e +[))RFr[\+E/56!n!!W&rJ,~> +nGiW-Z`X0+Hj'KRP/(oZZ-.#Za0fBP-]-30Trb>/M.=9 +OpWA+ZV^mQZ]]<9$477U%V)ifZ]]<*0FDX4T*eH%Op+^hE=+Bs;)#>_EA/suZa2=m;6u2kEP\u$ +;7!Tl;0oRT0Pn(Y/M.'%<>$8M+or]0r?)7i:&l;-/DU:./-Q2Mi;`l,oZ@*]s2k;i#dKVbZ.#tj +Z+Tn;r[\.E/P@\p/-#kI!.Y~> +nH&cRn(.F=/h6uRcKpWC9@hZe/+;r3OHAr"XGtNoX=Hs4mu;20n#S$4n*_c"cL7hbD9hU0r_$#T +c:^^fmu8j7n'8"p91s&YCVoQ4n'8"oD+heFn4TqQc7=nCX@mDiNG\.QXDNr6n*b*dNUQ1KXT%[i +NUQ>]Y/0SqD8Yhf91t8^Mokt`$f]O_hpg/VE<7+T0&6R2/h8GIi;s"goZ-s?s2Y/K#ca,UWjf"8 +WjMT%r[n:J928.Z/c[Eq!e:~> +nGi]LX2t>Fr;\u6af>RK!,S]n"gQ0c!!TX4"U0dgDZD?1aT)JqZ*=9[Z*=H9Dm=3a"d-n["U/_C +>q\m6Z#9qe].=*h$2b2nELO/;ag$!q:pI8FZ*A*KDm?R00/!V +nGi]MXi^VIr;\u7b,kgN!,\ir"gc?g!!T^8"U0gjE<%T5aoDSsZa0W`Za0f=EO0Wg"d7"^"U/bF +?nb?=ZZ-=l_(>fo$N(AqF.BSCb-Q=";7!SPZa4KPEO3!70JEh@Za4KU%V)iI:-ha`ZO1]YXU5DT +ZV_&`_6[!XZa50i0Fe^@rZV@c,lJhh,u+F\9.\m!""XTZ9AomGaoBihao9`hao9`jZ':LEYldX3 +9.]N3J,~> +nH&iuf(9"or;o-!o[YNC!g)!gXRGW'D/Dp=n*c?2CUmQj*)8-B!Wt&*.o,%)prEEDrl>#I!6>)J!ihKLo;Vmf +B21)J!e:~> +nGiWJX/l*t0MJaV"TS^BZ*=J;X)%qCX0Dg.Cp@m^$*g`="WXe]!%bC["U/hLDZp<,Yq-%^Doqp^ +#&aZ`YqHCiq$[a0Z'MZ"0/'T8:pI9!"Y]hZ/"A7!Z*A3R$rO:7X0J2"RL*o;aU'MB],V51Z(*?r +_QgA[S3IQ0+WMXE,Q/Pb,tn:]9J#!"""XU,9]6!Gao]K'b5K3Xb5T9][$?o`_tCD&!.Y~> +nGiWKXf_I#0M\s\"TS^CZa0hAX_e4FXg802D6n3c$F@&B"X14g!%kO`"U/nPE;7!T("Yfn]/"J@$Za4WY%T0R=Xg=_-TaGeGapK_F_'':?Z_&g$ +]X+r\TgKG<+rqjM,lJhh,u+F\9.\m!""XU,9AomFaTBr5ao0Zgao9`lZ':KXe+L!3!.Y~> +nH&csf%0^"0QHRM.fq5_n*_dqerVC4f'b*jORK8$9CM=".nK."!_`"N.k@^iX=GgHmn5/]XRuGZ +#-9>Vmqk]jq.gJ"n*'6/D/Jb1NUQ=U.rG7R-KT);n*d>NCTd-pf'hVerCa6\oLk1mrGZP3n*lmQj*)8-B!Wt&*/l(@,pW!?Ea2e.f!6>)J"KI]NWjhZ$lN2S~> +nGiZ-X0Dj,!.#SXX/cC("`1HK"gQ0c!!TXL"U/_IC]H#kYlt:^Z*=H`Z*=H9Dm=3a"e`+R"UT+J +CbIFm0*qf#YqH7e$k*[Y$k*Fq#mE!(YqHEgZ&u<5#mCW3Z,s8UP6nM9:^J[pZ*?DE:b4.(Dm?PU +/:k&W$mj$#/0G@`ao8OL&0i;;+WD[))[.N]!$Frdh#IO.+tQFI!!"/8b4idXX-f0Zb-](\[-I^B~> +nGiZ.Xg830!.#e`XfVa,"`:TP"gc?g!!T^O"U/bLD#c/oZNULaZa0feZa0f=EO0Wg"eW+T"U]7O +D(mXq0F@u'ZS2Oi%Ls*a%Lrh"$3`-+ZS2`mZ]_Z;$3^c6Zc]V\P7"Y=;$nmqZa2qO;(X@,EO2t] +/VCA]%OK9(/K>7`b5S^O&gSJ<+s800+9a&d!$+]`h#IO.*@skC!!"&5anO6gVjN^Rag'=hZ0MC?~> +nH&fSf'b-f!bEj$f%)>Q/!05g/+<+l!\ +nGl!/Z)_[l"YPnd9E681/DU:./-Q2Nnc/Y@nc/Y4qT8oI_og.#_Z7ON +_Z[$-Q)hgrZiI/m!.Y~> +nGl!0Z`S'r"YZNUMPZY]jtZa0feMmIC'/[Mc;0Trb^"U1'q;$@;% +Z\o.o$48HoEO.>+%fR+@%KUBcr\+LQZa0uG;?!mXOp)1i/IDi)Za1"FZZ- +nH)-Pn(*Rn.kYhm9@iQO.kAorE@^M/L+=eCmjfoimuT%mn*_c"Z1"aq9CM=dD9hUO.kAp6N@RYA +n$,M991s+pXRC"!C]97lCB;SZrbVgun*`nBNW/B'c7;PjNCupGn*`pY4(gr91s-)CTR!n +95EVWD/5d4mqo51D+ea7mu+.(imcK)eGe>/X)S1d:+k?(""l)S:@\Gd0(K&D*;[\XWjg$hrO2d6 +r3lfjAX&:cp8S,DlN2S~> +n,PI"X0KdIX0J]/9X1Y'X3"WN"gP=+!!UKL"U0daC]uAj]:Z^?YqH(\X0Jq1aiSH)$#dqjZ&/^' +ao/IJC^G$b0+%La!dMi!rNQ\9"UPKtZ*>qg%#"Vb"M:1#$"Nq=!A&0eYn*?2Dm?PU%#D/>$p:f, +/91Zo$H]PM$ksWu+<;RErYl"e9EbSn/DU:./-RRuo)JhC9J#c8!A).bb4NRSQ'diD_=k59Sc/Th +"n)GA~> +n,PI"Xg?0PXg>,5::%(/Xib#T"gbO1!!UNO"U0gdD$;Mn^n\]OZS2@_Xg>@9b0"]-$?=4pZ\o!, +b5JXMD$k9h0FI[e!dr/,rNch<"UYU"Za2=m%YObe"Mpd/$=j%@!A/ +n,bU&f'i7^f'h0?EUVKIf(=tQ/+;qH!\l"T@>>9>^Yr!KF2Ymgnn\XRGUnC[1AJCR";d +NR7[n$M +n,Oa +n,Oaj\F;7!T+;6t6G"]#''"Dn;o +ENT5H"Y^:'ZO.':%K]LQRJsN,0FA:"$? +n,amd0!X!rmuT%$!ccfBmuT%$/+;qd!\;Rg.k@mnX9(r]oT7YmOT$a:NUQ=qNUNr!.rkRW"HY-, +XOdC>"`6o6mn6=NCBCZ^ir8B\D+eY[9<@U-95BI&oC).nNCupFgA^OWD+fl6o^pG39<@UNCMWt= +E(dA&mu +k5Y\i!!!0&"T\H(!!)ct""^^^!>nL0+%Uh!"Af4 +#Rh7U$k*FN$kW7D!?_gE&-4 +k5Y\i!!!0&"T\H(!!)ct""gjc!H7[0FIdl!"Sr7 +#S%I[%LrgU%MJUJ!?;UC&cjQsrXSr@";W7*+ +k5ki +lMq1o!!NN+!!NN+o*,.##mDlNYlt:;#mCM3#lk/*#lkD5$3(G3$2P)/&-<7O&H3(Q/.<'u&88>7 +"UkqR'G)9*$lp#r+;Fed!#5DY&.g-6'GMZ7'H&,?'I+hA)&2rm!YcRur>P_Sr#5ej9E62),M`>6 +/-#ZD//p,D!1!TXs-3R8"WIUK)tO%0/GdNc_uIRP_uIOUQ"ZGi_=b28!<35k!.Y~> +lMq1o!!NN+!!NN+o*,.$#mDoSZNUL>$3^V4$318+$31S8$NCV6$Mk82&crOU')i@U/IiC'&o4hD +"V).X((qc6%NuT'*>\Ve!#GP[&/$98()@o9()nME(*k.J)]&;r!Yun(r?)(Zr#c.p:&l8&,i&G7 +/H>cD/0QPJ!0mN0s-*L7"X+$Q+nG[6/GdKbe,R)[e,R&`P\65c]_/Q0!<35k!.Y~> +lN.>B!\5c&!\5c&o.0i6#qJ[(mjfn]9.MOl9)pL=9)rc,9E/f*9DWH&MZR[PMuIK,NGFGfMq%4] +.r1'$W/HXpCQ59kZ`*k]!3#mt&J,~> +jT+]P!spW!?2Xs##lkD1$2"`&&H*"F/.`ADCf(KI&.fNirX]&KrY5>X!$h:R%jMr0,8h@D)^?4< ++WD::.K11c,:rR."rS^\+95(dh#J-S!!#\D)]L=Z[/]k"C]u?i/1^cPo)JbAr5o&Xb50$U_>hFP +_$$$:Q*eC#[/U.+"n)GA~> +jT+]P!t$`%@/U9&$31S4$M=o)')`:J/J8\KED[&Q&eYrqrXo2RrYGJZ!$q@U%jW)5,T@[J+=%mF ++s7gD-iP%c,VJg6"rej`*WShah#J-P!!#YC+X&BfZ2`/MD$;Hj/1^cPo)JbAr5euganjKd]`6I[ +]EFI3Pd.moZ2Xh("n)GA~> +jT=j#"&!L4Nr:L%9)rc(9D*)rMu@E!NJi_meZMP\Mi4O4regccri#gs!7:P?&(&G?d)jDVeBl=Z +imc)lmf( +m/[.i!!)?h!XT#:qZZQt!=T;(%.k)4'G(iT%/ph7'`T'L'`T$P'H7ba)$D0')&XCm)#t]V*;g`] +*>oe>+X7pN,Q8Ve)'r*'"\_TTr_3?*!Gn/&Q2bOr9^aM967a>]9H3p6!1!Q`")'5:"oU"D!!"SJ +aoTE&qSW +m/[.i!!)?h!X])jM8"n)GA~> +m/m;!e:~> +o)Jaoq>^O"!:^3s#mCJ="UPA3#lk/&#m:YC#n..,%.4\u'`K!L'_rX7)uh,_+T<;])'quU,5k47 +B_mttBOkXI9P!fi&S, +o)Jaoq>^O"!:^3s$3^S?"UYG4$318'$3UhG$4[F0%dju$(B,9P(ASp;+TE\e*W@/_)^S8Y*WJe4 +:B"o&PQb]/@S9@'q+L`_s%YA3m/-$hd/-RR./ +o)\nBq>p[J!q@cF9.MMc.n_Dl9)pL99*B$'95@2eC[R,PW;ap5BDRhrB3JJ6:0RHgs)J'6&R&109MR2A.S_TH/h8Q=a,lP^0(K&E0":f"!Op,J\,Wi5\,N`9 +B4[>"WWZ&u.fq6i!e:~> +nGiOmqZ-U!rrDftrsAW-!=8r/$2t,%#lkD5$0hrf&F1&/)=&4M*$?4?)]9qu"X5&h!:qcA!!#^h +!<4ST"TSNF,6/r5rW!W99Ip>u/-RRU!!"PM!%^fWQ*d59o`,"D_u7^Y_ohem!l;dlrkSYLQBh*L +!_`Rtm/VY~> +nGiOmqZ-U!rrDftrsJ].!=B#0$N:5&$31S8$L/,i''g>3)s\XG*WI5e)^S>b*?>+[o.9nA!)*.g +s"#5q!!"#b!$ifi!&=^N/-RRU"Y;5*!%\*M/5'W?Z(3H=!!+Y"rQ,)hanaBe][P@/]`2UEPk;3^ +9)o._!.Y~> +nH&\@qZ?aIrrVsGs%E;@!D=sB9E$I89)rc,9Bp<]MsI>?ammmZhuD17ioB%JeB+bN.jQ)9!qS&E +!WZ!l!rjkp.fobl)Zgrt!Wi?P:+e%L/h8PI!WjtU!\R5\PcC'&o`>.H\,F>J\&\ +AsDqf!_reIm/he~> +mf3=kr_3>Cn-'+)0/!J8"YXe4"n2ia%.=bl'^?V<*$P8"%4+[J!$_Ig,:kAj/1`s[/-5fV!;n&A +,5q`T+ohTf!$`]g/-Qu/"WR@>s""IMBU,sIs6.VJ/G/uC/H!Wk_ohhns2"`Q#/S3aBP<[Ios=lr +!!N?&"n2MB~> +mf3=kr_EJFn-'+*0JEY;"Yaq9"n2lb%dt%p(@!"D*?6+!+:TVl!!"9",U=ol,V1K5r[\%$r@A!M +?i^*M!$2%B%35EK,QK)8!%\9sD$;*\!<4SV94sKoaoCeNaXm)b!%e&i!Ro0ee,R)\dg!J6Z"I^6 +]_/N5:&kFt!!VilJ,~> +mfEJ>rc.s2n1+f-eDfiZrmVCXE<61\!#lk0/fQDq3rU`3 +9DpIE!aGg))ZV/_.h*a*!ZM1[)ZhWB.Zc/1quZmN#u5,tWlP.ia2]h*!WXkN`rWZiqR?L3s0i3> +\#O(RPdL+`"`XSo!WjnA!e:~> +nGidtCpC%_afEP^"TSPq"Tg6[Z2On00Tat32c!%e&j!Q3(X_#Uk>_$.`` +BkWdJp9Y"@9E5%r"n)GA~> +nGidtD6p@eb,rhb"TSPq"Tg9^Zi1+20XHoG"n;rb%eUJ6(B"m3(B#0R+<)9n+T<>[+:/u-*?ZID ++>>ANrZM=o/M6ZI!$qODr\FHQ"U,nt/-Q%P"Tg4Y"o^+Q!!5fXZ2;WHdI.&7aXm)b!%e&i!Ro0g +]E#56]EQchA7q.>p9=eM:&k7t"n)GA~> +nH&qGORLcmo[`[5.f]YD.frB4n,=g?D=>b#/+H9tC\eB,i+eGdSie-X7WimcK" +[r"bgr[It%92"t2!#tn=rW)p!"Y1iN/h7#%.fq=R/,i3@!Wl,]Wr'g?aOU=ja"I#d!&"2i!Op,I +ZiI-'Zj!q=?"]D/p8S;*E<61l/+3Oi~> +nGinIaiTDD"d,hh"T\,t!\^g`p]^Bu"9f)O#moo+oFV!9r=JB2oGI`M)&jOj)$h0!+;l%9)&Y"' +;#N'A/->l'!$h4 +nGinJb0#VG"d5tk"T\,t!\gsep]^C!"9f,U$4?)/oFh-=r=\N6oG[lT)^$:!)[IQ**?,q?)]LC, +;>i0N/M&J*q^_gL/-$si!<4SX"X+%$;(uuQ"d,%SrQ5*>qoJrfZ'6g4!!"SJaTBr5e+L?VZ".L3 +]_8T6aXmJm"U4>pJ,~> +nH'%jo^oC=/'c]r.g#;m!c@Dppac)3"=m,a92"SdoS`^IrJU*BoZ73bajei9aTp>;e]Gq_aiXF> +rG;X0/k\k7/cu/-!ZUk8s"4[0.P"/OD6.J&Pa&3Ha8c2:`rjD_PV2V1!&"2i!k64Zos=k%?"]D/ +p8S;:9*,/F/+3Oi~> +nGj)9X/cC-!!"PM"YX\LO`*qm"X7c1OcbMpMQsF)MG,[\C]stqDip6GD_D8#I!dSpOc_:'$1\Mn +&H3CB&G-\')>t]U)?(Q_+;l+;*#p7N'I+;2rY5A`rrq]grriBBr=&]4!\[6)oZ@8L67a8P!!"SJ +ao]K'_u%:M[/IfDZtO-<_>CS>X8TC*b5D;?"n)GA~> +nGj):XfVa1!!"SN"YaeOP&X7r"X7f6P*1_uMmKa0MbYsaD$:(sEKZNKEA.P'Jq>\.P*.L+$M"\q +')i[F'(ct+)uUfT)u^rf*?-+D*??FP(*jY"n)GA~> +nH'5_f%)?%!Wl!r.rCBQcE)$b.jC(\cH`\7Z1%._Z#OWcO=MhuXNokOXDKI\bKFbGcH^9"9Ccle +MuK[RMtEt7ao0cfao9cte]H=jio7#>W6hKPri#jVs"!C:s!n(?rG2F+!c;q^oZ%&H3\DEF!WXkN +`r``j\,3Q4Wr9:-Wb5t/[/6j'OSu0Za8H&>/+3Oi~> +nGiQ&ri6'9/H,et/??$,+L/0T"`MMf9J;9>Dm?Q`Cb.6EOTboNZ&p]EZ#9dLrNQLIZ&o1rmL8Fn +n.b"&ru:tU!#tnT!>HLP'EoF#'H&,,r[\$omOSG?#n.7>&H3(M$(o>cb0A*$b38']b%4%34Y6:, +!Ck!*aoTE&rPAK?qnWEBBP<[Ir3Q[/Q*dU![*%Y6J,~> +nGiQ%riH3ZgW('u*/()nM3/M/M!mOSG?$4[RC')i@Q$D>Q9ammL#amSTEa_!t167hg1 +!CbK9aT9l4rOi-7qn*':B4mIAr36I(Pd.-kZ,u82J,~> +nH&]'rmh+39E$Fd9@iQ)8+5ms/$/C3EG_tBXRGV>O@sHZc7:Ejn'5e=n#S#irU0m]n'3FVmVD0I +n>PKks4%(j!7_"i!N?MuIK(9@rh3a2uBCa48_]a&G/`3\L+- +!Bdji`rWZirNuR(qm6L+B4mI9r2Ks_PcBhFWlOB+J,~> +nGkI/X3%EIX-!PcCpAj$"\c0e"d,i^!!!0A"gP*.!!PKiM?O0gYlFqYZ&o1nZ*?t+Dm>0'#mou- +n.=n"i#)M6rY,PU&0hl,,mET7!\=Wdp^mH6!srecao9Ejs7FItk\EX]9KOdVp](=g_u7^Y_ohkm +!4;X>"LMiUQ,3C*s/Q:0X0eqMl2Z>~> +nGkI6XidcPXc`hfD6o-("\uBe"d5ub!!!0G"gb<2!!PZpMZj9jZN(.\Z]YIqZa3C1EO1Q,$4?/1 +n.P%&i#;Y=rY>\\&gS53,mET7!\=Zgp_*T:!t&nfb5TKjs3\sVmV,*_90t0\p](=fe,@Ahe&hL" +!3uF6"L2TPPe?q!s/-")Vm3/Al2Z>~> +nH(U>f(@P^f$5cIORKG).rk#m/'c_*!Wjl%/+;$j!\8$SYq%?nmfG"4n'3F6n*b6HXREDE92"Yf +n;HV2i5kuKrhp%1MpSEEX"3K;!\R,]pl#/f"&"aJo_ul=s2`72eQk:4:.Quip]:Ik\,F>J\&\BQ +!35q'"KH*IPdL@gs,[A`OK+D_l2lJ~> +n,O^bCi>HXX/ddfafB>uMQohYZ*=94!!!0RZ*=94"\c1Y!)0Y6rWW>,rrrG-rriR"Z&o1r$1//j +&F1%b)$Lrs'GMYnlMpu;"Ut/;rX8o9/51rDqu6Y0qb6u?qZ$[K]Yj`k!Q3(W_#Uk?_$.3HBP<[I +rNuR)rNlRIl2Z>~> +n,O^bD/k`]XfX0lb,oZ'MmH.^Za0W8!!!0SZa0W8"\uC^!)Bk;rWW>.rrrG/rriR$Z]YJ!$LJ>m +''g=f)[.?'()@knlMpu<"V1;?rXK&qZ$[K_:/D*!Ro0f]E#57]EPR~> +n,ajfOK?b"f%*KUo[^+FZ0uZ_n*^<.!WjlFn*^<..rk$_!cd[jr[\$;s""- +nGiOmr;[?3X/g&QX)'=<9Iq^uZ*=<."WdXpZ)[j."]2I]!)0Y6!!NP2Ylt<9aTViAZ&o1r$1//j +&Ejh`)$;)p$jGqs!X/l=rX]&Dq%3N6rs8m=anEjVb%U`I# +rP8ZETkKaW[/-j%ZiJ86!.Y~> +nGiOmr;[?3XfZGWX_fXA:+\%$Za0Z2"WdXqZ`O32"];Ua!)Bk;!!NP4ZNUN=aoqrDZ]YJ!$LJ>m +''L+d)Zq>u%L).u!X/o@rXo2Hq%EZ:rsAs9b0S61a_1QFs$?lX91pfe"o\K%/H3`ne&g(fqn2s6 +rO`<=SS)T"Z21BsYlMo2!.Y~> +nH&\@r;mK[f%,qEerWNtED&qTn*^>W.inabn(%Oj.uj#&!cd[j!\5eimjfpWoIDG3n'3FV9C6Na +Ms.+paTKnJCFe]P!\6oZregcTq2>5fs% +o)Jjr!%\ +o)Jjr!%eBR!"]MZ/^"+9s(D4%s$H`Y$plKr!!"R7Z,tJ:Z.&T_s0;R9 +s02]tB4mI6qPX:s!/p+BJ,~> +o)]"E!_Y'C!Y?m-mr=H?YlZEW!\4?EmjeJ=.iV.MoE$NnNUO,&9CL:Z.nfO'.kC)\.k?VJc7Ale +mVD9Lkc!@["K8A\D(FoRs!n(BrbM4crbMO,"SD`ds(D4(s#U0T$qN!'!Wk!=WlMThWjhl4s/Q(* +s/H3gB4dC.qN1ZU!3tejJ,~> +nGkC^X,:_0OfO?C/?uHrBM=:W!,S^:CgDol"fnnE:eXQfM?O0@Z#=H@Z"sRIZ*=H9:pH,drX&!$ +m1ALrlP]R=q\0,Y02S5)!!ZaK"WRgT%/1;=$kNgR"U-H7ane[27fH'_4%r?H/-S_Sb/:U/q6^.; +s0Mp&BUG'lqQ'V&!Qo6D!.Y~> +nGkC_Xc%%5P-'WG/[Md#B24@[!,\j?D.&8s"g,+J;,0lmMZj9BZZ0iFZY]jLZa0f=;6uDhrX/'' +m1SY!lPo^Dq\B8[0N"Y2!!ZsW"X+3[%egSB%MB6Y"U-K9b"hh,!(Hl[$pmT[/1iD(9 +nH(P/f!12B5t1r!g)!aOH-Sc/(X0NNH&t,Yq%?0n#VVrmuT%Mn*_bWNUP.Cr_)Zp +m>L5-lcK%5qksUtD2kdb!X<'_.nE<+C\N_nCPut$.k=8toPsb'!'L6U$qO,g/k[fL:9)@DWlOq8 +rj;^*"IEb4PcFSAri-">OQlmt~> +nGibECrrs(X%`Km(BnWUX3$5M!!Q'$Z,r+Z"Y>e@a\Y[9MZ*bZDuR!ODZp:NZ*=H9:pGBS"Uk_)% +."Pi'^ch?)\a7i'EB*O'EoEi-#[TNl2Uu=ChR_n$1SH'#m(8]/Gi*O4$>Ye9KP +nGibFD9B3-X\Siq(BnZXXicPR!!Q-(Zc\F_"YGnDb#(p?MuEk[EW39SE646FQ67kMT/~> +nH&nfOSeoCZj(FtTuf(?4?!\89Zn+=mu.ne1VoSmkZZ2Q6RXT%YuX=Geon*_bWNUP%`.r.fF +C[?uDW:%b/e>UmqVuY?HW!0Z/X/qC8l2h,AOCtXf9CZfs9*-V:9D_Hp830:4:.RoK81lNZa2b3h +q5OJ&a8W(AQY2PI\,DEeWWSKj`/s6cJ,~> +n,NRp!!!0+quH[!rW)g!!!)Zq!"&N+rsA]/#71P;#mCVD$1//f&Esnq)%IT")&jG-'I+h:,uH2s +47Z)F48qnZ4"NHT/1aHu$2tA4&H<.=&GHV5#luSBr_3>Cr_*_O9KP +n,NRp!!!0+quH[!rW)g!!!)Zq!"/T,rsJc0#7:V<$3^bH$LJ>i''U1u)\*u+)^$(8(*k.@,uH5t +6N0XX:A7E]6N0U`67kMj/1jU#$N:P7')rFA'))n9$3;_Ar_*8Cr_!YN90trs67a[Paj\)Tp9=hN +Z'8mcPb%cX!1a"P!F5ln!.Y~> +n,`_C!Wjl&quZgIrW;sI!!;gD!)*2>s%EAB#>6Qt9.NYN9C6N]Ms72,aUZh!ajeG2W6iniX0,)G +8H)BaEVE6.8H)?i84uKE/k^179E&`+MuRPmMt_#d9)qT`:B*ud:(/aM84ZBE/hWC/\$id>WWor4 +P\65FQi3oaU&C2VCFeWNJ,~> +irJ0E!=8r'$1&)d&Esnk)%I>u,qK?B/-RR."UQ+O)tX:8)[-EE)[%\q#mh%8&H<1:&H3+;#llOU +9ER@-4&#Q6s""29b5T +irJ0E!=B#($LA8g''U1o)\*W&,qTHI/-RR."UZCV+nPp>+U&&K+Ts>"$47:<')rI>')iC?$3r.X +91qT'6;.5Cs""28ao9cbZ2_K:Ym.k*/5'W?Pl>:s:-C3-!!!2f!.Y~> +ir\ +lN$nfqZ-$f!"&W.nd4Ril4E+mn/29A+;t.m%N?].&.fs,$m?#f&.fs)p^m91!$M1Jp^dQ:&.AsY +q@*9.rriNV9M?ugr&ap0!1!Q$pTtLJ_of@)U6UV$MNpj=!!N?+joBo~> +lN$nfqZ-$f!"/]/nd=Xll4W7qn/DEE*?4tn%Nm&5&eZ0(%NGrg&eZ0-p_*E5!$(nHp_!]>&e5Ba +q@ +lN7&9qZ?19!)*;Ank87`lAOi(nAta1e]Ifh%_&L;Mi3IMCO0c3Mi3IPpl"ua!/g\ipko8jMed*d +qJ6"%s!n4F:/4GTr(-i?!0mJlpSne3\&YMeTp2gHZ'8!6!\4=&joU&~> +k5YMd!:9si$3(2+#lk/.#mh"H#n.+K#mh"Hm0r7kk7mJ)!$hFV!?3?`&H=<]&H!!!0&"T\N*kl?5~> +k5YMd!:9si$NC;,$318/$4.1L$4[CQ$477Mm1/Cok8*V-!$qLY!?`]e')sQ`')rsO/H?di&c`F7 +')rIA*!$Zlr=8i?q$mH5%M&4?qum'Pq*P*4"/F>]e+g3Je,QZ^]ZJLBXctC@!!!0&"T\N*kl?5~> +k5kZ7!pqN<9E-O>9)pLA9*oB,95@1991s%nm;)!FkG[sn!7:\C!Oo-.MuSe:MuS\7N<"k8MZ@Pc +MuRSmM?/WmrG2Fkq.g%)CMWZ;r$qb?q+1N<".-L*\+m!'\,WH;[)_t6es&fX!WjkR.g#]#klQA~> +klBlMm0W(el4E"jp)+GV&1h]-$lfZq0+9L1)_=ZV$2uLT*<$-@*"U[/Zg)_6fJ@/-Q"Rp''^]J,~> +klBlMm0`.hl4W.np)=SZ&hS#3%Nu<*0Ffd6+Y?Ga$N;XV+oVZD+o_`F+TM]F+Ti&T$3gDP!X/oS +rWNNM"X+%9:+\'s/GLds+oVWR/5&W&67kMT/>pt%e+^-ISHlg4P\2QO!!)]rl2Z>~> +klU#um7Zb\lAO`%p;mlEMiI1@CN+'.D/4!J.SFc$rCd,\r[[t=%4WkY.S)$>.Omt^.n_Dl.KV+n +.fLq'.Ouu!89%9qr\!t=!(d)>$nb:M84ZBE/hW6pWjh`&s-EttWg%-h.foeG/*[1d~> +joFTKmKr1fl4Dngq\fDJ3XdQ5s09[>X.Z9r#6Oo#qQ62X)(Ie/-Q=`"URjr/5.SpBXGUn_8H8gs0Vc_!NU&+"m>r:~> +joFTKmL&7il4W%kq]#PN3Y!`:s0KjCXe]UPB?@Dkb*;qJPd/2caXkPrPf52rPf^1gXg%jX"TSNR +!%]l*/-%4$!%\+$+Y78=q]Qga/Hm`.D,-!@"UYD:$;O5G9.U'UZ+SPue,I#[Z2TX^X_mP2kQ$,~> +joX`smRuk]lAOW"qoSl:3bqB.s6oT"f!&fZB?.#boT]BrPcDp3a"GDsPfk]OPfKf/euAdE.foc) +!\OHS/cmX,!\OO,.P>@Hr$iUU91pd.erXmV9.NXc.nakW927)@B<&>J[($%As/Q('!S3A%/*I%b~> +j8eHKmKr1fl4Dngr#,MK$4naSX8i4Bkii&hp\tB=s7ZK8rr3;N/H +j8eHKmL&7il4W%kr#>YO$5+pRXoJFCmdC+sp\tB +j9"TsmRuk]lAOW"r5nu;$B'mYf)Pcje^a]?p\tB:s7lW7rr3<#0)ruloZ,"P0)bne/cl#*)_M0n +/c[@R!\Q),/h6uQ.P(Kk+=dLgP];f1C.g'-9.MMc85:ci:1n.F[uc]9B5;:EZ#T7`joU&~> +j8eHKm0W+fl4Dkfru(bL!YCYKqYpQ&rr<#?$-LB4ai_cJb0'b`aqD)-X3&N1afGFm/8S!hBM<)5 +,5Nhj"oKnO"oJ],"oh6r>lICt>tk5(&HrIE/53+e[$?oDQ'J)/BM9uF"m,f8~> +j8eHKm0`1il4W"jru:nP!YT/uqYpQ#rr<#@$-C?3b/qcJaiXS^aV(lQXiec[b,t[q/8\$cB1ll1 +*Vq;e"oKnO"oJ`-"U@[q?qX6i?r$\.&HrLF/P`FiZ':K?Pa%]&B21#G"m,f8~> +j9"Tsm7Ze]lAOT!s2k5Y]9YNcG%k&M$L)96&P'Wg&`ZPa%l+B5oQl/*6n`~> +j8eHKm0W%dl4D_b!t[+:"oBhN"oKnS9Iq_g/H.p6/-&B9/H8EB/-8Kr5lE569`-FA"o\f2$jd4D +"o83!"o8Q*"U9kaaiXR`@d+'Y!.Y~> +j8eHKm0`+gl4Vkf!tm:>"oBhN"o^%W/M'OG/5%Pn4oQu49DpF?/c@4,/PA_f/1iDG/3Wq`!)*8B +!A"ER$3UhG$3^V0!!!3!$NC86MuUrBs/fSk"m,f8~> +j9"Tsm7Z_[lAOGr",h"h/,Lq!/,h.*9.isl/l"%u9)^FC:AlgD9DpIL92857/k[fl/kZ(8!)EJc +!A5o%9*B$'9.MOh!WXbI9E-LHZ2aIgs41uM/*6n`~> +j8eHKm0W%dkn)Yb!>#S//H5ka/-Q1W!%\+$/-#Z$!!NNWrWN?'/1gc#!!Vlm!A"QU%0$V6"o83# +"UPA/#mCK+af>RFr<30-m02VPJ,~> +j8eHKm0`+gkn;ef!YPhloIU"G%kIkf!!"PM/1^c$/-#hW/H,eS!%]]#!!!2m!!+VXr=8i7!!W3! +!X/o7q?dB0: +j9"Tsm7Z_[l&4Ar!fK]EoIg.o%k]@_!WjtU/hR2,/cmOR0)d@&!\Q,)!WXb@!WaoHrG2F+!%[mI +!\6noqF^uBEV.g4!rXVL9C47l!e:~> +j8eHKlj;qckn)_d!>$:I/-$Xe/-,nSr<33%/H#PN"Y9WWrW!!'!#t2'!?2@D%0$Y6"o85n$0)3O +!.Y~> +j8eHKljE"fkn;kh!YQY.qCDUir%%jP! +j9"Tslq?VZl&4Gt!fN%2qCVatr%8"#!rXVM!\XEQ""Pu*/,fSO.fq3u!WrE(!W_fn!@gb@C]@'- +/,B>A9B.Pb!e:~> +j8eEJm0W%dkn)_d"V;Y))[-ED)uTs.)ZTm:)uTp@)_CO`s""0S$2b5/$3(2#$3(2+$17uY!.Y~> +j8eEJm0`+gkn;kh"VMt1+U&&J+oMT4+TO:r+oMQF+Y<0fs""0S$N(D2$NC;$$NC;,$LS)Z!.Y~> +j9"Qrm7Z_[l&4Gt"cI=m.P!%J.fCmc.KBJI.fCju.PC9Bs"4=&9DiT&9E-O69E-O>9C==l!e:~> +j8eEJm0W%dkRcYdrt#2a*<$6E*9mk-"T\o5oa1O"s"+*PrsAW4q[*9+lNut_jT'f~> +j8eEJm0`+gkRuehrt5>d+oVfK+mKF3"T\r6oa:U#s"40QrsJ]7q[3?,lO*%`jT'f~> +j9"Qrm7Z_[k_nAts,-np8H)6^8ErkF.fi9noh535s%E;@s%E<+qb-r>lV$XrjT9r~> +j8eEJlNukckRc2Wkn*+grX&K2jU(;XjT'f~> +j8eEJlO)qfkRu>[kn<7krX/Q5jU1AYjT'f~> +j9"QrlV$PZk_mogl&4hBr_*0)j\+tkjT9r~> +j8eEJl3Zecjq-;^ck-'_rsAT3rX&T5m0W%]jT'f~> +j8eEJl3ckfjq?Gbck?3crsJZ6rX/Z8m0`+^jT'f~> +j9"Qrl:^JZk)8#nd#7d:s%E9*r_*9,m7Z^pjT9r~> +j8eEJl3Zecjq-A`cOfp]rsAW4r<`K4mKr+]jT'f~> +j8eEJl3ckfjq?MdcP$'arsJ]7r +j9"Qrl:^JZk)8)pc\qX8s%E<+rCd0+mRudpjT9r~> +j8eBIlNukcjq,TJmh"amlNmRq$0_WT!.Y~> +j8eBIlO)qfjq>`Nmh4mqlO!Xr$L%`U!.Y~> +j9"NqlV$PZk)7 +iW/0Gl3Zbbjq,rTkRd%glNubYirFT~> +iW/0Gl3chejq?)XkS!1klO)hZirFT~> +iWA +i;i$Elj;nbk7H5Zit1Sdl3Z\YiW+K~> +i;i$EljDtek7ZA^itC_hl3cbZiW+K~> +i<&0mlq?SYkDRrjj,<;?l:^@liW=W~> +i;i$Elj;nbk7H8[it1Pcl3Z\YiW+K~> +i;i$EljDtek7ZD_itC\gl3cbZiW+K~> +i<&0mlq?SYkDRukj,<8>l:^@liW=W~> +i;i$Elj;kajUg5^iXkDal3Z\YiW+K~> +i;i$EljDqdjV$AbiY(Pel3cbZiW+K~> +i<&0mlq?PXjbqrnif!, +%%EndData +end + +%%EndDocument + @endspecial 5045 5088 a + 0 setgray + 5045 5088 a 10173 5340 a + 0 setgray + 10173 +5340 a 5462 5736 a + 0.357 0.541 0.710 setrgbcolor + 5462 5736 a 3822 w Fb(SLURM)20 b(\226)g(p)n(.)f(1/2) +10740 5736 y + 0 setgray + 10740 5736 a 4500 6000 a + tx@Dict begin -90 Rot end + 4500 6000 a eop +end +%%Page: 2 2 +TeXDict begin 2 1 bop 4500 6000 a + tx@Dict begin 90 Rot end + 4500 6000 a 5073 5340 +a @beginspecial @setspecial + tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.25 true -25.60728 +-25.60728 348.5461 253.94081 .5 Frame gsave 0. setgray fill grestore +gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end + +@endspecial 4828 2192 a +@beginspecial 14 @llx 14 @lly 513 @urx 49 @ury 3401 @rwi +99 @rhi @setspecial +%%BeginDocument: rule-glow.ps +% Use own dictionary to avoid conflicts +10 dict begin +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 34.560000 translate +498.240000 -34.560000 scale +% Image geometry +692 48 8 +% Transformation matrix +[ 692 0 0 48 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 692 string def +/gstr 692 string def +/bstr 692 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 9049 ASCII Bytes +colorimage +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +!!*!"#6P)3"U52:#lY,7$4I=P%1WmH&,d&j&V1OF&V1OO&cE:>%fd+=%K?h:$N:>:#R:S="U"r1 +rW<*"J,~> +'`\FC#71bG%1a'a'GhQ'*$-.D+s\H5-35MDq^V1fJLl@'JLl@'X=Wrnq^MUq./kP/,U+ET*Zc:= +(Ddbu&e>EZ$OI%C"onXR~> +JH16$JH16$JH3ppJ,~> +!rrB)"9&H0"pYD>$4@4M%K6n;&cNCC'D`F7'nI-O(4d6P(9A;C(&AUE'E/XD&cN:H%1EUP$4$nB +#6"f+!s/N(!.Y~> +'`\IF#n.:R&JGoq)B9_=+snWb.P*.M0*F!b1G^le21[Z:2M!c;2NTir2$>`l1GU]a0,?)g.OZVj ++s.dE)AX)%&Io9Z#mgh:!.Y~> +JH16$JH16$JH3ppJ,~> +(]XXA"U52:#RLkH$k]i'GV>u(Dm#er>C/)JJs(XJJsUgr>GPNrtcIe'bh>q&eYce%LrmT +$OI(D#6k>8!rr=O~> +*<6BS$kEs`'Gqf0+!W!X.P<>.1c@6O4$,Pg5 +JH16$JH16$JH3ppJ,~> +(]XXA"U52:#RLkH$k]i'GV>u(Dm#er>C/)JJs(XJJsUgr>GPNrtcIe'bh>q&eYce%LrmT +$OI(D#6k>8!rr=O~> +*<6BS$kEs`'Gqf0+!W!X.P<>.1c@6O4$,Pg5 +JH16$JH16$JH3ppJ,~> +)up*F"U>;=#n%1O%hK9b'G_H#(`=20)]Kb:*?G&!JKKFbJKKFbOrsTCruM+Zru2am)&O2,()@Ss +&.f?]%1 +)upBW%MBHi(`X\B-7UJu1H%-P5!_J%77B^;8kT(Us%N&ZJPLbkJPLbkXA8C^s%NDbs%45$7n#j6 +5s@In2E!?E.Olbg+WM=5'G:lc$ig9X~> +JH16$JH16$JH3ppJ,~> +)#sgF#7(VB$k3^X&JPoo(`=21*$-.C+ ++TMua&JQ'!*?ljY/2At=4@)8$85)]Q;,L7m='&L,=^##$>Cg%1>_-.2>c_3&>Q7n,=WU[H=&r6s +;,9kV845a04>nrM/12eh*>fV-&J5KQ!.Y~> +JH16$JH16$JH3ppJ,~> +)#sgF#7(VB$k3^X&JPoo(`=21*$-.C+ ++TMua&JQ'!*?ljY/2At=4@)8$85)]Q;,L7m='&L,=^##$>Cg%1>_-.2>c_3&>Q7n,=WU[H=&r6s +;,9kV845a04>nrM/12eh*>fV-&J5KQ!.Y~> +JH16$JH16$JH3ppJ,~> +*<69K#71bG%1a'a'GhQ')]]q@+X/*U,palb-RU>@.=it".Y0(#.Zu:[.39lb-RL/d,pXZX+Wh^F +)]9G.'G;#h%1 ++TN#d',V]/+t,&r1cdZ_77p0J<*37-?=%&LAS#IdB4tuNBn:#MC4U,NC921BC&_lHB-(YrAR](S +?',(lV!.Y~> +JH16$JH16$JH3ppJ,~> +)up3L#RV"M%h]Qj(E+23+!DdQ-7:/i.Olr"/M6rSJM2R-JM2R-N\CAas",0@.k3"t-RL/c+X%pI +)B'D+'G:oc%13@H#64aS~> ++TN,j()nD?-S@864$l8):K1:t?XmSZCMRg,EcQ5CFEVj"GCb!iG_(*jGcZ/^GQ2jdF<5LDEc>o3 +CM73b?X$K/:Imf=4#JlJ-QsWP()@M_!.Y~> +JH16$JH16$JH3ppJ,~> +)#spK#n.=T&JQ#t)BBh@,:4`c.P*,'0/#$Y1&s-/2"WYV2M!c;2M!cf2Y8m*1]T?21)_i"0.ne* +.OZVj,9S!I)Aa2(&J#B\#mgk;!.Y~> ++TN2o)':1P/2TFM6:sjI=^PNJCN+67G^+RaIt*$%K7npMKn5&2Lk1A5LocF)L&Zi+K-#SnIsu`h +G][n?CM$p\=]%d`69@7c/1)\c)&X+g!.Y~> +JH16$JH16$JH3ppJ,~> +)#spK#n.=T&JQ#t)BBh@,:4`c.P*,'0/#$Y1&s-/2"WYV2M!c;2M!cf2Y8m*1]T?21)_i"0.ne* +.OZVj,9S!I)Aa2(&J#B\#mgk;!.Y~> ++TN2o)':1P/2TFM6:sjI=^PNJCN+67G^+RaIt*$%K7npMKn5&2Lk1A5LocF)L&Zi+K-#SnIsu`h +G][n?CM$p\=]%d`69@7c/1)\c)&X+g!.Y~> +o`0ODJH:<&JH:<&kQ1\doDjC~> +$NLJ@$OmXY',DK)*J"6B!J(9&!J(:8!WN92*?#h3'+b]a$O[7@!.Y~> +$NLt_*$Qj^0f_Qe8q@"o!J(9&!J(:8!WN928jYj)0e+Xs*#oap!.Y~> +o`5!mJHUN,JHUN,JHY9A!XJo3oDjC~> +%0-\C$kEs`'c7o1*ruCn"G$],"G$],"R?1$#Qt8P*#oe1&eY]`$jcn6J,~> +%0.7f+!rTm2Es]%:]UTJ"G$],"G$],"R?1$#Qt9,7n5d%/hSIm*uP%YJ,~> +o`5!m!!IiYJI$f4JI$f4m0Ee'#Qt;&!.Y~> +%KHhF%1j0d(E+A;+oq]IJI$f4JI$f4JI(WK&.JmJ" +%KIFl+t56$3^ZV9 +o`5!m!!IiYJI$f4JI$f4m0Ee'#Qt;&!.Y~> +%KHhF%1j0d(E+A;+oq]IJI$f4JI$f4JI(WK&.JmJ" +%KIFl+t56$3^ZV9 +o`5!m!<`[Z%=nt>%=nt>%Iai,&H`IJ"9e>sJ,~> +%fctI%M9Bh(`XY@,ln#L#_%=nuX%K@"O%1!(>,p4 +%fdRp,V1f15"JRL>las/#_%=nuX%K@"O%1!(>>uFQk4uG2K,U=?0!.Y~> +o`5!m!sAl=%=o+B&V1OF&V1Pc&I'$`&If!K"S;\E~> +&HE4M%h]Wn)BL(H-34,M#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt8W+sJ'H()@Mn%h&F +&HEn"-8.;:6;(B]@0$B3#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt9=='&$]2`EB:-6E3fJ,~> +o`5!m!sAl=%=o+B&V1OF&V1Pc&I'$`&If!K"S;\E~> +&HE4M%h]Wn)BL(H-34,M#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt8W+sJ'H()@Mn%h&F +&HEn"-8.;:6;(B]@0$B3#Rq5o&V1OF&V1OF&b?SJ(D.5g#Qt9=='&$]2`EB:-6E3fJ,~> +o`5!m"9\u>%2".-JJWkRJJWkRp)!`L"r@j`%1!(>oDjC~> +&c`=N%h]Wn)BU1K-ij>O#Rq4TJJWkRJJWkRJJ\"rruDah&J5HX"9^+t,9Ig>((q,g$ig9X~> +&ca"$-SIJ?6V^fgAH;f7#Rq4TJJWkRJJWkRJJ\"rruDah&J5HX"9`:>>#%FF3A2a-*rl:k~> +o`5!m"U#)?%1sD-*J#5^*J#5^*V^W],TRmA&J5HX"9e>sJ,~> +'*&IP%hf`q)]p=N.00GP#Rq4T(P*TX*J#5^*J#7+*>Tn@*>];"%1!(>.3p/\)]';(%hB*L!.Y~> +'*'.'-o!eF78R5oB)r#9#Rq4T(P*TX*J#5^*J#7+*>Tn@*>];"%1!(>B3\\<76 +o`5!m#6Y;A%1sBs*J#Je,_74l,_76<,RQ%I*?>q.&If!K"S;\E~> +'`\[S&/5ru*$?OR.KKPQ#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt8[,paZR(`3qu&.JU> +J,~> +'`]C+.5F"J7T!GsB`S5;#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt9E?!U;s4?PAJ.3SZk +J,~> +o`5!m#6Y;A%1sBs*J#Je,_74l,_76<,RQ%I*?>q.&If!K"S;\E~> +'`\[S&/5ru*$?OR.KKPQ#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt8[,paZR(`3qu&.JU> +J,~> +'`]C+.5F"J7T!GsB`S5;#Rq4T(EFNI,_74l,_74l,l8i'.jQ,U(D.5g#Qt9E?!U;s4?PAJ.3SZk +J,~> +o`5!m#6Y;A%1sBs*J#_l.tK4%.tK5I.g[IA*>];"%1!(>oDjC~> +'`\[S&/5ru*$?OR.KKPQ#Rq4T(EFNI.tK4%.tK4%/,Cb3,TRmA&J5HX"9^2#,p40E(_dMm%0-BY~> +'`]C+.5F"J7T!GsB`S5;#Rq4T(EFNI.tK4%.tK4%/,Cb3,TRmA&J5HX"9`FE>u='R4>J?7+TMLm~> +o`5!m"U#)?%1sD-,_74l,_74l,kiSa* +'*&IP%hf`q)]p=N.00GP#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt8Z,U=HN(Dd_q%h/L=J,~> +'*'.'-o!eF78R5oB)r#9#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt9C>[1)o4$,/F-m/KiJ,~> +o`5!m"U#)?%1sD-,_74l,_74l,kiSa* +'*&IP%hf`q)]p=N.00GP#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt8Z,U=HN(Dd_q%h/L=J,~> +'*'.'-o!eF78R5oB)r#9#Rq4T(P*i_,_74l,_768,l\ku(D.5g#Qt9C>[1)o4$,/F-m/KiJ,~> +o`5!m"9\u>%2".3JK9:^JK9:^oGn,P&J5HX"9e>sJ,~> +&c`=N%h]Wn)BU1K-ij>O#Rq4TJK9:^JK9:^JK=A'',M5m%1!(>-mKrY)AX)$%hB'K!.Y~> +&ca"$-SIJ?6V^fgAH;f7#Rq4TJK9:^JK9:^JK=A'',M5m%1!(>AQi846TI.[-RTu9!.Y~> +o`5!m!sAl=%=o=H(P*BR(P*Cn(]P'L%1!(>oDjC~> +&HE4M%h]Wn)BL(H-34,M#Rq5o(P*BR(P*BR(\/CB&J,BW"9^%q+s%X<((q,g$ig9X~> +&HEn"-8.;:6;(B]@0$B3#Rq5o(P*BR(P*BR(\/CB&J,BW"9`.7=%bk=2_QL)*rl:k~> +o`5!m!<`[Z&V1OF&V1OF&ag55%1!(>oDjC~> +%fctI%M9Bh(`XY@,ln#L#_ +%fdRp,V1f15"JRL>las/#_ +o`5!m!<`[Z&V1OF&V1OF&ag55%1!(>oDjC~> +%fctI%M9Bh(`XY@,ln#L#_ +%fdRp,V1f15"JRL>las/#_ +o`5!m!!Ii^JIR/>JIR/>ljX"%"9e>sJ,~> +%KHhF%1j0d(E+A;+oq]IJIR/>JIR/>JIUrT%gW:@+s.mF(D@Gn%1NXE!.Y~> +%KIFl+t56$3^ZV9JIR/>JIUrT%gW:@=%uCV3\`?<+sIs+!.Y~> +o`5!mJI$f4JI$f4JI(NHrrhroJ,~> +%0-\C$kEs`'c7o1*ruCn#_<84#_<84#jM]q":Q@l*#KD'&e>BZ#ljsU~> +%0.7f+!rTm2Es]%:]UTJ#_<84#_<84#jM]q":S*s7mAma/g_Y^)#sYe~> +o`5!mJI$f4JI$f4JI(NHrrhroJ,~> +%0-\C$kEs`'c7o1*ruCn#_<84#_<84#jM]q":Q@l*#KD'&e>BZ#ljsU~> +%0.7f+!rTm2Es]%:]UTJ#_<84#_<84#jM]q":S*s7mAma/g_Y^)#sYe~> +o`0OGJHUN,JHUN,jok;VJ,~> +$NLJ@$OmXY',DK)*J"?E"G$],"G$^<":Q:h)AWtt&.K!T#ljsU~> +$NLt_*$Qj^0f_Qe8q@+r"G$],"G$^<":Rmh69-bM.O#iP(B=Gc~> +JH16$JH16$JH3ppJ,~> +)#spK#n.=T&JQ#t)BBh@,:4`c.P*,'0/#$Y1&s-/2"WYV2M!c;2M!cf2Y8m*1]T?21)_i"0.ne* +.OZVj,9S!I)Aa2(&J#B\#mgk;!.Y~> ++TN2o)':1P/2TFM6:sjI=^PNJCN+67G^+RaIt*$%K7npMKn5&2Lk1A5LocF)L&Zi+K-#SnIsu`h +G][n?CM$p\=]%d`69@7c/1)\c)&X+g!.Y~> +JH16$JH16$JH3ppJ,~> +)up3L#RV"M%h]Qj(E+23+!DdQ-7:/i.Olr"/M6rSJM2R-JM2R-N\CAas",0@.k3"t-RL/c+X%pI +)B'D+'G:oc%13@H#64aS~> ++TN,j()nD?-S@864$l8):K1:t?XmSZCMRg,EcQ5CFEVj"GCb!iG_(*jGcZ/^GQ2jdF<5LDEc>o3 +CM73b?X$K/:Imf=4#JlJ-QsWP()@M_!.Y~> +JH16$JH16$JH3ppJ,~> +)up3L#RV"M%h]Qj(E+23+!DdQ-7:/i.Olr"/M6rSJM2R-JM2R-N\CAas",0@.k3"t-RL/c+X%pI +)B'D+'G:oc%13@H#64aS~> ++TN,j()nD?-S@864$l8):K1:t?XmSZCMRg,EcQ5CFEVj"GCb!iG_(*jGcZ/^GQ2jdF<5LDEc>o3 +CM73b?X$K/:Imf=4#JlJ-QsWP()@M_!.Y~> +JH16$JH16$JH3ppJ,~> +*<69K#71bG%1a'a'GhQ')]]q@+X/*U,palb-RU>@.=it".Y0(#.Zu:[.39lb-RL/d,pXZX+Wh^F +)]9G.'G;#h%1 ++TN#d',V]/+t,&r1cdZ_77p0J<*37-?=%&LAS#IdB4tuNBn:#MC4U,NC921BC&_lHB-(YrAR](S +?',(lV!.Y~> +JH16$JH16$JH3ppJ,~> +)#sgF#7(VB$k3^X&JPoo(`=21*$-.C+ ++TMua&JQ'!*?ljY/2At=4@)8$85)]Q;,L7m='&L,=^##$>Cg%1>_-.2>c_3&>Q7n,=WU[H=&r6s +;,9kV845a04>nrM/12eh*>fV-&J5KQ!.Y~> +JH16$JH16$JH3ppJ,~> +)up*F"U>;=#n%1O%hK9b'G_H#(`=20)]Kb:*?G&!JKKFbJKKFbOrsTCruM+Zru2am)&O2,()@Ss +&.f?]%1 +)upBW%MBHi(`X\B-7UJu1H%-P5!_J%77B^;8kT(Us%N&ZJPLbkJPLbkXA8C^s%NDbs%45$7n#j6 +5s@In2E!?E.Olbg+WM=5'G:lc$ig9X~> +JH16$JH16$JH3ppJ,~> +)up*F"U>;=#n%1O%hK9b'G_H#(`=20)]Kb:*?G&!JKKFbJKKFbOrsTCruM+Zru2am)&O2,()@Ss +&.f?]%1 +)upBW%MBHi(`X\B-7UJu1H%-P5!_J%77B^;8kT(Us%N&ZJPLbkJPLbkXA8C^s%NDbs%45$7n#j6 +5s@In2E!?E.Olbg+WM=5'G:lc$ig9X~> +JH16$JH16$JH3ppJ,~> +(]XXA"U52:#RLkH$k]i'GV>u(Dm#er>C/)JJs(XJJsUgr>GPNrtcIe'bh>q&eYce%LrmT +$OI(D#6k>8!rr=O~> +*<6BS$kEs`'Gqf0+!W!X.P<>.1c@6O4$,Pg5 +JH16$JH16$JH3ppJ,~> +!rrB)"9&H0"pYD>$4@4M%K6n;&cNCC'D`F7'nI-O(4d6P(9A;C(&AUE'E/XD&cN:H%1EUP$4$nB +#6"f+!s/N(!.Y~> +'`\IF#n.:R&JGoq)B9_=+snWb.P*.M0*F!b1G^le21[Z:2M!c;2NTir2$>`l1GU]a0,?)g.OZVj ++s.dE)AX)%&Io9Z#mgh:!.Y~> +JH16$JH16$JH3ppJ,~> +!rrB)"9&H0"pYD>$4@4M%K6n;&cNCC'D`F7'nI-O(4d6P(9A;C(&AUE'E/XD&cN:H%1EUP$4$nB +#6"f+!s/N(!.Y~> +'`\IF#n.:R&JGoq)B9_=+snWb.P*.M0*F!b1G^le21[Z:2M!c;2NTir2$>`l1GU]a0,?)g.OZVj ++s.dE)AX)%&Io9Z#mgh:!.Y~> +JH16$JH16$JH3ppJ,~> +!!*!"#6P)3"U52:#lY,7$4I=P%1WmH&,d&j&V1OF&V1OO&cE:>%fd+=%K?h:$N:>:#R:S="U"r1 +rW<*"J,~> +'`\FC#71bG%1a'a'GhQ'*$-.D+s\H5-35MDq^V1fJLl@'JLl@'X=Wrnq^MUq./kP/,U+ET*Zc:= +(Ddbu&e>EZ$OI%C"onXR~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +JH16$JH16$JH3ppJ,~> +%%EndData +end + +%%EndDocument + @endspecial 3393 x @beginspecial 0 @llx 0 @lly 288 @urx +216 @ury 576 @rwi @setspecial +%%BeginDocument: linux_llnl.eps + + +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Times-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +userdict begin +DisplayImage +0 0 +288 216 +12.000000 +288 216 +1 +0 +0 +128 +252424 +040304 +F5BD0C +FDFDFB +3D546A +B29762 +B88209 +848383 +E5E5E5 +797979 +626262 +C6C6C6 +6B4709 +464646 +555555 +DADADA +AB7508 +3A3A3A +EBB20C +979696 +FEFEFC +1C1B1B +E3AA0A +F3DB97 +BAB9B7 +DBA209 +D59809 +F3F3F3 +A7A5A3 +182530 +141313 +2A3846 +F5C60C +9B6806 +C48A08 +425B72 +374B5E +C4A760 +F7D913 +B2A483 +5682AA +2A4054 +CB9309 +2B2C2E +EBC30B +507698 +513808 +4A6D8C +1E1E1E +4F789D +C2B28A +FAFAF9 +F3D62C +855906 +956D27 +FFFFFE +332306 +92805F +D8A72A +F7D50E +BAB2A3 +1F2E3B +436585 +9E9D9B +BE933A +E7AF0D +7C6540 +F5D845 +F7F7F6 +EFB60D +FCFCFA +BE8C1E +547DA1 +425F7B +9D9382 +2D3339 +0E0D0D +34414C +F5CD0C +201605 +A6823B +121C24 +AEAEAD +F3BA0D +DFAC1C +DBB539 +171616 +ECECEB +EDCB0F +0C1218 +F1D019 +BEBEBD +F8EED7 +343434 +8B8B8B +E4DCCD +212831 +090909 +6B6B6B +161515 +F8C00C +181717 +111010 +486A8A +212121 +1A1919 +496E91 +496985 +292929 +272727 +4D6F8F +303030 +776C5A +727272 +74716B +C2C1C1 +FEFEFE +F0F0F0 +CECFCE +F0B803 +EABB0B +6D5B3B +486784 +456787 +919191 +5B8AB5 +262626 +000000 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F010101016161616161 +616161616161616161010101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016161616161616101010101010101 +016161010101010101016161016161616161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161616101010101014C4C1E6369151530303030 +6868686830303030306969631E4C610101610101616161017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016161010161616166631568680000007E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E000000686815636661616101016161017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F0101610101614C661E69687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68156366616101016101017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F6161010161666315687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E681556666101016161017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01610101016669307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30151E61010161 +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +0161610101661568007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068156601 +016161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161 +01614C6368007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068 +5661610161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01610161 +6615007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E001566610161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F010101616161616101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F616101611E30 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E3063610161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F01614C6656693030683015651E666101017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161016156687E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E6856610161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F0101616669006F11110D0D0D0D0D115D6C6865666101017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016156687E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E6863017F01617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F016166156C110D0E62710909090971620A0E0D116C151E61017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016163687E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E007E7E7E684C7F7F01617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +0161567E110E62075E620E0A0E690E0A0A7C5E09620E112B156661017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6101611E687E7E7E7E007E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E0015617F7F7F61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01 +4C696F0D0A07620D4C0101010101017F014C560D095E620E11006361017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C157E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E68634C017F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C +155D0E09075D0101010101010101010101010101011109070A0D2B694C017F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016165007E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E681E4C017F7F7F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016169 +6F0E09096101010101010101010101010101017F7F0101117C710E6F694C017F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01010166687E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E681E61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E2B +0D090D610101010101010101010101010101014C61017F016309090E6F6561017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61016169007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68301E +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D +62090101010101010101010101010101017F4C6C116D66017F010E090D2B1E617F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E306566017F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66017F7F617F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01566F0E +5E1E010101010101010101010101010101011E110A0A111E01016107710D684C017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F61010156007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E694C017F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E7E004C7F7F617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161680D09 +71010101010101010101010101010101017F630D09090E6C6601017E5E0A5D69617F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F610161307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E157F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E65017F017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0E5E +00010101010101010101010101010101017F690D620A116F30617F010D070E6C66017F7F +7F7F7F7F7F7F7F7F7F7F7F7F610166687E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E15017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E30617F01017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F616911620E +01010101010101010101010101010101010169110D6F3056660101016107621169617F7F +7F7F7F7F7F7F7F7F7F7F0161011E007E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E007E7E684C7F7F617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61680D0711 +01010101010101010101010101010101010166301E617F7F010101010111070D7E4C017F +7F7F7F7F7F7F7F7F7F010101697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E4C7F7F617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E5E69 +0101010101010101010101010101010101010161017F0101010101010101090A5D63017F +7F7F7F7F7F7F7F7F610161157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E001E017F7F7F617F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0A134C +0101010101010101010101010101010101017F7F0101010101010101010162710D15617F +7F7F7F7F7F7F7F617F61307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E1E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E65617F7F7F7F7F7F617F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F015611620901 +0101017F7F7F7F010101010101010101010101017F7F010101010101010111070D004C7F +7F7F7F7F7F7F617F7F157E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E007E7E7E15617F7F7F7F7F7F7F7F7F017F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016911710E01 +010101616166617F0101010101010101017F014C30697F010101010101014C5E0E6F6601 +7F7F7F7F7F017F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E0015617F7F7F7F7F7F7F7F7F61017F017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01150D710A01 +0101610101156D667F0101010101017F7F01617F1E117E7F01010101010161070A5D6301 +7F7F7F7F017F7F4C30687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E69617F7F7F7F7F7F7F7F014C300030617F01 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61150D090A01 +017F01682B66666F4C7F010101017F65116207626C015D1E7F0101010101010E71116901 +7F7F7F617F7F7F7F7F01666515007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F01687E7E7E7E00694C7F7F7F7F7F7F7F7F014C687E7E7E7E30017F +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A01 +7F010D3F185E000156010101017F00717C3F520B5B0D7F1E017F01010101010A710D1561 +7F7F617F7F7F7F7F7F7F7F7F7F614C63687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F01157E7E7E0063617F7F7F7F7F7F7F7F011E687E7E7E7E7E7E7E3001 +7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A01 +7F6C7C1876735E6C7F0101017F1571520B0F0F0F0B5E697F010101010101010A090D3061 +7F617F7F4C617F7F7F7F7F7F7F7F7F7F01614C6568007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F01307E00304C017F7F7F7F7F7F7F7F4C56687E7E7E7E7E7E7E7E7E7E30 +017F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A7F +7F0E7357441B085E7F7F017F7F0A0B1B371B0F461B0B0A7F7F01010101010111070D6861 +010161157E6815694C017F7F7F7F7F7F7F7F7F7F01614C6568007E7E7E7E7E7E7E7E007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F0169006561017F7F7F7F7F7F7F011E307E7E7E00007E7E7E7E7E7E7E7E7E +30017F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D090A7F +011C373F090F3708637F017F7F134637761169621B3776697F01010101010111070D004C +0161307E7E7E7E7E7E006815666101017F7F7F7F7F7F7F7F7F014C6515687E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E00007E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F6166017F7F7F7F7F7F7F014C15007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E697F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01150D710A7F +650F187F5D0E76370D7F4C61011C3733117F110A0937370D7F01010101010111070E0066 +01157E7E7E7E7E7E7E7E7E7E7E7E0068654C61017F7F7F7F7F7F7F7F7F014C1E6515007E +7E7E7E7E7E7E7E7E68651E4C66007E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F01611E687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E637F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016911710A7F +68080E7F110E07370A016D2B631C37187F7F1E0A5D76370A7F01010101010111070D2B4C +697E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E00301E664C017F7F7F7F7F7F7F7F7F614C +6665300068151E4C017F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E00667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F014C63687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E +7E7E30017F01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01651162097F +68765D7F4C0D0E1B0D7F014C617137077F0161614C1C37717F010101010101115E0E7E15 +7E7E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6815691E4C017F7F7F7F7F7F +7F7F0161017F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F615615687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E30017F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E5D0A3F61 +690F0E7F01010D3C2E3535350C110F137F7F7F7F7F1837627F010101010101115E0E6C6C +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068151E017F7F +7F7F7F7F7F7F7F7F7F7F7F6115153068007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F0161666930007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +30017F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E5D0A134C +01180B617F7F0C47162C78412A223A321E7F7F7F0D46370E7F010101010101115E0E116F +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E0030691E61017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01614C6663151530680000007E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F6130007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E30 +017F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F666F0A7C4C +7F0937716635222A45787816062A2C78102E4C4B0F370F687F010101010101685E0A0D6F +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68155666617F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F014C4C6161017F7F7F7F7F7F7F7F010161614C6656656565153030 +303030303030303030306569617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1501 +7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F666F0E7C4C +7F11575F1022164545782C585A34345A3B201A255F57627F7F0101010101014C13710D5D +6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0065664C017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F657E7E7E00301569561E664C616101017F7F7F7F7F7F7F7F016161 +616161616161616161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +307E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F +7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F662B0E5E4C +7F6139472219124578782C5A34344334263B4E2C413A35617F0101010101014C1C090E5D +6C7E7E7E7E7E7E7E7E7E7E7E7E7E7E30564C61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E00006868155665561E1E69696969 +56636363636363636515617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0130 +7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E681E017F7F +7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C2B0E5E4C +7F4F21061A161245782C585A34434326263B2626265A020C7F0101010101014C52070E11 +6C7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01157E +7E007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00304C017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E5E68 +61350622194145452C2C585A434334262626263B195420357F7F0101010101010A070D5D +0030687E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F667E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F657E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E003063017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E5E5D +4F10061A161245782C585A4343343B2626267822062A162E7F01010101010101117C0E2B +6601014C666315687E7E7E7E7E00017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F637E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E301E617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617E0E5E5D +4F212219164553782C583443263B2626582A062A1919192E7F01017F7F7F010101076211 +65017F7F7F7F7F0161665669681E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00151E617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61000E0711 +7F38352A4553782C585A5A262626581906061A19191A064F7F7F660D307F7F0101095E0E +7E4C017F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E007E15017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E +007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00654C617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F1E667F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617E0E5E11 +7F4C0C352245205A34343B582C2A2121221A191A2A4739597F7F4C62090D1E7F01111C09 +0D6F301E4C617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E007E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E007E007E +7E7E7E7E7E7E7E7E7E7E7E0068156661017F7F7F7F7F7F7F0166667F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F1E7E00617F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C6C0E7C11 +7F6107503521062A470606061010062A1A2A224032180B0E7F7F7F11075E0E617F01095E +0A0D6F6C7E683030156361017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E00007E +7E7E7E7E7E7E7E0030691E61017F7F7F7F7F7F7F7F611E156830017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F657E007E3061617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0A3F11 +7F691818502121222A2A222A2A2A2A2A22060573760B0B077F7F7F4C0A5E09117F016F3F +090E112B6D7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F017E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E7E7E7E +7E7E683015564C017F7F7F7F7F7F7F7F61616669007E7E7E30017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F01697E7E7E7E7E1E01617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F611511621C68 +7F0052733C36210619191A2A2A220606403C5B180B7676186C7F017F2B090E667F01010A +7C0A0D6F6C7E7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01661E63656800007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E157F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E0068651E +664C017F7F7F7F7F7F7F7F01614C6669007E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F657E7E7E7E7E7E6861617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01666C0E070701 +7F3052735B3C50212110101021211005185B1876081B3357097F7F7F011E667F0101016D +1C090E112B6D7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F010161614C6656651530680000007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6615664C616101017F7F +7F7F7F7F7F7F01614C1E56687E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F01157E7E7E7E7E7E7E7E6501617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01613011625E4C01 +7F157376735B5B273936363650273C5B185B0F1B373737370F007F017F7F7F0101010101 +0913620D5D6C6D7E7E7E307F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F616101017F7F7F7F7F7F7F7F7F7F7F7F0101616161614C4C661E661E691515156930 +0000617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F +01614C63691530007E7E7E7E7E7E7E7E007E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01307E7E7E7E7E7E7E7E7E0061017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61566F0E5E0A0101 +7F0A44080B5B5B7373183C3C5B735B5B0B7657373714143737137F7F0101010101010101 +637C070E116F6C7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F4C7E000000686815651E4C4C61010101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101016161661E693068 +00007E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F01307E7E7E7E7E00007E7E7E7E6501617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6C0D09074C017F +650F37440F5B5B5B5B5B5B735B18737608754637141414143733117F010101010101017F +610A3F710E112B6D7E00017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +01687E7E7E7E7E7E7E7E7E7E7E00006868683015156563634C6161616101614C01010101 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C151568686800007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F01157E7E7E00156661667E7E7E7E684C017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D62136869617F +093737371B0B185B5B5B5B5B180B0F57330337141414141437373F7F7F01010101010101 +0101715E0A0D5D6C6D157F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00007E30 +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E007E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +61307E7E151E617F7F7F1E7E7E7E7E7E6901617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C15110A5E1101617F11 +08371437030873185B18185B76081B0314371414141414141437756D7F01010101010101 +01016F1C070E0D6F6C667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01 +007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E004C +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +683066617F7F7F7F7F7F697E7E7E7E7E684C617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161656F0E5E7101017F7F52 +37141414143308760B0B760F1B03141437141414141414141437370A7F01010101010101 +0101010A3F710E112B617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F65 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +617F7F7F7F7F7F7F011E007E7E7E7E7E7E5601017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161632B0E090A0101017F0D44 +371414141437374408574446371414141414141414141414141437527F7F010101010101 +010101010713620E6F61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6100 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E157F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F011E30687E7E7E7E7E7E7E7E6801017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01667E0D715E1501017F4C7337 +14141414141414033303373714141414141414141414141414143757007F010101010101 +0101010161077C62115661017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F657E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E007E7E00617F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F01614C30007E7E7E7E7E7E7E7E7E7E7E7E617F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C68116213000101017F0E1B03 +37141414141414141414141414141414141414141414141414371437627F010101010101 +0101010101307C070D6C1E617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E4C7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161 +1E30007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161695D0A7C110101017F615E1B46 +37141414141437374646371414141414141414141414143714334437137F7F0101010101 +0101010101014C07620D0066017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F307E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E567F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F616656007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00017F017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E2B0E070D010101017F691C0833 +03371414141433331B1B33141414141414373737371446441B08081B5261010101010101 +0101010101010168070A111561017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E30017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C30007E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D717101010101017F111C0B08 +1B444646334475080808577544333333334475570808080F0F76760F0B157F01017F7F01 +010101010101017F0A070E2B1E017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F65306868 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61007E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E00683030691E61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E687F017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01636F0E7C68010101017F010E1C1C73 +0F081B46333344080F08754403030303331B08760B735B737373730B081C617F0101017F +01010101010101017F0E710D3061017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101 +614C661E5669151530000000007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00686830 +65631E4C61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61300D096201010101017F610A52180F +081B33141437377508333737141414141446441B080F760B0B735B5B0B44077F7F661168 +7F7F010101010101017E5E0E6F1E017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F0101614C4C1E6356656969153015306800007E7E15017F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E681530156965561E664C6101017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01662B0E076601017F7F01011E070B081B +463703034614141B75141403144603030346373737034457080F0B735B0F1B0E7F7F566F +6C4C7F0101010101010107710D30617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61664C610101 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F010101616161614C017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F014C4C4C4C4C616161017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F016166017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E007E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016911620901017F66637F010E76574614 +0303031414031433440303030314030303030346031414371433570F0B73080F637F7F01 +305D567F0101010101015D5E0E2B66017F7F7F7F7F7F7F7F7F7F7F7F7F7F307E7E006868 +306956631E664C61610101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101614C +661E656515007E69017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E00007E7E00667F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61680D090A017F1E114C7F697344030314 +03031403140346461414464603031414034646140303030303031444080B0B1B5E7F7F7F +7F5611017F01010101010109621169617F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E +7E7E7E7E7E7E7E7E006830303015156965654C614C61010101017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01010101614C614C56651515153030687E7E +7E7E7E7E7E7E69017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01662B0E7C11017F6D697F7F0E3703031446 +4646034603030303030314140303034614030314030303030303463746570B76576D7F01 +6101692B017F01010101010A070D004C017F7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00000068017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F016530000000000000000000007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E69017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E007E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F015611625E017F4C6F017F1E733714034614 +030314460314460314031403140314030303461414030314031403033703087675627F61 +307E636F697F0101010101667C0A5D1E017F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F01157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E007E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61680D090A017F117E7F7F07371446034603 +034603144603141446030303141403031414144646031403144646030303377533730161 +6F0D2B662B017F01010101010A710D30617F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E657F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E30017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E1563687E007E7E68617F7F7F7F7F7F7F7F7F7F7F617F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01662B0E7C5D7F4C5D017F6676371414030303 +141403031403464614031403464614030346034603034603144646030303033737030D61 +110D6C012B2B7F0101010101115E0E6C66017F7F7F7F7F7F7F7F7F4C7E007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F667E7E007E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E +7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +00694C617F7F307E007E68617F7F7F7F7F7F7F7F7F7F7F7F017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6169116213667F7E307F7F0A37141403030303 +031446031446444603463303140314030303140314031403461403030303141446370701 +683066016611017F0101010166130A5D56017F7F7F7F7F7F7F7F01307E007E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E68617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E0030301E01 +017F7F7F7F61007E7E30017F7F7F7F7F7F7F7F7F7F7F4C017F017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C000D070A7F4C0D617F011837030314144603 +46141403143357440314460314460303140303460303141403140346031446034637527F +017F7F017F7E667F01010101010A090D30617F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F61687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +00617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E0030691E61017F7F7F +7F7F7F7F01657E7E30017F7F7F7F7F7F7F7F7F7F7F1E00617F017F7F7F7F7F7F7F7F7F7F +7F7F7F7F611D3D29292929293D1D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01635D0A7C1E7F307E7F7F117537030303140314 +14460346371B084646031403030303030314144603030303030303030314034614377661 +7F0101017F30687F01010101017E070E6D4C7F7F7F7F7F7F7F7F307E7E7E007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F307E7E7E7E007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E00 +617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E68156566617F7F7F7F7F7F7F7F +01614C69007E7E30017F7F7F7F7F7F7F7F7F7F7F567E7E4C7F617F7F7F7F7F7F7F7F7F7F +592949287D7D7D7D7D7D7D7D7D7D7D31041F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161680D097101012B617F61523703030346144646 +14030303147557031403140314031403464603030346031414141403461446460337571E +7F0101017F155D017F0101010161070A6F66017F7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E00151E664C017F7F7F7F7F7F7F7F7F616663 +307E7E7E7E7E15017F7F7F7F7F7F7F7F7F7F01657E7E7E697F017F7F7F7F7F7F7F7F1F3E +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D041D7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F011E6F0A7C5D7F665D017F2B1B3714140314034614 +03034614035757461414030346460303030303031403140303460314034603031437446F +7F0101017F155D7F01010101010109621156017F7F7F7F7F7F24040404044D7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4D042429291F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C4C61017F7F7F7F7F7F7F7F7F0161666330007E7E +7E7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F01157E7E7E7E007F017F7F7F7F7F7F3D317D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D3E597F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C680D0907017F006C7F7F0A373703464646030303 +03464637460808460303031414031414034646464646334614144646031414460337370E +7F0101017F156C7F01010101010171710D69017F7F7F7F7F7F7B7D7D7D7D245615000000 +00007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E047D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F4C007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F014C6515307E7E7E7E7E7E7E +7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F61307E7E7E7E7E7E61017F7F7F7F593E7D7D7D7D +7D7D7D7D3E24291D1D1D1D3D29046A7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F61655D0A7C11017F6F667F7F5E370303031414140303 +14030314030857031414034646030346030303140303461403030303140303141437370A +7F0101017F69157F0101010101010A090D30617F7F7F7F7F7F3E7D7D7D7D297F7F7F7F01 +01616166566515151530306800007E7E7E7E047D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068637F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01614C1E1568007E7E7E7E7E7E7E7E7E007E +7E7E7E1E7F7F7F7F7F7F7F7F7F7F7F01687E7E007E7E7E7E1E01017F7F3D287D7D7D7D7D +28043D7F7F7F7F7F7F7F7F7F7F7F7F611F3E7D7D7D7D7D7D3E617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F014C000D090E017F015D4C7F4C73370314031403030303 +031403034608574646334603460303034603034646030303141403031414030314033771 +7F0101017F15667F0101010101010D070D00617F7F7F7F7F013E7D7D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F0161614C4C4C66247D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F7F157E0000007E7E7E7E0068686868686830656565561E1E1E664C4C6161017F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F0161614C653068007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E1E7F7F7F7F7F7F7F7F7F7F7F61687E7E7E7E7E7E7E7E6961017F1F7D7D7D7D7D2829 +617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F59047D7D7D7D7D6A617F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F61655D0A1368017F0111667F5D57374646030314144614 +03031437440F084603460314034603141403034603460303030303140303144646143707 +7F0101017F304C7F0101010101014C070E6C4C7F7F7F7F637E6E7D7D7D7D244C4C616101 +017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F +7F01616161616161616161610101010101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F4C687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E1E7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E3001611F7D7D7D7D7D24617F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D6A7D7D7D7D6A617F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F61680D091101017F7F0D1E7F0D44371414144603461403 +46141414330F574603370303141403461414144603030346140303031403031446463707 +7F0101017F00617F0101010101014C5E0E2B4C7F7F7F01307E6E7D7D7D7D047E7E7E6830 +30156965651E664C610101017F7F7F7F7F7F1D292929291F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +667F7F7F7F7F7F7F7F7F7F7F4C007E007E7E7E7E7E7E7E7E68011F7D7D7D7D281D7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61047D7D7D7D047F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F01662B0E096101017F610D697F0A03370303031446031403 +03031414440F57464603030346031403034614030303030303141446031403030303375E +7F7F017F4C2B01010101010101014C5E0E2B667F7F7F4C7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E00000068683015691E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +017F7F7F7F7F7F7F010101010101010101614C4C4C4C661E1E56696969017F7F7F7F7F7F +7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C +7F7F7F7F7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E001D7D7D7D7D6A597F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F047D7D7D7D3D7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F01635D0A7101017F61000A5D7F7137140303141446141414 +03031414440F57141403030303031446030314031403144646140303140303031403375E +7F7F017F00007F010101010101014C5E0E2B667F7F7F697E006E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0115 +6830303030303030686868686868686868007E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F +7F7F7F7F7F7F7F4C007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F +7F7F7F7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E7E2B317D7D7D6A617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F047D7D7D28617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016511620E01017F01300A0D7F0737140303144614144603 +14140337440F57144603141446030314140346030314461446141446461403034614375E +7F7F01016D4C7F010101010101014C5E0E2B4C7F7F617E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F567E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F +7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F +7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E237D7D7D28617F7F7F7F7F7F +7F7F7F59246A7D7D28491F7F7F7F7F7F292929291F7F7F7F7F6A7D7D7D297F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016911710E010101017F6D117F5E37141414460303464603 +03031403440F750314034646140303030314030314144603140303141446031414463709 +7F7F7F4C687F7F7F7F7F010101014C070E6C4C7F7F667E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F4C007E +7E7E7E7E7E7E7E4B04496E6E6E04242B7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F7F7F7F7F7F +7F7F7F7F7F61687E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C7F7F7F +7F7F7F7F7F7F7F7F637E7E7E7E7E7E7E7E7E7E7E7E7E7E4B7D7D7D7D517F7F7F7F7F7F7F +7F59047D7D7D7D7D7D7D7D6A517F7F1D7D7D7D7D297F7F7F7F517D7D7D7D617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F016911710E017F7F7F7F01684C0737141403460314030303 +03461403440F1B030314140303141403030303140303030346140303140303460337370A +7F61656D6961566566617F7F010111070D00617F01307E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E667F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F607D7D7D +7D047E7E7E246E7D7D7D7D7D7D7D7D28232B7E7E7E7E7E7E00667F7F7F7F297D7D7D7D1D +7F7F7F7F61687E7E7E7E7E7E7E7E7D7D7D7D6E7E7E7E7E7E1F287D7D7D7D2D1E7F7F7F7F +7F7F7F7F7F7F7F567E7E247D7D7D7D7D247E7E7E7E7E7E6E7D7D7D297F7F7F7F7F7F7F7F +1F287D7D7D7D7D7D7D7D7D7D281F7F297D7D7D7D3D7F7F7F7F7F047D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F61150D71717F61382E4F7F016F5E37374614140303144646 +14144614440F75031403034603141403141403460346030346030346461414461437335D +7F6D3061010161566D5D6F4C7F010A070D00617F61007E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E307F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F011F7D7D7D +7D047E1F6E7D7D7D7D7D7D7D7D7D7D7D7D2D2B7E7E7E7E7E1E7F7F7F7F7F297D7D7D7D1D +7F7F7F61687E7E7E7E007E7E7E7E7D7D7D7D6E7E7E7E7E7E7E247D7D7D7D7D047F7F7F7F +7F7F7F7F7F01157E7E1F287D7D7D7D237E7E7E7E7E7E1F7D7D7D314C7F7F7F7F7F7F7F29 +7D7D7D7D7D7D313E6A7D7D7D7D2851497D7D7D7D617F7F7F7F7F597D7D7D6A7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F61680D09522E0612641235617F0E08371403140303031403 +46140314440F1B0303141403030303030303034614140314030303140303743774370F59 +65617F7F01017F7F014C110E307F09070D68617F697E00007E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F1E4D7D7D7D +7D04047D7D7D7D7D7D7D7D7D7D7D7D7D7D7D2D2B7E7E7E657F7F7F7F7F7F297D7D7D7D1D +7F7F61687E7E7E7E7E7E7E7E7E7E7D7D7D7D6E7E7E7E7E7E7E7E237D7D7D7D7D297F7F7F +7F7F7F7F01307E7E2B2D7D7D7D7D6E7E7E7E7E7E7E7E497D7D7D1F617F7F7F7F7F7F1F7D +7D7D7D7D04597F7F7F59247D7D7D31287D7D7D6A7F7F7F7F7F7F7F6A7D7D7D597F7F7F7F +7F7F7F7F7F7F7F0101016161566F0E5E3C2A126464642021017F0A573714030303031403 +14030314440F1B03141414461446031403140303140303031446031403375C1717172538 +4C7F0101010101017F7F300D2B7F7C070D7E6101007E7E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E567F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F4C004D7D7D7D +7D287D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D047E7E15017F7F7F7F7F7F297D7D7D7D1D +7F61687E7E7E7E7E7E7E7E7E7E7E7D7D7D7D6E7E7E7E7E7E7E30652D7D7D7D7D7D517F7F +7F7F7F01307E7E7E237D7D7D7D482B7E7E7E7E7E7E2B7D7D7D4801617F7F7F7F7F1D7D7D +7D7D7D1F7F7F7F7F7F7F7F1F7D7D7D7D7D7D7D047F7F7F7F7F7F7F297D7D7D3D7F7F7F7F +7F7F7F7F01016166636930005D0D091C4019455302026420104C7F0D7637140303030303 +14031437440F1B140303031414140303034614460303140346370303033355774E4E3B06 +7F7F0101010101017F612B00630C3C7C0E2B66657E7E7E7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F7F1D7D7D7D7D297F7F7F7F7F01007E4D7D7D7D +7D7D7D7D7D7D6B244B7E7E2B24497D7D7D7D7D282B30017F7F7F7F7F7F7F297D7D7D7D1D +01307E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D6E0030651E6661017F61287D7D7D7D31617F +7F7F61307E7E7E247D7D7D7D281F7E7E7E7E7E7E7E247D7D7D0401617F7F7F7F61317D7D +7D7D1F7F7F7F7F7F7F7F7F7F497D7D7D7D7D7D1F7F7F7F7F7F7F7F1D7D7D7D297F7F7F7F +7F7F7F01611E306C5D110D0D0E093F2522191253020202644E217F7F6F76374614140303 +46034614440F75140303030314030303031403140303461414031403371B5477203B2610 +01010101010101017F6615012E2026270A115666633068007E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F157E7E4D7D7D7D +7D7D7D7D494B7E7E7E7E7E7E7E7E247D7D7D7D7D24617F7F7F7F7F7F7F7F297D7D7D7D1D +307E7E7E7E7E7E7E7E7E7E7E7E007D7D7D7D7B61017F7F7F7F7F7F7F1D7D7D7D7D7D497F +7F61687E7E7E4B287D7D7D7D247E7E7E7E7E7E7E7E6E7D7D7D2B61617F7F7F7F297D7D7D +7D247F7F7F7F7F7F7F7F7F7F597D7D7D7D7D7D517F7F7F7F7F7F7F597D7D7D497F7F7F7F +7F7F0161566D110E0A620907135232471A16450202020202642C357F7F2B1C3737030314 +0314461433085746141403031403031403030303030314460303141437443A1202205835 +7F7F01010101010101017F4C063B3B55090D30617F7F0101017B7D7D7D7D243068680000 +7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F1D7D7D7D7D297F7F7F7F1E7E7E7E4D7D7D7D +7D7D6E1F7E7E7E7E7E7E7E7E7E7E7E497D7D7D7D047F7F7F7F7F7F7F7F7F297D7D7D7D1F +7E7E7E7E7E68683030691E6161017D7D7D7D3E7F7F7F7F7F7F7F7F7F7F297D7D7D7D7D29 +61687E7E7E7E2D7D7D7D7D497E7E7E7E7E7E7E7E7E7D7D7D2D6861617F7F7F61287D7D7D +28617F7F7F7F7F7F7F7F7F7F7F6A7D7D7D7D287F7F7F7F7F7F7F7F7F7D7D7D3E7F7F7F7F +7F7F611E6C0D0A394A0505250505222A1912530202020202022016387F7F665E1B370303 +0303140314441B03460346034614030303030303030303141414461437443A1202021235 +7F7F010101010101017F7F352C202054070E004C7F7F7F7F7F3E7D7D7D7D290101010161 +4C4C1E63153030686868667F7F7F7F7F7F7F1D7D7D7D7D297F7F7F61007E7E7E4D7D7D7D +7D6B7E7E7E7E7E7E7E7E7E7E7E7E7E247D7D7D7D3E7F7F7F7F7F7F7F7F7F297D7D7D7D4D +15631E4C4C0101017F7F7F7F7F7F7D7D7D7D3E7F7F014C4C7F7F7F7F7F7F497D7D7D7D7D +4D7E7E7E7E237D7D7D7D2D7E7E7E7E7E7E7E7E7E4D7D7D7D046861617F7F7F297D7D7D7D +297F7F7F7F7F7F7F7F7F7F7F7F047D7D7D7D497F7F7F7F7F7F7F7F7F7D7D7D3E7F7F7F7F +7F014C68116239062A1A1A1A2A2A1A1941530202020202020202202A667F7F7F0E083714 +03141446460337031414140314141414034614031414030346463746750F3A1202451621 +617F0101010101017F0138192C780254130E110066616161013E7D7D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F01017F7F7F7F7F7F7F7F1D7D7D7D7D297F7F011500007E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E7E7E00307D7D7D7D7D7F7F7F7F7F7F7F7F7F297D7D7D7D1D +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7D7D7D7D6715007E68617F7F7F7F7F7F616A7D7D7D7D +282B7E7E247D7D7D7D282B7E7E7E7E7E7E7E7E7E047D7D7D4D6861617F7F7F317D7D7D7D +617F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D297F7F7F7F7F7F7F7F7F7D7D7D3E7F7F7F7F +7F011E2B0E39221A1641411616161245530202020202020202022058357F7F7F7F117637 +370346370314030314034603031403461403141403030303030314080B733A1253411906 +0C617F7F7F7F7F7F612E2241784553541C620E116C6D7E00682F7D7D7D7D246101017F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F616161614C3D7D7D7D +7D244C4C4C4C4C4C4C4C4C4C4C4C6101287D7D7D7D7F7F7F7F7F7F7F7F7F297D7D7D7D1D +7F7F7F7F7F7F7F0101614C4C1E697D7D7D7D6E7E7E68617F7F7F7F7F7F7F7F51287D7D7D +7D6E7E4B287D7D7D7D1F7E7E7E7E7E7E7E7E7E7E6B7D7D7D2B6861617F7F517D7D7D7D49 +7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F7F517D7D7D497F7F7F7F +7F0165110A052A191245454512455302020202020202020202530258194F7F017F7F681C +4637460303460346031403140314461403030303144614460337447673733A1612411922 +060C384F4F4F4F2E35221916455302413C070A0D6F6C6D7E7E6E7D7D7D7D047E00683063 +1E1E664C4C4C61017F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F297D7D7D7D1D +614C4C661E636530007E7E7E7E7E7D7D7D7D6E7E30017F7F7F7F7F7F7F7F7F7F297D7D7D +7D7D236E7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E6E7D7D7D7E6861617F7F297D7D7D7D1F +7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D7F7F7F7F7F7F7F7F7F3D7D7D7D297F7F7F7F +7F61150D71052A16455302020202020202020202020202020202536458357F7F01017F01 +09373714031414140314034646031414460303140303030303141B0B0B733A161241162A +0606061021101006221A414553020253251C090E116F6C7E7E6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E0068017F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F247D7D7D7D1F +007E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D6E30017F7F7F7F7F7F7F7F7F7F6100237D7D +7D7D7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E287D7D2D7E6861617F7F3E7D7D7D7D59 +7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D6A7F7F7F7F7F7F7F7F7F247D7D7D1F7F7F7F7F +7F61300D09402A1645530202020202020202020202020202020202024E192E7F0101017F +7F09373746030303030303034603030346030303030314030314750B0B7347191241161A +2A2222222222222A1941530202020202543213620D116F6C6D6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E7E657F7F7F7F7F7F7F7F7F7F1D7D7D7D7D2963683030303030151F7D7D7D +7D24636363636363631E1E63636915013E7D7D7D7D7F7F7F7F7F7F7F7F1E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D2F017F7F7F7F7F7F7F7F7F7F66007E7E2D7D +7D7D7D7D7D7D2D7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6861617F7F317D7D7D7D7F +7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D247F7F7F7F7F7F7F7F7F317D7D7D597F7F7F7F +7F61300D09052A164553020202020202020202020202020202020202644E06017F010101 +7F015E37141446031403031446141403030303461403030314371B760B5B471A41124119 +191A1A2A1A1A1A194145020202020253453A3C5E620D116F6C6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F1D7D7D7D7D247E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E7E7E667F3E7D7D7D7D7F7F7F7F7F7F7F4C00047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F7F7F7F66007E7E7E2B28 +7D7D7D7D7D282B7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6861617F7F7D7D7D7D3E7F +7F7F7F7F7F7F7F7F7F7F7F7F597D7D7D7D3D7F7F7F7F7F7F7F7F3D7D7D7D6A7F7F7F7F7F +7F01150D710522191253020202020202020202020202020202020202024E780C7F7F0101 +017F0008371414140314460314030346031414030303030303374476730B472A16124541 +161919191919161612530202020202025377253C5E620E0D5D6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E7E1E7F7F3E7D7D7D7D7F7F7F7F7F7F4C7E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E24 +7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6861617F7F7D7D7D7D3E7F +7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D597F7F7F7F7F7F7F7F3E7D7D7D297F7F7F7F7F +7F01691171052219415302020202020202020202020202020202020253024E19387F0101 +017F610B37030314034603034614031403140303030303034603460F761C062A16124545 +121616161616411245530202020202020253123A187C710E0D6E7D7D7D7D047E7E7E7E7E +7E7E7E7E7E00617F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E7E657F7F7F3E7D7D7D7D7F7F7F7F7F61007E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F7F667E007E7E7E7E2B48 +7D7D7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E7D7D7D6E7E6801617F7F7D7D7D7D3E7F +7F7F7F7F7F7F7F7F7F7F7F7F6A7D7D7D317F7F7F7F7F7F7F7F3D7D7D7D28617F7F7F7F7F +7F015611621C221941530202020202020202020202020202020202020202205821617F01 +017F0176370303030314031403141446030314030303034603144608185D101A16125353 +5345121212124545530202020202020202020253543213710E2D7D7D7D7D047E7E7E7E7E +7E7E7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E7E15017F7F7F3E7D7D7D7D7F7F7F7F61687E7E7E047D7D7D7D4D +7E7E7E7E7E007E7E7E7E7E7E7E7E7D7D7D7D3E7F7F7F7F7F7F7F1E7E7E007E7E7E7E6E7D +7D7D7D7D7D7D281F7E7E7E7E7E7E7E7E7E7E7E7E487D7D7D7E3001617F7F6A7D7D7D317F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D497F7F7F7F7F7F7F61287D7D7D297F7F7F7F7F7F +7F01635D0A1C471A41530202020202020202020202020202020202020202024E780C7F7F +7F7F0A4437034646031414034603030303141403030314030303370B0D4F101A16125302 +025353535353020202020202020202020202020264453A4A622D7D7D7D7D047E7E7E7E7E +007E7E7E68017F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E7E68017F7F7F7F3E7D7D7D7D7F7F7F01687E007E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E7E7E7E687D7D7D7D3E7F7F7F7F7F7F1E7E7E7E7E7E7E7E237D7D +7D7D7D7D7D7D7D2D2B7E7E7E7E7E7E7E7E7E7E7E6E7D7D7D7E3001617F7F497D7D7D7D61 +7F7F7F7F7F7F7F7F7F7F7F6A7D7D7D7D297F7F7F7F7F7F7F6A7D7D7D28617F7F7F7F7F7F +7F01635D621C471A1653020202020202020202020202020202020202020202024E2A4F61 +7E3F373714034614031403461403031403030314030346141437085D7F38101A16125302 +02020202020202020202020202020202020202020264023A09487D7D7D7D047E7E7E7E00 +7E7E7E7E657F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E007E7E00617F7F7F7F7F3E7D7D7D7D7F7F01157E7E007E7E047D7D7D7D4D +7E7E7E7E7E7E7E7E7E7E007E68617D7D7D7D3E7F7F7F7F01697E7E7E7E7E7E7E247D7D7D +7D484D287D7D7D7D497E7E7E7E7E7E7E7E7E7E7E497D7D7D4D1501617F7F297D7D7D7D1F +7F7F7F7F7F7F7F7F7F7F247D7D7D7D7D1D7F7F7F7F7F61047D7D7D7D3D7F7F7F7F7F7F7F +7F016511621C471A165353020202020202020202020202020202020202020202582C101C +4437370346140314030303030314034603030303030303143776117F7F2E101A16455302 +02020202020202020202020202020202020202020202025407487D7D7D7D047E7E7E7E7E +7E7E7E7E017F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E7E667F7F7F7F7F7F3E7D7D7D7D7F01157E7E7E7E7E7E047D7D7D7D24 +7E7E7E7E7E7E7E7E7E7E7E68617F7D7D7D7D3E7F7F7F7F66007E7E7E7E7E7E1F287D7D7D +7D1F7E247D7D7D7D7D047E7E7E7E7E7E7E7E7E7E047D7D7D046901017F7F597D7D7D7D31 +7F7F7F7F7F7F7F7F7F1F7D7D7D7D7D7D7F7F7F7F7F596A7D7D7D7D247F7F7F7F7F7F7F7F +7F61150D0927221A415353530202020202020202020202020202020202020253782C1650 +0837140346460303031403140303030346030303141437377C4C7F7F012E101A16455302 +02020202020202020202020202020202020202025353455407487D7D7D7D047E7E7E7E7E +7E7E7E567F7F7F7F7F7F7F7F7F7F7F7F7F7F607D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E7E637F7F7F7F7F7F7F3E7D7D7D7D7F697E7E7E7E7E7E7E047D7D7D7D04 +7E7E7E7E7E7E7E7E7E7E68617F7F7D7D7D7D3E7F7F7F0101567E7E7E7E7E2B2D7D7D7D7D +047E7E7E497D7D7D7D7D1F7E7E7E7E7E7E7E7E7E1F7D7D7D6B5661017F7F7F047D7D7D7D +047F7F7F7F7F7F7F297D7D7D7D7D7D7D517F7F7F29287D7D7D7D3E7F7F7F7F7F7F7F7F7F +7F61000D0705221A415353020202020202020202020202020202020202020253532C2C06 +057437030314141446460303031403460303141437370F0A7F7F017F612E101A16455302 +020202020202020202020202020202020202020245411940622D7D7D7D7D047E7E7E7E7E +7E7E7E617F7F7F7F7F7F7F7F7F7F7F7F7F7F1F7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E7E157F7F7F7F7F7F7F7F3E7D7D7D7D567E00007E7E7E7E7E4D7D7D7D7D2D +7E7E7E7E7E7E7E7E7E68617F7F517D7D7D7D3E7F7F7F7F01307E7E7E7E7E497D7D7D7D6E +7E7E7E7E2B2D7D7D7D7D482B7E7E7E7E7E7E7E7E7E287D7D7D1561017F7F7F597D7D7D7D +7D49597F7F7F3D6A7D7D7D287D7D7D7D282424317D7D7D7D7D6A617F7F7F7F7F7F7F7F7F +01666F0A1340221945530202020202020202020202020202020202020202530253782C19 +21183737140346033714031446030314030374371B5E4C7F7F01017F610C101A41455302 +0202020202020202020202020202020202025345161A40070E6E7D7D7D7D290161666569 +1530567F7F7F7F7F7F7F7F7F7F7F7F7F7F4C4D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E7E68017F7F7F7F7F7F7F7F3E7D7D7D7D7E7E7E7E7E7E7E7E7E4B7D7D7D7D7D +1F7E68683030155666017F7F29287D7D7D7D3E7F7F7F7F637E7E7E7E7E047D7D7D7D282B +7E7E7E7E7E1F287D7D7D7D6E7E7E7E7E7E7E7E7E7E497D7D7D24617F7F7F7F7F297D7D7D +7D7D7D6A3E287D7D7D7D24497D7D7D7D7D7D7D7D7D7D7D7D3E617F7F7F7F7F7F7F7F7F7F +0165116227062A1253530202020202020202020202020202020202020202020253451219 +100C3F03373737740337031437373737373708076C7F7F7F0101017F660C102A16455302 +02020202020202020202020202020202534541192A05070A5D2F7D7D7D7D297F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F154D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D +7D047E7E7E00617F7F7F7F7F7F7F7F7F3E7D7D7D7D7E7E7E7E7E0068006830487D7D7D7D +6E1E01017F7F7F7F7F7F1F317D7D7D7D7D7D3E0101611E007E7E7E7E1F7D7D7D7D7D4D7E +7E7E7E7E7E7E247D7D7D7D7D047E7E7E7E7E7E7E7E4D7D7D7D31667F7F7F7F7F7F047D7D +7D7D7D7D7D7D7D7D7D1F7F297D7D7D7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +61150D714022191253535302020202020202020202020202020202020202020202451619 +220C610A520F1B14373737371444087652096C7F7F7F01010101017F4F0C102A16125302 +0202020202020202020202020202534516192A40277C710E5D2F7D7D7D7D3E2929292929 +292929292929292929292929291D7F7F7F613D7D7D7D7D2465656969696969691F7D7D7D +7D04303030667F7F7F7F7F7F7F7F7F7F3E7D7D7D7D5665664C4C610101017F297D7D7D7D +7D311F517F7F7F1D24317D7D7D7D7D7D7D7D6768007E7E7E7E7E7E2B287D7D7D7D047E7E +7E7E7E7E7E7E7E497D7D7D7D7D4D7E7E7E7E7E7E7E7E487D7D7D297F7F7F7F7F7F7F1F28 +7D7D7D7D7D7D7D6A517F7F616A7D7D7D7D7D7D7D7D3E517F7F7F7F7F7F7F7F7F7F7F7F7F +61300D7106221A1645535353535302020202020202020202020202020202020202454119 +2235387F7F1E5D0E7107710A0E1165617F7F7F7F010101010101017F4F0C102A16455302 +0202020202020202025353455345411922403C3F07620E115D6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D2901017F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F7F61287D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D287D7D7D7D6E7E7E7E7E7E7E7E7E6E7D7D7D7D2D7E7E7E +7E7E7E7E7E7E7E2B2D7D7D7D7D284B7E7E7E7E7E7E7E247D7D7D7D517F7F7F7F7F7F7F61 +293E7D7D28493D7F7F7F7F7F61296A7D7D7D3E24517F7F7F7F7F7F7F29292929297F7F7F +61150D7106222A1916121245454553535353020202020202020202020202020202454119 +22212E617F7F7F7F7F7F7F7F7F7F7F7F7F010101010101010101017F3835102A16120202 +020202020202020253451241161922503C3F07620E0D115D2B6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F7F7F3D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D6A517D7D7D7D6E7E7E7E7E7E7E7E237D7D7D7D284B7E7E7E +7E7E7E7E7E7E7E7E1F287D7D7D7D2D7E7E7E7E7E7E7E7E6E7D7D7D6A617F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D297F7F7F +61695D0A5006222A1A19191916161641454545535353020202020202020202020245161A +06350C4F7F0101017F7F01010101010101010101010101010101017F3835102219415302 +0202020202535353121619192A47051C5E710A0D0D5D2B6C6D6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D294C6565563D7D7D7D7D29017F7F7F7F7F7F7F1D7D7D7D +7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D01010101614C4C1E65691515247D7D +7D7D7D7D7D7D7D7D7D7D28297F7F7D7D7D7D6E7E7E7E7E7E7E247D7D7D7D7D247E7E7E7E +7E7E7E7E7E7E7E7E7E247D7D7D7D7D497E7E7E7E7E7E7E1F287D7D7D6A617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1F7D7D7D7D6A7F7F7F7F +011E6C0D7250501010060622222A1A1A1A19191641124545530253530202025345411A22 +10350C4F7F0101010101010101010101010101010101010101017F01380C21061A191253 +5353535353451216191A2A06501C7C090A0D0D5D6F6C6C6D7E6E7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D29307E7E7E4D7D7D7D7D0400000000006815691F7D7D7D +7D24617F7F7F7F7F7F7F7F7F7F7F7F662F7D7D7D7D000000007E7E7E7E7E7E7E7E7E1F6E +7D7D7D7D7D7D7D7D2804597F7F7F7D7D7D7D6E7E7E7E7E7E1F287D7D7D7D237E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E497D7D7D7D7D247E7E7E7E007E7E297D7D7D7D6A617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D28617F7F7F7F +0161696F0D62073F05502121101006060606222A2A1A1916414553535353454541192210 +21352E4F7F0101010101010101010101010101010101010101017F01380C2110221A1641 +454553451216191A2206101C7C090A0E0D5D6F6C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E30 +7F7F7F7F7F7F7F7F7F7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E697F7F7F7F7F7F7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +1F04233E3E3E293D617F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0061047D7D7D7D281D7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F613E7D7D7D7D28517F7F7F7F7F +7F014C696C110E0A715E134A05362121211010101006222A1A191916411241161A220621 +350C2E4C014C4C61110A0A0A0A0A0A0A0A0A0A0A0A0A0A604C4C6101380C3510062A1A16 +16414116191A2A2210363F070E0E0D116F2B6C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C +7F7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +30017F7F7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E667F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E306161047D7D7D7D7D49597F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F29287D7D7D7D28517F7F7F7F7F7F +7F0101611E306C5D0D0E0A72075E3F3936363535212121100606222A2A1A1A2A22102135 +0C0C384C71523F5E0707070909090909075E5E5E7C7C13133F527C0A0D2E35211006222A +1A1A1A2A22061021393F710E6F6F5D2B6C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6801 +7F7F7F7F7F7F7F7F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00 +617F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +667F7F7F7F7F7F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6961017F297D7D7D7D7D7D493D +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F611F317D7D7D7D7D6A517F7F7F7F7F7F7F +7F7F7F0101616656306C6F110D0E0A71077C3F39420C0C3521212110101010102135350C +0C2E11077C090A0E0E0D0D0D0D0D0D0D0E0A0A0A0A0A6262710713523F2E0C3521101006 +060606061010214213620D6C65006C6D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F +7F7F7F7F7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E66 +7F7F7F7F7F7F7F7F7F7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E007E7E1E +7F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E017F7F7F1D287D7D7D7D7D7D +28041F597F7F7F7F7F7F7F7F7F7F7F7F591F49287D7D7D7D7D7D04617F7F7F7F7F7F7F7F +7F7F7F7F7F7F0101614C1E69682B5D0D0D0E62095E134A390C0C35353521353535350C2E +2E0713090E0D5D2B6D006830303030006D110D110D0D0D0D0D0E62073F792E0C35211010 +101010102135425E620D6C1E61306D7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E617F +7F7F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F +7F7F7F7F7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F +7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C017F7F7F7F61247D7D7D7D7D +7D7D7D7D7D3E3E2929292929293E3E7D7D7D7D7D7D7D7D7D313D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F0161616663157E2B5D0D0E0A71071339790C0C0C0C0C0C0C2E2E +705E0A0D6F3063664C6161616161614C66002B2B2B6F6F6F5D110D0A0913792E0C353535 +213535350C42070A0D001E61016615687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00017F +7F7F7F7F7F7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F +7F7F7F7F7F7F7F7F7F7F157E00007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F +7F7F7F7F7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E3061617F7F7F7F7F7F59047D7D7D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D311F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F010161616656306C5D0D0E0A715E1370790C2E2E797009 +710E11001E61017F7F7F7F7F7F7F7F0101657E7E7E7E7E6D6C2B5D0D0E715E07790C2E0C +0C0C79707C090E11681E61017F7F7F014C661E15007E7E7E7E7E7E7E7E7E7E7E7E657F7F +7F7F7F7F7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F +7F7F7F7F7F7F7F7F7F1E7E7E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F +7F7F7F7F7F7F7F66007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6901017F7F7F7F7F7F7F7F611F49 +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D491F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101614C1E157E5D0D0E0A7109075E0709620E +0D6F156661017F7F7F7F7F7F7F7F7F7F01667E7E7E7E7E7E7E6D2B5D0D0E0A095E133F3F +3F3F7C07710D6F306661017F7F4C617F7F7F7F7F01614C66693000007E7E7E7E7E4C7F7F +7F7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F +7F7F7F7F7F7F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F +7F7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E017F7F7F7F7F7F7F7F7F7F7F7F +611D293E6A7D7D7D7D7D7D7D7D7D7D283E243D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01614C63306C5D110D0D0E0D0D116F +681E61017F7F7F7F7F7F7F7F7F7F7F7F6161687E7E7E7E7E7E7E6C2B6F110D0E0E0A6262 +62620A0E0E11654C01017F7F7F150030151E017F7F7F7F7F7F0101614C1E690068617F7F +7F7F7F7F7F7F7F7F7F307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E15017F7F7F +7F7F7F7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F +7F7F7F7F7F1E7E7E7E7E7E000068687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E684C4C017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F1D1D1D1D1D1D597F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1F292929291D01614C1E696800000068691E +4C61017F7F7F7F7F7F7F7F1D292929291F01157E7E7E7E7E7E7E7E6D6C2B5D11110D0D0D +0D0D0D11116F66017F7F7F7F7F157E7E7E7E0068156661017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E007E7E7E00007E7E7E00617F7F7F7F +7F7F7F7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E68617F7F7F7F7F +7F7F7F7F4C683015691E4C61017F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E15014C7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F01010161616161616101 +017F7F7F7F7F7F7F7F7F7F297D7D7D7D3E011E7E7E7E7E7E7E7E7E7E7E6D6C6C2B6F6F6F +6F6F6F2B6C6C157F7F7F7F7F7F157E7E7E7E7E7E7E7E0068301E6101017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F4C56656915686800007E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F7F +7F7F7F7F7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F7F7F7F +7F7F7F7F01017F7F7F7F7F7F7F01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6501617F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E6161687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E007E7E7E00617F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E0015664C017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F010161614C66661E1E65651515151530697F7F7F7F7F7F +7F7F7F7F7F657E7E7E7E7E7E686868686868301515156556561E661E617F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C4C017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E0101307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E157F7F7F7F7F657E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01017F7F7F7F7F7F +7F7F7F7F7F614C4C4C4C4C61010161616101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F0166007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68011E7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D3E7F611E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E4C7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E697F7F7F7F +7F7F7F7F7F7F611E4C6101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F01614C661E651530007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6301017F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D292929291F7F4C61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E007E7E68017F7F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F +7F7F7F7F7F7F697E7E0068303015155666616101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01 +69303030007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0061617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6101697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E697F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F +7F7F7F7F7F617E7E7E7E7E7E7E7E7E7E7E7E7E7E000000683069667F7F7F7F7F7F7F7F7F +7F7F6161616161616161616161616161614C4C4C4C661E1E617F7F7F7F7F7F7F7F7F6168 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1501617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F010166007E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E667F7F01687E7E7E7E007E7E7E7E7E7E7E7E7E7E00617F7F7F7F +7F7F7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E637F7F7F7F7F7F7F7F7F +7F4C007E0000000000000000000000007E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F61687E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6601017F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161307E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E007E00617F7F157E7E7E7E007E7E7E7E007E7E7E7E7E307F7F7F7F7F +7F7F7F7F01687E007E7E7E7E7E7E7E7E7E7E7E007E7E007E7E307F7F7F7F7F7F7F7F7F7F +61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E30017F7F7F7F7F7F7F7F01307E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E3001617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01011E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E007E68017F657E7E7E7E7E7E7E7E7E7E7E7E7E1F04043E3E3E3E29 +1F617F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F7F7F7F7F7F01 +307E7E7E7E7E7E7E7E7E7E7E7E7E1F046B6E6E6B041F617F7F7F7F7F7F7F7F017E24236E +6E6E49044B7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E2B24046E6E6E6E23244B7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E01017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F5129243E3E3E3E291F617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F61614D7D7D7D7D2D7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E237D7D7D7D24683068007E7E7E7E7E7E7E24487D7D7D7D7D7D7D7D +7D7D4951307E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D047E7E657F7F1F49317D7D7D312465 +7E00004D7D7D7D7D047E7E7E24487D7D7D7D7D7D7D7D3E517F7F7F7F7F7F1D3E7D7D7D7D +7D7D7D7D7D6E4B7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1F497D7D7D7D7D7D7D7D7D7D6E +4D7E7E7E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F7F7F1F49317D7D7D31247F7F7F +7F7F7F7F7F7F7F1F317D7D7D7D7D7D7D7D7D7D49517F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F010165487D7D7D7D1F7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E287D7D7D7D1D00301E636930007E7E4D487D7D7D7D7D7D7D7D7D7D +7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D047E680129287D7D7D7D7D7D7D7B00 +7E7E7E4D7D7D7D7D047E4D487D7D7D7D7D7D7D7D7D7D7D7D1F7F7F7F61047D7D7D7D7D7D +7D7D7D7D7D7D281F7E7E7E7E7E7E7E7E7E7E7E7E7E7E237D7D7D7D7D7D7D7D7D7D7D7D7D +7D6E2B7E7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F29287D7D7D7D7D7D7D3E7F7F7F +7F7F7F7F7F1D317D7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F014C047D7D7D7D497E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E247D7D7D7D6E007E7E7E15664C6665247D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E4D7D7D7D7D047E60317D7D7D7D7D7D7D7D7D6E7E +7E7E7E4D7D7D7D7D04237D7D7D7D7D7D7D7D7D7D7D7D7D7D7D517F1D287D7D7D7D7D7D7D +7D7D7D7D7D7D7D282B7E7E7E7E7E7E7E7E7E7E7E2B2D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D481F7E7E7E7E7E7E7E7E7E7E4D7D7D7D7D297F51317D7D7D7D7D7D7D7D7D3E7F7F7F +7F7F7F7F1F7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D047F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F6101607D7D7D7D282B7E7E7E7E7E7E +7E7E7E7E7E7E7E7E6B7D7D7D7D247E7E7E7E7E7E301E1F7D7D7D7D7D7D6B241D1D1D2904 +287D7D7D7D7D047E7E7E7E7E7E7E7E7E4D7D7D7D7D04047D7D7D7D7D7D7D7D7D7D7D6E00 +7E7E7E4D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D6A297D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E7E6E7D7D7D7D7D7D48490404232D7D7D7D +7D7D7D282B7E7E7E7E7E7E7E7E7E4D7D7D7D7D29297D7D7D7D7D7D7D7D7D7D7D3E7F7F7F +7F7F7F1F7D7D7D7D7D7D49291D1D1D2904287D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F01617A7D7D7D7D247E7E7E7E7E7E +7E7E7E7E7E7E7E4B7D7D7D7D287E7E7E7E7E007E7E4D7D7D7D7D7D494C61017F7F7F7F7F +61047D7D7D7D7D1F7E7E7E7E7E7E7E7E4D7D7D7D7D287D7D7D7D7D7D6A3E3E3E487D6E7E +7E7E7E4D7D7D7D7D7D7D7D7D2849242B7E30591F317D7D7D7D7D7D7D7D7D7D48044D7E7E +7E1F04287D7D7D7D7D2B7E7E7E7E7E7E7E7E7E047D7D7D7D7D2D4D7E7E7E7E7E7E4B6B7D +7D7D7D7D6E7E7E7E7E7E7E7E007E4D7D7D7D7D287D7D7D7D7D7D6A3E3E3E317D3E7F7F7F +7F7F1D7D7D7D7D7D49617F7F7F7F7F7F7F61047D7D7D7D7D517F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F61014D7D7D7D7D2D7E7E7E7E7E7E +7E7E7E7E7E7E7E047D7D7D7D237E7E7E7E7E7E7E2B487D7D7D7D4D017F7F7F7F7F7F7F7F +7F7F237D7D7D7D6B7E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D3E1F617F7F7F61007E1F7E +7E7E7E4D7D7D7D7D7D7D7D042B7E7E7E68617F7F616A7D7D7D7D7D7D7D28247E7E7E7E7E +7E7E7E1F7D7D7D7D7D247E7E7E7E7E7E7E7E4B7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E24 +7D7D7D7D7D247E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D3E1F617F7F7F7F7F7F517F7F7F +7F61317D7D7D7D1F7F7F7F7F7F7F7F7F7F7F7F047D7D7D7D497F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F010161487D7D7D7D1F7E7E7E7E7E +7E7E7E7E7E7E7E487D7D7D7D4B7E7E7E7E7E7E7E047D7D7D7D237E0065617F7F7F7F7F7F +7F7F61317D7D7D7D4B7E7E7E7E7E7E7E4D7D7D7D7D7D7D311D7F7F7F7F7F01307E7E7E7E +7E7E7E4D7D7D7D7D7D6E4B7E7E7E7E00617F7F7F7F1D7D7D7D7D7D7D232B7E7E7E7E7E7E +7E7E7E7E047D7D7D7D497E7E7E7E7E7E7E7E497D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E +047D7D7D7D487E7E7E7E7E7E7E7E4D7D7D7D7D7D7D311D7F7F7F7F7F7F7F7F7F7F7F7F7F +7F297D7D7D7D247F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D7D597F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F6101247D7D7D7D497E7E7E7E7E +7E7E7E7E7E7E4D7D7D7D7D6B7E7E7E7E7E7E7E00287D7D7D487E7E7E7E00017F7F7F7F7F +7F7F7F1F7D7D7D7D24661E563000007E4D7D7D7D7D7D24617F7F7F7F7F7F567E7E7E7E7E +7E7E7E4D7D7D7D7D6B7E7E7E7E7E7E667F7F7F7F7F7F287D7D7D7D247E7E7E7E7E7E7E7E +7E7E7E004B7D7D7D7D6E7E7E7E7E7E7E7E4B7D7D7D7D7D4B7E7E7E7E7E7E7E7E7E7E7E7E +7E487D7D7D7D247E7E7E7E7E007E1F7D7D7D7D7D24617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F287D7D7D317F7F7F7F7F7F7F7F7F7F7F7F7F7F1F7D7D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F61157D7D7D7D282B7E7E7E7E +7E7E7E7E7E7E497D7D7D7D247E7E7E7E7E7E7E247D7D7D7D247E7E7E7E7E617F7F7F7F7F +7F7F7F617D7D7D7D047F7F7F7F01614C3D7D7D7D7D247F7F7F7F7F7F7F4C7E7E7E7E7E7E +7E7E7E4D7D7D7D7D047E7E7E7E7E567F7F7F7F7F7F7F3E7D7D7D7D4D7E00683015696366 +4C4C61017F7D7D7D7D7D7E7E7E7E7E7E7E047D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E7E +7E247D7D7D7D6B7E7E7E7E7E7E003D7D7D7D7D247F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +3D7D7D7D7D1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617D7D7D7D047F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F01013E7D7D7D7D247E7E7E7E +7E7E7E7E7E2B7D7D7D7D487E7E7E7E7E7E7E7E497D7D7D7D2B7E7E7E7E7E617F7F7F7F7F +7F56151E317D7D7D3E7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F4C1E6330686868 +6800004D7D7D7D7D040000000015017F7F7F7F7F7F7F047D7D7D7D3D616101017F7F7F7F +7F7F7F7F7F487D7D7D7D7E7E7E7E7E7E7E6B7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E +7E4B7D7D7D7D287E7E7E7E7E7E56607D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +047D7D7D7D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D3E7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F611F7D7D7D7D2D7E7E7E7E +7E7E7E7E7E247D7D7D7D047E7E7E7E7E7E7E7E487D7D7D2D7E7E7E7E7E7E4C7F7F7F7F7F +01007E7E6E7D7D7D7D01017F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F01011D7D7D7D7D29010101017F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F7F +7F7F7F7F016E7D7D7D7D7E7E7E7E7E7E7E287D7D7D7D4B7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E487D7D7D7D1F7E7E7E7E3061607D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +317D7D7D6A7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F0101317D7D7D7D4B7E7E7E +7E7E7E7E7E2D7D7D7D7D4B7E7E7E7E7E7E7E7E7D7D7D7D286E6E6E6E6E6E673E3E3E3E3E +7B6E6E6E287D7D7D7D686830696661011D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F7F +7F7F7F7F666E7D7D7D7D7E7E7E7E7E7E7E7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E6E7D7D7D7D4D7E7E7E001E01607D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7D7D7D7D283E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E287D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F61297D7D7D7D237E7E7E +7E7E7E7E1F7D7D7D7D6B7E7E7E7E7E7E7E7E1F7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F010161614C +66666369006E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E7E7E1501611D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F51 +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F01567D7D7D7D287E7E7E +7E7E7E7E237D7D7D7D247E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F7F666965631E6666664C61 +616161607D7D7D7D29017F7F7F7F7F7F7F7F7F01614C247D7D7D7D1F6515153068007E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E7E004C01011D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F01497D7D7D7D247E7E +7E7E7E7E287D7D7D487E7E7E7E7E7E7E7E7E4D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D7D7E7E7E7E7E7E7E4D7D7D7D7D297F7F7F617E7E7E7E7E7E7E7E7E00 +007E004D7D7D7D7D04157F7F7F7F7F7F7F7F01307E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E7E5601617F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F3D7D7D7D7D6E7E7E +7E7E7E247D7D7D7D047E7E7E7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E007E004C7F7F7F01 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1F7D7D7D7D297F7F7F157E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D04617F7F7F7F7F7F7F7F697E007E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E007E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D047E3001617F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F01317D7D7D7D4B7E +7E7E7E6B7D7D7D7D4B7E7E7E7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E1E7F7F7F61 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E003D7D7D7D7D297F7F4C007E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D247F7F7F7F7F7F7F7F1E7E7E7E00047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E4D7D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E047D7D7D7D04004C01017F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D +7D7D7D7D3E7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D237E +7E7E4B7D7D7D7D6B7E7E7E7E7E7E7E7E7E7E2B7D7D7D7D7D7E7E7E7E7E7E7E157F7F7F4C +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E151D7D7D7D7D297F01687E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F7F7F667E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7D7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E6E7D7D7D7D4D6301617F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61 +7D7D7D7D7D7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F597D7D7D7D287E +7E7E047D7D7D7D247E7E7E7E7E7E7E7E7E7E7E287D7D7D7D1F7E7E7E7E7E7E00617F7F1E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E004C1D7D7D7D7D297F1E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F7F4C7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E287D7D7D7D4B7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E487D7D7D7D4B01617F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +287D7D7D7D517F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F497D7D7D7D24 +7E7E487D7D7D487E7E7E7E7E7E7E7E7E7E7E7E6B7D7D7D7D047E7E7E7E7E7E7E567F7F65 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E68011D7D7D7D7D2961007E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F01687E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E6B7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E +7E4B7D7D7D7D286101017F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +497D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D6E +7E4D7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E7E047D7D7D7D487E7E7E7E7E7E7E00617F01 +15687E7E7E7E7E7E7E7E7E7E7E7E657F1D7D7D7D7D29657E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F7F157E7E007E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E047D7D7D7D6E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E047D7D7D7D4901017F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +297D7D7D7D317F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D7D7D +4B497D7D7D7D2B7E7E7E7E7E7E7E7E7E7E7E7E4B7D7D7D7D7D047E7E7E7E7E7E7E657F61 +664C1E1568007E7E7E7E7E7E7E7E617F1D7D7D7D7D29007E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F7F637E7E7E7E007E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E4B7D7D7D7D7D1F7E7E7E7E7E7E7E7E7E7E7E7E +2B487D7D7D7D1F617F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +597D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D +497D7D7D7D497E7E7E7E7E7E7E7E7E7E7E7E7E7E497D7D7D7D7D247E7E007E7E7E7E6115 +7E694C01611E6904047E7E7E7E00017F1D7D7D7D7D247E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E4D7D7D7D7D297F7F7F4C7E7E7E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E6B7D7D7D7D2D7E7E7E7E7E7E7E7E7E7E7E7E +237D7D7D7D31617F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F047D7D7D7D7D1F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F29297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F617D7D7D7D +7D7D7D7D7D4D7E7E7E7E7E7E7E7E7E7E7E7E7E7E4B287D7D7D7D7D047E7E7E7E7E7E0000 +7E7E0069661F317D294C666500567F7F1D7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E3D7D7D7D7D297F7F01687E7E7E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E1F7D7D7D7D7D497E7E7E7E7E7E7E7E7E7E24 +7D7D7D7D7D1F017F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F59287D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F1F317D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D3E292929292929292929292929 +2929292929291D7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F047D7D7D +7D7D7D7D487E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E247D7D7D7D7D7D6E247E7E7E7E7E7E +7E7E1F04487D7D7D297F7F7F017F7F7F1D7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E00007E +7E7E151D7D7D7D7D297F01307E7E007E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E7E7E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E047D7D7D7D7D2D4D7E7E7E7E7E7E4B6B7D +7D7D7D7D7B017F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F1F7D7D7D7D7D7D3E3D7F7F7F7F7F7F7F7F5129317D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D +7D7D7D7D047E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E497D7D7D7D7D7D7D286E23040404 +6E287D7D7D7D7D7D24017F7F7F7F7F7F1D7D7D7D7D2415680000007E7E7E7E7E7E7E7E7E +7E00611D7D7D7D7D297F567E7E7E7E7E7E7E7E7E7E7E047D7D7D7D4D7E7E7E7E7E7E0000 +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E6E7D7D7D7D7D7D48490404232D7D7D7D +7D7D7D28667F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F047D7D7D7D7D7D7D283E242929293E287D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F317D7D +7D7D7D7D2B007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E047D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D7D0400154C017F7F7F1D7D7D7D7D297F7F7F0101614C63691515153030 +30667F1D7D7D7D7D294C7E7E7E7E7E7E7E7E7E7E0068047D7D7D7D1F156565564C61611E +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E2B2D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D311D7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F297D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D297F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F297D7D +7D7D7D23687E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4D2D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D7D6B1F7E7E7E1E7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D294C664C664C6161616161616101297D7D7D7D1D7F7F7F7F7F7F7F66 +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E237D7D7D7D7D7D7D7D7D7D7D7D7D +7D3E667F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F1D6A7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D49517F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D +7D7D7D7D7D7D297F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F617D7D +7D7D7D1D66007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E246B7D7D7D7D7D7D7D7D +7D7D7D7D6E044B7E7E7E7E7E667F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F297D7D7D7D1D7F7F7F7F7F7F7F65 +7E7E7E7E7E6E7D7D7D7D7E7E7E7E7E7E7E7E7E7E7E7E7E1F497D7D7D7D7D7D7D7D7D7D67 +1D617F7F7F7F7F7F7F7F7F7F7F7F1D7D7D7D7D297F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F3D497D7D7D7D7D7D7D7D7D7D7D7D3E29597F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F61011E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E2B4D04496E6E6E6E +23044D2B7E7E7E7E7E7E7E7E617F7F7F7F01687E003069656661017F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F15 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E2B24046E6E6E6E23240001 +617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F611D29043E3E3E3E24291D617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F61011E007E00007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F4C7E7E7E7E7E7E7E00003015651E664C4C017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101016168 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00630161 +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F610166007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F697E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E617F +7F7F7F7F7F0156696969651E1E1E1E1E1E1E1E636569696969691530303030686868007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E001E01617F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F610166007E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E307F7F +7F7F7F7F7F1E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E001E01617F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F610166687E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E307F7F7F7F667E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F +7F7F7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E006601617F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F61014C307E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E657F7F7F7F307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F7F +7F7F7F01307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E304C01617F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F610161157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E157F7F7F017E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68617F7F7F +7F7F7F567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E306101617F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F010101657E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E1E7F7F7F7F +7F7F61007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E696101617F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F01610163687E7E007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F657E00007E7E7E7E7E7E7E7E7E7E7E68017F7F7F7F +7F7F157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E00630101017F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F610166687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F7F307E7E7E7E7E7E007E7E7E7E7E7E7E637F7F7F7F7F +7F4C7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68660161017F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F610161157E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E68017F01307E7E7E7E7E7E007E7E7E7E7E7E7E017F7F7F7F7F +01687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E007E7E7E7E7E7E7E156101617F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101011E687E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E667F7F016615687E7E7E7E7E7E7E7E7E7E657F7F7F7F7F7F +567E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00630101017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C307E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E300101017F7F014C563000007E7E7E7E00617F7F7F7F7F61 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E304C0161017F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61010163687E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E611E7E1E017F7F7F7F014C65153000157F7F7F7F7F7F15 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00560101617F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161014C157E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E30307E7E6866017F7F7F7F7F7F7F61017F7F7F7F7F6100 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E154C0161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F61010166687E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00564C017F7F7F7F7F7F7F7F7F7F7F0161 +4C4C1E636569691530303030687E000000000000000000007E006830303030301515007E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E681E6101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161016156007E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E007E007E7E7E7E7E7E7E30654C017F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F0101010101616161616161616161616161610101010101017F7F307E +7E7E7E7E7E7E7E7E7E7E7E7E0065610161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101016169007E7E007E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E6815617F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F657E +7E7E7E7E7E7E7E7E7E7E00154C0101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161014C15007E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00617F7F7F7F0161017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F567E +7E7E7E7E7E7E7E7E00154C0101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6161014C15007E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E157F7F7F7F7F157E0068 +151E664C4C6101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F667E +7E7E7E7E7E7E00154C0101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F016101014C6900 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E657F7F7F7F617E7E7E7E +7E7E7E7E7E7E68301515156565561E1E666666661E66616161616161616161661E66157E +7E7E7E7E00694C010161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0161010161 +1E68007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E4C7F7F7F7F1E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0000007E00007E7E7E7E7E7E +7E00686361010161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F6101 +01616615007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00017F7F7F01687E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00 +1566610101617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +01610101615630007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68017F7F7F61007E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00305661 +010161617F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F01616101014C5615687E7E7E7E7E7E7E7E7E7E7E7E7E7E687F7F7F7F157E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0015654C010161 +61017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F011E4C01014C1E69307E7E7E7E7E7E7E7E7E7E7E307F7F7F01007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E68691E4C0101611E017F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F0161614C0101614C1E69687E7E7E7E7E7E7E157F7F7F4C007E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0068151E4C610101614C61017F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F017F01610101616161665615683068157F7F7F157E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E68683015634C01016161010161017F017F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01616161016101017F01017F7F7F1E691530686868 +68686868686868301569651E664C01017F7F7F7F7F016161017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F01616101017F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101616161017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F0101616161616101010101 +010101010101010161616161610101017F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F +7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F + +end + +%%EndDocument + @endspecial 5073 3450 a +SDict begin /product where{pop product(Distiller)search{pop pop pop +version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto +closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show +grestore}if}{pop}ifelse}{pop}ifelse}if end + 5073 3450 a 5073 3450 a +SDict begin H.S end + 5073 +3450 a 5073 3450 a +SDict begin H.R end + 5073 3450 a 5073 3450 a +SDict begin [ /View [/XYZ H.V] /Dest (page.1) cvn H.B /DEST pdfmark +end + 5073 3450 +a 5073 3450 a +SDict begin [ {ThisPage}<> >> /PUT pdfmark +end + 5073 3450 a 5073 3450 a +SDict begin [ /Page 2/View [ /XYZ null null null ] /Title (What is SLURM?) +/OUT pdfmark end + 5073 3450 a 5563 +1764 a + 0.257 0.441 0.61 setrgbcolor + 5563 1764 a Ff(Wha)r(t)100 b(is)g(SLURM?)8186 +1764 y + 0 setgray + 8186 1764 a 5045 2274 a + 0.357 0.541 0.710 setrgbcolor + 5045 2274 a 5113 2470 +a @beginspecial 14 @llx 14 @lly 47 @urx 47 @ury 113 @rwi +@setspecial +%%BeginDocument: bullet-glow.ps +% Use own dictionary to avoid conflicts +10 dict begin +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 32.400000 translate +32.400000 -32.400000 scale +% Image geometry +45 45 8 +% Transformation matrix +[ 45 0 0 45 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 45 string def +/gstr 45 string def +/bstr 45 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 6293 ASCII Bytes +colorimage +e,Y"~> +e,Y"~> +e,Y"~> +e,Y"~> +&d8ID#7(SB$OmOU%hK9b',)&pq\BAN'GM2n&eP$Q#n77L$4$kA"pG!W~> +&e,B`&JPoq*$67H,UXri/1`D.q_Ag>/hS\*.jlSd+s.d@(DIGn&.JVi~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&do-X&/#Ti(E+24+!MmS-71)hq^N7.-RU5d,U+ +'HA2:-7UK!2EX)g852fV<`WC0?XNe?'OP-L>#nO!9h7T;4>nlI.OHJa)utK~> +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +n,Ne)-oa1K3B8`6#mp)$J,~> +)%RAo()[u0+!W!W.4d#'1,:dO5 +/0lbt1-%?[85N,a?=d\`EH,_r8kM?24@)bSAT;L$AR8G>:e3i:3AN?@,QN>~> +nc8\?$VEu[7RKC)4#SfJ)Y!fX~> +/.`L0(E4;7+seNa/2&Y45X7q57Rfa05 +/13&&2*F)k9iY2!ASc1(>[0lm7Rfa05nN4Z,)L-NJY~> +o)K=[:/4S[91q`@69R:a1G0Xeo)O:~> +/.r^6)&sV=,Ub&l0/GCQ:/4S[91q`@69R:a1G1401G::1-mToX*#TV0&cdF~> +/1ND13C,r';Hm@9CNFQ!:/4S[91q`@69R:a1G1mVF),;s>>e'c5rgq\.KFu~> +o)K=[:/4S[91q`@69R:a1G0Xeo)O:~> +/.r^6)&sV=,Ub&l0/GCQ:/4S[91q`@69R:a1G1401G::1-mToX*#TV0&cdF~> +/1ND13C,r';Hm@9CNFQ!:/4S[91q`@69R:a1G1mVF),;s>>e'c5rgq\.KFu~> +o`5"B&Pc5%<)QId8OPs13A`QG.4Gu'!.Y~> +//&d7)BKqD-7UJt1-e*";GpIl:/4AK6p`*Z>q4'**O~> +/1`V74@M\5=(#ELEElaD;GpIl:/4AK6p +p&Gg:8kMlY<*E6s:J+#C5<:VX0.JFs"n_kG~> +///m:)]p.I-S-f&2bH\<<)d%#:JXSN6pE^h1bU=.,VLi*/12\g*uc.8'EEX~> +/1rh=5=e=B>%D/\C._)o<)d%#:JXSN6pE^h1bU=.,[tV-A6Mi-83] +p&Gg:8kMlY<*E6s:J+#C5<:VX0.JFs"n_kG~> +///m:)]p.I-S-f&2bH\<<)d%#:JXSN6pE^h1bU=.,VLi*/12\g*uc.8'EEX~> +/1rh=5=e=B>%D/\C._)o<)d%#:JXSN6pE^h1bU=.,[tV-A6Mi-83] +p&GgU8P)ZT;H-Oh:.[iA4ukGV0.A=q'(l6T~> +///p<*$?@L.4m,+4\84?;GpIl:/4AK6p +/20%C5tXaJ?"[eh=\21[;GpIl:/4AK6p +p&Gge7Rg$G:/=VX91D674ZG5R/h&4o)>*u[~> +//B*@*?cRP.P<>/5=S+8:/4S[91q`@69R:a1G1+*,9S`s/h/.n+WVR@('&j~> +/2B4G6;'sO?YF+n8k)9C:/4S[91q`@69R:a1G1+*,:deTBO=b>90ts*1&uh~> +p&Ggi6UO=78P2QD7RKC)4#SfJ/12eh*;';^~> +//B*@*?cRQ.PEG25!q\,8P)NG7Rfa05 +/2B7I6VL0S?tsFt5XRn.8P)NG7Rfa05 +p&Ggi6UO=78P2QD7RKC)4#SfJ/12eh*;';^~> +//B*@*?cRQ.PEG25!q\,8P)NG7Rfa05 +/2B7I6VL0S?tsFt5XRn.8P)NG7Rfa05 +p&G1T5 +%Mfp"*?cRQ.PEG23^5hqrC$ZP(I'uC3&<3@.O?A`)`'9'.OHJc*??"5!.Y~> +%Pg(+6VL0S?tsFt4?l%srC$ZP(I'uC3&<3@.O?A`*-619?rg<%6UNmi!.Y~> +p&Gg\4$,Sh5!M4o4ZbV_1b^I3-R0iW(%hQW~> +//B*@*?cRP.P<>/2ENu`5!D1p4Ztkd3&E +/2B4G6;'sO?YF+n5s%.k5!D1p4Ztkd3&E90ts*1&uh~> +p&Gg\4$,Sh5!M4o4ZbV_1b^I3-R0iW(%hQW~> +//B*@*?cRP.P<>/2ENu`5!D1p4Ztkd3&E +/2B4G6;'sO?YF+n5s%.k5!D1p4Ztkd3&E90ts*1&uh~> +p&GgK2E!NT3BB/[3&WQK0J+_&,Tn3L%J9^O~> +///p<*$?@L.4m,+1H%-N3B9,\3&ifP1GCC0.3p#Y*$R*l/L_qj+<2@<'EEX~> +/20%C5tXaJ?"[eh:Gt*j3B9,\3&ifP1GCC0.3p#Y*'S=\B3eG78jPa&0E?V~> +p&G1$0ekK_2#f?>0eY12.4$8`*??"#o`0L~> +%MT]q)]p.I-S-f&1,1L>rA=O1(GRQr/1Dkk+WVR@/2/b/-R9rZ)]KS-!.Y~> +%PBXt5=e=B>%D/\AMGnqrA=O1(GRQr/1Dkk+WVR@?YsXj>#A-f5 +o`5"1!&"4's"4X0.Olek+X%jE)@c<=J,~> +%MKTn)BKqD-7UJt1+t:5r@e1'(G%$c-R9iY*?#h?1+k1/-6aWT)B'A)!.Y~> +%P0Fn4@M\5=(#ELED&qWr@e1'(G%$c-R9iY*?#h[EG0#n=%uCX4?PGO!.Y~> +o`5"1!&"4's"4X0.Olek+X%jE)@c<=J,~> +%MKTn)BKqD-7UJt1+t:5r@e1'(G%$c-R9iY*?#h?1+k1/-6aWT)B'A)!.Y~> +%P0Fn4@M\5=(#ELED&qWr@e1'(G%$c-R9iY*?#h[EG0#n=%uCX4?PGO!.Y~> +o)Jk4.4HbG.1%@J,pONQ*?#G!o)O:~> +&J>ip)&sV=,Ub&l0/GC8.4HbG.2O?X,pONQ*?#t?1G::1-mToX*#TV0&cdF~> +&LoOk3C,r';Hm@9CNFP].4HbG.2O?X,pONQ*?$XeF),;s>>e'c5rgq\.KFu~> +nc8\(s!7Uh#9k95*ZQ%8%IjFK~> +/.`L0(E4;7+seNa/2&Y4.Ol\h,9nBT+ +/13&&2*F)k9iY2!ASc1(7ReXK,9nBT+nN4Z,)L-NJY~> +nc8\(s!7Uh#9k95*ZQ%8%IjFK~> +/.`L0(E4;7+seNa/2&Y4.Ol\h,9nBT+ +/13&&2*F)k9iY2!ASc1(7ReXK,9nBT+nN4Z,)L-NJY~> +n,Ne!&fDQ,)B'>""9e2oJ,~> +/.WC-()[u0+!W!W.4d#'1,:I0+ +/0lbt1-%?[85N,a?=d\`EH,GT.k;Y\*%*pW?ZBjsAR8G>:e3i:3AN?@,QN>~> +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +&do-X&/#Ti(E+24+!MmS-71)hq^N7.-RU5d,U+ +'HA2:-7UK!2EX)g852fV<`WC0?XNe?'OP-L>#nO!9h7T;4>nlI.OHJa)utK~> +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +&d8ID#7(SB$OmOU%hK9b',)&pq\BAN'GM2n&eP$Q#n77L$4$kA"pG!W~> +&e,B`&JPoq*$67H,UXri/1`D.q_Ag>/hS\*.jlSd+s.d@(DIGn&.JVi~> +%%EndData +end + +%%EndDocument + @endspecial 298 w Fa(Resource)67 b(manager)h(arbitr)n(ating)f +(requests)g(f)-7 b(or)5411 2755 y(e)g(xhaustib)i(le)67 +b(resources)5113 3143 y @beginspecial 14 @llx 14 @lly +47 @urx 47 @ury 113 @rwi @setspecial +%%BeginDocument: bullet-glow.ps +% Use own dictionary to avoid conflicts +10 dict begin +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 32.400000 translate +32.400000 -32.400000 scale +% Image geometry +45 45 8 +% Transformation matrix +[ 45 0 0 45 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 45 string def +/gstr 45 string def +/bstr 45 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 6293 ASCII Bytes +colorimage +e,Y"~> +e,Y"~> +e,Y"~> +e,Y"~> +&d8ID#7(SB$OmOU%hK9b',)&pq\BAN'GM2n&eP$Q#n77L$4$kA"pG!W~> +&e,B`&JPoq*$67H,UXri/1`D.q_Ag>/hS\*.jlSd+s.d@(DIGn&.JVi~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&do-X&/#Ti(E+24+!MmS-71)hq^N7.-RU5d,U+ +'HA2:-7UK!2EX)g852fV<`WC0?XNe?'OP-L>#nO!9h7T;4>nlI.OHJa)utK~> +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +n,Ne)-oa1K3B8`6#mp)$J,~> +)%RAo()[u0+!W!W.4d#'1,:dO5 +/0lbt1-%?[85N,a?=d\`EH,_r8kM?24@)bSAT;L$AR8G>:e3i:3AN?@,QN>~> +nc8\?$VEu[7RKC)4#SfJ)Y!fX~> +/.`L0(E4;7+seNa/2&Y45X7q57Rfa05 +/13&&2*F)k9iY2!ASc1(>[0lm7Rfa05nN4Z,)L-NJY~> +o)K=[:/4S[91q`@69R:a1G0Xeo)O:~> +/.r^6)&sV=,Ub&l0/GCQ:/4S[91q`@69R:a1G1401G::1-mToX*#TV0&cdF~> +/1ND13C,r';Hm@9CNFQ!:/4S[91q`@69R:a1G1mVF),;s>>e'c5rgq\.KFu~> +o)K=[:/4S[91q`@69R:a1G0Xeo)O:~> +/.r^6)&sV=,Ub&l0/GCQ:/4S[91q`@69R:a1G1401G::1-mToX*#TV0&cdF~> +/1ND13C,r';Hm@9CNFQ!:/4S[91q`@69R:a1G1mVF),;s>>e'c5rgq\.KFu~> +o`5"B&Pc5%<)QId8OPs13A`QG.4Gu'!.Y~> +//&d7)BKqD-7UJt1-e*";GpIl:/4AK6p`*Z>q4'**O~> +/1`V74@M\5=(#ELEElaD;GpIl:/4AK6p +p&Gg:8kMlY<*E6s:J+#C5<:VX0.JFs"n_kG~> +///m:)]p.I-S-f&2bH\<<)d%#:JXSN6pE^h1bU=.,VLi*/12\g*uc.8'EEX~> +/1rh=5=e=B>%D/\C._)o<)d%#:JXSN6pE^h1bU=.,[tV-A6Mi-83] +p&Gg:8kMlY<*E6s:J+#C5<:VX0.JFs"n_kG~> +///m:)]p.I-S-f&2bH\<<)d%#:JXSN6pE^h1bU=.,VLi*/12\g*uc.8'EEX~> +/1rh=5=e=B>%D/\C._)o<)d%#:JXSN6pE^h1bU=.,[tV-A6Mi-83] +p&GgU8P)ZT;H-Oh:.[iA4ukGV0.A=q'(l6T~> +///p<*$?@L.4m,+4\84?;GpIl:/4AK6p +/20%C5tXaJ?"[eh=\21[;GpIl:/4AK6p +p&Gge7Rg$G:/=VX91D674ZG5R/h&4o)>*u[~> +//B*@*?cRP.P<>/5=S+8:/4S[91q`@69R:a1G1+*,9S`s/h/.n+WVR@('&j~> +/2B4G6;'sO?YF+n8k)9C:/4S[91q`@69R:a1G1+*,:deTBO=b>90ts*1&uh~> +p&Ggi6UO=78P2QD7RKC)4#SfJ/12eh*;';^~> +//B*@*?cRQ.PEG25!q\,8P)NG7Rfa05 +/2B7I6VL0S?tsFt5XRn.8P)NG7Rfa05 +p&Ggi6UO=78P2QD7RKC)4#SfJ/12eh*;';^~> +//B*@*?cRQ.PEG25!q\,8P)NG7Rfa05 +/2B7I6VL0S?tsFt5XRn.8P)NG7Rfa05 +p&G1T5 +%Mfp"*?cRQ.PEG23^5hqrC$ZP(I'uC3&<3@.O?A`)`'9'.OHJc*??"5!.Y~> +%Pg(+6VL0S?tsFt4?l%srC$ZP(I'uC3&<3@.O?A`*-619?rg<%6UNmi!.Y~> +p&Gg\4$,Sh5!M4o4ZbV_1b^I3-R0iW(%hQW~> +//B*@*?cRP.P<>/2ENu`5!D1p4Ztkd3&E +/2B4G6;'sO?YF+n5s%.k5!D1p4Ztkd3&E90ts*1&uh~> +p&Gg\4$,Sh5!M4o4ZbV_1b^I3-R0iW(%hQW~> +//B*@*?cRP.P<>/2ENu`5!D1p4Ztkd3&E +/2B4G6;'sO?YF+n5s%.k5!D1p4Ztkd3&E90ts*1&uh~> +p&GgK2E!NT3BB/[3&WQK0J+_&,Tn3L%J9^O~> +///p<*$?@L.4m,+1H%-N3B9,\3&ifP1GCC0.3p#Y*$R*l/L_qj+<2@<'EEX~> +/20%C5tXaJ?"[eh:Gt*j3B9,\3&ifP1GCC0.3p#Y*'S=\B3eG78jPa&0E?V~> +p&G1$0ekK_2#f?>0eY12.4$8`*??"#o`0L~> +%MT]q)]p.I-S-f&1,1L>rA=O1(GRQr/1Dkk+WVR@/2/b/-R9rZ)]KS-!.Y~> +%PBXt5=e=B>%D/\AMGnqrA=O1(GRQr/1Dkk+WVR@?YsXj>#A-f5 +o`5"1!&"4's"4X0.Olek+X%jE)@c<=J,~> +%MKTn)BKqD-7UJt1+t:5r@e1'(G%$c-R9iY*?#h?1+k1/-6aWT)B'A)!.Y~> +%P0Fn4@M\5=(#ELED&qWr@e1'(G%$c-R9iY*?#h[EG0#n=%uCX4?PGO!.Y~> +o`5"1!&"4's"4X0.Olek+X%jE)@c<=J,~> +%MKTn)BKqD-7UJt1+t:5r@e1'(G%$c-R9iY*?#h?1+k1/-6aWT)B'A)!.Y~> +%P0Fn4@M\5=(#ELED&qWr@e1'(G%$c-R9iY*?#h[EG0#n=%uCX4?PGO!.Y~> +o)Jk4.4HbG.1%@J,pONQ*?#G!o)O:~> +&J>ip)&sV=,Ub&l0/GC8.4HbG.2O?X,pONQ*?#t?1G::1-mToX*#TV0&cdF~> +&LoOk3C,r';Hm@9CNFP].4HbG.2O?X,pONQ*?$XeF),;s>>e'c5rgq\.KFu~> +nc8\(s!7Uh#9k95*ZQ%8%IjFK~> +/.`L0(E4;7+seNa/2&Y4.Ol\h,9nBT+ +/13&&2*F)k9iY2!ASc1(7ReXK,9nBT+nN4Z,)L-NJY~> +nc8\(s!7Uh#9k95*ZQ%8%IjFK~> +/.`L0(E4;7+seNa/2&Y4.Ol\h,9nBT+ +/13&&2*F)k9iY2!ASc1(7ReXK,9nBT+nN4Z,)L-NJY~> +n,Ne!&fDQ,)B'>""9e2oJ,~> +/.WC-()[u0+!W!W.4d#'1,:I0+ +/0lbt1-%?[85N,a?=d\`EH,GT.k;Y\*%*pW?ZBjsAR8G>:e3i:3AN?@,QN>~> +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +&do-X&/#Ti(E+24+!MmS-71)hq^N7.-RU5d,U+ +'HA2:-7UK!2EX)g852fV<`WC0?XNe?'OP-L>#nO!9h7T;4>nlI.OHJa)utK~> +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +&d8ID#7(SB$OmOU%hK9b',)&pq\BAN'GM2n&eP$Q#n77L$4$kA"pG!W~> +&e,B`&JPoq*$67H,UXri/1`D.q_Ag>/hS\*.jlSd+s.d@(DIGn&.JVi~> +%%EndData +end + +%%EndDocument + @endspecial 298 w(P)-10 b(ar)n(allel)68 b(job)g(launch)h(f)-7 +b(acility)5113 3536 y @beginspecial 14 @llx 14 @lly 47 +@urx 47 @ury 113 @rwi @setspecial +%%BeginDocument: bullet-glow.ps +% Use own dictionary to avoid conflicts +10 dict begin +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 32.400000 translate +32.400000 -32.400000 scale +% Image geometry +45 45 8 +% Transformation matrix +[ 45 0 0 45 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 45 string def +/gstr 45 string def +/bstr 45 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 6293 ASCII Bytes +colorimage +e,Y"~> +e,Y"~> +e,Y"~> +e,Y"~> +&d8ID#7(SB$OmOU%hK9b',)&pq\BAN'GM2n&eP$Q#n77L$4$kA"pG!W~> +&e,B`&JPoq*$67H,UXri/1`D.q_Ag>/hS\*.jlSd+s.d@(DIGn&.JVi~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&do-X&/#Ti(E+24+!MmS-71)hq^N7.-RU5d,U+ +'HA2:-7UK!2EX)g852fV<`WC0?XNe?'OP-L>#nO!9h7T;4>nlI.OHJa)utK~> +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +n,Ne)-oa1K3B8`6#mp)$J,~> +)%RAo()[u0+!W!W.4d#'1,:dO5 +/0lbt1-%?[85N,a?=d\`EH,_r8kM?24@)bSAT;L$AR8G>:e3i:3AN?@,QN>~> +nc8\?$VEu[7RKC)4#SfJ)Y!fX~> +/.`L0(E4;7+seNa/2&Y45X7q57Rfa05 +/13&&2*F)k9iY2!ASc1(>[0lm7Rfa05nN4Z,)L-NJY~> +o)K=[:/4S[91q`@69R:a1G0Xeo)O:~> +/.r^6)&sV=,Ub&l0/GCQ:/4S[91q`@69R:a1G1401G::1-mToX*#TV0&cdF~> +/1ND13C,r';Hm@9CNFQ!:/4S[91q`@69R:a1G1mVF),;s>>e'c5rgq\.KFu~> +o)K=[:/4S[91q`@69R:a1G0Xeo)O:~> +/.r^6)&sV=,Ub&l0/GCQ:/4S[91q`@69R:a1G1401G::1-mToX*#TV0&cdF~> +/1ND13C,r';Hm@9CNFQ!:/4S[91q`@69R:a1G1mVF),;s>>e'c5rgq\.KFu~> +o`5"B&Pc5%<)QId8OPs13A`QG.4Gu'!.Y~> +//&d7)BKqD-7UJt1-e*";GpIl:/4AK6p`*Z>q4'**O~> +/1`V74@M\5=(#ELEElaD;GpIl:/4AK6p +p&Gg:8kMlY<*E6s:J+#C5<:VX0.JFs"n_kG~> +///m:)]p.I-S-f&2bH\<<)d%#:JXSN6pE^h1bU=.,VLi*/12\g*uc.8'EEX~> +/1rh=5=e=B>%D/\C._)o<)d%#:JXSN6pE^h1bU=.,[tV-A6Mi-83] +p&Gg:8kMlY<*E6s:J+#C5<:VX0.JFs"n_kG~> +///m:)]p.I-S-f&2bH\<<)d%#:JXSN6pE^h1bU=.,VLi*/12\g*uc.8'EEX~> +/1rh=5=e=B>%D/\C._)o<)d%#:JXSN6pE^h1bU=.,[tV-A6Mi-83] +p&GgU8P)ZT;H-Oh:.[iA4ukGV0.A=q'(l6T~> +///p<*$?@L.4m,+4\84?;GpIl:/4AK6p +/20%C5tXaJ?"[eh=\21[;GpIl:/4AK6p +p&Gge7Rg$G:/=VX91D674ZG5R/h&4o)>*u[~> +//B*@*?cRP.P<>/5=S+8:/4S[91q`@69R:a1G1+*,9S`s/h/.n+WVR@('&j~> +/2B4G6;'sO?YF+n8k)9C:/4S[91q`@69R:a1G1+*,:deTBO=b>90ts*1&uh~> +p&Ggi6UO=78P2QD7RKC)4#SfJ/12eh*;';^~> +//B*@*?cRQ.PEG25!q\,8P)NG7Rfa05 +/2B7I6VL0S?tsFt5XRn.8P)NG7Rfa05 +p&Ggi6UO=78P2QD7RKC)4#SfJ/12eh*;';^~> +//B*@*?cRQ.PEG25!q\,8P)NG7Rfa05 +/2B7I6VL0S?tsFt5XRn.8P)NG7Rfa05 +p&G1T5 +%Mfp"*?cRQ.PEG23^5hqrC$ZP(I'uC3&<3@.O?A`)`'9'.OHJc*??"5!.Y~> +%Pg(+6VL0S?tsFt4?l%srC$ZP(I'uC3&<3@.O?A`*-619?rg<%6UNmi!.Y~> +p&Gg\4$,Sh5!M4o4ZbV_1b^I3-R0iW(%hQW~> +//B*@*?cRP.P<>/2ENu`5!D1p4Ztkd3&E +/2B4G6;'sO?YF+n5s%.k5!D1p4Ztkd3&E90ts*1&uh~> +p&Gg\4$,Sh5!M4o4ZbV_1b^I3-R0iW(%hQW~> +//B*@*?cRP.P<>/2ENu`5!D1p4Ztkd3&E +/2B4G6;'sO?YF+n5s%.k5!D1p4Ztkd3&E90ts*1&uh~> +p&GgK2E!NT3BB/[3&WQK0J+_&,Tn3L%J9^O~> +///p<*$?@L.4m,+1H%-N3B9,\3&ifP1GCC0.3p#Y*$R*l/L_qj+<2@<'EEX~> +/20%C5tXaJ?"[eh:Gt*j3B9,\3&ifP1GCC0.3p#Y*'S=\B3eG78jPa&0E?V~> +p&G1$0ekK_2#f?>0eY12.4$8`*??"#o`0L~> +%MT]q)]p.I-S-f&1,1L>rA=O1(GRQr/1Dkk+WVR@/2/b/-R9rZ)]KS-!.Y~> +%PBXt5=e=B>%D/\AMGnqrA=O1(GRQr/1Dkk+WVR@?YsXj>#A-f5 +o`5"1!&"4's"4X0.Olek+X%jE)@c<=J,~> +%MKTn)BKqD-7UJt1+t:5r@e1'(G%$c-R9iY*?#h?1+k1/-6aWT)B'A)!.Y~> +%P0Fn4@M\5=(#ELED&qWr@e1'(G%$c-R9iY*?#h[EG0#n=%uCX4?PGO!.Y~> +o`5"1!&"4's"4X0.Olek+X%jE)@c<=J,~> +%MKTn)BKqD-7UJt1+t:5r@e1'(G%$c-R9iY*?#h?1+k1/-6aWT)B'A)!.Y~> +%P0Fn4@M\5=(#ELED&qWr@e1'(G%$c-R9iY*?#h[EG0#n=%uCX4?PGO!.Y~> +o)Jk4.4HbG.1%@J,pONQ*?#G!o)O:~> +&J>ip)&sV=,Ub&l0/GC8.4HbG.2O?X,pONQ*?#t?1G::1-mToX*#TV0&cdF~> +&LoOk3C,r';Hm@9CNFP].4HbG.2O?X,pONQ*?$XeF),;s>>e'c5rgq\.KFu~> +nc8\(s!7Uh#9k95*ZQ%8%IjFK~> +/.`L0(E4;7+seNa/2&Y4.Ol\h,9nBT+ +/13&&2*F)k9iY2!ASc1(7ReXK,9nBT+nN4Z,)L-NJY~> +nc8\(s!7Uh#9k95*ZQ%8%IjFK~> +/.`L0(E4;7+seNa/2&Y4.Ol\h,9nBT+ +/13&&2*F)k9iY2!ASc1(7ReXK,9nBT+nN4Z,)L-NJY~> +n,Ne!&fDQ,)B'>""9e2oJ,~> +/.WC-()[u0+!W!W.4d#'1,:I0+ +/0lbt1-%?[85N,a?=d\`EH,GT.k;Y\*%*pW?ZBjsAR8G>:e3i:3AN?@,QN>~> +e,Y"~> +'FkZc',D?$*?ZIL-7LAp/hSe31,Ahb'J_Br0.ne,.4-8a+<;=;()%>m%KM"~> +'HnhO/Mo:G6:jaF=']*BBP;4$EcV/#'QS//ChR?i>usj!8O>L#1bC:,+TR#~> +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +&e,?^&el#s)BBh@,:+Wa.Olu$q^rO6/1`8!-m^)\+<;@;(_dSq%h/Mh~> +'H\PE.5*>54@;J-:fUM"?XI>UBP@BZ'PM)hA7&PF +e,Y"~> +&do-X&/#Ti(E+24+!MmS-71)hq^N7.-RU5d,U+ +'HA2:-7UK!2EX)g852fV<`WC0?XNe?'OP-L>#nO!9h7T;4>nlI.OHJa)utK~> +e,Y"~> +&IJpT%hK9c'c7c**$-.D+sJ92-2o7k-3#2$+s8!L*#TV2'b_5l%hB'U!.Y~> +'Ghc1+t"`h0K1pP5Xe+59heJa +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&dSgO$kEj[&el#q)&jM7*ZcCGq]QUq+!2OD*#fb2().Am&.]0X$4$W^~> +'GMB$*$QRS.PEG33^#Vl7Rfm?92#7X'MD%g7n,d14ZYDV0.J=s+rhR>'EEX~> +e,Y"~> +&dJ^L$4I=Q&/#Th()Ic()B'P7q]-=i)]K\4(`*r$'+tid%L`[O#mUH\~> +&ePlp(`XM<-7LAq1,UpL4?Pemqa(r]5!D(h3AiQD/L`"h+<248((gOs~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +%0d(D#mq"J%1`s]&el&Z('#0M)#bEQ)#kEO((Crj&J5N_$k*IL#m^_8J,~> +&eG]i()Rl/+!W!Y.P<>/1c.*Mq`,fP-'+b.o~> +e,Y"~> +&d8ID#7(SB$OmOU%hK9b',)&pq\BAN'GM2n&eP$Q#n77L$4$kA"pG!W~> +&e,B`&JPoq*$67H,UXri/1`D.q_Ag>/hS\*.jlSd+s.d@(DIGn&.JVi~> +%%EndData +end + +%%EndDocument + @endspecial 298 w(Simple)68 b(queuing)g(system)5045 +3825 y + 0 setgray + 5045 3825 a 10173 5340 a + 0 setgray + 10173 5340 a 5462 5736 +a + 0.357 0.541 0.710 setrgbcolor + 5462 5736 a 3822 w Fb(SLURM)20 b(\226)g(p)n(.)f(2/2)10740 +5736 y + 0 setgray + 10740 5736 a 4500 6000 a + tx@Dict begin -90 Rot end + 4500 6000 a eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/executable_names/doc/slides/users/figures/slurm.eps b/executable_names/doc/slides/users/figures/slurm.eps new file mode 100644 index 0000000000000000000000000000000000000000..da42db8a6aa9ced301ffc154f59ceee079f6caae --- /dev/null +++ b/executable_names/doc/slides/users/figures/slurm.eps @@ -0,0 +1,4115 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /home/dun/dvl/slurm-doc/slurm.eps +%%CreationDate: Fri Nov 2 14:10:19 2001 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 515 389 +%%EndComments +%%BeginPreview: 256 191 1 191 +% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +% fbefbdf7df7befbef7df7f7df7defbefefbefbdf7defbefbdf7df7befbfbefbf +% eebaebaebaeebaebaebaeaebaeb5d75d5d75d6baebbaebaeb5d75d6baeaebaeb +% fbefbf7df7ddefbefdf7dfbefbff7df7f7df7fefbeefbefbff7df7fefbfbefbf +% ef7b76efbefbbdedb7befb77aeabd75d5d75d57aebbb6dded5dbbdabdededdeb +% fbdeefdaebaf775bed6baeedfdfefefbfbefbfdfdf77fbb5ff776bfeb5b5bb7f +% eef7dd7fbefbeeff7ffefbdf5bb7addf6f7df6f5bbeeaf7fabdeff5bffffefd7 +% fbbd7bd6f7b6bdd6d5addf7bf77dfbb5ddd75dbf76bdfbeb7ef7d6f76b557afd +% ef6fdf7dddefefbdff7bb5debeef5f7f7bbdf7ebefefb6beedbd7ddefeffdfaf +% fbfaf5efbb7dbaf7adef7f77ebdbf5edef77bebebdbaefeddfefdbbbd7db75fb +% eeafbf7af7d777befbbdeded7efebf7bbbeeebedef77bdbbbabaf7777d77df5f +% fbfb6bdfbefdeeebb7777bbfd7abebdf76bddedfbbeef77777efbeeeefdef6f5 +% ef6efef5ebafbddeeeeedf75bdfedef5efefbbbaf6bdddeeeeddebdddafbbddf +% fbdddbbf7efaefbbddddf5ef775bbbbf7dbaf777bfefbbbdddfb7efbbfaeefbb +% defbbeebd7b7baf77bbbbf7deef7776bd777beeeeadaf777bbafd7af76fbdaf7 +% f7af77befdeef7beef776bd7bddeeefefdeeebdddfbfbeeef77afdfbefb77fbf +% edfbededaf7ddeebddeefefdefbbddd7afbddefbbb76ebdddeefaf5ebdeeeb6b +% df5ebf7bfbd7bbdefbbddbaf7af77bbdfaefbbaf77efbefbbbddfbf7ef7ddeff +% 7bf7ebdf6efdf77baf77befbdfbeef775fbaf77deebdedaf777b5ebd7bd7bbdb +% eebd7ef5ddaf5eef7beef7b6f5ebddeef5f7beef7def7bfbeeeff7efdefdf777 +% 7befdbbf7bfbf7ddeebdddefbf7efbbddf5eebdbd7bbdf6ebddd6d7af7af5eef +% ef7af76bef5ebd7bbdefbb7debd7af77bbf7befefdeef5ddefbbdfdfbdfbf7dd +% fbdfbefebbf7efdf77baf7d77efdfbeef6bdedabaf7bbf7bbaf77af5ef5ebd7b +% 6ef5ebd7eebd7af5eef7befdd7affebddfef7bfefbdeebef77beefbf7bf7efdf +% 7bbf7efd7defdfbf7ddeebaf7df807f7badbdf6ddef7bebbeeebddebdebd7af5 +% ef6bd7afd7baf5ebd7bbdefbdf00003ef7bef5dfb7bdedeebddefb7ef7efdfbf +% 7bfefdfafdefbf7efdf77bdef012a887def7bf7afdef7bbdefbbafd7bd7af5eb +% eeadaf5faf7b6bd7af5eef77c0400100f7ddebefaf7bdf77baf77afdefdfbf7f +% 7bfbfbf5fbdefefdfbf7dddf0a0912293d777ebb7bdef5eef7beefaf7af5ebd7 +% ef6f5ebf5ef7dbaf5ebd7bbc009020000fded7eeeef7bf7ddeebddfbdfbf7efd +% 7bddf7ebf7bd777bf7efdf7024024492437bfd7dddbdebd7bbdefb5ef5ebd7af +% eefbbd7ebdefdeeeddbb75e10090000009eeb7d7bbef7efdf77baff7bf7efdfb +% 7db777d7ef7b7bddfbf7df842402492490fbeefdf77bd7af5eef7addebd7af5f +% efeeeefd7bdeef7baf5ef7088090000002377daf5edefdfbfbddefbb7efdfbf5 +% 7b7dfdb7def7dddf7dfbbe2012024924905ed7fbfbf7af6edefbbdf7d7b76edf +% efdbafeef7bdbfbbef6f680240480000020ffdb6df5dfbdfb7af776efdeefdfb +% 7d7ffabdbdeff5f77bddf924090124924846b7efb6fb6efafdfbeefdaf7dd7af +% efed6ff7ef7b6f6edefbb00090240000010bfebdfddfffb7db5eddd7fbdbbefb +% 7b7ffdbd7bdffffff7af6248020092492423b7ef57bb5afef7f7bbfedef777b7 +% eed5afefdef5555addfdc1ffa09270000081fd7bfef7ffdbbeddf75bf7beedef +% 7bff7b7b77bffff7ff6f8bffc400f4924908d7deb7bedb7febbb5fff6eebdf7d +% ef5befdffdeb6dbeb5fb11f1c892f00000227ef7fdedf7d57f77fad5dddf7bdb +% 7dfedd76d77fffedefaf20f282200254948077bdb77bbeffdbfedfbf7bbdeeff +% efb7fbefbedb5b7fbdfe02f62ffcf8fe7ef93def7ddf6db6f6d7b6f7ef77bdab +% 7b7db77df7f7fedb776c48fe5ffdf9ff7e601f7beff6fbefbffdfddd7dfef7ff +% efef7fdb6eded7fffffc00fe9f7cfbcf1ee49bdedd5ddf7dedb76fbfdbabbdb7 +% 7dbbedbffdfbfdb6d55892f60f3cfbcf3fc00ef7bbfbf6db7ffffb75bf7f77fd +% effedff6dbb75ffdfff800f64f3cfbcf9fc92fbdff6f5fffd56d6ffff6edeeaf +% 7b6bfb6ffffef5afb6d124f0df3cfbef0fc006ef6bfdfb6dbffffdadbddfbdfb +% efff6ffdb6adfff058f401f1df7cfbef2f8927fbfedbb7fffb5b6fffeffb77b7 +% 7d5bfd5bffffad04826093ffdf7ef9fe078007aedbff7edadffffb6b7b6feeff +% effedbff6adb7f4910a403ffdf7ef8fc772491ffff56edfff6dadfffdffd7fdb +% 7b6dffb6fffff610452090000000f800f70003b5b6ffffb6bffff6ad76dbdaff +% efffb6ffdb6adc45102404491249f1223e4925ffffedadffffb6bfffffffffb7 +% 7db6ffdafffff8904560fc802001f2047c0000db6b7fff6c007fedb6d6b6b6fd +% efffd5bfb6db59051005861244920048009248ffffdb6df8ff06ffffffffffd7 +% 7b6afff6fffff051e564140000004900840002eadaffffacc1f8f56db6d5adbf +% efdfb6dfd5adb505f02aa649249200241092487fffb55b7c3f169ffffffffffb +% 7d7dfffb7ffff053baa80400000049012200006dadfffffe1fa9c7ab5ab6dadf +% efefadb7edb56505e832ad24924900240049257fff6db5b58fea31fffffffff7 +% 7b7b7ffedffff0517d5004000000248092000075b5fffff8e3daac76d6db56bd +% efdff56dfb6db204df8aa52e4925c712a0f2793fffb5ad6919c3c73fffffffef +% 7dbadfffb7ffe4a13a0c0c611f8228c633098436adfffff00e38119b5b6adb7b +% eff7fb6b7ed6d00a1e24a488904cb2488c4e2a7fff6db6da4b8f4a9fffffffdf +% 7b6f5fffedfff550aa440d52a14910b229148236dbffffe806f0ff8d6d5b6d7b +% effdf6db7fb5b80406054500aa52252488402a5ffed56dd895bf003fffffffef +% 7d5bbfffdb7fe951524c1455a05440202295411db7ffffe806d4fffb6b6dab7d +% effff5ad7fedba040504a680a5708aaa8800151ffdb6d5b12368037fffffffdb +% 7db6dfffeadffc5151940a2aa052203022aa813b57ffffd805b915badb5ab6ff +% f7fffb6dbffb6d04048545808a988ab28c022a1ffeadb6ea4b50437fffffffb7 +% 6edb6ffff76ffe51504414955049284824ad013d6dffffb405b9059b56db6dfd +% fffffedb6efdb6040554a88085480a4a8a05551fffdb6d5c96d0233fffffff6f +% 6db6dbffffdbfd51502408ab508aaec82a55011b6dbfff6805b2847b6d6adbfb +% ffffff6db6ff4784056549814488090a88892a3efff6dbb646d14edffffffedf +% 6d6db7ffffb695d150281095499958102d1102c01b6fff6c8b62209b5bb6d7fb +% fffffdb6dbffa3e40522a981408808950c4a5312a7fdb6da02a69a9ffefffdb7 +% 6dab57ffff6d05b150680a95958aa81054890444036fffb69106a93d77db6fff +% ffffff6db7ff2bf8052aa680204809328c2a511155fdb6db0248c33beefffdad +% 6d6d6dfffedb016aa06809950a4aa810254a044400dfff6d1012a837bddb6fff +% ffffffdb6ffe55fc0a29428050a80895140aa91154f6dcd6225492bef7bffdbb +% 76dbb6fffadb01b4a0c816aa824aa11054aa0044015ffcbb00606e3fdff6dbef +% ffff7fb6dfff28fc0a4aa48094c81412a412557f547b6c6d24cea075badfff7f +% 6db7f6fff6db0269508808ab4189505025528e9bc13ffc36004510fffffb6ded +% fffdbfdb6fffa89204955266770ea10fc2a2701ef46db895494ab376db6fffdf +% 76dff6fffdb682045184e010001008200905809bd13fe9060043427ffffedb7d +% fffb7fdb6fffd4a885110484484091002020041f785b78204be886edb6dbfff7 +% 6db7edbffdb6e00222020810820400250484489df2bfdd04025298ffffffb6df +% fffedffb6fffdaa88e4841277dfbfe804810801fd42dba209e4892edb6db7ffd +% 76ddfb6ffdb6fc022e010ae8000000be0122125db13ff784004d24fffffff6db +% fffbdffedfffdb50be487a02a5252401f000001fe476fd48998251db6db6dfff +% 6dbfbdbbfb6dfffffa0380a8084041540f49493b013fd6c00850c5fffffffb6f +% fff6fbf7bfffb6dfdebc2502a215140120ba003e546dfb449aa28bb6db6dbffd +% 777fefbf76dbfffb7b41082808a041544a02fff0017fb6c0f23125fffffff6db +% feedbef7ffff6dbfff245142a20a140100a80002aa6ded898a9249edb6db7fff +% 6ffffbfedb6dfff6d449041008a0a1545402aa9400ffa000991493bfffffedb7 +% fdb6efb7ffffdb7ff9005145420a040101500020aaede224c4b513fb6db6ffff +% 77ffdefedb6dbfeda255041014a0a9545405550a01ffc8434e6867b7ffffdb6d +% ff6dfdeffffffb7fc8005145400a000101500050abb6c14ca11247ff6db6ffff +% 6dffb7ddb6db6fed12aa8410157ffaa85405550207ffc8a4d5248f6effffdb6f +% ffdbff7ffffffefe200021454f0003c281500054af6dd124312897fdedb6fffd +% 7b7f6df6dbb6dbd88aaa8a1070200018280555003effa9552543076fdfffdb6f +% eff7ffdfff7ffff9200020878044940742a00055fbeda50b0e922ffdfdb6fffd +% 7ededb7db7f6db680aaa8a38048000a0e80aaa0befbfe75554a60edfb7ffdb6f +% fbfdfff7fedffff2a00020c0200922041d502fff7efb8ac4c5044ffbff6dfffd +% 6fb7db6f6ffdb6d00aaa8f128490082081ffa7fdedef822a29280edf6dffb6df +% feff7ffefdb7fff5500030001002410400000edbffdf3e11b2492ffbffdbfffb +% 7bedf6ddefff6db00555c4490248082094003fffb77d20548491ddbf6dbf6dbf +% efbfdffbddb6fffaa00600802401210401491db6fef75089cd137ff7fffbfff7 +% 7efb7dbfffffedbc0abe29124092042124007fffefef0fc48856bb7edb776dbf +% fbeff7f6db6ddff540ef00000800488400247b6dbdbf2035b225dfedffeffff7 +% 6fbedf7fffffbdbf5fbd9249212400109281f7fffbfb0a4b10a6bddfdb7edb7f +% fefbfdedb76dfbf7f7ff8000040124820010ff6db7b72088654dbbbdbfefffed +% 7befb7ffffffbfbedeedc924909000104905edffff7f4a24204b3ffbfb7db6ff +% efbeffbbeeedf6f7ffffe000020492420023dfdb6efe808cca8abb6fbfefffdb +% 7efbeeff7fffbffef6ddf24924200008490ffdbffdedd5209087bffef6feeeff +% fbefbfeffbb6f6dbdfffb80000849241002f7ffb6ffca00ac4957bdfffdbddef +% 77befbbddfffffffffbbfc9248100008249febbfff6cffd29106f77bb7ffffdd +% fffdf7ffbeedb6db76ff7e0002424921007dff76dbfca0248525fffffedb777f +% 76efdf6dfbdfffffefefefa49008000424ffbfffff78dec521036eeeefffeef7 +% fffffeffefff7df77fbdfd800241249081f7f6eddded73950b25fdddddbbbfff +% 77bb77f77edbefbffb7fb7e49008000213eefffffbfda4255001fffffffffddd +% feffefbfeffffdf6dff7fff00491249047bfdddf7fbf68890692edbb76eeefff +% 77eefefdfdbedffffefeeefc900000020ffdfbfbef76cc315200fffffffddedb +% ffbddfefbff7fbb7bbdfdfde024924907f77bfbf7dfda5630425dbeeeedffdff +% 76fffbbdf77eeffefffbfdffa4000004fefff777efecc3c12c81ff7dddfbbff7 +% ffedbf7fdeeffeefeedf77b7e0924923f7eefffeff7e48058813f7effffff7bf +% 77bff7f77ffdbbddfdfdeffefc00000fffdfdddfdbffb0117c81deffbbb6fefb +% feff7efefbdfffffbff7feefff92497fb6fdfbfbffb7da43d413ffdb7fffdfef +% 77f6efdfef7beedff7bfbffddffd17fefff7bfbf76fee60ab483b77ff6eefbbf +% ffbffdfbffff7ffb7efdf6dffbfffffbf7bff7f7eff7f9936c13fefeffdfef7d +% 76fddfbf6ddffbbfefeffffbbf7fffb7defdbefeffbfde62da87efedddfddff7 +% ffeffbf7fffb6ff77dff6efff7eddb7f7fefffdfddfdbf9f6c177dffffbffdff +% 77bf7f7eef7ffeffffbbffdb7effbffffbbf76fbffefffe3fb3fffbbbbf77fb7 +% fefbefeffdeefbdddbf7dbffefddfeeddffbffff777f76fc07feedffff7fedff +% 77fffdfdbfffdfffff7f7f77fdfff7fffeefdddbfff6fffff877ffeeefedffef +% ffb6dfbff76dfedb77effffedfb76fbb77fefbffdddfeedfffffbbbffdffbbbd +% 76fffbf77fffb7fffefddb6ffbfffeffffbbffbb7fbffffbdfeefffbbfbbf7ff +% fff7bf7feddfffbeefdffffddf7ddfeeedffb7fff7fb6dff7bbfeeeff7ff7f77 +% 77bef7edfffb7df7fdfb777fffeffbbfffeefeeefeffffb7fffbbffefeefefff +% fefffeffbbbfefffbfbfffedbb7f7ffbbbbff7ffdfdbbffeeeeffbbbdfddfddd +% 77eddfdffff77f6df7f7ddfffffbeeeffffbbfbbfbfff6effffeeffffbffbfff +% ffbffbfb6efffbfffefeffbbeeeffffeeeeffdff7f777fdddbbbfeeedf7bf777 +% 76fdbf7fffdddfdf6fdff7ff7dfedbbbfffeefefefefeeffffffbbffffef7fff +% fff7f7eefbfffefbfdfbbeefffdfffffbbbbff7dfdfefffbbeeeffbbbb7feddd +% 7fdffeffdf7777ffdfbf7fdddbfbbeeeffffbbffbfbfdbb7f7ffeefffffbffff +% f6fedfdbffffff6efbf4db3ef6df67fdee5bffb7f7f6ffff7fbbbfeeeeef6f77 +% 7ff7fbff76dd44aabf7ddedb7773df8d1eaf5b7d5cbec8cfedf7fbbffdfffdff +% f7bfff7ffffadaad575bad5ef577bd6eeb6bbe92adbdb75dffff7ffbbfdddfdd +% 7efedfedddff77dbdf7bbaedeb7aaf5d6b75ad7d6abadedfbbb7eefff7fffbfb +% fff7fbffffb6f5d5ed7ab5dd6eeabebdf77bbacefd7bbfdbfffeffdb7ef77f7f +% 76dfbf7f7bfdb7f7ff6bb5faeefafeb5f6eb7bfddbbaadbfb777fbffefdfefef +% fffdf7edfff5f7b776f757fdd6baf6bdb6bd55fd7b77bfb77fffdf77fefefdfd +% 77bfffffef6eedf7fedb77b5ddfbddbaeaf377b5f56b7b5ffeeefffeddfbffbf +% fef76edfbdfdd7f9eeab6a5b5d7bfdabeeef75fdf76f5f7df7fffb6fffdfdbf7 +% 7ffffffdfffbefbafd576abaadeadabdd5eb6ffbb7575377bfdddffddbff7fff +% f7defdfff7bad7cdddf76fb5bbfbfabbadaeebbaf55eaebffefffeffff7bff6f +% 7effefdbbffbded6fdeeaf57badbf5555daeeff5ef5afefef7fbbbdbbfefedff +% fffbfffffef5dfeafd6eed775ab777b6bd5eaf37eb5eff77dfdffffff6ff7ffd +% 77df7dbf77d7dbf5b5eaeab77557ebb57abd72f7af7e82fffeff77bf7ffdffb7 +% feffeffbfff7afbdfbff7577fff5efb5fafef575ef757edefbfbfffbffdfedff +% 7ffbffffeefeffffff7ffffeefffafbffffbfff7fdffdbfbdfdfeeffedfbffff +% f7df7db77fdffdf7b7eddffffedffdffb7dfefdfbfef7fffff7f7fdf7fbfbfb7 +% 7effeffffdfdefbefffffdb7dffdfff6ff7fbefff7bfff6f7bfbfdfbfffff6ff +% fffbfffeeffffffffedfbffefdffb7bffffbfffb7ffdedffffefefffedf6ffff +% 77df7db7ffb7bdf7dbfdfbffffdbfeffdbef7bdffef7bffdef7f7fb77fbfdfdb +% feffefffddfef7beffffffb7dbfffff6ff7fff7fefdfffb7bdfdfdfffffffdff +% 7ffbfffeffffffffff6fb7feffbf6dfffffdeffb7dff7bffffefeffeedf6ffbf +% f7df7db7fbb7def7dbfdff7ffffbffdfdbeffdeffffbff7ef7bfbfb7ffbfdbfb +% 7effefffdffefffefffffff7db7ffffb7f7fbfffefbfeff7fffdfdffdfffffff +% fffbfffeff7ffbdfff6fb6fefff76dbffffdf7bdbdf77dffdef7f7fefdf6ff6f +% 77df7db7fbf7df7bdbfdffefffffffffedeffff7ffffffdefbdfbfb7ffbfdbff +% feffefffdffeffffffffffffdb6efff6ffffbefff7beeffbfffffeffdbfffffd +% 7ffbfffeff6ffbef7f6fb6ddffffedbfdfbdf7dedff7fdbfdf7df7fefff6ff6f +% f7df7db7fbffdf7fedfdffffbffdfffffdf7fffffeffdfff7bf7bfdbff7fdbff +% 7effefffdffdfffdfffffffbfb6fdff6ffffbefbfbdefff7fffffeffdbeffffd +% fffbfffeff6fbbefbfb7b6dffffffdbfdbbef7df6ffffb7ef76f77ff7ffeff6f +% 77df7db7fbffff7ffbffffff6ffdbffffff7ffffff7bdfefffffffdbff7fdbff +% feffefffdffdf7fdff7efffbfdb7fbf6ff7fdefbfdff7fffdefdeeffededfffd +% 7ffbfffeff6fbfefb7f7db6fffffffbfdbfeffdf6feffb7dfbefbfff7fffff6f +% f7df7db7fbfffeffffffffff6ffedfffffeffbffffbdefefbffffddbffbfb7ff +% 7effefffdffdf7ddfedefffdfdb7fb76ff7ddf7bfdffffffff7df7ffedfbfefd +% fffbfffeff6fbfffb7fbdb6fffffffffdbffffff6ff7bdbdf7efbfbf7fff7fef +% 77df7db7fbfffefbffffffffb7fedfefffefbbefffbff7ffbefffefbffb7f7ff +% feffefffdffdf7dffedf7ffdff6ffb7eff7dff7dfdfefff7fffdf7ffedfffedd +% 7ffbfffeff6fbfff6ffbf6dffffdffffdbfff7ffdff7dedef7dfbfdf7ffedfff +% f7df7db7fbfffefbfdfffffbb6ffdfedffefbfeffbbffffffefbfefbffb7fbfb +% 7efff7ffdffef7dfffdf6fffffeffb7fff7dfefdbffefbfbdffff7ffedffffbf +% fffbfffeff6fffff6ffbfedffffdbfffb7fffbdfff77df6ffbdf7fdf7ffedff7 +% 77df6f6ffdffdefbfdbffffb6dbfffedfef7bffff7ffffff7ffbeefdffb7fb7f +% ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +%%EndPreview +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 374.085208 translate +500.113915 -374.085208 scale +% Image geometry +500 374 8 +% Transformation matrix +[ 500 0 0 374 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 500 string def +/gstr 500 string def +/bstr 500 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 251367 ASCII Bytes +colorimage +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +!< +!< +!< +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +IK1Zr?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;s&a_W=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C;)1IU?2Z?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;s&a5I=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=C3?SJ,~> +IK10D69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qks#>Ho3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3(!X)IR6"R69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qks#=sa3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3'nD]J,~> +IK2-GFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_Js)id4F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`dY+IWT^TFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_Js)i:&F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`]A=J,~> +IfLd%=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=FOUZ=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?iO5W?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJr1=DV>H=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJr0=90]JJ,~> +IfL9O3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3.=1R3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa6N9#o69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j8)3,Co@3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j8(2usfqJ,~> +IfM6GF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKFaeFTF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFT6K4FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hg+F_l/BF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`hg*FTF5tJ,~> +!<=Es=FjSI=FOUZ=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?iO4=?W^E;=BJp4=C504?W\TSJ,~> +!< +!<=m+Fb+\.FaeFTF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFT6IoFEM_JF`heKF`_bKFEK>=J,~> +IfLd%=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4= +IfL9O3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3$^gM3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j8(3.=1R3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa6N9#' +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j7B3)r:) +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&h]SJ,~> +IfM6GF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKFX2'OF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hg*FaeFTF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFT6JA +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hfDF]EO+ +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`fG>J,~> +!<=Es=P['Z?iF/V?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJr1=DqPK=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C8sJ)IHTK?W^E;=BJp4=C504?W^E;=BJp4=C3?SJ,~> +!< +!<=m+Fkq0?FT-E3FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`hg+F`2AEF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`bND)K^+EFEM_JF`heKF`_bKFEM_JF`heKF`]A=J,~> +IfLcs=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?iO4O?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C:u.!+1:ZaB3Ii=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C:/l!@7_r~> +IfL9E3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk +3&j5a3'oSa6N9"g69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3(!O&!()5ra>e3,3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'u^d!>b`d~> +IfM6HF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFT6J,FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`dP(!-Ed7aE;NFF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`c_f!AXY*~> +!<=F4=?Kqm=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJr0=FOUZ=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?iO4a?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;`)p#H=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^DV!.Y~> +!< +!<=mAFZabgF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`hg*FaeFTF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFT6J>FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_J`-#(%F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM^]!.Y~> +B`KG]?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJqK=9)_-=FOUZ=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?iO5H?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;`)mpb +=BJp4=C504?W^E;=BJp4=C504?W^E;,liG~> +B`Jr/69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j7C2ul;E3.=1R3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa +6N9#`69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a +3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk3&j5a3'oSa69$qk`&JZ% +3&j5a3'oSa69$qk3&j5a3'oSa69$qk(BAs~> +B`Ko2FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hfEFT?O_FaeFTF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FT6K%FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J`,uu? +F`heKF`_bKFEM_JF`heKF`_bKFEM_J1&uh~> +!<=F2=>O;d=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C6V] +^K>M`=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C:2m +!@7_r~> +!<b`d~> +!<=m?FYe,^F`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF``1W +^NFR=F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`cbg +!AXY*~> +!<=Es=JJuI?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E; +=BJp4=C504?W^E;=BJr1=9)^H=B&X0=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;==!rt~> +!< +!<=m+Fea).FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_J +F`heKF`_bKFEM_JF`hg+FT?O%F] +!<=Es=FjSX=@ce$=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4 +=C504?W^E;=BJp4=C504?W^E;=BJqK=;bIJ=C504?W^E;=BJp4=C504?W^E;=BHjLJ,~> +!< +!<=m+Fb+\=F\$UsF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heK +F`_bKFEM_JF`heKF`_bKFEM_JF`hfEFW#:DF`_bKFEM_JF`heKF`_bKFEM_JF`fG>J,~> +!<=Es=FjS*=Sc,p?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504 +?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJqn=90]JJ,~> +!< +!<=m+Fb+[dFo$5UFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bK +FEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`hfhFTF5tJ,~> +!<=Es=FjS*=MIrk?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C504?W^E;=BJp4=C3?S +J,~> +!< +!<=m+Fb+[dFh`&PFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`_bKFEM_JF`heKF`]A= +J,~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=Es=FjS*=HQ\d,liG~> +!< +!<=m+Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d+TR#~> +!< +!<=^&Fb+[dFcgeI/HC;~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=FjS*=HQ\d+TR#~> +!< +!<=^&Fb+[dFcgeI/HC;~> +!<=9o=FjS*=HQ\d,liG~> +!< +!<=^&Fb+[dFcgeI1&uh~> +!<=9o=Kts?:dd,o,p=';%2'Hn+XJ]s3(/="JQVMG!?hGn~> +!<PTb~> +!<=^&Fg6'$DI?%$1+aUe&fMl8/M]R_>$uo(JT^R,!A+;%~> +!<=9o=LM<77PlD-%Jp,/'cnqQ*YnMO":Z.n1e*$uJQV_M!@7_r~> +!<b`d~> +!<=^&FgcDqAP"X"')MY4"pk_G#mU5+";2h48S*HqJT^d2!AXY*~> +!<=9o=LqT:6nfDdrW!-210eUXWOhoJ#Jm[:Jnn(9%/g/.(G/$OJQRJ*r`B1E!.Y~> +!<\JN/3?r\son!.Y~> +!<=^&Fh2\t?pGtMrW!--$lgB9/N3Df#<4Im-Qj36#Q4W)+@'=PJTZNdrcJ5n!.Y~> +!<=9o=M@lE:c'=)!!!EZ>`?8Zaoo;=A3CA#!!4<#:k;`"=90QFJ,~> +!< +!<=^&FhVu*DFlDm!!!65*$dH-4TmYh*YJ_W!!4`DDLlq]FTF&oJ,~> +!<=9o=M\)@:c'!f!!=f`R`+1-!hjZprW!!91f/a*KNJ6u!.Y~> +!< +!<=^&Fhr2%DFl,Q!! +!<=9o=Mn5A3$J8$!^2.Hg<'Z:N(49V!$O=Q=GBoY+TR#~> +!<d!#7):3/0Bn'``a~> +!<=^&Fi/>&=tT^R!YQk=g-#[#,SgUb!%hB*FbY#>/HC;~> +!<=9o=N4GJ:bW=Y!'#SHeB/$4N'..@%5:V0=G^,\+TR#~> +!< +!<=^&FiJP/DEng7!"^M;e3+$r,SC(W&jU>cFbt5A/HC;~> +!<=9o=NFSK7Nha3'kFSpap,Fm'`\4[7Y+["=90QFJ,~> +!< +!<=^&Fi\\0AM!l^"s,PF4U*ee"onWYAV"u^FTF&oJ,~> +!<=9o=NX_L6m2O115s;s"cP#5!$t*c=H-D`+TR#~> +!< +!<=^&Finh1?nD?Y$m`nW"XFNW!&A,:FcCME/HC;~> +!<=9o=NjkN6m2O14e]g:"e%CN!$tHm=H?Pb+TR#~> +!<c/en?d6*/#W"f+6\!#IMD30-$"'``a~> +!<=^&Fj+t3?nD?Y&i% +!<=9o=O("P:a#f=8$'MK"eIIL!&.6#=HQ\d+TR#~> +!< +!<=^&Fj>+5DCkhg(,EZg"Y^>b!'kFQFcgeI/HC;~> +!<=9o=O:.R:bVkL32+"-"Hk&2%6/o@P#q`.!.Y~> +!< +!<=^&FjP77DEn1%&2Cg\"=4BT&mBj/P'$dW!.Y~> +!<=9o=OC4R6k',BP.8X;Esr$b:k;`5=90QFJ,~> +!< +!<=^&FjY=7?kNGH-+H)@+pS)nDLlqpFTF&oJ,~> +!<=9o=OU@T:aH)MCUM:f\jl`#1kAbo=90QFJ,~> +!<2us`oJ,~> +!<=^&FjkI9DDD1s+LO?82AQ8m8V)#LFTF&oJ,~> +-3,2k=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*rJQV_M">gPf33fd3"I^&*(JoZb +QWO83!.Y~> +-3+c?3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQJN3Hb"="3Q4MA&Q"Jch6&iG5" +QT,!\!.Y~> +-3,W?F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>JT^d2"A'4+&2LOS"=OHS,]80U +QZW<\!.Y~> +!<=:u=?98\:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:psI/:a#fRH`tQp_+an=3.Y2!=90QFJ,~> +!<II2&-*-KWj#2bu+NJ/V,mK2us`oJ,~> +!<=_,FZOD_DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DROZjDCkhm-*KH73#;Q->(Lg`FTF&oJ,~> +,lf)j=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJD==?98\:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr;"@]k6k',d_5tc^N!o\<:k;`; +=90QFJ,~> +,leZ>3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&ie73'&oV2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2=`^0/dVMJc)fP#PS*s;21[`U +2us`oJ,~> +,lfN>F`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hT@FZOD_DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DXqoQ?kNGT3357G,R4<7DLlr! +FTF&oJ,~> +!<=;B=9)1q=9)1q=9)1q=9)1q=9)1q=9)1s=?02[=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr`E3^K=AW*r=AW*r=AW*r=>U!XH`>-lYq5ql:fpPF +=IiOp+TR#~> +!< +!<=_NFT?=WFT?=WFT?=WFT?=WFT?=WFT?=YFZF>^F`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>`H;c1F`)>>F`)>>F`)>>F\)Q5-)j$31(=4+DKTiJ +Fe*XU/HC;~> +!<=;A=9DB%=A]!!!)WVr"&N*%;#XPs;#OJu:fpgrr`B.sr)`qqr)`qqr)`qqr)`qqr)`qqr)`qq +r)`qqr)`qqr)`qqr)bsU=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%;"@]j/H?NZVTK*G!"D=u=AXQNT3)+;!.Y~> +!<oK:2)mQQr\sm8r&=[6r&=[6r&=[6r&=[6r&=[6r&=[6 +r&=[6r&=[6r&=[6r&?\o3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT +2)mQQ3&icT3&NZT2=`^/*WR"XVUu)O!!t8;3&Q7HT/Zid!.Y~> +!<=_MFTZN(F`.2$!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3Yr,i!Wr,i!Wr,i!Wr,i!Wr,i!Wr,i!W +r,i!Wr,i!Wr,i!Wr,k#;F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>EDXqoP5QD!CVEG,!!"r[^F`)bQT61/d!.Y~> +"99TI=A\ot!)WYs!)WVr!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr"&N*%;#XPs;#OJu:fpgrr`B.s +rE'.u=BJE!=9)1r=9DB%=A]!!!)WVr"&N*%;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq +;#FDq;#FE-:fpgr=BJC%=AW+%:fnk@/\7b#"+("W3:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:k;a%=90QFJ,~> +"99/r3&UUn!&aa8!&a^7!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7"#W%t2?#Q82>oK:2)mQQr\sm8 +rAXm:3&iep2uki73!2#t3&U[p!&a^7"#W%t2>fE62>fE62>fE62>fE62>fE62>fE62>fE62>fE6 +2>fE62>fEG2)mQQ3&icT3&NZT2)l +"9:#rF`.,"!,hdY!,haX!,hdY!,hdY!,hdY!,hdY!,hdY!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3Y +rH/3[F`hU$FT?=XFTZN(F`.2$!,haX")`7(DZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VW +DZ"VWDZ"VhDKU)>F`hSEF`)>EDKRN2%5t"F"!mp[>5iY(DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DLlr`FTF&oJ,~> +!<=;B=9;<$;#XPs;#XQ#:fpOr=A]!!!)WYs!)WYs!)WYs!)WYs!)WVr!)WYs!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr"&N*%;#XPs;#OJu:fpgrr`B.s +rE'.u=BJE!=9)1r=9DB%=A]!!!)WVr"&N*%;#FDq;#FE":fpO1!'S/maoe4D!&V\t1f.:N=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AY#[!?hGn~> +!<oK:2)mQQr\sm8 +rAXm:3&iep2uki73!2#t3&U[p!&a^7"#W%t2>fE62>fE<2)mH+!("l(fE8)c!$fKC1c76M3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&Q^U!>PTb~> +!<=_NFTQH'DZ4bYDZ4b^DKTi>F`.2$!,hdY!,hdY!,hdY!,hdY!,haX!,hdY!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3Y +rH/3[F`hU$FT?=XFTZN(F`.2$!,haX")`7(DZ"VWDZ"V]DKThB!"q8c4TdAC!(k1Q1i@GRF`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`*4^!A+;%~> +!rsKH;#OK":fpOr=A\ru$W'r-:fpgr=AW+%;#XPs;#XPs;#XQ#:fpOr=A]!!!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr!)WYs!)WYs!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr#uF`+:fpgr(B@1%aulaH!&.MW:fpgr +=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJDC=?98\:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:ruf?+TR#~> +!rs&q2>oK<2)mHQ3&UXo$T0n'2)mQQ3&NZT2?#Q82?#Q82?#Q=2)mHQ3&U[p!&aa8!&aa8!&aa8 +!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7!&aa8!&aa8!&aa8!&aa8!&aa8 +!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7#rO\%2)mQQ%ffM"fK?Vc!$4*Z2)mQQ +3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&ie=3'&oV2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ29@fY'``a~> +!rsoqDZ+\]DKTi>F`./#$Z:*0DKU)>F`)>EDZ4bYDZ4bYDZ4b^DKTi>F`.2$!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX!,hdY!,hdY!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX$#Xm.DKU)>+934M4ZkJ+!'k[LDKU)> +F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hTFFZOD_DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DTR#%/HC;~> +(B>U\:fpOr:fpOr:fpOr:fpOr=AW+%;#XQZ:fpgr=BJC%:fpgr=BJC%=AW+%:fpgr=AW+%:fpgr +=AW+%:fpgr=AW+%:fpgr=AW+%:fpgr=AW+%;#XPs;#XPs;#XQ#:fpOr=A]!!!)WYs!)WYs!)WYs +!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WYs!)WVr!)WYs"&Kd6>b0"?YpBB%;#OJr +;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#FDq;#XQQ:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr`E5,s=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*C!.Y~> +(B>102)mHQ2)mHQ2)mHQ2)mHQ3&NZT2?#Qt2)mQQ3&icT2)mQQ3&icT3&NZT2)mQQ3&NZT2)mQQ +3&NZT2)mQQ3&NZT2)mQQ3&NZT2)mQQ3&NZT2?#Q82?#Q82?#Q=2)mHQ3&U[p!&aa8!&aa8!&aa8 +!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&aa8!&a^7!&aa8"#UShA"D6T]dEe$2>oK7 +2>fE62>fE62>fE62>fE62>fE62>fE62>fE62>fE62?#Qk2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT +2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ`Afk83&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZ1!.Y~> +(B?%0DKTi>DKTi>DKTi>DKTi>F`)>EDZ4c@DKU)>F`hSEDKU)>F`hSEF`)>EDKU)>F`)>EDKU)> +F`)>EDKU)>F`)>EDKU)>F`)>EDKU)>F`)>EDZ4bYDZ4bYDZ4b^DKTi>F`.2$!,hdY!,hdY!,hdY +!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,hdY!,haX!,hdY")]4]*1]4q1(""HDZ+\X +DZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ"VWDZ4c7DKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>`H=1YF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=R!.Y~> +8,sf8:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr=A\ru"&N*%;#OKY:fpgr=BJC%:fpgr=BJC%=AW+%:fpgr=AW+%:fpgr=AW+% +:fpgr=AW+%:fpgr=AW+%:fpgr=AW+%;#XPs;#XPs;#XQ(:fpOr=AW*r(BA!8ap,[.!%h;T;#XPs +;#OJu:fpgrr`B.srE'.u=BJE!=9)1r=9DB%=A]!!!)WVr"&N*%;#XPs;#FDq;#FDq;#FDq;#FDq +;#FDq;#FDq;#FDq;#FDq;#FEU:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr +=BJC%=AW+%:fpgr=BJC%=A[(@!`1$?J,~> +8,sAa2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ3&UXo"#W%t2>oKs2)mQQ3&icT2)mQQ3&icT3&NZT2)mQQ3&NZT2)mQQ3&NZT +2)mQQ3&NZT2)mQQ3&NZT2)mQQ3&NZT2?#Q82?#Q82?#QB2)mHQ3&NZQ%fgC7fETSJ!$4*Z2?#Q8 +2>oK:2)mQQr\sm8rAXm:3&iep2uki73!2#t3&U[p!&a^7"#W%t2?#Q82>fE62>fE62>fE62>fE6 +2>fE62>fE62>fE62>fE62>fEo2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ +3&icT3&NZT2)mQQ3&icT3&Sc:!]:\mJ,~> +8,t5aDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>F`./#")`7(DZ+]?DKU)>F`hSEDKU)>F`hSEF`)>EDKU)>F`)>EDKU)>F`)>E +DKU)>F`)>EDKU)>F`)>EDKU)>F`)>EDZ4bYDZ4bYDZ4bcDKTi>F`)>>+93IP4U*kQ!'k[LDZ4bY +DZ+\[DKU)>rcJ3YrH/3[F`hU$FT?=XFTZN(F`.2$!,haX")`7(DZ4bYDZ"VWDZ"VWDZ"VWDZ"VW +DZ"VWDZ"VWDZ"VWDZ"VWDZ"W;DKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)> +F`hSEF`)>EDKU)>F`hSEF`,9C!cBRiJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:]XZpr)a%t=BJDu=;Oe9=AW+%:fpOr=AW+%:fpgr=BJB9!,J"F#/N%p/Qc+Or`B.s +rE'%rr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.srE'.u=BJE!=9)1r +=9DB%=A]!!!)WVr"&N*%;#XPs;#OJu:fpgrr`B.srE'%rr)`qqr)`qqr)`qqr)`qqr)`qqr)`qq +r)`qqr)`qqr)`qqr`D3X=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+%:fpgr=BJC%=AW+% +:fpgr=BJC%=AW+%+TR#~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2$#Zor&=d93&ieo3#=G33&NZT2)mHQ3&NZT2)mQQ3&ic+!-=R\#0f"**]Q,:r\sm8 +rAXd7r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8rAXm:3&iep2uki7 +3!2#t3&U[p!&a^7"#W%t2?#Q82>oK:2)mQQr\sm8rAXd7r&=[6r&=[6r&=[6r&=[6r&=[6r&=[6 +r&=[6r&=[6r&=[6r\uqr3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT2)mQQ3&icT3&NZT +2)mQQ3&icT3&NZT'``a~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>D?4ltr,i*ZF`hU#FVeqEDKTi>F`)>EDKU)>F`hRE!$I[m"um"k5]q3ercJ3Y +rH/*XrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrH/3[F`hU$FT?=X +FTZN(F`.2$!,haX")`7(DZ4bYDZ+\[DKU)>rcJ3YrH/*Xr,i!Wr,i!Wr,i!Wr,i!Wr,i!Wr,i!W +r,i!Wr,i!Wr,i!WrcL8>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>EDKU)>F`hSEF`)>E +DKU)>F`hSEF`)>E/HC;~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:aK4?=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r:_s+:Qc]ND,lfW$=A]!! +"]/;t=BJE!=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1r=9)1s=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9DB%=A]!!!)WVr"&N*%;#XPs +;#OJu:fpgrr`B.srE'.u=BJE!=9)1r=9DB%=A]!!!)WSq!)WSq!)WSq!)WSq!)WSq!)WSq!)WSq +!)WSq!)WSq!)WYs!`1$?J,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'k4>3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ2%fn!Qe2M^-NG2I3&U[p +"Z87s3&iep2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki72uki82uki8 +2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki83!2#t3&U[p!&a^7"#W%t2?#Q8 +2>oK:2)mQQr\sm8rAXm:3&iep2uki73!2#t3&U[p!&a[6!&a[6!&a[6!&a[6!&a[6!&a[6!&a[6 +!&a[6!&a[6!&aa8!]:\mJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DC'FCF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>DBo3%QTYO2$33>6F`.2$ +"`AI#F`hU$FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=XFT?=YFT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFTZN(F`.2$!,haX")`7(DZ4bY +DZ+\[DKU)>rcJ3YrH/3[F`hU$FT?=XFTZN(F`.2$!,h^W!,h^W!,h^W!,h^W!,h^W!,h^W!,h^W +!,h^W!,h^W!,hdY!cBRiJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:aB.>=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r+TPZ1atLRW!&Re[:fpgr +=BJC%=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=A]!!!)WYs!)WYs"]/;t=BJE!=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1r=9DB%=A]!!!)WVr"&N*%;#XPs +;#OJu:fpgrr`B.srE'.u=BJE!=9)1r=9)1s=90QFJ,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'b.=3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ'`_0tfItJs!$aH_2)mQQ +3&icT3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&U[p!&aa8!&aa8"Z87s3&iep2uki8 +2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki82uki8 +2uki82uki82uki82uki82uki82uki82uki82uki82uki82uki73!2#t3&U[p!&a^7"#W%t2?#Q8 +2>oK:2)mQQr\sm8rAXm:3&iep2uki72uki82us`oJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBs@BF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>/H?QO4YJc%!(h +F`hSEF`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`.2$!,hdY!,hdY"`AI#F`hU$FT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=XFTZN(F`.2$!,haX")`7(DZ4bY +DZ+\[DKU)>rcJ3YrH/3[F`hU$FT?=XFT?=YFTF&oJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a9(==AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*G!(W6q+0cje6r6u^=AW*r +=AW*r=AW*r=AW*r=AW*r=AW+%;#OJu:fpgrrE(mQ=BJC%=AW*r=BJC%=AW+%:fpgr=BJC%:fpgr +=BJC%:fpgr=BJC%:fpgr=BJC%:fpgrr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.s +r`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B.srE'%rr`B.sr`B.sr`B.sr`B.sr`B.s +r`B.sr`B.sr`B.sr`B.sr`B.sr`B.sr`B;"=BH^HJ,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'Y(<3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZ3!(W7*+2&cs/i>UG3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZT2>oK:2)mQQrAZVk3&icT3&NZQ3&icT3&NZT2)mQQ3&icT2)mQQ +3&icT2)mQQ3&icT2)mQQ3&icT2)mQQr\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8 +r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8rAXd7r\sm8r\sm8r\sm8r\sm8r\sm8 +r\sm8r\sm8r\sm8r\sm8r\sm8r\sm8r\t$<3&hWQJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBj:AF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=W!#Cb]+#4-&?uC+)F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>EDZ+\[DKU)>rH0r7F`hSEF`)>>F`hSEF`)>EDKU)>F`hSEDKU)> +F`hSEDKU)>F`hSEDKU)>F`hSEDKU)>rcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3Y +rcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrH/*XrcJ3YrcJ3YrcJ3YrcJ3YrcJ3Y +rcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ3YrcJ?]F`f89J,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a9(==AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AUgS1;T-r=f`#37T`bh=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=BJE!=?B>]=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=AW+%:fpOr=AW+% +:fpOr=AW+%:fpOr=AW+%:fpOr=A]!!!)WYs!)WYs!)WYs"]/;t=BJE!=9)1s=9)1s=9)1s=9)1s +=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9)1s=9DB%+TR#~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'Y(<3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&Mo\29h<:=go"D0fV-M3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&iep3'/uW3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&NZT +2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&U[p!&aa8!&aa8!&aa8"Z87s3&iep2uki82uki82uki82uki8 +2uki82uki82uki82uki82uki82uki82uki83!2#t'``a~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBj:AF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`'bN$ojD5=Y^3^AT`-5F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`hU$FZXJ`F`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`)>EDKTi>F`)>E +DKTi>F`)>EDKTi>F`)>EDKTi>F`.2$!,hdY!,hdY!,hdY"`AI#F`hU$FT?=YFT?=YFT?=YFT?=Y +FT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFT?=YFTZN(/HC;~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a0"<=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=?$:%_2ufhOoQ+k=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r&Qhk3 +:fpOr:fpOr:fpgr=BJE!=:e;2=AW+%:fpOr=AW+%:fpQm==[3M=AW+%:fpOr=AW+%:fpOr=AW+% +:fpOr=AW+%:fpOr=AW+%:fpOr=A]!!!)WYs!`1$?J,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'P";3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3%Y+Qc&gS-RfEjS3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ&NDX- +2)mHQ2)mHQ2)mQQ3&iep3"Rr,3&NZT2)mHQ3&NZT2)mJl3%HjG3&NZT2)mHQ3&NZT2)mHQ3&NZT +2)mHQ3&NZT2)mHQ3&NZT2)mHQ3&U[p!&aa8!]:\mJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBa4@F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F]nbO306:Q,lej$F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>&Tqu6 +DKTi>DKTi>DKU)>F`hU$FV&G5F`)>EDKTi>F`)>EDKTjqFXq?PF`)>EDKTi>F`)>EDKTi>F`)>E +DKTi>F`)>EDKTi>F`)>EDKTi>F`.2$!,hdY!cBRiJ,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:a&q;=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r7K +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'Fq:3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ0`ViqNnAi&!#7IN3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZ`2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2>fE92)mQQrAY3C3&icT3&NZQ3&hWQJ,~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBX.?F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>AH2rjN]hk7!%i>2F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=iDKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DZ"VZDKU)>rH/NdF`hSEF`)>>F`f89J,~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:`rk:=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r%02j]aoeo#F2=ftIm!cg=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=C"a*:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fnk@J,~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'=k93&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ#lpdcfE8gFHd/MAImF&Z3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3*eC$2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)l +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DBO(>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>&ca?E4TdGe+ulMaIhD`QF`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F^8m-DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKRN2J,~> +IfLWg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r= +IfL3@3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3$1";2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mH.!.4Rp!k1ZSoI'YOrVusRc/dL] +[rXh_-W6qgfRLm`!%p5g3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&Ou$2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mH.!.Y~> +IfM'>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>FWYLDDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKThK!$_8&!\tN#oEtU'rVus.3934, +1*@2:$5YD@4b#?r!+9qeF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`(K-DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKThK!.Y~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:``_8=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AUgS8,::-3:$VFHfiHOX>9VP!3FGf +J"ZiO:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:g@+!=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r= +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'+_73&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&Mo\8,:d;4R<%JK]^nf[l+!^!4U5* +J#iVV2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2-`*u3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3#)FD~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DB>F`)>>F`)>>F`)>>F`)>>F`)>>F`'bN(AU)n&F9As-0@>k1(=!Z!&De^ +Ik^p9DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DHq=%F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>FY*TD~> +IfLWg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=<::@:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:db:)_>24R8*g3U/a(7W_%lbG!0#.E +IsV/=:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:g7$u=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r+TR#~> +IfL3@3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3$'q:2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2(ekOc2#ul8*g3U1$@0ibnp0U!0k^[ +ItRe:2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2-W$t3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ'``a~> +IfM'>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>FWPFCDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DIDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DHh7$F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>/HC;~> +IfLWo:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:`WY7=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r:^mE(prWZSJee(]"Um@\7lVRf!!!Gj +aoJ%/!!*hGbK><)!&ReS=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW+':fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:a#gh~> +IfL3C2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2'"Y63&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ2$j8hpt,YmM\l0h"VNpf7m%pl!!!Yp +fDqoH!!*nUbLh;7!$aH\3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&N[!2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2&-+A~> +IfM'CDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DB3k;F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>D@uq$pcS[<-O0AH"U>SS((^fM!!!8e +4TI23!!*9^b<:=j!(h>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>*DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DCkj=~> +IfLWg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=<(.>:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr+TQl^aoHeb!!*MEr5o&O8,WGNaoT=" +qZ$XVXNJ\8\ePZD=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r>$+U':fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fnk@J,~> +IfL3@3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3#je82)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ'``p[fDpU$!!*_Wr7D%i8,WGNfE'5> +qZ$XZ\'!?Q`YSq93&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ=u\B!2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)l +IfM'>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>FW>:ADKTi>DKTi>DKTi>DKTi>DKTi>DKTi>/H@*i4THf)!!*>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>>'4_*DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKRN2J,~> +!<=:n:i0<2=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=>U";oZ@0= +q>^LNq8re&!!")&ap,F^4ZH/WXN/J5OoQ:p=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=]eL&:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:a#gh~> +!<^LQq:Gd8!!"/(fET?*5s/%l\&[-NRfEsV3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ=ZA8u2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2&-+A~> +!<=_%DJaN6F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F\)QEoK<10 +q>^L(q)nfm!!!>f4U*ea&eGj'1<2P-,lf'*F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>=`nV)DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DCkj=~> +/-$hq:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:ftk:2crmY:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOj=ATG8](=)@!!#"Wb5Z#Paof4, +'o_q1!jS?8rQ55IR\%@faofS`R_e^?"g!Z7N1n)]ap#AUR[ThQqoT&QSsl7ep<%kf!&RMS:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*C!.Y~> +/-$DE2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)r`92`NZS2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHN3&M!T`q.jZ!!#.[f`,aefE9,J +(R4^I!kkS]rR_4cUoDW2fE9R2Us8Vc"h0_SPcW.'fEK:$Unk!'qq)%kWMHN +/-%8EDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKX*>2g'"\DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi7F`%fs2Y0*.!!!T/4oZT'4TdSO +"sit,!\uGsrB16<-nmXQ4Te&,-ogo`"Yq>N,V_:P4U!_q-n$c)q`P'?0ISV7p-!m@!(h'NDKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi! +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)=R!.Y~> +@fRZK=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=O9kJ=AVg;!.sda!#>A2!''u# +"+("JC\PsY_2M)'!!#a9b)@D?!!,TkqT8oOHVGgc!!#ahao[_h%/U#*8"TY$!kMnoq>^[6K$)6) +-2[`C8,(./_%crH:k)SD=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AVpu:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:a#gh~> +@fR6$3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ37'Md3&NQ.!/pF#!#PM4!'L85 +",$XSF8+;oc'2*B!!#pLfT[NW!!,U!qUbniKMj2s!!#pmfE.O.')MY08#cF=!lf"1q>^[8MqH[X +-i +@fS)uF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>FjP"0F`)(K!%7>#!!`<#!"f,m +"!mpI+SS#+3$]:E!!!fu4X:@4!!*ijqE4p=,o6pf!!!i24TZoB#Q"K%(,5YL!]D)/q>^['-TsU@ +$N'l((ABrp3!KA#DLZeHF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`(-#DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DCkj=~> +!<=:n:hs00=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*Z!'Tkp!%n'J +!''u#"&/aq/c!NjSkTXk!!4puK),HJ%%dF?!M2IN!!#"UaoSS!p&G8$_90p=*qfU6aoDkH!!'+p +b(#QS+])9;=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW($:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:a#gh~> +!<0/3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZI!($/-!&=?N +!'L85"&]+!1&9H'WDXB,!!5%1Mu!DS&uki^!NAB]!!#.YfE&H=p&G8+c.L[s+SGg8fDlQ\!!'M& +fRK@j'f@s.3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&Obs2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2&-+A~> +!<=_%DJOB4F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>*!#"fb!"Jf* +!"f,m!uCq;%J`-g0Gaul!!3Ql-i*fD#;H*>!AG/_!!!T-4TR;Hp&G793'BDl$2+B!4TG``!!"eK +4b"aX/T,]KF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`(9'DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DCkj=~> +/-$hq:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fth9/m(qP:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOrr_NY*%(buO!%n'J!$;-^!$;+>qT8e. +q#CF(AG?--*l6"AN;*AQ3;go"Opps_"$OTF](Q++*m2VbqZ$UOou_bS!'!eW:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOp=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r= +/-$DE2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)r]8/iY^J2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQr\X``'#sIo!&=?N!$M9n!$M7@qUbd< +q#CF.C\Rl4+O/QkPkY4Y4T*h4RhG>n"$tAf`qBB7+P>=/qZ$URp"4aa!%g&f2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHo3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3#)FD~> +/-%8EDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKX'=/p2&SDKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>rb_cM#<)*8!"Jf*!"&Wf!"&W)qE4fo +q#CF#*r#^<#rk(2,kq?>&H"Zl,mX&B!tmsa2YI+Q#sCE_qZ$U)of[d?!*X8_DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKThtF`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>FY*TD~> +!<=:n:c2?O:fpOj=AVgr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +d80sJ:aH*_nB(_oq#CF:%/g/+])9\N]'KD!R``c)p](:RrQ5,/qZ$X<1ALnQ=j"m.%/9f)HcjL9 +r;ZjERe4`(\dT&!:k)SD=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AUDJ:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:f(7j +=AU.@J,~> +!<nCR_,q#CF<')_e1`r+Hh`p<[-UtF2>I4T;qT`L')2G/K\4qj +r;ZjGV"E:@`Y&U/21ISC3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&N*D2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)R?N +3&MENJ,~> +!<=_%DDcQSDKTi7F`))>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +d;B)0DDD29n3$aaq#CF%#Q4W&2Z,]<2XCDG-p9^&p](:*rB1-/qZ$X'%/Bl+(-Of)#P\9$,s=CH +r;Zj*..fY(2?slGDLZeHF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`&UMDKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DJjT7 +F`&c2J,~> +.KCVg=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgrrD3Jrr(mAqdSM]$:f(7j +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpO^!%mZ^!'ToR!3uFD!,M +.KC2@3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQrA=R7r&"I6dPWd>2)R?N +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHG!&p92)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)l +.KD&DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>rGDUXr,)LWdV^g_DJjT7 +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi)!"JB[!#"l'!&FF7!$M"9 +!=8u+!!=E.4X0Y$!"f,m!B(/[!!Du%2@]H^!%%V-":"o,#<)-9/0Y'ZDKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKX-?Ecl8BDKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKRN2J,~> +!<=;@:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:b#RD:fpOj=AVgr:f(7j:fpOj=AVgr +:f(7j:fpOj=AVgr:f(7j:fpOj=T)%r=OU(J(BC/taoFTr!!';#aoICr!!@hqb!#S$!*oNG!O3C9 +!!#"XaoGuL!!$:'aoEaa!!#OgaoJ.2!!=Oib-CpG!,M)H?lf;;=AVgr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpOr:ft\52crmY:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr +:fpOr:fpOr:fpO;!.Y~> +!< +!<=_LD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWDCTdHDKTi7F`))>DJjT7DKTi7F`))> +DJjT7DKTi7F`))>DJjT7DKTi7Fo?1XFjk40+94.b4TH,d!!"eN4THc'!!=T34VISk!$(u$!AXlU +!!!T04THQ#!!"#<4TGic!!!f64TI54!!DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKTi>DKWp92g'"\DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKTi>DKThK!.Y~> +!<=;,:]OVq:]OVq:]OVr:]jfr:g!]n"'AAr=T)%r=Sttq=Sttq=Sttq=Sttq=Sttq=Sttq=T2+s +=T)&K=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j2ul\@aoFU$!!4H@ +*rQ*7aoK9R!<1+@T)&Ee:&W37>l"F#3<%&#(&It2>lMkGAGH6(aoFU#!!\%tA,lT<_=5SMOoQY% +=P6Mg=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW,B:]V^> +J,~> +!<Ic1'?gRfF0\ +38$0,3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&N\<2$"El +J,~> +!<=_8D?+hWD?+hWD?+hXD?G$!DKYqr"*JL!Fo?1XFo6+WFo6+WFo6+WFo6+WFo6+WFo6+WFoH7Y +Fo?21F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7=o]B,4TH,k!!3KD +$2jl"4TIJ;!<,+]0_tbL(]?Js*;TX8&H4fm#5\B#*<&)$*r,g74TH,j!!Xf6*WQ0F3:K'6,lfN7 +FkLYMF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)?ED?2 +!<=:K:]OVs:]OVq:]OVq:]OVs:]OVs:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVp:]_(7]'d]@ +4o,-_]#r/I!!")9aoK9S!!")>aoK9S!!#OfaoG]C!!>4'b-CdC!'U>(!1rud!29D7!1rud!=WN< +!!#a]aso@N6r6u^=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=NaN]=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r= +!<@9fY.+]!($V:!3,bo!3H1P!3,bo!>92I +!!#pbfIAu`/i>UG3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ36O1"3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3#)FD~> +!<=^WD?+hYD?+hWD?+hWD?+hYD?+hYD?+hWD?+hWD?+hWD?+hWD?+hWD?+hWD?+hVD?:FU2XW^. +')DS42Ea24!!!?$4TIJ>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>Fj"ZCF`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>FY*TD~> +!<=9o;"RQg=AVgr0E>nUaoF$j!!!c5aoctj!*oKF"L5nfb/*oS!$;*]!"A`)!'U;'!*o@#"$"HG +Red!a(&l>U`;'B5P5WN'3;!7OT'j`&W;mae:c)9N:fpOj=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r=AW,>:cDKQ=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=AW*r=AW*r+TR#~> +!<4S8[SWUAC?ZN(Wj2)I9M2)mHN3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&N\82)dKP3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ +3&NZQ3&NZQ3&NZQ3&NZQ3&NZQ'``a~> +!<=^&DY.fNF`))>5QDqo4TGrg!!!6&4Tcu1!$(r#">W>-4ZN9>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>F`)?ADDu]UF`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>F`)>>F`)>>/HC;~> +!<=9o;#O2m84cBDpeV#$'uB:[!%%LB!#>LU"0;J2Z2VlL>Q>h]b/*oS!$;*]!"A`)!&FMq!*o@# +"$"HGP5,(XZ2VlG*r5j:T)He3P4ekU*ph#t7fYqR=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr +:f(7j:fpOj=T2+s=NsZ%=AVgr:f(7j:fpOj=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r=AW*r +=AW*r=AW*r=AW*r=NXG@+TR#~> +!<f?34SL]7#oCkRfDm;r!!!i7fE8S_'#":s"_.NTc.L;;!!"/?fDlQ]!!"nTfDoFX!!>@9 +fUM[:!58Ba!$M+PTb~> +!<=^&DZ+GT;E-X6phg-G"uu!5!"/T'!!`Ec"#9i]1B'E?)up:)4ZN9DJjT7DKTi7F`))>DJjT7DKTi7F`))> +DJjT7DKTi7FoH7YFj4e`F`))>DJjT7DKTi7F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>>F`)>> +F`)>>F`)>>F`)>>FinS&/HC;~> +!<=:':]a0Z8c26_8P&bU#Y@le:J=PX7nEPS!\FD!m)f;:q>gK:!O9K?aoJF?!!7bp](uC,*rX4]% +/U#)1B#>q>l"F&36KC;q#CDArlP4#q>^N3r5o!cpAb2(m)fL:!#JI.=Sttq=Sttq=Sttq=Sttq= +Sttq=Sttq=T)&M=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj= +T2+s=Sttq=O0f&=AVgr:f(7j:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr:fpOr: +fpOr:fnk@J,~> +!<pm+;:Nq>gKH!PQbWfDr8W!!8)2`qfZ8+T9pm')MY/ +2>u/-A,60-4P8;fq#CDJrn%35q>^N?r7CuspAb2/m+;KT!"q.H3;bW63;bW63;bW63;bW63;bW6 +3;bW63;k]g3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3;tc8 +3;bW636sH@3&NQQ2)R?N2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ2)mHQ +2)l +!<=^3D?<]q3;b6,3)]Zl#WN(i!<<-#(/k'J!^H`3lob=Rq>gIW!AZY64TI)5!!4N22YmCR$2m!e +#Q"K$%/i^LTr&k#epAb17lobM-!$lH"Fo6+WFo6+WFo6+WFo6+W +Fo6+WFo6+WFo?23F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7 +FoH7YFo6+WFjFqaF`))>DJjT7DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi>DKTi> +DKTi>DKRN2J,~> +!<=:+:^0Ha7nc]P:]4-&9M\>U;+sPQ:Mm8Ta1IU6:JC^`!<=2-aoK9R!!'k2aoF3r!!7MiXSMns +*rX7X!!">DaoG]C!!>4'b/*lR!''u#!'U2Z!''ku!0$XP!3tk4!_iY_lqd[ar(mAqr(mAqrD3Su +:f(9m:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVq:]OVs:]OVs:]OVq:b>dG:fpOj=AVgr:f(7j +:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgrrD3Jrr(mAqdng&g!.Y~> +!<'GRMHu)PS7/\tD!$LX\!6t<>!6t>l!&a`U!ef48q>^L< +rRgrH!%7`t!+Yj*"$G5gc1q>>4TUF3&NQQ2)R?N2)mHN +3&NQQ2)R?N2)mHN3&NQQ2)R?N2)mHN3&NQQ2)RAl2#oW62#oVb2$"ElJ,~> +!<=^7D?`ug('"@8!W<99!!*'"#V%en!AT\D[A7XF!@n%c!<DJjT7 +DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>rGDUXr,)LWdr#1 +!<=:-:^BW_:J>ATZcD&'m0M\&]9RG79M]9tm0M[*9MA8Z/HCChaoJ.2!!&_iaoTFTr;Znfb+AG0 +!$;-^!4r",!$;*]!*o@#!''u#!'U,X".mZX(&It2T)-S0*r,d91@!!`X8j'C:]OVq:]OVq:]OVs +:]OVs:]jfr:g!Zm!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q!*K.q/m(qH=AVgr:f(7j +:fpOj=AVgr:f(7j:fpOj=AVgr:f(7j:fpOj=AVgr:f&;8J,~> +!< +!<=^9D?r3;!<=KIR'k]Im0MIjUhr-u!!+JEm0MHH!%Ml(5QE1u4TI54!!"bN4TRndr;ZmI4YZ^4 +!"&Wf!&jZR!"&Te!$(h8!"f,m!##)-"#)l$#5\B#0`!p4$2FQ$%-ftW1&rT+D?+hWD?+hWD?+hY +D?+hYD?G$!DKYnq!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W!-S3W/p2&LF`))>DJjT7 +DKTi7F`))>DJjT7DKTi7F`))>DJjT7DKTi7F`))>DJh$+J,~> +!<=:/:^'B[:KaCCoBcY=]6gm[m0/5<8PfC.lcK3l"F#3<%&#U%nZi$p>p6!!$g1aoHea!!%B1aoY'57"J26:]OVq:]OVq:]OVr:]jfr:g!]n +"'AAr=T)%r=Sttq=Sttq=Sttq=Sttq=Sttq=Sttq=T)%s+TR#~> +!<^LXrn%4Pq#CI/5puO0!-@tg!/1.J!/0Uh!_35CJMmEa!''m6!''m6!''p7"#r.q3;tc; +3&NQQrA=R7r&"I6r&"I6r&"I6r&"I6r&"I6r&"I6rA=Tj!.Y~> +!<=^;D?WoR!>^+-oBcY7UdpgJm0-Ji3,S^&lTG4hq#CX/+seW`,od-f!!04TZB!@"E4pD?+hWD?+hWD?+hXD?G$!DKYqr +"*JL!Fo?1XFo6+WFo6+WFo6+WFo6+WFo6+WFo6+WFo?1Y/HC;~> +!<=:0;#a2i;5*%;"D1=Z!.sU\!P2"l!!>sl"F#3;pu"C[qH*AGF:J +`"i+K!5[pB!hKB +!<:3#&!''p7!''m6"?87r'``a~> +!<=^ +!<=:1:]j3]He79E"1q5Q($s'C=mH%hXND:P!!0ofpAb;:b0!uc!!#"VaoH5M!!*gdpJ,~> +!<X!-"+3`h([TcS;sODb\(DMk!!1?&pAb;Bf[s^1!!#.ZfDp!c!!*mop=K@dqZ$Ud +kL]em!.d#82$"ElJ,~> +!<=^=D?CXS8'Ku["/Go(#4+JQ(@(r%1-Gj9!!,&,pAb:>4Zse]!!!T.4THVt!!*9Op,rBuqZ$U3 +k +!<=:2:]aKfU#55==ZCKhaoI%[!!>s!_:D)p](F*WQN@gq>^LTqoSr21ALnO'kFoQap*G4 +!&Ch%_>=34RchfpMuYG\:ps1$+TR#~> +!<^LXqq(qK2>I4R(Mh%ffER6M +!&_IBc2.J@V!$A3PQ2bU27>@C'``a~> +!<=^>D?:(DIGaDn((_\V4THkr!!=$#4Vmem!Z!pQp](F%/Nl6:q>^L,q`Os6%/Bl)"s,]"4U*8< +!":VG3;W[U.-E_p,QL)\DROE`/HC;~> +!<=:3;#aAmZek'NL.oGLaoT)Fnt?2LF%ofRrlPMl"F# +3;L]%XE.W07nmcjq8r]+r;ZpOb/u^B!!"V4aoN4dJP`dO!?hGn~> +!<PTb~> +!<=^?DZ9tBR,733<<,#E4TRGpnhC7n+r;"Sr]LN@+;YY+(*"GOr]LQB*Z#S)()J#>2Z>i>*;TX8 +&G\Ho1*R\N()J)Iq)n^+r;Zp/4ZsAT!!!Ji4TPa"JSqo6!A+;%~> +!<=:4:]a-\]A;iUZV7@/aoG]C!!#ORaoG06!!9FJ3;igWRcVZnCB-2B:q'7%+TR#~> +!< +!<=^@D?:RRUttD>QiJ_K4THJu!!!f!4TH;r!!4o=&H)S/.-3Sn+94uaDRXKa/HC;~> +!<=:5;#a2hW8-bAf1_.6aoHeb!!$9gaoFs0!!,T#r;ZgljN7P8!#N%>!(QiRs$hrD!?hGn~> +!<!!,T*r;ZgqjOaOR!"u[s!&=@'s"THi!>PTb~> +!<=^AD?;9fLYV7ubQ&p!4THf)!!"#'4TH8q!!*iVr;Zg6j?3Q&!$nsi!+l%8s(..,!A+;%~> +!<=:6:]a0]HeRif;09Fm!hl&Qq>^MIl,j!IpAb4?_;iZ>7fZ#g:]VjOo`,4+&f2];1c.Ue:]V^> +J,~> +!<c(8!!`f=%i#m*,;,PTb~> +!<=^BD?<]98)!>2#SXg5!\l)=q>^LCkrf"jpAb4$39*.'('%pUD?2L*o`,40)B^Ue8P* +!<=:6:]aKsiS*Z"AnCVW#J-X`CgLFr_9pC*U%eTg'u]@Z!Pp)X!!+jdilV=c!%k`X&Ie^c=D;nl +F_Pu$=BJ0W1aEP-!!E`I,rA)^:]V^>J,~> +!<Bb46 +Fa%t@>?aca3@5(0!!ET=(F(Z*2$"ElJ,~> +!<=^BD?:(ZgY2#q-OfW1#<""M%gWFW370kh1&(_L#".Wh!'n)4&J>'lA9`EF +H?aaJA7SV*3[bX +!<=:7:]a3^Y1`1CHWKm`!jRGcr_*JuF)=TW]$e_$Z2"A#'qsg5!l8+Mr;Zj>Hf)sH$k9dE![Rhh +n\GIDWg8-I8h(;L!! +!<^%hX/(TcfP!mP3fr;Zj@K\tD_&dc-,!Z(iZ +n](mPYaL8V9J?eP!!PTb~> +!<=^CD?;ctOP0"%7g8WM!\t]#rW!*;3\^U?2UX_g1ALnN"u5:(!]V/)r;Zj)-/Uid#84Uc!\sb% +n^e#p^8@-/;_Jd_!! +!<=:7:]XF$f^/]o:\r3>_3/+u9P0R%iVr3G]1dq+aoRYHr;Zm?CV&TL"MpdjP-Nic!aG^n]2/M; +)uIGPWeLFp"+QW3^%]>FWde,&rW!!98j]=M!?hGn~> +!<I;#8fMc'r*6935qWNrG4DHqTCFfE%Har;ZmAF2m:n"O4$4S%[Y1!b23_]/9Tq +,5]C]Y_i@%",E;C_tV1RY_QF>rW!!49Lkm9!>PTb~> +!<=^CD?1"af^/]>!W"qb3$eh1!%2WZg]$RAU];@]4TQi8r;Zm*+?&:D"?8+],r4:>!ZV2J]5@W^ +./VTs^6S\D"-f[ke+_Gr^6E.crW!!F;eVtE!A+;%~> +!<=:8:]a0]W7^J=Pt]$lap!r/9OO.;q<\2pA^AL$Z'q8q\B4lE!%#6R!j1`J#33rg'RVbdC;!.Y~> +!< +!<=^DD?<]9LY1tqD#cQn4U!,8!$6"$q<\21%*q'=1+4h7\30mI!&D0(!n;4X`0]8H:#-VeuMe!.Y~> +!<=:8:]a-aiU#q8Tk7G8L=c%a!gQHqrlPAK?;+t;p?_m- +!<PTb~> +!<=^DD?:RZg[+;2I4#dO#QQ6>p?_lN"bAf;#njmg!bD@Br7:ue!)3BN"at8o +8M:qZ!#$2BF/I(2dsXnqNiT%%(]XOK11dJ'!A+;%~> +!<=:8:]X7Em-Ogp9`@Q^9E;6fm0JtN_90oh9Mqb\m/_Q7J]\%!!(=Ir!<>Lb_#ou4$uYm0"dXF: +6R3*>!!=K.5[sY[#=r!2)ZTj]7''2c+TR#~> +!<Xf`rh_9&q]qa"fd;i +7j\lJ!!=Q2;fqrB#?PPO+ohTX0!$o2'``a~> +!<=^DD?0`;m-Og7!<*c6!!&,Qm0IP/3'BDQ!!nAPm/]]\JNX&S!+djf)ql_#CZEK"f@&e +9.1&E!!=W99Q'd/#?5;V-ia6!@'"5H/HC;~> +!<=:9:]a3^ZgI,]L.k;?:]j6Y9ZQhn#DQ$sb*#G1fCSA1D.S:@!hfT?]MJVA'`5]TQ4s=5R[T4] +DJQ@2mt$k6\CRL*+p_829r!!!g'Y##-B!.Y~> +!<o902YBS"e;X8j'L2$"+#qo9,5'``H_Z)!,+ +GB\Y$ril[-O_72t$$?'L$"m_fa,<(\!"poe2$"ElJ,~> +!<=^ED?;ctR-j8B<<+NJD?EcP!4DLe#?:df4XC(Ubk(3&0arUr!\j[1]P[`g)#MnnVAK;XX/heH +I<^!bN;fj^VMo+Y#81qOWsNBDf@Q +!<=:9;#a2hiU6(7^e@H!:]X7%p$Ds1 +!<)r0;!EX5kfE0\A%)"M#/dVN7qo8i<'`_]_qGRB< +r36Wn;eNA2G@G$*Uh=08`s&D3!!!WaYVcFr!.Y~> +!<=^ED?;9fg[=G1WW4OGD?0_bp$DrR"[+F;1#)9d!@JD/4T[bN)SL"j?kNI)qpttZ(][iWqFgm6 +r2U3c9P1>rG[4U"SRu1+f*/TU!!"9PY\jIn!.Y~> +!<=:9:]X'umHjt09LenU!_H)+p?`#qA\hDMiUQ:9=`f5;"3O=<7__b'1]RLb%$LM(%&tQQ)_D^6 +$47;#5_f9,%@0OUQ@MLk;Gob_5T>LV_$-T$!!"<7Z;:QF!.Y~> +!< +!<=^ED?1M#mHjsT!+l%F!]U1fp?`#2$oeD+g[XY3())6^"$IG#A\W*d8H8`'#F>8=%)++i-oDt\ +&eZ!D9UGaZ%Am*(VN+VL?!U-99IPhsf*/TU!!"ccZ>K[p!.Y~> +!<=:9:]X7:mHjq$;>O)j7SImtm02HBI>gk3nEg6RFFhR:b)? +!<Js8oUn<3lJH%FTMfTZ@\^bl?A!!uCq#lo,F`rin5!!)p6 +(*Q4MUp71E;j4"Y=-p1sUmFFK!$Za,rPo&.0E;D(ZS_au!.Y~> +!<=^ED?0`-mHjpE#l8E?AH4dcm025E(F0!VnEg5^'7i:K4X:#!^hsBK!"s9k&cd7Tf)s,U!!)p0 +()KPASZAf,9TGZC<0sYdSX2J>!% +!<=:::]a*[Q0mr?L.k)5;#a2h]D1arZV7*0=mt_Y9SJ&?"3SF[(VroT2ujC_<)c3t!'@4Y_#qAQ +!!)p($55ZiJ;-J,~> +!< +!<=^FD?=ALD=-]l<<-V,D?;9fV"j<[QiJQG(@UVk!#pJP"$JUD,f+@*=o]1fN/V`p!(+R#f)sK4 +!!)p0$62`5NgEFWX(G%lrMp0i9RU(L!% +!<=:::]a0`W9rsRa%T2&:]a-QA.Y=r0dq05`M4u;@NUOP5W3"[7UE.1q$3]+TR#~> +!< +!<=^FD?<]:L[FI1[/_]PD?9eRg\L4>3WVAL1%=Q3gAi1D4o[YG$kgEp"(`)FEW(h!DAN9cK_s@' +PQq0nr=TAU8PE)_VO'u$r2U-P9V&5]>nR,cQMoD +!<=:::]a0]Zg@&\L.k28:]a0]F8G8-^eB1!Cgcc"!nU,)J]e#8!b;:!_b^CX!'U9[#@tcqOraTK +QMeQ$UFH6Dr<`c?1dGrI@R,JARK8_"rL*nU8.5JTU]&"2KbOM5[nm)K!.Y~> +!<PTb~> +!<=^FD?<]9R-a2A<<,#TD?<]93r84IWW3hu%j(6-!mCWiJNa#r!Zh>L_eoN-!+c%e#D#6*,maQ" +VYo$J[P%U\r=T>O4\U:)DG6)gWr])QrMp+! +!<=:::]a0`Zg@&]iGD7^qG78c9QSham0BspO/!lmutJ]e#8!h'*@`)$M!!#ti8!3uOG +"i4^L!'?tS_%OFo!!!E7$55KlQC;)E5Y,@4NVJqGNC*[GB>+;\"KF$R(Ikr3!?hGn~> +!<"_9[2$5s6?&AND#C0'F`n5l9Nq&;7JkMSaf`0S*U];IS2$,H3,5bmM^Acag +c"d:Z4fJ>"'#S2Z!"p+c,tM+;Z#N]@=*0S#pot!u7fWO!_u@[Z[57jr0tB.B'``a~> +!<=^FD?<]:R-a2BgG&[XqJHBp!'8@&m0B!a"ZAL[!8I&2!jr"SJNa#r![n%6`,5W_!%@c(!)*;S +"ZRP'!(+-mf+QPH!!!6:&faJBVQ4K+9N5ngSbT5hSP&q_C"*(5"N!"r,\=N(!A+;%~> +!<=:::]a0]Zg6u]iHn6g7f-!l8PE!9Y+]H$?EqYqRS9mSm/k=%Ra9+YU4n<;qT8rGP(f@@cH64" +Z,-1W!lP'T`)$LY!(6]a!-nC`"gLc%!(s$b_$?_e!!"K65_/j&!etSqr]gTW?#G1PqjIY9,QJdL +rkS]M8cT[<:]V^>J,~> +!<e@^"Cu596]oi!eO(@ce&?#Mi5jVfEAmWMknVCfE0(+ +c1fildJsou2$+Km:AnW%LATU,]i"h19W7p1#H0HZ!&.>MPQ%fgQ\&lL;Zp0AJs3#-Ylp19!$[j1 +`rj4Q!"ZUt!>PTb~> +!<=^FD?<]9R-X,BgID5ZAc$?T2uj4aOF8JV#VnP+-ifA!m/jZq.*k$Y.2s3cqE4s:,o\6lc924e +1-#"k!^cr5`,5W.!-.sr!-J*$"Ypko!)p?)f*A`A!!"ZG9TK+Q!ge=Ir_*GoCOM56ql9jY-ibZm +rmq8$;ZIrND?2 +!<=:::]a0`Zg$iZThJj;rN)opO!EQf1 +aoSJQrCd5mP4cs&_5rfYKoDbBq8s#^RWMS+9M]5R](jDLRVc+)9EJ7K](sJL/IfWp!< +!<:?!'L6R!EP-VfE,)PM=Qi3HqUO8fE/CDK)T]iH)orW!L-Xa9*&)5rR_.W +B`1R)BDb[.FSiPTb~> +!<=^FD?<]:R-Eu?I/jONqecF4&H2Y1"WRA&!X0@`o'HLS!%I\+!\GZ6rXT#C.H3Jk,R+/I! +!<=:::]a0]W9EUNZVaRjr(mMc!)9`0qT8o7:LLO#m/jUfWVagH\qO0Y9Mo20?r9U(Z2)NIZ%[%+ +ASd(%p<",T?;,4=iO_rn_90oK9NdY$iO`r#FSNuZU2Ba#!`+6\r5oD1<_QA;L6[L*9M^WEapXA5 +9Mp/1W0M3n:SR^.!aG^n`_Z^n!%e%Ip +!<KmS]uKp$"056tH1R4$GtYL@fF5cX<_H(\<**$o945I/fE]*JEG0$) +MmrE4'tn!J>'H!S:12?!fRcapCk@[p>"a/9fE&$mqF^ldK$F5G$_(0i:17^MAQMN$Pl')@RoW0W +@<$C*>"_\mqUbjZ!%u8K![@\$r*oBP#-:)j!'-Ibrl54h-3+$"GH1JD"Jh03FHQF)"IC;49Z-kM +!^-N)]/9U(!.Y~> +!<=^FD?<]9LZn+-Qj2B)f"!!jVn*XD`O1AO'<1)gc5 +$kF:4p,s-G#QQT@gS>)\3'BD@!#BFZgS?P('DO]k.1l=U!Wa)sr&kE6"TSfu +!!l)CLM\aG!@dk.!ZV2J`bkiL!)!0Jp,rU7&c_nmVUPOr#)"B)!&&Soq5XXhN.#T&qPsac-id2p +rmq3 +!<=:::]a*^Q07N:a&u),rD3PT!-@nW"/8gi@.`gfY"Z+uap!`"9Pp`[rTsaHW)6U#r5oDYFA,A2 +D/EEL9PqWAaoeA6;5jH\#I@*Xb&g=(iV`'EL.m +!<>?2$,?0HhZ.pX&_kmoTK?#9>18U"dDhV>',W"P6?nf:0,(+fF,]E91r2e +>#S'eER"=3"056nFT%C.GtX(JGtVS+r0%1n98i]"%C9G8:1\X$M3EdD@7tS=fEB3-936E9P66D? +99fG."NG+J<-eA)"+jKFX8CNNPQ2rJ2$+Qo:AnW%L@s1([SA4N!%*$0rl5529E5&*7u$H:$E?)d +8&NBf_]f(5]JT^)!.Y~> +!<=^FD?=AMD9j?WsY^b +!)(emf@),J@(^@X/HC;~> +!<=:9:]X7Ek3W9&=\MBc:]`R4aodf#@+Y;C"ER@m9SWB1!ddV8rlPD\FA,i2iVDjGPt[XhWD?Bbp[&3,9WZC2<_T4^m/u +!<NJ>>u6GPAbhMk@8![#fEKNF92fhjq3)&"9;L4H:el$)P6YAd\(I`^96'`j"--;\ +c2?2q]`8kg2$"*lr*fYmo[jFi@Tt5e!#8_Grl5;UFYEdq'hEqVn?E$c!,);O!gs$$]JT^)!.Y~> +!<=^ED?0`;k3W8p('%83D?<''-2'J'3"-)bm/h\92Z>iB3"H!D[J9+j[0R3>4TmYH!*.8Am0(XM +!!kR]4Tcu1*mFNK"?HQ&!*/j^!_35>r]LEE'*&erg\L4AD#btI/HH-*p[&2H!&?\d"TWuGm/u)Y +"ZZEC!\sa2`bkeq')[[gB_4FnJW,4@&c`bZ_Z&-maa,T?!#S:UVXUVf8H +!<=:9:]X'ujmhjn"]9-*:Kba3m0;0>D5'g/a7em%]1e1\aoMne`_Z[9)uNY8 +S+Oi'S,Q@l:b3:\!'?L[rkSo@B-[HW$n>/#QLpUJQ6ZI1rkSY.!(=Ls!?hGn~> +!<)rHC"+3a7>549fN`0?P6Qk=EN;o7K(bB0HqT_$fDuTq`\dbs,5bmM +WV"gCWW$?3>r*2q!'Qafrl5>L@jV0U&hmdLWqPTb~> +!<=^ED?1M#jm<>t*WT)UDDD2IofW!8tI/kku4oYcfV"sBZLB&:k4Tcu1 +1#)Ql"/Gns1&1,BgD1&X4Z3QG`*:m0:c?&1IVq[J&thU];\;4TPd1`bkeW./]#( +>kC/Z>lKZeL.W9_!(*R3rmqIjBd`r]#;9A +!<=:9;#a2hiT9G3f3h9C:a#hWou[;HD=m3#Pt]?C_.?_RZRS7SW +q<\:C;,#%)m09L_R_`<-Y4V)aHV[FFfC\G5L.kBTfC\G2?s``Q!B:)":]`TV/GrHIWV"=5`; +!<p"0:Y>4e!`CeNF5c"KaqoTKN?98hHTMbA9gP6,#dc2Q>tUe=mO +q3(o@:.p35P6Q,%Us3:BGP%(%@8Kd"M=cu7AP5j$M=cu4<+,UU!B^A&2$,?01]1\^[e/2PdedJX +7j7p5,&"C_`riPg4UM)f&0aJNFG?-^Z*C=6Um#m\!/CKn!gs$0]eog*!.Y~> +!<=^ED?;9fgZ@f-bT6a^DCkiUofW#7OD?r_]l!j&!.Y~> +!<=:9:]a3^^uXkdf3(d<(DZSb!EOR>m08;@b0#-+W:KM"%_#h:M+h^\Q+TR#~> +!<VL2`ra-Y'tlI*'``a~> +!<=^ED?;ctWoWONbSC1V+9qI$!r9Ef)jD$/\Q$&/HC;~> +!<=:9:]a*[Q/h67f3(cU/bI0d:PSN/"aa:mWD&':m0.?bb5;uiohaoJ.0 +!<(VM[,'``a~> +!<=^ED?=ALD<(!dbSC0`%J2da!EJdZ"\/_Z/HAf@m0,3Q4Y6Yqp?`+>!$j]c!>`oQmJkE'm/q2* +!*/UW!]gUpo'HM5MuZfJ4TJXZN!ElK!!!X)KXUd0%F_bOH?37n +92f#)Ga6#@f)iA\1;.Q+/HC;~> +!<=:8:]X'oip?ig;+rtAaoP2$o^)g'?HQSWiUQ:=D.UkD9\8t)"\a?eAPpM2m/ts6;;q*5s2X$a +!j54ur5o)7!%l8g!< +!<%lQH98W>*"\XI"BMO0BP66Y7:6+n/s+9-l +!d@;Hr7D(P!$93=!< +!<=^DD?1Loip?iU#QPG.4TPP"o^)fC#X&G/g[XY70ap2a!6k-'"TT?%$ja9(m/tQ4#i"q;s0^bO +!g!C;r&k*9!'nVC!<=DBMuZfJ4TJ%GMunW(,lRcI&isQ][aX]s"2Z\k>.neS/HC;~> +!<=:8:]a3^a5ZIg]1cPIp+AFib':e5+V(&\+H'JrEpFao.7URIsQR[0+^B1!+./\Fm\+TR#~> +!<utf((]==J'fertFbc<\W2?MlVO +!<=^DD?;ct[GpQUU]:Z[p,rI8!,_Aq">L<5!.FA("[E7m/iXT/c7a5 +2ukPPD?=,E9)FPI=n4]UJb+g'L/]3*#5nN+(ckT0HBacn[Ki[qKP='l!'n27!A+;%~> +!<=:8:]a0]Q/V*3PtZ;nao\hAW:]H[?u9^WiUH4;9RY'"B(bNpa%VYb9YfcW!DJ6mm/k'sUAN(6 +$l@#^!\FC8qc!Q[o#^rWnl,U'rlPDLP&!cI(%;2'/\=g[+TR#~> +!< +!<=^DD?<]9D;jj`D#b7C4T[A=L\0s:*Y8hfg[OS5!#Id/-hZj1[/_L$!35/J! +!<=:7:]a-aiSj/*L.mR#ao\P9Zh3Ve=_19]nEgD29T7,#F7no(]1erQ9]>+#!DJd'm/k=%Ret5. +/Iffu!Z(i5qc!QHo#^r`nl,U6pW<]FTot"KF$opX"unb47md8"]2/MO!.Y~> +!</V#/dF +0aYrZ!YPK=qdKPco%3r&nmVTRpXf\`XIG,pHUn&k"t`24>##&4]/9U(!.Y~> +!<=^CD?:RZgYqN$<<+<=4T[28R.TbJ((:1CnEgD'!$j]53q_kDU];h_!8HW&! +,lf)b:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'Wu:]a0]W8R%ED,7/+ao\;2_"@!r +;.WG(nEgCk9VT[1HhHb/W(aI<=lo#Pa%Uj)m/km5P5EB&7f^\.!_*V3qG[H4o#^rsnl,UGn]Ci: +q,@A-%D,F;+TR#~> +,leZ;2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,)2$$?li0+4G:p]rL!intDoTKAP +BM3R=P6H>,X4UH]oofN#9>,ULjc]at94?)/!f9R>qq(p>!6R/#0aS9b@K;#NfDqZ:@K;bbfDo^_ +@K?lD]/9U(!.Y~> +,lfN7DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%&D?<]9LZ%P$0``m$4T[&4Wq>Z\ +#Rg]pnEgCT!%C&78+l6PLB'(C(?Oob[/`_Am/kK3-2Th+(')Kp!bDu_qMYE&niZt]nr*Q^nN?l9 +q2>=m'"`#^/HC;~> +!<=:u:cV!A:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X +7SloNrD3Pb;./>L"4p[V_>24TP"`pgm/p%!9VLtC"fP,"b"RQ_m0&\J_/3TAm/t-t;;ogf!oZh3 +qoStF!(P..!^m#6q,Hq-!1WOY!1WQ%!4hl(!?D0P:]V^>J,~> +!<\pc#H_EP66;-:6*V`!ffp< +qq(s[!&;YS!\OI$q-rpI!3,Nu!3,PA!6=kD!?qNU2$"ElJ,~> +!<=_,DE29GDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsrGD[J#Thpk"3_Ma3;G]=,lk@Fm/m>"!.FA("c!(54TJLTm0%8+3"R.mm/s?g#i!Yl!o!]# +q`P!#!+j>k!al!fq2Fl-!*o)R!*o(X!(cmD!AXYeD?2 +,QJua7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e&B"!(Qra!_H(ai9^T]9PsUJ!fTh) +p$Dn@9SH/pnEgCE9YnP=Q1aMJHWJ:;;;p[)"0P +,QJQ:0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)3$,!&=I1!^'+ti0+4l96'd[!gH?7 +oofN=98cGSn<4#l9?k^SD"Wtq@92$4:6+J#"*[C2A^6J@N_><-fE-C"/^$!Q*WSS'@K=I?fDqoA +@K +,QKE6ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIpb(!+l.I!]U18i9^TG!"erh![Ici +p$Dn:!#ko!9"7g2$l#i"M/"-0Cdb5QG?jMuZE?4TJaX +MuZfI4TJX[MulTO?G(.V/HC;~> ++oic_:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloNr_PUE:f'VX:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7f?-e7SlQO=lJ<+!gQH[3 +#1lP3FA.t8o'HU- ++oi?82)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCr\Z\j2)R*G2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG1&Ws50f:[\;i]e"!c1MoqUbk-99/\/ +#)Q!BGtVt'nrj5c%lQa95KWFk`Z-c95mOJhNIqrnrj)IK)=1%PQ2rO2$+Km>PV_. +WUnaBYOZ-&ddl#jUA87#?9J95]JT^)!.Y~> ++oj34DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsrba`-DJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'Ac6KMASu&b(>Id7!c7o_qE4m!!8I26 +#0[&n'*)mLo'HTN"[+U@L\:$>0ap2n!,^K7kj8Li!"T'khX(s,QLEZD?;BiKDCH+ +>k:)Y=n7LO6h3A?@JPiaGsVL&]P[a%!.Y~> +,6/lV:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7fH4B7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X\:]Nu_:]a3^Q/Cs1Al#]/aoQofo^)q9 +9Tltu9MB'Mo^)fiCs&_NZh<\j=`)=(CeRN"kj8OpA3Jpf%6 +,6/H52)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG1&a$g0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,f2#oB/2$,m5Cu:EX=&?U-fE$S!oTKQ; +9:Nq791r?CoTKGXE7hKiH1d@+;fUIBE(`i!k`Z0U#FGOgq!EF!t_P6,;g@IoZ`97m&n!i,f@ +b;K;+pgO5Xo@O&Bo3q]?n^mi9r*fk9=&M[K!$8d1!>PTb~> +,60<,DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'Ac?R*ASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%bD?+8GD?;ctD;X^^-NQ""4TQ?)o^)q. +!$sN3!!"Cjo^)f'%m;KER.]hO((`Vl%fcS8kj8O7"ZQbfORhc?I6+1pm/g8f8+Z*K!#PMq![n%? +bAR=mpl#2po0!(Yo8E[#nN?k\r/:i79,@R:!'n27!A+;%~> +-3,2c7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8NrD5:>:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X\:^BNe:e"8X7o@mrm/km:Ac'UND-?Mu +#ffW-b0%;S:ODa$"]'QhU.iAqm/]n7rlP;2APr*e!nVMFq!A8_FNV1+9Wn$T"6!*N=nD"`Y"W.q +_"@!p=`jP`)Q<]g:f'VX:e"8X7SloN:f'VX:e"8X7SloNjA5nG!$q>=!*o- +-3+c<0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sCrA?Ac2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,f2$boo2)-sG7o"p!P6-S9B`$E_EDuLn +#_G^Ff\"3.:gs!["]0g'X%Rs8P6"=7rn%:JBMS2`!f:3>plbnWH.^,M96^#l"--,L;tH1UG=u=: +J+Sp*;gJ8m)RBDb2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCj>?uk!%@VO!,M2Y!1EFf!/C$r!3,p+ +#?OYn<,?OS*kX?2'``a~> +-3,W8ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm]srGFE&DJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%bD?sfkDIm^'('r.Bm/kK;%/W0g&/Op* +#djX\4Zt\K!CueL"T]E&.0-C@m/[2+r]L<2$jcLm!mE^Lq!A7k'0S5^!0Hj?"5=(](A$nrO8oOd +Wq>ZZ()-R.)D(qSDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsjDG$,!''b4!0d";!+b\[!-I`o!*oJ] +#?1s/*c6<*5eLt8/HC;~> ++oic_:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloNrD5jN:e"8X7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:e"8X7SloN85+*^m/itTL&B'oAS1T% +!kV.#rQ5._;>';\f1_.GP"`pim/km5N;^m"FA_\t!kV-Qq<\En9Ua,HYtV+gm0($p?;/uCm0$Qu +\kJC]m/^@3qoSuO!%$i**_&t&7SloN:f'VX:e"8X7SloN:f'VX:e"8X7Pk*JpJ_-loZ@/Yo2G^Z +n]D9N<)c[g9P1WumD],P]MJVP!.Y~> ++oi?82)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCrA?qs2)-sG0f:gC2)R*G2)-sG0f:gC +2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG0f:gC2+q64P6,_sMu;3.BNOhi +!dmYArR_-r:A'eTM+a)cRnJA,P6-S6Pl958Gu"!q!dmXLq3)&/9;L4m]hP6?8+?qZ@KP6=fl +`_1.?P6"U-qq(ti!#OiV*\fN00f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0d?[2pL4-2o[j.uo3q^! +n^n8j@U`V@936D&PC!9G]JT^)!.Y~> ++oj34DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsrGFu6DIm^'ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'ASuBs;?/c8m/h\9)uMi"$n(]7 +!i,fFrB1/p#kdQhbQ&nO,lk@Hm/kK3,lKk,'+"6t!i,fdq<\ES!%9un1'!+%m0'3b#QW*@m0"11 +2?7Udm/[t9q`P!=!&EbU*bB5,ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'AOul6pP])NoK<1ro8EZS +nN@:ON/WK-!%40$mD],]]P[a%!.Y~> +,lf)X:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SlSQ:btR;:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e(C["%H*`7fH6a9E;$Km/h?&Z2MfG??>c+ +!jbS"rQ5._=nV.d^eCKFN(hjsm/k=%Rf1A0FC=b."0P +,leZ72)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:]a2)?sE2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)5%e"#2Yj1&a$36q_XZP6,#_^&?Ra?sWDg +!dRGFrR_-r;tZ=YInQipPY6l,P6->/V#ApHGuXF""*[C2H2<^0>u8eufW.YpoTKDo99`)$oofQ' +9;L3@@J#`a;gJ8m)U/6s2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCj>@#U!2b);@K;G\fDp-e@K=I< +fEHk9=%d@irf[eJ!$4!P2)R*G2)-sG0ul-P'``a~> +,lfN.DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASu)XDDPjADIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIrca"(c@fAc?QK.KG7]m/frB1/p(A7&!WW4J2,QQ'^m/jZq./c:0'-?f5"- ++TNZ^7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X[:e!oN7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX7SloN:f'VX:e!rPfAQ#tf1^;baoPOi +o^)^Y9X4Q=!Gl0:m09L_Z-%boiV)X?ZV7@saoQ ++TN670f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,e2+B;X0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G0f:gC2)R*G2).TrM;XR!M+`-mfE##] +oTK>u9>1;V!H;$2P6Q,%^"A69NqSY ++TO*3ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%aDFS2TASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'ASuBsDJj$'DIjRhbi%jibQ&=T4TP^V +o^)^8!&FL9!=p7Em08=G1-HQVg\1"9QiJ`:4TQ'@o^)dC!!*@mr9XQ]!#to#![Icio^)cB#UobR +p$DoQ!BiRO3qVe?()-O-'EB^rDJj$'DIm^'ASuBsDJj$'DIr]_+(]>-ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'AJuE0^A*WfJOB)n!0d&6!-mrq"&!/tOT"PKgMHpGoklg%DJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'/HC;~> +9)p,):e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:e"8X7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7f?-l7SloN:f'VX:e"8X7fH3g7S-9D7nH2L:]a0]B&DtWL.oG_aoP1j +o^)^R9Y12F!G--@m0/bK_9-jsp$DgS9Y12F!G--?m0o[^XBnSA]A__O;-(O4aoQT]oBcZXFIGnD +p$Do[FNVa4F7ei#;18;`3rgF#7SloN:f'VX:e"8X7SloN:f'VX7SlQN:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8N!'@HjB_YO,U%QS";ui0\aofJKKpqeZ!bG'3rTt,o;+psA:e"8X7SloN:f'X& +:]a*0!.Y~> +9)o\]2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG1&Ws<0f:gC2)R*G2)-sG1&a$70g%io7m&O)2$$?Ohie+Q9?mIg!D@"r +P6,_s`r4NjBNk(m"`-iVfQg6bP6,_s`r4NjBNk%l$unqL?qXdQNfJ +9)pPTDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'ASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'Ac6KTASuBsDJj$'DIm^'Ac?QOAN2.T(-#n)D?<]9-f=:m<<,#X4TPO_ +o^)^.!&jd=!=U^Um0.>,3'@o\p$Dg/!&jd=!=U^Tm0nCC1'dk@UtaXc#R*3e4TQ3%oBcYd'.#3rgjMASuBsDJj$'DIm^'ASuBsDJj$'ASu'sDIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm]s!(kDYS+qpB=nOrLMu[;a4TdYl)^tJE!Xo'rrTt,N#QOiiDIm^'ASuBsDJj%, +D?=B$!.Y~> +D#b_U7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SlQN:e"8X7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SloN:f'VX:e"8N:f'VX:e"8X7SloN:f'VX85W&XD.$%785McP8PFlsm0C6sU<:Wp +9U58;!gQHqrQ5.IF7no(HWJ;3D.*&(!JXDJaoPgio^)gI9YnQ!:]3rf?Fp*X!G,m8m02HBN06ld +p?`()9TmQ@ATRM2!DIq_f!-n1Z!*o.q!6"iY!NB-!9EBRXqoSto9VMFP%YdYgHN5Wo:e"8X7SloN +r_PXF:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X ++TR#~> +D#b;.0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC +2)R*G2)-sG0f:gC2)R*G2)-sC2)R*G2)-sG0f:gC2)R*G2,6e>>#\-i2)R*G4A08DP6ZJ.X4Z(L +95O6a!c1NSrR_-Y?1jBb@92%5EE)Up!G,+*fE#AcoTKGp9?k_>;#O#f@)i/t!GGR,P6Ht>Pab=& +p6,]49:OSdBO17o!DA%@fEM +D#c/*ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASuBsDJj$'DIm]sDJj$'DIm^'ASuBsDJj$';@!7.0cg<#;Jp&`2ult:m0BEe.6TgR +!,_Aq!c7osrB1/e3q_kD7g2%=&0CN3!EB0u4TPgLo^)g!!&uqW!WN!-Ils!0d&6!(6]J!A+KS!!*lqq`P!"!.Fh5%TNK;,lg2JDIm^'ASuBs +rbac.DJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^' +/HC;~> +@/qH?:f'VX7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8N:f'VX:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX7SloN:f'VX:e"8X7SloP9Ne_$m0UC-9LquL:eXQ]iU$m/9RY(+ +\kJgim/`JGr5o%9L@sp;=`)=(ASq,-!IIlFaoPOio^)[E9`E0;_4$(3Ret5.:PSN/"i*g#N(i4( +m09mjWQN@iF7no%f1_/$apOSZ!$t<4;.+6D;>s6?;+sPX:e"8X7SlQN7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SloN:f&G<6hF=X`:h=RAG&n%Jc3^sYtnc6f7lt1_>VLXYtT6;m1>OVFNTaH1e(;< +7SloN:f'X\:bY@8:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'XY +:]a*0!.Y~> +>6#Bm2)R*G0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sC2)R*G2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G0f:gC2)R*G2)-sG1&a$392g-8P6lV89/SR]2+1)ZiKFM,97kgK +`_1=DP6#Jmr7D$HAbD5j;fUIBBNk(m!F]%,fE##]oTK;l9E*QHc(p8UV#/dF:hB9_"b01@PY7&1 +P6Q;*Ze3o +@/qljDJj$'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm]sDJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'ASuBsDJj$'DIm^'ASuB`!#Ct$m0TR(!)d]GDCPXAiU$m)!#Id] +2?80tm/_&(r&k&]__((`Vl$o.GB!Cm=k4TP^Vo^)Zr!<,+a3%,^b./Q..!EJdZ"f_PN,QQTm +m08pX/Nl6&3q_kAbQ&pd4UNSN!"&]+#Tb]9#lXfT#V%fODIm^'ASu'sASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASuBsDJh30EV,1i6hWYCJb=s%D>cU'1'&G`bZ+WO3;kuA1&sB6m1=+7'0RWA8S)dW +ASuBsDJj%bDD5X>DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%_ +D?=B$!.Y~> +?iV?H7SloN:f'VX7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX7SloN:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:e"8X7SloN:f'VX:e!oO;:ka5$.i$O7SlQD7o-qZm06s8b0$t_ +Y4V)^L/7`i!DeIDm0;NCL!%P=HhHb,D.WXf!DeIBm/_r8oZ@6H9U58;"KkG'I8'>$#,+`%b0!b3 +p$E4(9Ua,H\qNpR;1#7^iV`'KiP;..:J=VW7f#q&7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN +:_s-';uiWcaoH>P;ujl8aoZEWfDb.>ThJe(rlP:R;:kg7#J3ZHb0#;92#U5V7SloN:f'VX7f?.; +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7fH3b+TR#~> +?iUp!0f:gC2)R*G0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G0f:gC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG0f:gC2)R*G2)-g\:5Sn4$&MDP0f:[?7o4]oP6P!+f\!l1 +GP%("APi%mid!DmA"P6#5fo[j5b95O6a"F!MPJkPd##'!;Uf[s55 +oofi79;L4m`f!Yd:186rNr5(HNdl%S:eOPG1&i\@ED']Zrn%9c:5St6#CK0af[u)^,Q0J*0f:gC2)R*G1&Ws` +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG1&a$2'``a~> +?iVcrASuBsDJj$'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'ASuBsDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'ASuBsDJj$'DImAb#gE56$-WY\ASu'j('1Gom04UC4ZtP# +OS%o@<<<"\!24Zt.m8c +?N;6=:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:f'VX:e"8X7SloN:f'VX:e"8X7SlQN:e"8X7SloN:f'hZ]DCmrY"VFd:]j6c=i]Oh#'4+nb+_SA +o^)[+i9iUlLeiM^?^9M%]M7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7K=D! +;uh1:aoI\";ui0]ao]CTLA^EDZV4]Ab,J("rp:-Q=]WA]b%guF:e"8NrD3J`rD5LD:e"8X7SloN +:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SlPt!.Y~> +?N:fq2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)R*G2)-sG0f:gC2)R*G2)-sG0f:[C2)-sG0f:gC2)RcpI/9$.G=t's2$-NOK&Vsu?!u=;X%Rj4 +P6#)mrR_1r95O(^!2.*93lh'oTLbbFB;+.4>A]J2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC!$_#D +!/C4"!2B0r!2BGE!mOPQr0%A2946#sZV,-6P73IM +?N;ZhDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DJj$'DIm^'ASuBsDJj$'DIm^'ASu'sDIm^'ASuBsDJgp(V#'H[O8q9>D?EcB(:E/h#!*#Q4XgB, +o^)ZL"oURc2umghm09ru-p9NiD>!8s()-U/!0Jg[sk_gP7-V!'"P-ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'AH4.M +Mu[tn4TJpaMu[;b4T[SD +?2u-<:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e497q!AB"9L_iJ:e48ffAl6&HWJ;3RS:co +m/_97rQ52Q9VM1I#.%"&b*l#9p?_q59SNGf!l7R(o^)[+b%52Xm08hLb0%Oo +Q1aMKL/3t59QS8Bm3f\d9Mn>W7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VF!%d\?pb%4H/rp9cP9VVO/!_iYarD3_g:e"8X7SlSQ:bY@8:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'X[:]V^>J,~> +?2t]p2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)S$GnfP"@ZP6Phrf\"GA +D"WtrAPejs93m/;P:(i`927?%0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*B!&O1Tp=KAc +pL4,Wr7D(j96'im#'ij\fP"$?rf[D"9<8'E!`B"QrA=g72)-sG0f:]a2)$aB2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R,e2$"ElJ,~> +?2uQgDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDGgI7q!AA8!+g%ZDGgHUbiA'p7g2%=-ig[I +m/]6RrB13?!.FS.#+,BB4X^<+p?_q*!#tl"!]U1.o^)ZL"nXqZ,lk@Fm0$Di4U`_2m07D-4Ztb) +D>!9#<<4BL!'7OUm3eng!!lJ?ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj#l!(ug@p,rCH +pP])or&k*>!.Fb3#+,B$4U_VNrp9c(!%In1!Z(iJrGDjODIm^'ASu)XDD5X>DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj%aD?2 +?2u-<:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e+CAq!AEk9M&&W7SlWLB%Q,2#('\!b*#HM +o^)ZrAc9aQYtV=om09L_]#o+liV)X?ZV7@sao].JU%I^QD.W@^!ej>,o^)d&?HQ;qp$DsK9Ynl_ +9VM.H"Dph+@)2'p-*p`J9L_iJ:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X/HA0/;uiokaoIY$ +;upmTr5o)G9W7gT"I2Yt9U5VE!nU:crQ59q%8]Mj7f?-`7f?.E7SlQN:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8N:a#gh~> +?2t]p2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2+LE%plc&/90>'h0f:g]=,H"%#%:olfUGNj +oTK;ZB`6Qb]h%mQ\!fK^3oTKD`@+\LgoofSr9?l,/ +96'Wg"BnGk<.F1s-$`E^6npPR2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG*WSt+@K +?2uQgDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDAEN4q!AEM!'"k6AStBG-d:Z=#"Jq^4XC*P +o^)Z6%/i]p$Ds#!'!," +!.FP-">KlV*ieMm-(#GJ.V3L/DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'5QGfpMuZfM4TK$g +Mue>or&k*:!/LF<"Dn,M!,_`&!mCo\rB1;n&oM8uAc6KHAc6L-ASu'sDIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm]sDCkj=~> +>lZ$;:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N85,`Om0hlM9Me2T7SlZMB&Vk=#('Cnb(WOJ +o^)ZeD#MKXWD'Ylm00F^Z*?uWp$Dg`9X4Q=!jPFto^)ZkAb=+GD-?Jt"CQ&^9U5;<#*hlub,J(@ +p$DiY9U4T#m3LYF9Mn>W:e"8N:e"8X7SloN:f'VX:e"8X7SloN:f'VX(B@;&;ui-TaoI:q;uhLG +ao]CQQ20eLHV@,brp9cP9W\38%La.M:e"8X7SlQN:e"8Nr_P:<:f'VX:e"8X7SloN:f'VX:e"8X +7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloNrD3Pb+TR#~> +>lYTo2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2+qr`P7*CG6o?\V0f;'d=,uC+#%:QbfS`C_ +oTK;TE;eDjZV,T;P6H&$]tI'MoofH$9>1;V!kh6KoTK;WB_9pXEDuIm"B9?b95O9b#&HrWfX"4r +oofJQ95KXPP66hV92>ID*AKE+2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G%ffo+@K;hhfDq98@K;Gb +fE0;jD#'7s@7s7Mrf[D"9=OlP%MB:02)-sG0f:[C2)-sCr\ZAa2)R*G2)-sG0f:gC2)R*G2)-sG +0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gCrA=X2'``a~> +>lZHfDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s;?2.>m0hYS.W/g8ASsI--embM#"Jh[4W=CU +o^)Z#&,eWm/HD13m0/7F1,8i0p$DgB!&FL9!\sb2o^)Z,%.l[`&/Om)"EQ$7fWP5rp9c(!&FL9%L4+oDIm^'ASu'sDIm]srbaE$DJj$'DIm^'ASuBsDJj$'DIm^' +ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsrGD[J/HC;~> +>lZ$;:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8X7oA7=m0e87:e"8N:f'\V@+XQ."`7hnb(WO\ +m/gZkP5`T*U.iArm01*qI9'4sp$Dh$9RZl^!jPG%o^)ZeD=ksO??>`*"As9G9W7XO#*hlub*l#E +p$DdY^uXl+ZVaCe:f'VX:e"8N:e"8X7SloN:f'VX:e"8X7SloN%2\P6!,hGO"gNVmDMbq$apG%h +<_Rl-m<`6mrp9dG;/Q="!o[9nrQ7a6!$tH2:e"8X7SlQN:e"8N:e"8N:f'VX:e"8X7SloN:f'VX +:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:e"8X+TR#~> +>lYTo2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sG7o#*,JlYX'oofH/97m,p!kh6NoTK;TEV.la?sWAf"AX6U96Bij#&HrWfVD/l +oofDuJ)ldpGtq$32&e8-2)-sC2)-sG0f:gC2)R*G2)-sG0f:gC#nlc;!.sjq"hp"@JsXOTfEnm0 +<_HkbP@7FIrf[DD:0RX\!fg2mrRa`O!#ILI2)-sG0f:[C2)-sC2)-sC2)R*G2)-sG0f:gC2)R*G +2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)-sG'``a~> +>lZHfDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm^'('r[gm0cDaDIm]sDJi>P*mEd6"YgEK4W=Cm +m/e=0-2p%/.0-CAm009c(Bk)gp$Dgg!#PSs!\sb;o^)Z#&G/*d#WhSE":,Yr!/L77#&O?"4X^<< +p$Dd8WoWOjQj<[iDJj$'DIm]sDIm^'ASuBsDJj$'DIm^'ASuBs&g["+!.FK&"\W]WI:u1K4UE\R +"TV'[m7/5Arp9dA#Vl>G!o"J!rB3b.!&AG'DIm^'ASu'sDIm]sDIm]sDJj$'DIm^'ASuBsDJj$' +DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDIm^'/HC;~> +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N9RHI"%&$?c:e"8N:e!uL=i]^m"^,]bb&geX +m0LL>9Q\G"RS:cpm/p`i=hsXr#^]6V_90p"9Y9ra!EjO:aoP1joBcZVI@ +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC94@LW$unot2)-sC2)-s];hF1r"]KEnfQgEe +P6cY>96o1BUe?=4P64cW;h+D&#[pA>c.L[T976Aq!E4:9fE"WVo90;RJtu%hoofSr9A%mT99.Pd ++G*Qc2)-sC2)-sC2)-sC2)-sG0f:gC2)R*G2)-sB!&O+RlIZNiGtUn +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s!(Z_L%"/+RDIm]sDIl]G(:E>m"VqY44VJV& +m0K^>!#%LY-ig[Jm/nC0(96un#Y+k'3'BDV!2T8S!>Z@@4TPO_oBcY](FT9`p$Ds#!'NIa!8H&k ++LN6j;Is`WDIm]sDIm]sDIm^'ASuBsDJj$'DIm]l!(ua>l9,P8'*&;! +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8P9Wn'U%D,;)7SlQN7SlQF9OQK:m0;NCIEK]K +@.EUgL.m$[3"bogqb'd.9m2sqf +9L_iT7SlQN7SlQN7SlQN7SlQN7SlQN7SlQ.!'TgN!4hF<"*@4kiVi-HL/3LsHhm%1HV_KVb">A. +7SlQN:e"8N:f'VX7SlQN:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN:f'VX:e"8X7SloN +:f'VX:e"8X7SlPt!.Y~> +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sG96^&m%=Cf+0f:[C0f:[C92pc4P6R%?K%S^p +<:Q.VAP7X-RnJV1P5pI/P6YnsK%S_V97QSt!D\7>fE/`ZFS(b#N_>:g99/\/"_CN_fRclIP95W\ +9//:]0f:[C0f:[C0f:[C0f:[C0f:[C0f:[,!(66b!6=EX"*mONNr>.EAPe:X@JQ)g@8P5IfLf$A +0f:[C2)-sC2)R*G0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC +2)R*G2)-sG0f:[#!.Y~> +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]`!0Hm@%AWu%ASu'sASu'W!$9AKm0;;F(Hjnl +*qAV%<<*gu,ll0]m/YB"m0@J.(Hjo1!35\Y!=0M74T[A=L\0s;gAi03!8I26"]YRd4VnCQm2sOn +!+g%cASu'sASu'sASu'sASu'sASu'sASu'E!+bSX!(cE=!ttZ7g\pLB<<4$=8,;NR7fbUJ4\?Lj +ASu'sDIm]sDJj$'ASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBs +DJj$'DIm^'ASu'2!.Y~> +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8Q9\8t)%G+9I:e"8N:e"8N85*mbm0:U)P01pY +D=HorHVC]'9]=st#('%Tb*l#Eo^)ZQL%WRiP"`pgm0)$7P&4@om0.i;b0":-dd8*k9M@oP7SlQN +7SlQN7SlQN7SlQN7SlQN7SlPt!)E#_!28c%!i\kJqs=Q6?HR[iQ2BqMiDF^pb" +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sN98W>*%>d_G2)-sC2)-sC2+q-;P6QV3S(QA, +>4@^Z@8":u99.tp#%:0EfVD/loTK;KMtP^(RnJA*P6?_8RrMC!P6GAqf[sk=dZY`%911Kl0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[#!*er%!3bbA!jbO2qi_1l@+^'(D#9CtN_XltfLcqg0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G2)-sG0f:gC2)R*G +2)-s'!.Y~> +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]F!6k-'%Enf%DIm]sDIm]s;?/H9m09ru,s=C" +1%=Q67fY:i!8HK"#"JYO4X^<q,lk@Fm0(W5,nLjam0,u`4Zs3$dd8*U!%MPtASu's +ASu'sASu'sASu'sASu'sASu'2!/'d"!*SYO!\FCPqs=PW#X&t(D>W]%gB\Jj4\>nsASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sDIm^'ASuBsDJj$'DIm^'ASuBsDJj$'DIm^'ASuBsDJj$' +DIm];!.Y~> +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8T:\3r_?q4$_:e"8N:e"8Q9U4o1#,k5#b0!b3 +nEgD"9Tk*'iSj/.^eC3>P"aL#m/l6?L%WRhI8'8""M7@%?>]?%"_M>gb"mB3m2UjS85McP7SlQN +7SlQN7SlQN7SlQN7SlQN7L^(#;uhdAaoZubiVW!HL/5Y.D+po+m/jmnRf1B%\c +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sV;"Kk[<(Af#2)-sC2)-sN95NmW#' +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]8!V>[f*YrX)DIm]sDIm]F!,_#g#)<164Zrs= +nEgCe!$rQagYqN(WW4G1,ll0^m/l#B)tc>p(BF'o"Jc#H#Vku="Xa^A4TS(#m2T++;Jp&`ASu's +ASu'sASu'sASu'sASu'sAJ,jKMu[PX4TZE"g\^@B<<5'B&-.L`m/j'`./c;%2?5=HASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASs("J,~> +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8O@.WaqPtXSB7SlQN7SlQD7oA72m/_Q0rlP7; +L@FR5f1_-O9]5:BiCnsJN(hjrm/km5N:kNW)^eBI)_.? +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sY<:c:`CeHB<0f:[C0f:[?7o#*1P6#)grn%6J +AakldM+a(b9Al!;_PY6l+P6-S6PkEZ0BNOeh"E@)S:hB9_"]0g'`_1-qP9#KT7l<"Y0f:[C +0f:[C0f:[C0f:[C0f:[C/c]CUn6uBXm+;>H>5FEfInP^Pc"KatrK@:o:sJsk98`cp2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-s$!.Y~> +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]$*qSb/D#ds]ASu'sASu'j('r[\m/]]Xr]L8_ + +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8OD=d-)^e@6r6?L7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN+TR#~> +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sY>4[pfInMm]0f:[C0f:[C2+qcOP6Od%f\"GA +D"*VkED*W`:>h;_MbB*'P6-S6S+YD7@@0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C'``a~> +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]$1%XcBWW5"rASu'sASu's;?1S"m03h-4Ztb) +D=HoqI/ki4#iP(SgAi0U)Z\Xcm/kK3-1sD%"\81O"?H]L!,_Dr#0[&m4Y6Z$d-Vij!)d]GDIm]s +DIm]sDIm]sDIm]sDIm]s8H:,$FRb:iII00!3!DhJm0l#U.6TQm#ds'egB\>f4\Hap?uBOnASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu's/HC;~> +>6#g9:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e!oE@.N[o?r9Bi7SlQN7SlQN7r@V[#Ja#rb0%:h +U%%FP?s_!(9]5:AThMH.KhV.+!ln!'ou[;2L@jj:iDF^>9U5;<#,k4sb*#H=d-Vn5;+FGP:e"8N +:e"8N:e"8N:e"8N:e"8N+TT*r`+edA!+bQ@"GKlM9QU$s%+el\L!$Z$=kE%f9W@s49.^TB:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"7t!.Y~> +>6#Bm2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-gU<:Z4^<),/*0f:[C0f:[C7p>8C#CfC9f\"2: +EU].p<++@19Al!;ED*XjMbE]+!eO(@p"0:AAb;/iN_XlP95O9b#' +>6$6dDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDImAp*qJ\-*XH=pASu'sASu's(,>1C#H@bM4Zt\' +IIQV,*XFnF!9!5JI/ki^)Z]Nt!jr"VofW +>6#g97SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQJ;=a)`ThJ$S7Rg3D:e"8N9Ng`L#DQ$cb0%Or +L@OX8ZV6>#KhUIam0-X!b0"g'o^)_#9VV4&!DeIBm00XdU<6/pp$Ds1:Wgh69]==b)3mld:e"8N +:e"8N:e"8N:e"8N:e"8N:^nKFaoT%`o2G^#nB(oV:MlA^ZhWnpiH%\@b+_R;D+oBUb"TVO(JmRt +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7Nhb^~> +>6#Bm0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[R:@aSXED&DO0ekO?2)-sC6rWH9#A$`Of\"GF +AatrgGtXCSMbB)hP6Flmf[tIEoTK?.9<7a^)/Mr'2)-sC +2)-sC2)-sC2)-sC2)-sC2$kE)fE'$5o3q]?nCRni:g.[OH2*R1Na5;0fW.YE>"aJFfM'Ni&iDC$ +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0bj\=~> +>6$6dASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'/#kI?lI/l6EAS#ajDIm]s.MhC<#?:d_4Ztb* + +>Q>p::e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8T9]>U1%H1G[7SlQN7SlQN7RpVJm/^(#rQ5.7 +Q1=5G?rk+dP"`pfm/bhFo'HXH9Ua,HFBS8'!l.L(ou[;9L@jj:Alcaj +>Q>Kn2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sV99/V-%?=@W0f:[C0f:[C0h51/P6"EtrR_-D +D"3\n<*%8rRnJA)P6$Mcnrj8o9;L4mGuO@!!e3kDp"0:GAb;/i='!Su +>Q??eDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]8!8I,4%GMX6ASu'sASu'sAJQ'Jm/[J'rB1/] +D=Qut*X+Md,lk@Em/bFuo'HWu!%9un',L6-!ic5LofW +"99T77Ss(R!)WYa!)WYa!)WYa!)WYa!)WYa!)WYa!)WYa!)WYa1f-Y<7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQG9Y9l_%'E8t7SlQN7SlQF9SVs%!jbRhrlP;Y +9U529#F.uOb0$t_Q1XGGiE9%:o^)_#;.]aL!G,m8m/j4[XS'^:ARP2u#.%!^b0"O.p?`*M9WZCZ +N(hjnm02IaTn[VkqFh#hAp^K.nEh'69L_iJ:e"8N:e"8N:e"8N:e"8N:c&0!r5o#=oMbg$n]Co] +9]>m9"(4erU&43YHVBn'b"]]8!'!GE7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7Sjm$J,~> +"99/k0fAqb!&aa1!&aa1!&aa1!&aa1!&aa1!&aa1!&aa1!&aa11c7!F0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[J976;o%!P?40f:[C0f:[C94dLS!dRG7rn%:s +95O0_#Ad&/f\!l1D"NnnN`/]5oTK?.:2'XZ!GGR,P6,i!\+SASBN4Yg#'ik+f[t.Bp6,_t9=NR+ +PY6l'P6HtrEFiESqF^rd=(-3-n<4\p9//:Y2)-sC2)-sC2)-sC2)-sC2'W*Sr7D"XoO7f@n^mnp +99/n5"&qodEVkq$@8!EkfM0UV!%fo_0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f9RDJ,~> +"9:#bAT%KY!,hdI!,hdI!,hdI!,hdI!,hdI!,hdI!,hdI!,hdI1i?lBASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'=!2T2Q%$1H=ASu'sASu'W!*/FR!gis9r]L^X(-V&s9nEh&R!+g%ZDIm]sDIm]sDIm]sDIm]sDFjgSr&k$YoS`d$nN?pi +!8ID<"!.FBIJ`C57fXt44\[mK!*WrOASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASranJ,~> +-NG;Z:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N;#Woa;#Woa;#Woa;#Woa;#Woa +;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Wof:e"8L9U5/8!ddU4r^I&f7RfmDa6i6qF&0XNaoP:m +oBcUk9Pj[M!FB1,m0)Bb9MD/Qm/um/_9(oZ@5h9ZQnp#hN3[_90oS9\9(,!nU4Z +rlP;29ZQhn"6$D;@/`h':L7md4XL)!s%ED_r_*?0Y4CrsY"VAU:e"8N:e"8N:e"8N:e"8N:du`2 +Z2;ZDWV'3jAF[eCAS1i,"lW./APBo;m/u +-NFl92)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2?#<12?#<12?#<12?#<12?#<1 +2?#<12?#<12?#<12?#<12?#<12?#<12?#<62)-s@95O-^!b"_ar\4R60el0pK'ea'>u8fEfE"f[ +o906'95sj^!FSn"P6?nL91s9tP66hD:r`Le!ENY$P6"rco[j5'97lo%#`2J\c.L[,98WG-!f9`e +rn%:J97li#"-.S:<;oMo:ge9p5puXos$QiWr_!8qGOgq7G=seJ2)-sC2)-sC2)-sC2)-sC2),mI +^&-F^[e4)0Eq.c_BNP(p"cc66BM3jQP66hE +-NG`0DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDZ42IDZ42IDZ42IDZ42IDZ42I +DZ42IDZ42IDZ42IDZ42IDZ42IDZ42IDZ42NDIm]n!,_8n!_35Mrac7NARuVX[I*>_3WV5=4TPR` +oBcUT!"]#k!=0b>m0)/u!!%H?m/u)Y!B0p?!"ks"r$im=*m/u)a"ZZ?A:,iXd!,c@cASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASs("J,~> +]?% +"348>_>VLXRS9"@m0;0S9T3O[fD"Y7f3h:HrQ5.AF7no%W(_p;ao].MF85,)f4IgXrlP;I9RHU& +"6!ifZ2VlIWD'Jim0UguAkYloAVHSXrQ5U?!)Q-]7SlQD85)lS@)2F%(ZA%]7SlQN7SlQN7SlQN +7SlQN7SlPe(&>uPWV09kC%9=H9SWE2"\a$L +OuP6QkF99a*bM>*29M,[-KrR_-O?1jB_FA%PafE0&h?20TcM-!N[rn%:c94@X[ +"--GZ^&HXcZV,N;P6lhW=%c1_BT&\"rR_TM!&ZJg0f:[?2+124<.FP((QM-V0f:[C0f:[C0f:[C +0f:[C0f:Zo(\u\`[e=/1GOa;d94ds`"\X-\<`=kQP6,r$X8COFc"K`M%l#pr2)-sC2)-sC2)-sC +2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2)-sC2),gG +J,~> +1(1B'EASu'sASu'sASu's +ASu'sASu&t#5LC^;tc.MGk!ot!*/m_"TT2o"W#>[m/i@L.Jl8(3",ce+D#G%DIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIkC" +J,~> +>lZ$;:e"8N:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D7SlQD:e"8N7SlQD:e"8N7SlQD +:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N:e"8N8PHJ[m0AnP9MA;W=hF%f!esCRr5o(h9]>^4 +"1qE2])0VOCeUf'm0KC_:R]G-:LMfMm/s:a:R_4(!e!bFq!A49L.l0po?%/h9QSh`m0)CH=\PRf +aoZubU&43Za(A#6rQ52X:OE!+#fi359MAcHU;?ZJ%o!$n:e"8N:e!oN7S-HNQ1XGZD,Ec!7SlQN +7SlQN7SlQN7SlQN7K>sRaoJ^@;uhL?ao]CQQ29kPL.nSJ:M/Sam/km5P5EBtAP@%C,u@'-7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7Sjm$J,~> +>lYTo2)-sC2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?0f:[?2)-sC0f:[?2)-sC0f:[? +2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC2)-sC4A0thP6Yo#91r#Q;gdqq!bG$#$e00f:[C +0f:[C0f:[C0f:[C0`X`=fDrY[@K;GZfE0;jD#0>"AP9A=:fi\UP6-S6S,:i6BM2V2(H!p)0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f9RDJ,~> +>lZHfDIm]sDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajASu'jDIm]sASu'jDIm]sASu'j +DIm]sASu'jDIm]sASu'jDIm]sASu'jDIm]sDIm]s2uo?8m0@J/!!!9)(8UNW(<<+U+!@QY#m/kK3-2Ti$$iim"12^Z@ASu's +ASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASranJ,~> +"99T77Ss(R<_u7T:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:e!oN7Rg3D7SlQN7Rg3D7SlQN7Rg3D +7SlQN7Rg3D7SlQN7Rg3D7SlQN7Rg3D7SlQD:e!oN7T!RPnEgD2W.oYmiU#q5f26D^ao\;2U%n!X +iJ($4Z22TP_.?;e_!UOJ^m/%rA[26W%AHWqL9A=p];UHe9O>"$aq),fL2BUXFM[Li +$\_8MF-W#FHVmICXS^-J_.?;]W4T4+D,3rrqoT=h9Yg&_f:cSG9P'0fou[h?!)Q-]7SlQN7Rg3D +7Rp.,p$EN[9LqWL7SlQN7SlQN7SlQN7SlQ2!-@nW!P)b:;ui0Rao]CQQ29kWf3).cP"]8qmHqr8 +9X4N<:i&h!M?#J07SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN+TR#~> +"99/k0fAqb<])Td2)-gC0f:[?2)-gC0f:[?2)-gC0f:[?2)-gC0ekO?0f:[C0ekO?0f:[C0ekO? +0f:[C0ekO?0f:[C0ekO?0f:[C0ekO?0f:[?2)-gC0ht].n<4$4FCem#NpMr2M,&'ffE/*HEVP_# +Nb(jk^&$@jc"KaYJ!6(VIr&%VBYFDt%BE<#ATrWJHurpu945I1fFQ5792oJ=EHHDEAQh`"H-Pm3 +$]@YS?#4=g@89I'\,4ecc"KaUFF8:P>#8%kqq)=&97N.hM/cKf95'R'p"0gR!&ZJg0f:[C0ekO? +0h4lJoog/-9/SF]0f:[C0f:[C0f:[C0f:[1!.4Im!QT6V@K<.nfE0;jD#0>)M,RHpRnH_.PEUT( +9>18U:iK'I<<+7$0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C'``a~> +"9:#bAT%KYNW/bSC@?,lf!^mHq;B +!&FI8:_*PSM?$4cASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu'sASu's +ASu'sASu'sASu'sASu'sASu'sASu's/HC;~> +!<=;A7Ku[Y7SlQD;#Nic:e!oNrC-lc7Rg5Q7QjR;7SlQD:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D +:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D7SlQD:e=?8ea3Em9X4H:!bG6Eqs=RGQ!$e&_>).R_1h_Z +!G._saoSbhqb.&eAX`D:"2Tq-:]*lg:L8ISm`GU9I9->@!`jE3pW[!/:?n;/Apkm774H7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN +7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7SlQN7Nhb^~> +!<o632)-gCr@nC30ekQa0g.BK0f:[?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO? +2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?0f:[?2*=NCeWU&G9>12S!bb>Yqi_2DCfS3InMm]0f:[C0f:[C0f:[C0f:[C(BCQ1fE'EeqI0HF +n^mk=@JQ)jIo'OmUfRCd!/pd-;/f0EP;N=p0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C +0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0f:[C0bj\=~> +!<=_MAHm$`ASu'jDZ+,KDImBsrFH(KAS#cXANapBASu'jDImBsAS#ajDImBsAS#ajDImBsAS#aj +DImBsAS#ajDImBsAS#ajDImBsAS#ajASu'jDE%Vrea3EW;3#h\o +!=UCR4TR;OqZ$Zu$n1m6"#qP7!W2p"!=0JsmQCV,(BsdDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s/HC;~> +"99T77SrkL!)WYa),Ndl:e"8N7SlQD:e"8N7SlQD:e!oN7Rg5Q7KZIV7Ss%Q"&MHV;#Nic:e!oN +rC-lc7Rg5Q7Lrc19aoSblr_ro/WUn79]#r0D9ZQtr$+iu6_82RgI>kH/b#3=TQ0mrT +&k5\e:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"7t!.Y~> +"99/k0fA_\!&aa1))X-'2)-sC0f:[?2)-sC0f:[?2)-gC0ekQa0`s9f0fAna"#Vef2>o632)-gC +r@nC30ekQa0b6,r0f:[?2)-gC0ekOR96]!O!eO'jq:H+h<`!U[JpD0991rZno[jAfRt?6MUrN/] +#0jKT\#[3en^mua]tMG1f%:)6X1cOHfEK97<`XLTn(7b/!&ZJgr\4a;0f:[?2)-gU98WD,"HH,; +0fAqb!&aa1!&aa1!&aa1!=oh7fE&^@raGnK[e&,T`n8pq97lu'$%,QMc-<&9Js +"9:#bAT%9S!,hdI)/a"sDIm]sASu'jDIm]sASu'jDImBsAS#cXAHQg]AT%HX")_[]DZ+,KDImBs +rFH(KAS#cXAIiZiASu'jDImBsAS#a/!0Gh"!jr"Aq)o-A"T`J9[?tec!!!9RoK!4DXi$)@S*3&i<&(F1d64]2pnD=-^9 +)J*etDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]2!.Y~> +!<=;A7Ku[Y7SlQD;#Woa:ut.H;#3W];#3W];#3W];#3W];#Woj:e!oN7Rg3D7Ss(R!_6&,f^/`J +:V->D!P3+F9EJOKWI`4`ap0L-7SlQN7Ss(R#>dlZ:e!uLHhQh@=[u:X:e"8N:e"8N:e"8N:e!nS +3:Y,m`3HT=ap=G39M]c!:LMfMm/jmnD"l'ZI8#C_mFM=]7Rg5R7K?9a7K?9a7QjR;:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:duT.J,~> +!<T$-2>T$-2>T$-2>T$-2?#<:2)-gC0ekO?0fAqb!_6(=fTQA9 +:r`:_!QK*V9*/LQZ[pd#fEX,;0f:[C0fAqb#;n4j2)-s]@J5m!;b&]"2)-sC2)-sC2)-sC2)-fc +4Rq&*d_ +!<=_MAHm$`ASu'jDZ42IDWPF0DYdoEDYdoEDYdoEDYdoEDZ42RDImBsAS#ajAT%KY!YtgEf^/_] +!B0^9!B(Jd!!3EB/V-(V4U2E/ASu'sAT%KY#B"*aDIl]G8+u?M((tLrDIm]sDIm]sDIm]sDImAZ +&Fhmb6VC)D4UP^AS#cYAH6WIAH6WIANapBDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIkC"J,~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss%Q"&MHV;#Nic:e!oNrC-lc7Rg5Q +7KZIV7Ss%Q!)W8V"%Z9lf@oTnL.n'/aoo;ER]3lLb4*Od*YLq3:e"8N:e"8N:e!oN7RpVTm1aD- +7SlQN7Rg3D7SlQN7Rg3D2umaQapPCIAtaQK9QWs2W;5f^Pt[qJao[8jLApQOVZ8PC:e"8N:e"8N +:e"8N;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa;#Woa +;#Woc:_s+^~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAna"#Vef2>o632)-gCr@nC30ekQa +0`s9f0fAna!&a@&"#WhPM;"-pAP8ilfEB3iUpJ'lf^RN++:KtZ2)-sC2)-sC2)-gC0h519P8%1j +0f:[C0ekO?0f:[C0ekO?/HBkNfF#;b=)hYD96j0/FSV+%CeLi)fE-t(Ac@l)D#be82)-sC2)-sC +2)-sC2?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<12?#<1 +2?#<32%fn>~> +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%HX")_[]DZ+,KDImBsrFH(KAS#cX +AHQg]AT%HX!,hC>"&]C?bhDFc<<+H?4TmYk-nR?.4n(TI#o[AdDIm]sDIm]sDImBsAJQ'Tm1_8j +ASu'sAS#ajASu'sAS#aj=o]](4UNqE-[eJj!##>JL\^<=D#c$\4TZQ& +!<=;A7Ku[Y7SlQD;#Woa;!(4I;#3W];#3W];#3W];#3W];#Niq:e!oN7Rg3D7SlQD:e!uL@,]o. +!hi;0J]cil&e#RQ7Rg3D7SlQD:e"8N7SlcUp?`WB;+=#O7SlQD:e!oN7SlQD:b;Z6PJlM(%#%C, +mHrM5:RYT`@+Y;C!oZq'qT8ku9QU1":0R]d7Rg3D:e!oN7Rg3D:e"8N:e"8N:e"8N:e"8N:e"8N +:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:e"8N:duT.J,~> +!<T$-2>T$-2>T$-2>T$-2>o6A2)-gC0ekO?0f:[?2)-s]<0#at +!c^kYJ_8i3&eY^40ekO?0f:[?2)-sC0f;?op6-8#:,+I\0f:[?2)-gC0f:[?2')`fRF:-J%#[c8 +PEUi&:o%Jl +!<=_MAHm$`ASu'jDZ42IDWYL1DYdoEDYdoEDYdoEDYdoEDZ+,YDImBsAS#ajASu'jDIl]G*o#K; +!dt%^JN_jQ&dKOsAS#ajASu'jDIm]sASrt'p?`Vc#\@RbASu'jDImBsASu'jDEn28A4,B?$l]2j +mHr+=!@S3R*mFNK!o!_lqE4m*!':)G:2Ku=AS#ajDImBsAS#ajDIm]sDIm]sDIm]sDIm]sDIm]s +DIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIm]sDIkC"J,~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss(R"&MHV;#Nic:e!oNrC-lc7Rg5Q +7KZIV7Ss%Q!)W/S"%Z*niSNr'ZV4q]b218B_#PYV7KZIV7Ss(R"AhQW7pu&X",9K=;#Woq:e!oN +7Rg3D:e!nj!)QX*WTM>*_9-S%rTsg09Q\F?9QU't!G5p?ao\#*D>`cr3"8>R7Rg3D:e!oN7Rg3D +7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD:e"8N7SlQD +:_s+^~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAqb"#Vef2>o632)-gCr@nC30ekQa +0`s9f0fAna!&a7#"#W_NNo#s$GtVh%f\Y6^blALV0`s9f0fAqb">qng7o]2G"(b+[2?#5XRZ,7-(^0ekO?2)-gC0ekO? +0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[?2)-sC0f:[? +2%fn>~> +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%KY")_[]DZ+,KDImBsrFH(KAS#cX +AHQg]AT%HX!,h:;"&]+?gYV4DZ42YDImBs +AS#ajDImB)!/?G`;s$4F3'@cnrTsfs!#%LA!'9uD!@J +!<=;A7Ku[Y7SlQD;#Woa;!(4I;#<]^;#3W];#3W];#3W];#Nil:e!oN7Rg3D7SlQD;#Nic8PE:= +i9^WL9ME$Kb218EX8jPC7Ss%Q#uF)\:e!oN7SJ1&m0&/;7Rg5R7KZIV7Ss%Q"&MGr'`Cu3M8\]% +"gMB-:JYj*m08;=_9.I*Q2BqLAo.Cf"/8J$iVi.>i;aZ`7SlQD:e"8N7SlQD:e!oN7Rg3D:e!oN +7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7Rg3D:e!oN7ReO$J,~> +!<]*.2>T$-2>T$-2>T$-2>o6<2)-gC0ekO?0f:[?2>o634A/V0 +i0+7e92!9Uf\Y6a[f@4%0fAna#rOFl2)-gC0hYsKP6>Gi0ekQb0`s9f0fAna"#Ve>(&_SBQdY0O +"he;::f(?nP6PSkc.IqID#9Cs=)e)i"05'rNr>/;NW9\H0f:[?2)-sC0f:[?2)-gC0ekO?2)-gC +0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ekO?2)-gC0ejCCJ,~> +!<=_MAHm$`ASu'jDZ42IDWYL1DYmuFDYdoEDYdoEDYdoEDZ+,TDImBsAS#ajASu'jDZ+,K2uj`< +i9^W.!!"p.4l/=*1&s(IAT%HX$#X`!W]$-P-,<""=3tg\pM8gAiL1ASu'jDIm]sASu'jDImBsAS#ajDImBs +AS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS#ajDImBsAS!FnJ,~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss(R"&MHV;#Wod:e!oNrC-lc7Rg5Q +7KZIV7Ss%Q!)W2T#>dlZ:e48W]Ai2\ThIEG_:m$:_6K_tN.#eirac14?=$\2?N"F8D>nYOIIqX\ +I0PCaP+&,H]"uMjMuY^57K?9[7fQ-^]CtUmL.qS9!)WM]!)WYa!^6T8r)<]7`9YPL?;Zu/9Ps^p +#I@+'b0"No]D_*uf1^nsaoe_@@+Y>D!l+dfr^HlarC01O7Rg3D7SlQD:e!oN7SlQD:e!oN7SlQD +:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:e!oN7SlQD:duT.J,~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAqb"#Vef2?#<42)-gCr@nC30ekQa +0`s9f0fAna!&a:$#;n4j2)S$%I,^=mED&Coc.^eTc+U0IP_+1+rb)C7?sm%6@/Xa=EW17XK(O?f +Jd.-tS#!*o`kg:/PQ2s,0`X*+0`ja9I.ia)AP<"W!&aU-!&aa1!\aU1r*f\Ydd,Nh?qtND93V7W +#C/tKf[t.9I/T61M+`d*fE8TZ +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%KY")_[]DZ42LDImBsrFH(KAS#cX +AHQg]AT%HX!,h=<#B"*aDGgH?UuLbEI/jfY38-M#3&2p/,Sq+-rX8l4#RCV4#lP/3&H3@;(\AC? +(Btg(,q(2t2ShNX,QLF7AH6WCAHF=]V"X0V<<3#0!,hXE!,hdI!aYk!r/:Z)6gHo8#Qnp)!&=E= +#FGKC4Zs;UV#BZ^bQ&U\4TdG?*mFQL!ic5crac(IrFJB7AS#ajASu'jDImBsASu'jDImBsASu'j +DImBsASu'jDImBsASu'jDImBsASu'jDImBsASu'jDImBsASu'jDIkC"J,~> +!<=;A7Ku[Y7SlQD;#Woa;!(4I;#<]^;#<]^;#3W];#3W];#Nil:e!oN7Rg3D7SlQD;#3Wa85W'G +iTBM3iHn6g,lk%)ap#V\N.#8!8sHVs]1"&MHV;#Nid:e!,=4o81ZA@_*M#/NuumHq^0r9Xcr +9W?1W_,a^trp9c69X4T>"0km(fDFqMC]HFa:e!oN7SlQD:e!oN7Rg3D7Ss%Q"&MHV;#Nic:e!oN +rC-lc7Rg5Q7KZIV7Ss%Q"&MHV;#Nim:e!oN7Rg3D:e!oN(BAs~> +!<]*.2>]*.2>T$-2>T$-2>o6<2)-gC0ekO?0f:[?2>T$12,6e\ +NolN0NaYRN(BCr&fEKO+P_*RLqb%Jq;cd.+@:4n'[@8?_T"#Vef2>o642)--P6i11>W"2.`1M>NJO;#i1&2)-gC0f:[?2)-gC0ekO?0fAna"#Vef2>o632)-gC +r@nC30ekQa0`s9f0fAna"#Vef2>o6=2)-gC0ekO?2)-gC&cdF~> +!<=_MAHm$`ASu'jDZ42IDWYL1DYmuFDYmuFDYdoEDYdoEDZ+,TDImBsAS#ajASu'jDYdoI;@!8> +gZIl-gID5Z1&s)f4U!es,SpjmqZ%05(+1gk7n5U17lj.$-SZtrrY>J>pAjh$!!r%M8_racCRAS#ajAStBG1%jo77gT$(")_[]DZ+,LDIl'5AG_;dJOo/k"ulU"mHpp]r9XcW +!%g>s3!C)Prp9bW!&FO:"#:#cbkpcBM#^^jDImBsASu'jDImBsAS#ajAT%HX")_[]DZ+,KDImBs +rFH(KAS#cXAHQg]AT%HX")_[]DZ+,UDImBsAS#ajDImBs,QN>~> +"99T77SrkL!)WYa(f3[k:e!oN7Rg3D7SlQD:e!oN7Rg3D7Ss(R"&MHV;#Wod:e!oNr^Hud7Rg5Q +7KZIV7Ss%Q!)W2T"&MHV;#Nic7ndO8kj8V]=\MLY/-).#aooP[N,;Vp9F"F,H^1bGa5PG5s5=78 +a2"jOL3m<*r_*GqCk\Upc,p&W!;o:d;#3W`85*1N7K?9`7KO_5:ARojAAmoY!j#(u +q!A,p:Vm%Q#GOn(fAVHXIK%@k_,aFRqX";S!:3/T;#3W];#3W];#3W];#3W];#Wol:e!oN7SlQD +:e!oNrC-od7ReO$J,~> +"99/k0fA_\!&aa1(c=$&2)-gC0ekO?0f:[?2)-gC0ekO?0fAqb"#Vef2?#<42)-gCr\4L40ekQa +0`s9f0fAna!&a:$"#Vef2>o637nZp8k`Z6s;bKM5+onG#fEBI*P]9b'9*\3n@;L.8Jr\6Bs,IAA +Jq%uaARSP5r_!ApE/Ud:c.E%e!;nPO2>T$02+pl)oofJ`7klms0`X*00`i'i>P_e0EmjC.!k1gH +plbb\:sK!l#HLL!M2l.?K)XC)buRSkqNCq;!:2E?2>T$-2>T$-2>T$-2>T$-2?#<<2)-gC0f:[? +2)-gCr@nF40ejCCJ,~> +"9:#bAT%9S!,hdI(iEnrDImBsAS#ajASu'jDImBsAS#ajAT%KY")_[]DZ42LDImBsrac1LAS#cX +AHQg]AT%HX!,h=<")_[]DZ+,K('#_ikj8VB('#gq63&Fq4Tm_r,S1.Y!!`cW7r=?`[G0*rs4[h' +[Ao=: +!<=:b7K?9^7K?9]7K?9`7LW*_7SlQD:e!oN7Rg5N7K?9a7Kc:V9RGCXm0UgM9Mn>M7Pk*sl,j+> +P'p[99E\L>Q*])Vm0)%ITmKrA9ES=;N3(FL!u2G<;#Ecg:e!oN7S-9Na7Sa"=\&H\"&MHV;#Ecc +:e!n`')5E+DXPXKYtV=sm/tCG9To=r!Kp7X9E926aofIk9Y:,f'+GRD7SlQD:e!oN7Rg3D7SlQD +;#Ecb:e!oNrC-lc7Rg5Q7KZIV7Ss%Q"&MHV;#Ni`;"I-V;#Ec`+TR#~> +!<&I9*A1!CjClOP6?_fEFDfF9*84?Pdf&m!uDA#2>f072)-gC0g&*(K(P6-;b-gA"#Vef2>f03 +2)-fl%/=93K'q7m]hf022)-gCr@nC30ekQa0`s9f0fAna"#Vef2>o602=iO&2>f00'``a~> +!<=^nAH6WFAH6WEAH6WHAINHfASu'jDImBsAS#cUAH6WIAHXsm!(Y9"m0U0T!!lJ6AOukLkrf,, +,o6jd!!F&uD4&P]m0(Y#I7G(P!!p"#p\hV"sBk&fP=mDImBsAS#ajASu'jDImBs +r+,tJAS#cXAHQg]AT%HX")_[]DZ+,KDImBsrFGtHo47o>r+,m\!.Y~> +!< +!<"_LNr@n@-!-@P["211L%Mu9[$(lXHu*(`91r)pMmL[[fE/M^ +(]H,h2>T$06q^L2oTKE<911Klq_8(.r%S7*!%@SN!2Ar7!ldlQqi_,B:eR&LfE8gFJuek&!c^kT +q3(l,!#P&X!&aR,!&aU-!&aU-!&aU-!&a^0#rOFl2)-gC0ekQ`0`X*10``!hJ,~> +!<=C7AHXI_!(WjTm027"0`V25rFH%:!$LYl"#;/9"o\K(0iaUb[-\7UUhr-u!!!$.)_F&$4T[A= +1B(hbDYdoH.KCNto^)e9!%MPtqdfbFr+,q;!''_3!+G=Z!]C%,qs=L?!<=DA4TdGY(Ff;G!Y>?e +q<\7'!&EtR!,hUD!,hXE!,hXE!,hXE!,haH$#X +!<=:37K?!Y9ESFPZe,$?#hQ\RF%f8)8P&_J!<>jaapPD4D,s>(;0/GHiN)>Ja/F_qr_*E*IA4=- +aolbc1e(=@7K?9a7fH'^L>hak!lmu+r^Hud7Rg5R7K?9a7KPCH4n_hT`:(hL9SWE2!gQH-o?%,_ +9U5D?'8ccH7SlQD:e!oN7Rg3D7SlQD;#Nic:e!oNr'gcb7Rg5Q7KZIV7Ss%Q"&MHV;#Ni`;"R3W +;#Ecb:duT.J,~> +!<t[gc4>m!j!/4T7&;2)-gCr\4C1r\4I!!(6Hh!7L>g!D@##P6,PnK(IUr +JkKqTP7ppr,;D&10f:[?2)-gC0ekO?0fAna"#Vef2>f022)-gCr@nC30ekQa0`s9f0fAna!&aC' +!&a[/"#VeJ!.Y~> +!<=^?AHu*_!!!d7R*>Bn#gB)]3WK-c3)]Wb!<.`trW!$/(F_8s +4Tlr/8S)f=AH6WIAHXI_!*.eFm/jZq3 +!<=:17KPtL8,Z*]=oD_.=oD"q;+sRV7KErEou[TBN,;Th9Mp/1a.hr'f<^3Dr_*GqD2"^hi5u'[ +!<#@h:e!oFr_*?0_"$doPtX_FqF1H]r^I#e7Nhb,p/D$KnB(gD9VM:L!ddV"ou[>p9RHO$!B:)I +7K?9]7K?9\7K?9]7K?9]7K?9`7L;m\7SlQD:e!oNrC-c`r'g]1!.Y~> +!<j:..5>0`_S.p"0S[P]9_s928o8JteG2M0WZ6r_!ApEJpm2i7J&m +!<"VX2)-gC6q^0VJ+8^)CeHWCqCqt-r\4O50bj[mp0n#gnCRf^96'ck!b"`dp"0>194@RY!@%U4 +0`X*-0`X*,0`X*-0`X*-0`X*00aT]l0f:[?2)-gCr@n:0r%S3e!.Y~> +!<=^=AHH7!(B"45(B#9S(B"47#V%h/AH +!<k/:kK47F!#J+$ +7Rfp?7ncTt]C5+fD,L:%"&MHV;#Ni`;#Wra%J<[#AFR_C\kJgmm/h,uReOr,U.fF_q!Ac:$k5Zq +:e!oN7Rg3D7SlQD:e!oNr^Hud7Rg5Q7KZIV7Ss"P"&MHV;#Nic:e!oNrC-c`oL8gWrC-c`r^Ho3 +!.Y~> +!<&[)&cha[$+HCD:eOG[@<$mfP6?nnCgC!=9*J.*Js#,&O"#Vef2>o602?#?1$2%a-Eq%]_`_1=HP6+o\V"`LDX%QWVplcCt&d^9I +2)-gC0ekO?0f:[?2)-gCr\4L40ekQa0`s9f0fAk`"#Vef2>o632)-gCr@n:0oJ$>'r@n:0r\4Eg +!.Y~> +!<=C0AHGah.f:(^.fVI.;Y=T%,QRX'#r3eD)rI3!!NB3(F1Rjk<084!$l,n +AS"b!('"=qV!m[O0aRbi")_[]DZ+,HDZ45I'(q1`Jabf(2?81#m/f!B./,k,.0)*Wq!AbV#81TZ +DImBsAS#ajASu'jDImBsrac1LAS#cXAHQg]AT%EW")_[]DZ+,KDImBsrFGtHoOS#?rFGtHrac*^ +!.Y~> +!<=9o7f,XV/HD7S#:J=GbH_JKBm02+WTn[/Tr_*MlATWWpXLdiB$Yo`!7RTg<9MATSfC&#- +a%T2&7K?9`7KZIT!$1]2!6"BL"BJ[.a4L4U"6!W`WVO[=Ytncdq!A0)9E67(7K?9^7K?9]7K?9\ +7K?9]7K?9`7L;m\7SlQD:e!oNrC-c`rC-lc7Nhb^~> +!<WZh`5U]hh[gplbec9)o^p0`X*.0`X*-0`X*, +0`X*-0`X*00aT]l0f:[?2)-gCr@n:0r@nC30bj\=~> +!<=^&Ac$$?5QE524U +!<=9o7f,X_2umL3b.<:&9QR/QL[>8sZ_<+c;>j/r:L7jZKp%n(XLc!ZrQ5Ma\u[Y59LhcM;23-W +m/i#98Fo:P1]T*!;ujK%ap,G2FG7Q1 +!<E3M,%*kqq)"q<_eMHP8.M!9)p.j2)-gC0ekO? +0f:[?2)-gCr@nC30ekQb0`s9f0fAna"#Vef2>f022)-gCr@n:0oJ$>'r@n:0r@n +!<=^&Ac$$H=o]U,4Z45[!'5nCL[>8hR!hs^#lO`2!=02L)^Qma1,_$MrB1NJ2DP[J.M`!a#Z\:u +m/g8f;Y+H$8H;BTMuZEA4U*e`',rn_"o\K%Wr)/cbQnA1q`P$@"UN?Im/TZU!"hP/DImBsAS#aj +ASu'jDImBsrFH(KAS#cYAHQg]AT%HX")_[]DZ"&JDImBsrFGtHoOS#?rFGtHrFH!]!.Y~> +!<:J>iMJaNI(#M7#!Tn[Vr;=I6]:M,m(l0SQ2;+L1H![Rh:oMbh/p +!<T$-2>Js,2>o692)-gC0ekO?0fAna!&a^0 +">qng'``a~> +!<=BrAbosC&d^N:!<>0gJaNI(#L'T;I8r +!<=9o7f#US,m-q:F2rk!o^)kAf>,#$TqVIN#)8D.Tru#Zjm<,C9M"_D!>5k6;uhLCap5LR=i]pA +9O@_@!i\t-qX"?X9VVL.!e!b9q!A9Z9Q\E/%7IQm!?hGn~> +!<M19nsEH1to#%_UeEHceejc]ac9/Z8p!=T;,@K;G^fE]Dm;hC3\ +947bO!jb^)qNCu#9<8$D!eO'bplbo%96o/E#qiS>!>PTb~> +!<=^&AbosA1("$^3jjP+o^)k;bc7J#I=;*3#$#MWI?:8Kjm<+t!)iB!!?)UCMu[_g4U3kG(:EP* +!!rQe!\FF#qX"?4!%Ik0!Z(ibq!A96!#%L)&n&(X!A+;%~> +!<=9o7f,XX8PDfpa+iCnt)ao[`" +LA:-?ZV4rQ_#P:X7KFY4J,~> +!<8+A;8!%)a[@K;hhfE/*HI/]<2G>!knfE.O8Ac%YmN_><0fE.O8 +Ab_GnGtVi'blAB_0``!hJ,~> +!<=^&Ac$$A2uiq5[=R_bm/l#J(@br;!% +!<dZ8Pr/u]7K@fm/i#98Ff4Z2un$Bb.4L@P_k6\S#Q#%!g67/rTsZ59W\69!d%,7r9XaJ +9SLX3WD@.$m0C[-?GXdU!%kNH!?hGn~> +!<rK@:k9=OoQ!dRF\r0%AG +98hHTZVX`uP6Z\9@*R?'!$8I$!>PTb~> +!<=BrAc60C3!]L=Uk.pOm/g8f;Y"B.=o]a04\/LV@;'=b>Z:5W![RijrTsYV!&FO:!YYQhr9XaD +!#n'a/HI6om0C$"#WOt$!'ml%!A+;%~> +!<=9o7fPp\85W&gZ[qM]m/k=*8+B%M,ljP#ao\;2]D_*uf25lQaoZ-Ja8PB1]1eC1\lMtcq<\I> +=]W,Vb%gu:ZUOs=!.Y~> +!<28+A;8(BCGufE/*HI/T61M,%IWfE,_ZK)Ll +!<=^&AcH +!< +!<PTb~> +!<=BrAHYmH!#C?@mD8/k*WTU1( +/cIm6&cf4K!A+;%~> +!<=9q7Kl1R9Mq)6JaL;@!esB?n4!EY39nWjWKNFUD,Jp_m/hW.WW($JWD$0SQ!$eTb'csWq!A-0 +9Ubq&!=TUH7KFY4J,~> +!<5gH0``!hJ,~> +!<=^(AHcHk!!mGrJaL;@!`]4[n7;V#&F)C_/L;]$&.$MXm/fcX/cIm@/H?&nD&*+#4Vn*Hq!A,Q +!%@e/!='OKAH=@_J,~> +!<m33:QeLciVi-Tf3(dCKu(p:AP>d(U<8ouHhct0 +ThL1=ao\XE-*fu@+TR#~> +!<.QM,R&DMp9nfBM2!+X4X4@@JH#f +ED)5gfE/M^(U>ar'``a~> +!<=BuAHXsu!(Y7amD/)jO8pd"AHH$8*pYrh&H2Y4!@7aog\pLNbSC0Z)`Tu9$ig85.6T'Z8,2HQ +I/k5b4T[A=19tHl/HC;~> +!<=9t7Kc7P9OPJ`mD&#j^e[Hgn4!I2!1N8s$B.Z5f>g`pP"]KHrTsa.TlWn=rlY8Ps2kGT:LN/W +m/k'sAc0[PHN5n.7KFY4J,~> +!< +!<=^+AHYmH!$7qemD&#jWWs#gHB!?U"k +m/j9f%/`6i,lgNBAH=@_J,~> +!< +!< +!<=C#AHXsm#]8=ImD&#j[0R%9mpuPG!''[8""b#o/c.[3"Yp#D#)<0t-ik^Mqs=H%!%%M*rs/V4 +q<\:.('Q\q4TZE"@'X>E/HC;~> +!<=:!7KZ.SB#h(A!o`P*PjJRg;+sOK7KErMp_NX +I8$U7m/h?&WVag=,n7+K!?hGn~> +!<PTb~> +!<=^-AHN\J-ag,E!o*+sPjJRQ#QRcjAHYq@./c:11&ub$m0,NN1*lojqX";!&H"Zm +(BB6cm/f +!<rm.m/s[j;+U+E!^6Thp +!< +!<=C&AHYm:!,^Jtm00nZD)s$Mr;cd%%2L!4-TX:Y +!<=:$7KZ4U;7j=)"4sl6D>d-0S +!<5_(qbtqi4PDN%Bc.L[<98WS1"a!CqbuS$FP6"`urn%=m<`>%SP6->/E;J2gRfFM70``!hJ,~> +!<=^0AHOml#c+rs"3d-41&V(R"V2:F)[d;q',M2k%h&^L"TeQ%"p"]>3c18=XmH4-!#AK"AHG*s +,kjG22uuP:mE>hA3'BDN!6kB."c!'s3!D&6m/\RCr]L?A"W#kgm/jZq&,JEj,lg38AH=@_J,~> +!<1f4I]H7-mAI+TT*r\tZe5 +ao\#*Zi9=sY"X8db(WOJqs=Q.9WWY9iV`'D;0;f[!c1QNq<\:C?rjl8aoYfJ33bpR+TR#~> +!<?0'k:s'`c8+`iI,V +fE.jAH2a!4G>!P?fS`C_qi_1h9=KLGNr5(A:3lik!cUeaq3(o@<*%$8fE,O_/[7#2'``a~> +!<=C(AHOml-d90h$eq%K*WQ0@#T"dB3:/j52DQj1)\<;S!!4NbWj;!pbU3B+@-hG//H@[l2CUQ] +4T[#3R/ZIXO8p([4W=CUqs=PJ!&>>jg\gF>#S[2#!Y5:=q<\:=*X+Iu4TZT'>-VW>/HC;~> +!< +!<.G@8!rZMbB*-P6He< +!<=C)AHOml-el<$!k!G2rW!$/)_F&.4UF(s)[HED(0.0b\*X97#QQjLAI&nT4XgC3!#mor4TZ0# +g\pLD7fY,()Z\Xim01]>"W%0_rTsj6!#n'a,QM]Vm/g8f.JZ+.$kcsQAH=@_J,~> +!<=:'7KZ1T@,\lf$/rLN=\MLqIA4R2ap5M@Cem`-L;:Fg"Kl-+7nDo7%n$Clb#Vo^F%fWGb0%:h +LA^ECiE93tN(hk"m/tC+9Mt`T#,+_ib-=`Zq!A-p9Q^'P!< +!<t\5DK#'!;BfY(*bplbc,96p +!<=^3AHPg1*o"Hs$/;7U('"=?(F_>s4U3kk%flYG +!<!.pq=Y3kVg;-(NUN(h:h +m0L +!<<>;N`0!'q:GbJ!#Mjo!>PTb~> +!<=C*AHEVQ[DD59gR(J:!!*KR1=A;j3$f(8!#BFq_!M8d-NFE3k[b8r!%02qOR;G2#R*1N,QP7L +m0KKf'/BPBR!m3Vm1.?g[I*?O +!< +!<,eO"Vh$NJkM.'P6QM0ES-1B +Nr"qEAP8h`:eOG_pQPSL"`_Q7PY6#kP6,;gX8( +!<=C+AHGa0D8Y`HgQ4o*!!*`]36XMj3$\n4!&8oV`pEuSD&**W3+1o\"YB^0(BE4hm09Qj&3Us4 +g\U:B<<+Em!<<*Ip[.q["V +!<=:(7KQ(WiPt6jiN@N$9M]c)_8aV%Z%Z4P:OB^sm0D7:D+mVn8OVZ0";2HlD.*;/"dMcUN(h:g +m0MZY +!<"_LY4>,_M":Q+!EE)k""`-i4PY6W) +P6d1J +!<=^4AHEVQgW&UdgQ4o*!!*`^36")c1)gAs!Crs/m0Cj`0`V1h3+1iZ"<%J-&0Cc:"`45g,QP7K +m0MGf"ZA=l,QM]Wm/l#B)u_u%1''-)m/j9f'DFWk&cc=DAH=@_J,~> +!<Gap+S^:J=oVa3s>\f<0j99MA;W8E3/C6i\fT:NQI$#2rEj\kHu" +qX"@)9Pj^N!c1QNqX"@99ToCt!c1Q^q!A,jQ6N7KF;*J,~> +!<c0J0`_meJ,~> +!<=C,AHGa0?os4U*>K!< +!<Bap5bGAP>m@Y2S=+rSdds"LFeVF&Dp1"%Q$U7,^T=1]Sh)AsN8\ +#aJ)bN(dB>^t8MO#aJ)Hb0%:r=lK8F#I@*ub0$/HQ2'_JThLXDao\gJ-*Kc=+TR#~> +!<u(Al"%Pa:0&\Mg,60)i=)@bt +#]*/CPY4qkIu4)e#]*/'f\"2E;i^a=#C/tCf[uumD"s1qED)eqfE/_d(U#Oo'``a~> +!<=C,AHFgkWlj]5Uf@[#!>?on4U3qm$ig;hOPA^\rS.@["IOU;3XG]b!u<@a@,YZ#8H9)5-Z/bJ +#]0Ps,QJTsWm(D.#]0Pf4Zt\,(>J`R#FGK?4Zt1nD> +!<>f>kM+Q%j?l-2:167fl7D7,:<6,ljk< +m02*8IEJ9jr_*b`d~> +!<&8J@mZRs;M1U,!Ch6mR-hp@77fke90&85`(BA=I +P6He9K%R,3r_!6&r0%Cf:qbN6X&)u[r0%=r9?l,6<`JjX!f9Zcp=KG)!$e[%!>5B_~> +!<=C,AHF=]gWf*j[;?ZZ!"^P<[64dN(Bjd=0l<<%md1>8bdF7.D,iVE$MXW$('6H^@,5Aq1'!a; +m01]6(Hj2QrVupur9Xb;!AZf$.020Xr9X\g!'!,$"WmI+!mCoYp,rI)!(jA*!@.Yq~> +!< +!<e+BUd8MfE/+*@/W_1;d*U@;bm3_"]/S]!%(,44T@:j +0`_[hp6,M\1&O!`B"PY;$%m!.Y~> +!<=C,AcEOlm0Cj`-NF,T,ri(k!\"okr;[EF0h4`N0Ts&.H[ +!?)UEm/\pFr]LBB-kHBYrTs[1!"Aii![Ib9rTsjE((<>h(BCK1m/fcX1A3j4(B@dFAH=@_J,~> +!<D1.+sR\I('b.7uj7*nC(!(chN!hi +!<t[guMoMaK#KF*7JpD$1 +!<=C,AH&/Q92-n-o24Z3NX@*iHc!)iOX!dt&, +rB13A!@Rg4!dt%fr]LZ/!(Yf2m;2hO4Z3:1q!A-j!#P;k!=BIBAH=%VJ,~> +!<b`d~> +!<t_6Cf[u*T +=*\4IES/o_98WG-!`rFBp=KGk!#;Xk!>5B_~> +!<=C,AH +!< +!<`VLM,$]?Ph=Wa +:eOH5c.JLYD"s1qGtXCpfE.NB*j.3u'``a~> +!<=C,AH=7\fBigeI3&@g&1BMo4TdD=+CNQ-!\sbUrp9f9!!*,u!!!]/4TZ#tbl-o?bQn1L,X":= +!<<*93'APfD> +!< +!<]hho,P6"T_qq)4qWM6iLf[ss>/Zpf/&cdF~> +!<=C,AHFgk[G(!PUdkCb#UD<^4TYrj>0ga]+;3H.m0G'F6Tm"H)]L7%4T[A=3rJ@T[?**C.6TgP +-oO4O1''-(m/[t+q`P6V>[^Pu4Zshd>-;E;,QN>~> +!<Y--es\!''rE!FTa6ao[8jY5@SfiDF^naoYmHfD+_7W(`ZY +aoT%jr) +!<389FA&G. +fE'$Er*fbrdPV$,0`_meJ,~> +!<=C,AHGa0D;FR`b\\*q!>d>?4TZ`+1 +!<q,@E0$l?$8!>b`d~> +!<5B_~> +!<=C+AHEVQgYhH'O>-_8$mdlb4T[28'$b%i=o`^Dm/\pFnN?t6#Su1lm/\pMq`P!"!/L@:!o"Ir +rB1-Zq2>B"#9^-[!@.Yq~> +!<b`d~> +!<5B_~> +!<=C+AHG0uD<(!fbZ+oK"W&qF4U!u9$347;cXd/C!1EfQ".0'!2Y'!4/HA< +!<Q?(p7KOA+iV`'OPtXkfKqbQO]!8?A_>D@VI8%!Fm/^@, +r5o(P;:kU1!o[9grlP8[AGB+*/-%N/7KF;*J,~> +!< +!<=C*AHEVI[H?i\bZ+ZD&.(%A4oRSG)uqb=AHF+Wg\gFED#aPH)_!?o2Z>H33;Yi?(BBj#m/[t6 +r&k)i#gE)2!o"Irr]L9LJbY0*8cVGbAH=%VJ,~> +!< +!<"b2fDps+@KI_R0!-i/&cdF~> +!<=C*AHPg1*o#rH#c]oc!%Ll70am/kL3(AIk2#T#8q4TdYL#gE87!?MgN +4TZo0IJ<+1O8p^.4TK?nMuka7@'*u@,QN>~> +!<b0$eZ +F8bJ,AnCta!l7oLp?_lg +!< +!<=C)AHFgkE'!,XF,QN>~> +!<b`d~> +!<5B_~> +!<=C(AHF=] +!rs-,7#j_>5>4a_]CkOnf;O$nr_*AT7R[,C"$\=:9nURi9`QK_7KXG,9ZQMe&]\9QR``ch9U459 +9T7-:YtTNb`d~> +!rrrg/rhXh018H7I.`[0M0*0$91qZ90eW>X""thu;M3U';?.NV0`r$g97lMo&V5B_~> +!rsTX@#ee$?n).(V"O*]b_J[o!!"K8ARPCH"(4Fq(P=jP(B?56AHO1X!4D1\&[`Y[-p9^(!,]rI +!$j]j1&si +2ujaa7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R+d[ +s$R&_9MATSY/gOn"Mh@/HWg;@"A)!N7R[#@!Z(iqKusIZ4Y3YHZf4Ig[b/%Zg9EnP6 +b0"QsfD"Y6a%V3daoJ./ +2ujRG0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770e^F! +s"4L<91r3"GCogN"Fk]5@8m.u"[kI*0ek5B_~> +2uk48ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARNDe +s'Q$j!!!dOOL>)3"KIi+7i)(("Y)K>AS#9EAHEtS,_\A_+oib.AHNPM!0HO6#0\Fq1-IT*rW!-+ +3'BD9!R1<*!jr"Ir]L6ap5B&4!+)a +Er["G6q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R6 +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5PmnO +5"S9>9E\3_8Ou&97KYgS%(_5:"cNEj5=S&c7KbmT*DD4Qm/km:?N/(QWJm"Ob0$\WQ1jSHL.o2X +aoI\$)\#3:7KF;*J,~> +ErZh-/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70DdI* +0K_l#9*A![4>eh`0`s*0'#o^Z"dAun0/5*(0a'01,"lM4P6-S9@/edaZ]ps!f\!N'D"a%oAP:&B +fDqZ@@K_"b+pfm'0`_meJ,~> +Er[Is?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W@/FL: +?8r_q!!EQC3)X)RAHQ6=#<%?#"XF'\?tE`jAHZ<>1&t>>m/kK;#lZsm/L2W#4Zt@sD>*>u<<+rV +4TJpcN!,rn-k]phAH=%VJ,~> +IK10R7Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"0 +7RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^1 +7R'@17RTF2r(6oZ(I(AW7RT^17R'@,7R'@,7R'@,7Rf3715O'VTaUo\7RYHi"=sO99j-`J!j54[ +q8rbM;:kR0!oZgprQ5+kq,@K?Z)[j@X%!++!.Y~> +!<"G$fE,_]M>*28N_=ZrfDps-@K_S0_Z1=M0`_meJ,~> +IK1X)ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnW +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARJhBr&F^S(LUf^ARK(WARK(WARK(WARK(WAS"F5%#@%M0a@\^ARN_n"@<*!(Dc9&!g!C. +q)ncf#gE&1!o!\grB1-tq2>HWbfBc0X(;;W!.Y~> +IK10R5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,6q0R66q0R66q0R66q0R66q0C1 +7Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7Rfd8 +6q0X07Rfd6+%AIa5=Rk,7R'@35"7q06q0R66q0R66q0R65=QdrA;\M4Ym^Ul7*7t&+TP#/9Yfo[ +!FSt)ao\P9Q1jSHThMHaaoH\^-J,h/hX@<4,!.Y~> +3<0[H0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7/hnt5/hnt5/hnt5/hnt5/ho$! +0`is^0)RI(/dO0b0eY770ek?[0bQ)n/hnt5/hnt5/hnt50/41ACPpaI]b1;s0$5mP'`_E=97Q2i +!E<+rfE/BPD"a%oED*Y:fDp[%@KjZjP5lXVX>'_g!.Y~> +IK1X)?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ +?tEnWAS#7W+(\hk?tE_WARK(\?tE_W?tE_W?tE_W?tE_W?tCni*f<)`1'[e_@*3$a/HBfa!35;N +!?MF@4T[28D>*>uI/kkt4TKU"N!7;HNW;=PXCVDX!.Y~> +FoW=J7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@+7Qs:*7Qs:*7Qs:*7Qs:*7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@17RT^67RT^67RT^67RT^67R'@3 +-pC*g7RT^07RT^67RT^67RT^67RT^07RfR27Qs:25"8"07RTHR!/ulZ$G%8Y1djet7R'@,cUJ'N% +9-5!Hg0o!W(`r_aoZBViV)X>AmYDX!-n?>#$eF<=TCELX@<4,!.Y~> +,QJH30eY770eY770eY770eY770eY770eY770eY770eY770e_rL4>/EB0eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY760eP150eP150eP150eP150e`J[!\Q2[r\4g60eP150eP15 +0eP15oJ$P&0eP*f!0iGp$H=1g,;(](0eY77cS5S3$"@46@HisWFA&\3fE-"eNqSY;=((sY!/C>Z +#&D<$B)jM9X>'_g!.Y~> +FoWe!ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(\ +-t$UoARK(WARK(WARK(WARK(WARK(WAS#7\ARK(\?tEnWARJma!$mLd$8r1j8RQ+;ARK(WcXd7u +&r_)98*TCBLB&e#4TZ-"g\1"8-OBW5!-J'r#*[9TAcQ"BXCVDX!.Y~> +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rh+5"7_*5"7_*5"7_*5"7_*5=Rk, +5=Rh+5"7b+4s3d:Oc!3/Kh(BAs~> +?N:]n0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70CCOt0/5+70DmO)0Cgh)0/5+70/5+7 +0/5-X0`s!6'!.,G7)gSS*\K0"0eP150eP160eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY0[,%>"L:kItr!fg*/r7D([95O +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?m'#gARK(WARK(WARK(WARK(WARK(WARK(WARK(Q&dL.O4[_18!'jq'?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_R!&BLl.KQsBm/l#C +(]6Dt1&u1bm/jZq,lBe*D>K1oPK_6.!30T2,QN>~> +!rs-,7XmWl5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=QYX7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Pk)d\rb''_(>X57RfR27Qs:2 +5"7q06q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0R66q0!5/6#SH9Ps%] +!HV<>aoZZ\fCnS5Pt\deaoI:o<<'!"%2,[1!>b`d~> +!rrrg0n1i20/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/4J#0eY770eY770eY770eY770eY770eY770d?Z@`fSgTbqT27pG"TZ0eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP1*!&J(n?;"JdP6"rir7D'r +:l4n0!c1NLr7D"9q-sBA!=9170`_meJ,~> +!rsTXAUe*!?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tC?dARK(WARK(WARK(WARK(WARK(WARK(WAOuk.2NU'j3"5jCAS#7\ARK(\ +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tDn08rS^S!& +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,59`Q]7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@35:cd\_32r,_(l!:7Rfd86q0R6 +6q0R65"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs9f!(6`b!`2RU +lKnY<9Y15G!l7QWp$Dc_Ac'UMPke99RZ@Fp7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R,Zt!>b`d~> +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70-W,(0eY770eY770eY770eY770eY770eY770eY790-UBDc'$]hbr#J;0ek:8/hnt5 +/ho!+0`i-k:B"](=%dApP6,Pn`r=TlbtDL +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?m9/iARK(WARK(WARK(WARK(WARK(WARK(WARK(\?pXi#30HEj3",dBAS#7\?tE_W +?tE_W?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK()!-/!s!_WN1 +lKnXi!&jg>!]U0Mp$Dbq%/W0f@JPj>[\a$[ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARO;)!@.Yq~> +!rs-,7XmWl5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Q\Y7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'?g!'$1b6,>;V,sFd_7Qs:* +7Qs:*7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7RT^67RT^67M5_! +!rrrg0n1i20/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/4M$0eY770eY770eY770eY770eY770eY770eY6t!'HIt#0f"*(GRWtpb=KV +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY760eP150eP0h!;p:-6r7^cP6-#& +Zi8SYPY6W%P6->/Pl')5[eXB;H$9650eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP160eY770eY770eY770eY770eY770eY770eY770eY770eY6o!.Y~> +!rsTXAUe*!?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tCBeARK(WARK(WARK(WARK(WARK(WARK(WARK()!"b>W5r]8Q114[$ARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WAJtRHMukI0 +D +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,59iW^7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7RfQb!'QUi9YiIa+[8F\7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Qs:*7Qs:*7Qpf/S#UX2 +<)?:_L>hOe!ln!'rlP7J@.imgPt\ddaoK!I<*M0Z5=S%15"8"*7RfR27Qs:25"8"*7RfR27Qs:2 +5"8"*7RfR27Qs:25"8"*7RfR27Qs:07RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^67RT^8 +(BAs~> +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70-)c#0eY770eY770eY770eY770eY770eY770eY77r\4Hh!'un&2U+)Z'e_9p0eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77pb<12!'.!FSn"P6,Pn`r"Bga7s*H3<1]e0$uC#/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt50bOJ:~> +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?mB5jARK(WARK(WARK(WARK(WARK(WARK(WARK(WAS#7$!"tP[9K3F\/RW-tARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WAR5?t^;?q0 +N.r,K~> +IfL9Q7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7O12f5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk*(B?Ubb!W`l!$sj!5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rjo!,;G; +!-\?@"ADToW8[44#M2Y.b0$t_U%RdRF'e[b!+bn)rs`+#5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=S%16q0R66q0R66q0R66q0R66q0@07Qs:25"8"*7RfR27Qs:25"8"*7RfR27Qs:25"8"* +7RT]^!.Y~> +IfL*60eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770dJD,0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+4&cb4afL*Y5!#I:C0/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+)!-eF` +!/gbb"@Q'bFH5gR#Dl* +IfLa%ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WAL(Yp?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_R,QJID4[V+:!&@qn?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_;!-nLe +!3?*X"=aEfLYM:b#L!/n4ZtP#IJ)t.3XGOE!.js)rt8IG?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_WARK(\?tEnWAS#7\ARK(\?tEnWAS#7\ARK(\?tEnW +ARK'p!.Y~> +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5:&c`7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@358O;_RE@q/,lf5\5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5:$;q +rilL)>lI\5;FaDmH`49EL3muRD0qu8qs=X?9T7-:KhU+km/^")q8r\gqG^]p!$OQr5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5"7_*5"7_*5"7_*5"7_*5"7_*5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5"6=gJ,~> +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70-r>+0eY770eY770eY770eY770eY770eY770eY770eY790+n7NRFjpI-NFr;0/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70,FVg +rl>,XC].]P7nZoqFEqk;@9lr<@<%>)P6Zq;Ph=WH98W>*!Dn(;fDps.@NSeS'e_9p0eY770eY77 +0eY770eY770eY770eY770e_lJ+tkZ(0eY770eY770eY770eY770eY770eY770eY770eY77r\4Ed +!.Y~> +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?mTAlARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(\?mG^bR6o!DfKSPqC +IfL9Q5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7OLDi5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=?:f4i*Z27'Rd5/O)]o +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +&e4cD!-\9>!`i2sr_*Sn +IfL*60eP150eP150eP150eP150eP150eP150eP150eP150eP150eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770deV/0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.mk;6-YqP7(j]C*\T6& +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +$jljQ!/g\`!`r]7r_!MnF99e)]?s!#b!eO(7q:G\UqI3\s!$X-N0eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770ej:@J,~> +!<=D#@!lNnARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARJmJ,QJH:S397q#lm4uAS#7\?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tC5hr6,/Ar/:\\H$TAh#QY)7%h&I=(\!h$ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(\,QN>~> +IfL9S5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5"7_*5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5:Auc7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Qs3`!&D-Wb!i!4!%gE) +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=>r1r366UqG[QJZ)P#*ao\P9LA^ECa%VZ=\kJC^m/itTZ1uHAAG]>2,QKen5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rj\!.Y~> +!< +IfLa*?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?moSoARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARJmt!":cW4[h(1!'jq' +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?sjU#r6,/>qMYMn1+b9Y4T[28 +-3+iM5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_#ImuUi5=Rh)5=Rh)5=Rh)5=Rh) +5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rh)5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@t*+T_WbZ(T6/Oph=I +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,4oe.OYlJ_=;uiWeao].JLA^ECZV7@@P"`phm/_9/pW +>Q>Bh0.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn20ek:60ek:60ek:60ek:60ek:6 +0ek:60ek:60ek:60ek:60ek:60ek:60ek:60ek:60el?S0/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nt4'`]AiT\)`'&ca.0 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY78!*B*>!.+KN!3c1M!ldlEr0%>19=*9?97li#!F8b#fDq98@U'WS/ho"60/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70+n88~> +!<=D#?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?qP! +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@_*5=@_*5=@_*5=@_*5=@_* +5=@\)5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%V)5"%V)5"%V)5"%V)5"%V)5"%V) +5"%V)5"%V)4t8rb7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7R'@,7R'@,7R'@,7Qs%+4tQaCSta@tHN4%& +7Qs405=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5<&XGr366,r)D@VFA0aQm0/bK]#o+lo^)ZTFSEoX\boE4:]M;$5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,(BAs~> +49-!K0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nn40.nn40.nn40.nn40.nn4 +0/!5Y!&"7*!&"7*!&"7*!&"7*!&"7*!&"7*!&"7*!&"7*8hMbO0eP+60eP+60eP+60eP+60eP+6 +0eP+60eP+60eP+60eP+60eP+60eP+60eP+60eP+60/5+70/5+70/5+70eY79*WQhPU=_th!!"5u +0eP160eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY77/HBG]a8g#R@Kg%HH]+]Eqq(sq97m)*"`-iOfQg6aP6"L*pXfJdr*ir;!"q">0eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY6o!.Y~> +-3,<&?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_Wra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra6FO?tE_W?tE_W?tE_W?smPR5QD$CU-2!m!!#T% +?smPRARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(W=o`14bQ*k)N!4rp+r_piq`Ouo!4Dal"`45t4VJ+nm/[5$pH8LIr/=p9!$l,`ARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK'p!.Y~> +IfL9Q5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rh$7Qs:*6n:Gj5"%S(5"%S(5"%S(5"%S(5"%S(5"%V)5"%V)5"%V)5"%k(6pEL.!.1Na86c-( +3(-/(5"%k)7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@!!,;D:!1Ngb"'A5o;>s5oCm)'7XE7-jqs=Q(?HUDsD>!8t^eC3jaoI"k<*_fj/O)]h +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Re0oJ,~> +H2nR10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10/5+40/5+40/5+40/5+40/5+4 +0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+4 +0/517r@n:)r\4C*r\4C*r\4C*r\4C*r\4C*r\5*>0/5160/5160/5160ek:6,6.^sUtA4J!!t50 +/ho(50eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770d?[BrQ"u9r*fb49287]9*]F*]uIO,94e!a"^5 +!<=D"?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?j1+L?tE_Wra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5h>?smRF?irt#!%"F(8/qUB>$t`L?smPRARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(@!-nId!4Mfa"(VB;#lXf/%j`th1(sXfqs=PA +#X( +GlSXM5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@_*5=@_*5=@_*5=@_*5=@_* +5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_* +5=@mq5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rjs%00,@W6.`K +4TH*Y6p=()7Qs4(6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p=". +5=Rk,5=Rk,5=Rgn!,;G;!NKE&q>t4 +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7Mc&T~> +GlSI30/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nn40.nn40.nn40.nn40.nn4 +0.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn4 +0.nk50.nn10/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+3#lmlOW7X_e +5l_%I>r)I* +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770bOJ:~> +-3,<&?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_Wra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +q-X26ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5qA?s40C(IP,a#riOt)I?fZ +ARK)q?k-aUARK(WARK(WARJ(0GlGnf_NXnV#>5'@mG"F:(An.4~> +IfL9Q5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk,5=@_*5;#>g7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R'+,5=@_(4q[iAZ)YrB +Xp:"Mgt0W7Un5#*hleb-=X=p$DcfAb=+FM>gI[)ZW>l +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@3(BAs~> +IfL*60.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10/5+40/5+40/5+40/5+40/5+4 +0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+4 +0/5+70.nn40.nk10eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY170.nn10FRq/]rK]l +[jM.g0/"q40eP-*0bQ)n/hnt5/hnt5/hnpXB?7uVC\qQB=%eSOP6?AWEHI'6P6Phr^"C"kFS1gu +<+tpV!13[o>p98'0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70bOJ:~> +!<=D"?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?ijnIAc?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?'; +Ac?';Ac?'>ARJnWrEob7)?:+"W]^G>$32@N?iXd;?nc/"ARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK*B?jC7H!+sHr[$1BG!_WOJr9XWeLOFs%qX"K(!&?\m!/L77 +!?M[A4TK0pN*Rh3ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WAS!+eJ,~> +IfL9S5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=@_*5=@_*5=@_*5=@_*5=@_* +5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_* +5=@_(5=Rk*5;,Jj6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF.*6pF((6pDst%"bS' +9Tfea/O)Wm5=@_*5=@n(6ps7-6pF(-5=@n(6ps7-5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_( +5 +IfL*90/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70.nn40.nn40.nn40.nn40.nn4 +0.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn4 +0.nn10/5+40/#%5/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\q4/h\h1/h\"@&rWjD +4IZr`*\T-#0.nn40.nk1/hSe0/h\h00.nk1/hSe00.nn10.nn10.nn10.nn10.nn10.nn10.nn1 +0/)uQs"=BQ,55OJ?:8o*P6Zq>E7igL96p5p!eO(0o[mU#EaiJX%kfXj0eY770eY770eY770eY77 +0eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY770eY77 +0eY770eY770eY-l!.Y~> +-3,<&?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_Wra5_;ra5_;ra5_;ra5_;ra5_; +ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_; +r*TM9ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;qHsC\!!amQ4U*2;!'jq" +Ac?';A^=`kARK(WARK(WARK*K?i^6UpP]0!.YmQ]#L!Ga4Zt@sR.fnK[/_KE4^g^/N/R`Z?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W +?tE_W?tE_W?tE_W?tE_W?tE_W?tE_W?sk5[J,~> +IfL9Q5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk* +5=Rk,5=@_*5;>Pj7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R'@,7R'@!%0/o0 +YKBUN!!"i?6pF((7R':*7R':*7R'@,6pF.*7R':*7R'@,7R'@,7R'@,7R'@,7R'@,7R'@,7R'@, +7R'@,7R':/5=@n(6ps7-6pF'U!)E8f!`2\5o'H[/9WZCZU.iArm/iPHZ1H+GWDl4b,sOU`5"%V) +5"%V)5"%V)5"%V)5"%V)5"%V)5"%V)5"%V)5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=Rk, +5=Rk,5=Rk,5=Rk,5=Rk,5=Rk,5=RgQ!.Y~> +IfL*60.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10/5+40/5+40/5+40/5+40/5+4 +0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+4 +0/5+70.nn40/5(40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY770eY7+#lmK8 +YLlTc!!"5s/h\h10eY.40eY.40eY77/h\q40eY.40eY770eY770eY770eY770eY770eY770eY77 +0eY770eY.30.nk1/hSe0/h\gf!*f2,!`r3Mnrj;e9=NR+X%Rs9P6,Pn^%9la[UMu3(G@Er0eP+6 +0eP+60eP+60eP+60eP+60eP+60eP+60eP+60/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/50o!.Y~> +!<=D"?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?ijnIAc?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?'; +Ac?';Ac?';Ac?'FARK(WARK(@&c`\*Y<;t/!!#Ug?iXd;?iXd;?ijnIAc?'=ARK*K?m'#gARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK*@?ihGNKD1<+9*)Hkm0?,]1-IcL!35b[!c7omo0!=W +N,\hQ?smRF?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?o_e+ARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARHb`J,~> +IfL9L6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF((6o$tp5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_#4r426 +N3^T'\i9[&3(,u#5=Rk*5=Rk*5=Rk*5=@_*5=@_(5=Rk*5=@_(5=@_(5=@_(5=@_(5=@_(5=@_( +5=@_(5=@_(5=Rk*5=Rk,5=@_*5=RI0'LVXp"0km0fC\G3ThL1>ao\#*a7em$?s`BG?\p<61d4Am +6p=((6p=((6p=((6p=((6p=((6p=((6p=((6q0@)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4) +7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7Qs4)7R'9W!.Y~> +IfL*7/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/i#(40.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn20Fn." +Pd8q=`]O50/M8\20/5+40/5+40/5+40.nn40.nn10/5+40.nn10.nn10.nn10.nn10.nn10.nn1 +0.nn10.nn10/5+40/5+70.nn40/4[O'i+O5"2.`6M=cu5ED)5hfE.jAK(bB/<+,7K".(eD,Q9Ct +0)dR*0)dR*0)dR*0)dR*0)dR*0)dR*0)dRf/ho(60ek:60ek:60ek:60ek:60ek:60ek:60ek:6 +0ek:60ek:60ek:60ek:60ek:60ek:60eY-l!.Y~> +!<=Br@+AWf?6B4P,dKQ>2@oj,>$t`L?tK=F!+l.;!+l(9!+l(9!+k"p!+l.;!bGbNra5qA?tDn0 +(if>0"#:#qbk19(I/k5c4T[#3[J&tg*XM:!"_^L.8RQ-/?iXd;?iXd;?iXd;?iXd;?iXd;?iXd; +?j:1M?tE_RAc?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?';Ac?'? +ARJmk!.Y~> +!rs-%5CZ'b6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="& +6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF.*6pF.*6pE@p5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_(5=@_(7R'9l +!!#O#[E;F>'`]C@6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF.*7R'@,7R'@,7R'@,7R'@, +7R'@,7R'@,7R':*6pF((7R':*6pF.*6pF'U!"D^"ao\#*_"[3ta%VH] +b$IR<5=@_(7R':*7R':*7R':*7R':*7R':*7R':*7R':*7R':15=@_*5=@_*5=@_*5=@_*5=@_* +5=Rh+5"%S(5"%S(5"%S(5"%S(5"%S(5"%S(5"%k(5=RgQ!.Y~> +!rrre07PT//hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\q4/h\q4/h\n50.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn10.nn10eY.' +!!#O/[FeEW(B>1(/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\q40eY770eY770eY770eY77 +0eY770eY770eY.4/h\h10eY.4/h\q4/h\gi!!um+@KheEZVX_`p6,T&95)TLfE.jAJ+o-.JkM?t +fK)M&0.nn10eY.40eY.40eY.40eY.40eY.40eY.40eY.40eY.60.nn40.nn40.nn40.nn40.nn4 +0E!U*0)dR*0)dR*0)dR*0)dR*0)dR*0)dR1/ho(60ej:@J,~> +!<=C#?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd;?iXd6?jC7N?pXhn(,iQ` +">C#[/RIIF)J*;f?tE_W?tE_W?tE_W?tE_W?tE_W?tE_WqHs;7r*TM9rEo^Q!"sq\N!4&]/HI6R +p?_sD!":jd4T[#3WqYl^[/_KA4TQ;urEoV:ra5_;ra5_;ra5_;ra5_;ra5_;ra5_;ra5h>?smRF +?iXd;?iXd;?iXd;?iXd;?j(%KARK*K?iXd;?iXd;?iXd;?iXd;?iXd;?jUCP?tE_RARHb`J,~> +!<6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="& +6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6pAj[+@JF^5=@_(5=@_(5=@_(5=@_( +5=@_(5=@_#7Q;1a%!/o#R6 +ao\P9]D([oL.o2Jb$H+u5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_(5=Rk*5=Rk* +5=Rk*5=Rk*5=Rk*5=@_(5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*7R'9W!.Y~> +!<,<"0.nn10.nn10.nn10.nn1 +0.nn10.nn20eF"<&pq+? +!<=Br@+/KeAQg>Z#9pW?"!.FB6N(:1ARK(WARK(WARK(WARK(WARK(WARK(WARK*1?j(%KARK*K +?ijnIAc?'BARK'^!!":!qht\O4Zt(k8,)BQLB%T>rB136!2TAV!`]4Yn3$dY')l8=Ac?';Ac?'; +Ac?';Ac?';Ac?';Ac?';Ac?';Ac,p9Ac?';Ac?';Ac?';Ac?';Abod7Ac?';Ac?';Ac?';Ac?'; +Ac?';Ac?'BARJnW?sk5[J,~> +!WX$)r]bQo5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5",B7!(?fN!(?fN!(?fN!(?fN!(?fN&O\fI5=@\"5=@\"5=@\"5=@^257'_A6pEme%0.]C +]?43[/H?5>6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF((6pF(( +6pF((6pF((6pF((6pF((6pF((6pF((6p:TCB)inK;ugY2ao[8jQ29kNiJ($;])9\PYtUkdm/l6B +D=G\T\c +!WWicr\&FI0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eWGY!&"7(!&"7(!&"7(!&"7(!&"7(&M>dk0.nt40.nt40.nt40.o!T0*s6c/h\k%#ll?K +]@^2u0`VM3/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/hd9!@fR_N@K:WNfE-t(D#0=uNb(js`r+Hj]h +!<=Br@*i9a64s8*.(_VF1(=3r>-qZ@?3!o +!<;:T +:PSZ3!gQQ\nB,*s!%^?&5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=Rk*5=@_*5=@_*5=@_* +5=@_*5=@_*5=@_(5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*5=@_*58O +!<nCV*4!$X'K0/5+40/5+40/5+40/5+40/5+40/5+40/5+40/5+40.nn40.nn40.nn4 +0.nn40.nn40.nn10.nn40.nn40.nn40.nn40.nn40.nn40.nn40.nn40+n88~> +!<=Br@*`3a?8;K\(,ETe"!n0P/_j_NARK(WARK(WARK(WARK(WARK(WARK(WAbod7Ac,p9Ac?'B +?3"Nf;ZJS-reph^r&k)m!0I-G"O%ne(HD7S!~> +!<f?Q_"2S;;U&OE]a&u*)prWV?D>EQ#iE9a\b$SBR3(,u#5=@_(5=@_( +5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_(5=@_( +5=@_(5=@_(5=@_(5=@_(5=@_((BAs~> +!<=5=?`N`0W[fO&+g/M8\20.nn10.nn10 +.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10.nn10 +.nn10.nn10.nn10.nn10.nn1&cdF~> +!<=Br@*N'_=s*eF(,j#m">USi&kT<8$33-=f1Q*!L5_<`r&k-A#QT;Pm/sa3!%@V*!G4(^m/l#X% +.?=_)us/M?tH +!WX$)q`fQu5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%S&5"%S&5"%S&5"%Rk6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&5 +!WWicq_*FO0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +0eP150eP150eP150eP1;/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt50/"q2 +/h\k&$ig9;]uAV0EtSHc0J>(31&`gc/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h10)@4%/i!;X%PBIh0.mk;RE*3=!"rS(qUc(nBM2<9>"_\mpt,\_ +@TS'UP6,PnX7+\J0aTKc0.nn40/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+7 +0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/4(>J,~> +!<=Br@*;p]8K%R/*&>Jr"<[pL,[RZ^#p]MJf@*Xu,_g"/4UARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(W +ARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK(WARK'p!.Y~> +!< +!<BFRRi`blACT0*!X(0*!X( +0*!X(0*!X(0*!X(0*!X(0*!X(00Lp@/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1/h\h1 +/h\h1/h\h1/h\h1/h\h1/h\h1/h[h;J,~> +!<=Br@*)d[8K%R/*&>W!"=4?S&kT35$!I!=0W&pH8UhN#,"]m/j\@DXT^i +2uk5#?i_MQJ,~> +!<ss66p="&6p="&6p="&6p="&6p="&6p="&6p="& +6pEn(5"%S&5"%S&5"%S&5"%S&5"%S&5!MG!6p="&6p="&6p="&6p="'/-$BQ_80gc'qX[4"DLh3 +9ZR,!"6!WiAFIYIScC'$6p="&5=GK8!(?fN!(?fN!(?fN!(?fN!(?fN!(?cM3^c/"5"%S&5"%S& +5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%V'5=?:fJ,~> +!<M8#abc%AYi]!#I=B0.nn2/ho!W02jJX/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5 +/h\k10eP150eP150eP150eP150eP150eY.6/hnt5/hnt5/hnt5/hnt3+oi@Ta2`B((THZO"F"bEpqWeW;m_f/hnt50/!5W!&"7(!&"7(!&"7(!&"7(!&"7(!&"4'3\E->0eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP+30.mk;J,~> +!<=Br@)lXY8J2"'(,3ur"XjcZ!&@l]?jT."(q/&JGQ7q%krf/oN(X/YrTs^A*b9ij4T[;;18S@Z +,QN>~> +!<K6p="&6p="&6p="&6p="&6p="&6p="& +6p="&6p="&5=@\'5"%S&5"%S&5"%S&5"%S&5"%V"6p="&6p="&6p="&6p="&5=@%&!-uDsOpqD4 +lcK^U<)cam@,^M?iFYbc<4VM@#BKl%5L6p +!< +!<=Br@)ZLX8K\!5%4=-`4U!,?!!"TSW*fou!!%](f9R$L,3qB%6]?tL#ThafmFrugA;j(K4TZf- +8Yoeq,QN>~> +!< +9`R@A6p="&5 +!<'Fd]935S3[d_oY +;?/C(/hnt50/"q40/!5W!&"7(!&"7(!&"7(!&"7(!&"7(4"`0>/hnt5/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnsk!.Y~> +!<=Br@)H@V=sO(J#8T&G4U*kl#ljrN>,>U68J2#6f@RGZ!#@K[4TJF[N!`_g0p$5f!)&90;t)pO +(B@d +!<0/!,T!&"4'!\Q2[r@]0D0eP150eP150eP150eP150eP150eP150eP151&`g=/hnt5/hnt5 +/hnt5/hnt5/ho!W0+BNg/hnt5/hnt5/hnt5r\"X6/IVVB]#V]^!#M-mfDq9:@K9L/9*%ppraGko +nCRsg#qmnc/ho!X0,cGr0.nt30eP150eP150eP150eP150eP151&`gb/hnt5/hnt5/hnt5/hnt5 +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/hmt=J,~> +!<=Br@)64U?9f,'!"'i(gcYif('ag>10UG\$Y +!<6p="&7/]=O6p=$;59*'T6p="&6p="&6p="&6p="&6p="&6p="& +6p=$;58$@J6p="&6p="&6p="&6p="&7/]=Y6p="&6p="&6p="&7/]=Y6p;Ce)kb$`IglBP](!iB +DZ!H8:f:3h;uh15apbi](IUGT5"%S&5"%U658HXN6p="&6p="&6p="&6p="&6p="&7/]>.6p="& +6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6p="&6l,iR~> +!< +!<=Br@(p"R8M(PT!"'c$j#mW*,Sp[c!#e+o?jg9d!%=o"f9?mJ(H1bG!.Fd(!etuGr/:VtnN?q3 +!$n@J!@.Yq~> +!<S5"%S&5"%S&5"%S& +5"%S&5"%S&rBE/-5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +5"%RN!.Y~> +!<B.L0eY77,8(:_!"qeCUs88Y"1O1u-iO)I$l:Mo0*!a*0*X-a0eY771&Wa,0eY9Z0,uT! +/hnt5/hnt5/hnt5/hnt5/hnt5/hnt5/ho!W0+oll/hnt5/hnt5/hnt5/hnt50)[FD/hnt5/hnt5 +/hnt5/h\k10eP+#!!%/^a0e&1&qof-nm_.A%"nU)0.nt30eP150eWDX(+q +!<=Br@(TeQ8L+oK!!a8^-ogQV"#;5D$N:#,)DYKb?j].!!.*8K_En5--1O.hN:B%4,lg9-?i_MQ +J,~> +!<!%jZ3aoK!C;uj2oapg<15!M8"5"%S&5"%S&rBD&c5"%S&5"%S&5"%S&5"%S& +5"%S&5",?61djMq5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S& +(BAs~> +!<(30eP150eP15r@\p=0eP150eP150eP150eP15 +0eP150eWDX1bLL80eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP150eP15 +&cdF~> +!<=Br@(9SG8MV4_!#,VK(*FtQ0etLD2E3HI-mTuX(((!))lG!Y>? +!<S5"%S&5"%S&5"%S&5"%S&5"%S& +rBE)+5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&5"%S&4r43L~> +!<_r@\[90/5+70/5+70/5+70/#'Y0+9NI!""D# +a2;*f!(!^[fDrAN@K +!<=Br@'sAF?:cmt)XdY0&g/bm>$dA"$sk1Z&r5)jdps'k&i')C!)rHI!*o+Y!]C$(UL4*J!.Y~> +!< +!<(6N@t\a#lm,ma2bDX!!#r0eY770eY770eY770eY140eP150eWDX1+k:60eP150eP150eP15 +0eP150eP150eP150eP150eP150eP150eP150eP150eO(=J,~> +!<=Br@' +!<c&ddDJ"u.bc +0/5+7r@]o\0/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/5+70/"q4/hnt5&cdF~> +!<=Br@"D^_?k$9b!"s"pf@RH(!!!HUqE4glnr*U#6hNSD2?skh?i_MQJ,~> +$31l+5<_:q5<_:qJNn]MXZlqF%0.)frkSf=cdnH!.jZ>!3u4>!a,LSW':MN5<_:q58O +$31\n0/5+70/5+7JM2R-XY0f%#lk]drl55I +!<=Br@"D^]?j'%6!#UCgf*8rm&c`+U1As?9D=NPb9D(FL('$[q?i_MQJ,~> +!<brJ,[7j[<3_p!$uE^b(9(^!/^El!g3NrTg&Po!.Y~> +!<"!%2isfT,K2!13E3!h0/uTe?EZ!.Y~> +!<=Br@"D^\?j0k%!!"F3rmqIuH7/an$6V)eD=NPbB_FRj,lejW?i_MQJ,~> +!< +!<87,<+?;epo3q]?pXfVX&caL;U+ZN[!.Y~> +!<=DA?@cL8@&RH;?7c-W.#6:Nf*JEf(]XOB3b4!:Mu\G'4TmMF!*W^'?i_MQJ,~> +!< +!<31#=Pf0eY170/#'Z0*!a+0*!_X0B=bk0eF+?!#91Yrl5,YR9Lm7!!a!5A9] +".Ko',G6[j&cdF~> +!<=C[?@cL8@,YJt=tK^S(j!guf)sL!A17EW!uO".EV>=k9DL^Q,mOEATO7dG!.Y~> +,QJWF5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!Q,4X$6YL5b`d~> +,QJH10J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50JBL]X"ON/0/;68!&9]k"u$i"!"qe[ +r5SoDH:J_K!"'Gb-o44c>$GHFLATU,Ud4t\,;GiE!>5B_~> +,QK)t?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=9j@JRFaN#$s%t!!c/_r7;%bKM*0\ +!"'Pu3(d_$EeB=0FSe3(-kZL[8Y9Ak,QN>~> +?iV!-5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!Q/5Zp+UU5b`d~> +?iUfm0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50JBO^ZnDJ80/_i\(?f0/:R% +$8F1f+q+GO'j$g@r5SuKM.fC+$2FQ(#o=3j(]==7&hT\.!>5B_~> +?iVH[?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=9mAJRHc2#[Th9!!!j>VUPIp"i?OG +9.1GK!!Eo=#6kD2!!+?KSmVRE!.Y~> +IfL9L5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q4rQXL5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5HI&O56=#554:]954q,?55[VN3$f"6 +!"D;@WqjI9Wh>&gBNRl!r&Y#]%4*ttSNd,k!.Y~> +IfL*70J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50H)Su0/,%50/,%50/,%50/,%50/,%50/,%500ISM(!V!.Y~> +IfLa%?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?5d3X?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I@'![h?jKpk&c_nE98(1Xf*B0nQ$RL^ +;cET\"99&i>$db-!@.Yq~> +IfL9L5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5#=I-5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_<55.j)`5!M4j+VObS"<0^NQF6;""b-Lu5!M7+ +56*nA56=#55.!NT(BAs~> +IfL*70J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50MjDV0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,&\0YB%B0J>.4'b('A" +IfLa%?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?;P$9?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[6B?G'YL?=7/E/K4Tg"=QohVTJD\"dB!B?sm<3 +?i_MQJ,~> +IfL9L5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5(>d\5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<]K?5!M4q5!M4q5!M4qXZlDB!'^BH"#qhJ%K-8?'J2[SFann,QA($Y +UP2_K%6-R9ffoI#q*+pE5b`d~> +IfL*70J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50Rk`00/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/*ef0J>+50J>+50J>+5XYBE$!&4C*""b]0$2ji;'f8EbFbba?R>Hcg +W/4RU#q[eafe3=[q(De(0/:g,!>5B_~> +IfLa%?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?@Q?h?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?sX7L?=7)I?=7)I?=7)IX^:[.!+,Y4"'S#:')_eD(c=rsHBaYkVNmFD +[Zt"r&mA[LS6u@C!.Y~> +!rs-$5Nb4[5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:qIm6+]5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q4t&WZ5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_ +!rrrf0BY$=0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%5IkNK/0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50ISS.0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,'30FBHe0/#"5,8Ut$$1n3!$mRLr0X<>31&EU)&cdF~> +!rsTQ@-:jG?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5IIpcSj?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?792f?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[6n?4((H?sm;I8MVP0'(c/*)G+?+?E7H7,QN>~> +!rs-$5I!D%5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:qIm6+]5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q4s<-S5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +rBL +!rrrf0+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50Hi)'0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +r@e1)""b`A,5rVf+r;%>,;Cp`0]=Yc&cdF~> +!rsTQ@'O$f?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5IIpcSj?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?6N]_?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +rF#Y3"'S8_6N04S68C;_8RPr:?K#8m,QN>~> +!rs-$5Cl#l5(>d\5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<`pK5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q5!M4q +5!M4q5!M4q55meH4p4)65 +!rrrf07bhN0Rk`00/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/.5r0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50`Ea*0Ea$_0/#$Y0.ek20J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+5a"RN,!.Y~> +!rsTQ@"DYX?@Q?h?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[\X?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?N+@4?3FYB?sm=??nG\m?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)Ia'Jcl!.Y~> +!rs-$5Cl#15(>d\5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5 +!rrrf07bgh0Rk`00/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%50/,%50/,%50/.l/0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+/0/,%50/,%50/,%50/,%50/,%50/,%50/,%50/,%5 +0/,%50/,%4&cdF~> +!rsTQ@"DXr?@Q?h?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s\=j?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7(g?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5K,QN>~> +!< +!<+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>*m!.Y~> +!<=D#?3"Aa?E%7\?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5IF'r<^?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7(b!.Y~> +!< +!<+50J>+50J>+50J>+50J>+50J>+50J>+50J>+50J>+5 +0J>+50J>+50J>+50J>+5&cdF~> +!<=C=?3"Aa?E%7\?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I3+-'#?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I?=7)I +?=7)I?=7)I?=7)I?=7)I,QN>~> +!<$/5Cl"t5(,XZ5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q5<_:q +5<_:q5<_:q5<_:q5<_:q5<]k`J,~> +!< +!<=Br?KPPo@"DX`?@?3f?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?sY)YJ,~> +!< +!< +!<=Br?Ed`9@"DX`?:SC0?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I +?s[5I?s[5I?s[5I?s[5I?s[5I?s[5I,QN>~> +!< +!< +!<=Br?@cGU?3"Aa?E%6>?s[5I?s[5I?s[4d!.Y~> +!< +!< +!<=Br?@cF6?BSUr?mG`&~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BSUr?mG`&~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +!< +!< +!<=Br?@cF6?BJOp,QN>~> +)ZU[<3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3/'Ns6:KKi!^0%:JNeWKeij*N!.Y~> +)ZUL)/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/VPk[7oM.p0EOUF6g-6(0nD$00_$gt&cdF~> +)ZV-i>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>(p8aBPh/0?34YXAE[A"@"DX8?L_>&,QN>~> +"996%4uiO*!''sA!''sA!''sA!''sA!''sA1cRZY4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c +4ub_c4ub_c4ub_c4ub_c4ub_c4ug/<"%u]s;"-XN7nu]?mQLV6r`9(_l95;C='%hA5(Pog4olH" +J,~> +"99&g0J38X!%n1(!%n1(!%n1(!%n1(!%n1(1bCC50J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J0mj")!d[Hgrcm0j8X26gcW.6iN5K6g??-B9JEVJM;X/nh:(W +!.Y~> +"99]R?<[>7!*]A.!*]A.!*]A.!*]A.!*]A.1g43h?AFB +!.Y~> +)ZU[<3'KMc5!Cqi3'KMc5!Cqi3'KMc5!Cqi3;u)A3;u)A3;u)A3;u)A3;u)A3;u)A3;u)A3;u)A +3;u)A3;u)A3;u)A3;u)A3;u*(3'KMc4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c78#s2 +3'K;c3'K;c3'K;c3'K;c3'K;c3;,N9<;ots4p"P[7J]1J8,QEg8,>CO6;UKFqE=mPr`9(ipHAXF +91AV>!([#i!)W)Ir_!;_69Y$+!([#f"&MWZ4b5eg4olH"J,~> +)ZUL)/MJk10JG(4/MJk10JG(4/MJk10JG(4/cIF(/cIF(/cIF(/cIF(/cIF(/cIF(/cIF(/cIF( +/cIF(/cIF(/cIF(/cIF(/cIFd/MJk10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1;eJTS +/MJb1/MJb1/MJb1/MJb1/MJb1/bUjuM#NP;1&`j/0m8@OqChnQr/q%`qCi"AH[A9Z0E>bbOoS\[ +0EOaW;tr$H>5jZbHg`Wg1&bee>":sR0E>;UL]_g5;a^.1!&:c5!&9$Yr@e6b!.Y~> +)ZV-i>$bN=?=$fA>$bN=?=$fA>$bN=?=$fA>5hh.>5hh.>5hh.>5hh.>5hh.>5hh.>5hh.>5hh. +>5hh.>5hh.>5hh.>5hh.>5hhj>$bN=?$bB=>$bB=>$bB=>$bB=>$bB=>4u8&L]354@/aI7@"3rKqHa/Br/:VrqHa8;JUqM2?3#3KMu[nm +?34eaD>7E;ErM!tJaZnF@/b?OEbK"W?3#$FLBE$MD.N6E!+<*=!+:@arE]LM!.Y~> +&-*M14ub_i3'KMc5!Cqi4uiO*5<(hj3'KMc5!Cqi4ub_c5!Cqi4ub_c5!Cqi4ub_c5!Cqi4ub_c +5!Cqi4ub_c5!Cqi4ub_c5!Cqi4ub_i3;u)A3;l#V7nZ$06;UWX<)?Oj<)?Oj<)?Oj6U!s<-36;'Z;4p+,J:d+b@#XqBV7n#j569Y30"%#sg97];+4olH"J,~> +&-*=s0J+t4/MJk10JG(40J38X5:nQC/MJk10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t1 +0JG(40J+t10JG(40J+t10JG(40J+t4/cIF(/c@@=>%]QD7sg&=LjOr)LjOr)LjOr):,#WGOpj]3 +0J,"XB4kC&0JG*X0E<^(0FTNe0J+t10J+t10J,$XOp!Hj0JISIOp3Wp0J+t4F8D%4;_TdW/MJc4 +P*1VT/MJb1/MN"[OoS#O0EtI&F"o@&6iN5K;u/0J8,\SNG5*cg7ftJ"0R!>V!f1nfqChn:q2tf+ +=u#e+"%SN;>50cR>%_J8kqE0/B1MSJ"%R]]6iA\G;eK9;;c?1V6SU=o0EXh$P%T>"r\+?c!.Y~> +&-*t^?$bN=?=$fA?<[>75?_B">$bN=?=$fA?5hh.>5_bCEd(ntBRtqiLOk53LOk53LOk53EF*M]N!s6' +?$bBf +N/WNu>$bB=>$d!`Mu[Pj?3Y7tI:-AfAH%MfD>IQ=B`3kiJ,!@IBEMXK?@Vj2!f)2;qHa/4q2>B+ +Ea\ZK")*XPEqirCEd)_ +-NFrH3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_i3;u)M3'KMc5!Cqi4ub_i3;u)M +3'KMc5!Cqi4ub_i3;u)U3'KMc5!Cqi4ub_c5!Cqi9351o54DVS5#D5["@YL679'1d&k>,L3'K;c +4ub_i3'Ku37m9*rr]U7K-?o:-LX$3'K;b<;or+<'<3)3'K;c3'L18:@7m6Z3##nZ*:d.'3oiD,gr]U +-NFc5/MJk10JG(40J+t4/MJk10JG(40J+t4/MJk10JG(40J+t4/cIF4/MJk10JG(40J+t4/cIF4 +/MJk10JG(40J+t4/cIF,0RNe^"B.!+;i(@7&m?tC/MJb1 +0J+t4/MLga=thW^r\+=NrfRG.0JG(4M#NP@6SL)G0PC3E#)Fre/MJk5rfRA>0JG*X0E=WBOp$Rp +0J,$YOoobW0N7t6#]h[O0J+t16\t`)$A_&$0J+t10J+u%qN:nI0SoLe!II?70E=K7Oo^A;q(Mf) +rf[+3!CM\AOoS\b0E=K37fYpU0E=K>Op"9/;d)Qa0F!>rP'\l:;tZ:RF8dinHiB0.0nD%Y0EDdd +J,~> +-NGDu>$bN=?=$fA?$bN=?=$fA?$bN=?=$fA?5hh:>$bN=?=$fA?5hh: +>$bN=?=$fA?5hhB>$bN=?=$fA?$bB= +?$cE(EaE'Ura#SAreq#1?=$fAL]359A6rGG??c4(#)?Mk>$bNCrepr7?=$h7?3"[]\##^p#_? +;ZIUt4ub_c4ub_c4ub_c4ub_i3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_c5!Cqi4ub_i3'KMc5!Cqi +4ub_i3'KMc5!Cqi4ub_c5!Cqi4ub_i3;u)E3'KMc<;or!4n)MQ6N(!c4oe+K!^](7rE"P6r]U?!!.Y~> +;ZIFa0J+t10J+t10J+t10J+t4/MJk10JG(40J+t4/MJk10JG(40J+t10JG(40J+t4/MJk10JG(4 +0J+t4/MJk10JG(40J+t10JG(40J+t4/cIF,/MJk1M#NP;6h$6=8,\SP0ecf,Opc=b/MJk10JG(4 +0N7t6#"L@$/MJbhrfRCf0JG(GrfRG@0JG(4;uMj[Lg'b?"]I*,0JHH)Op?.a/MJk10PCBJ!,)9b +!*]Ab"*Q@M6iN5RLbLM70JG5;rK77Q0JG*X0ENg[8,8;LB/!ulOp5PN0J+t4BD.JnB.tnk/MJb2 +rK@17"YDD[0LLZnOoe--;t6"QB.u#PrfRCfB9JF6qChnQrfR>=0JN*]!_4q!rK7.8JM@*X!>5B_~> +;ZJ(L?$bN=?=$fA?$bN=?=$fA?$bN=?=$fA +?$bN=?=$fA?5hh2>$bN=L]354AFPNXB`3kk?s[mLN!k&?>$bN=?=$fA +?>]\##&%=L>$bBVrepu#?=$fGreq#9?=$fAD>fCoLN$bN=??cC-!-eEK +!-8't"+OW\AH%MmLL+:j?=%#prJUhl?=$h7?34;:B_dSgG@#LeN!=K0?$bB? +rJ^b_"^559?=\igMum[!D=NPeG@"U"repu#GDqK9qHa/Brepo6?=*5^!bbnJrJU_aJR8@_!@.Yq~> +7fX>h3'KMc5!Cqi4ub_i3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc4ub_c5!Cqi3'K;c3'K;c +3'K;c3'K;c3'K;c3;u)P3'KMc5!Cqi4ub_c5!Cqhr`9/#5"kHJs%E>m!`2'LpK%\p5!Cqi4ub_i +3)9HS!_#:4r]U_4ub`!r`9=p5!Cqi4ucO@C56N'sc<;T`$90P=!3'Ke1 +r`9(rJNj&s!>b`d~> +7fX/U/MJk10JG(40J+t4/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10J+t10JG(4/MJb1/MJb1 +/MJb1/MJb1/MJb1/cIF7/MJk10JG(40J+t10JG(GrfR>=0PBs>s(D=o!d67rpQ>kr0JG(40J+t4 +/T^oS!`Ld)r\+>!rfRCS0J+tWrfRD*0J+t5rK78=0ed8>Op,n\0J+tkrfRLi0JG(40J/+[Op"9/ +/MMAIOp"rB0J/+[Op+3,0J+u%rK7Lk0J+t4/MJb10Q[&Q"&gm*8,\SNM#3>>B.tnk/ML-&Oo^A[ +qiUq_r\+C*0Lu,*!dcUQr\+@-M#*89HSBg9Ood3hHiB0/7sk5u#=C0s0J+t4M#NP==tiJ +7fXf@>$bN=?=$fA?$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?$bB=>$bB= +>$bB=>$bB=>$bB=>5hh=>$bN=?=$fA?(-C/!c;7Ira#SUreptn?$c^XN!+0-?$bB=?@DX.")V@JB`3kiL\m#7G@"HZ>$c(FMue]^ +qhtMqra#Y0?>0=s!eFZ]ra#V5L\cr2JR3osMum0hJc:T/BS$/A#@q.E?oIoJUq/,?3);OJ,~> +=o]@&3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc4ub_i3'KMc5!Cqi +4ub_i3'KMc5!Cqi4ub_c4ub_c4ub_c5!Cqi3'KMrr`9.r4uiL)!([#i!)WMU!*&r!!_#:PrE'"h +!*&nu#t7$;4ub_i3'L=@ +=o]0h/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10J+t4/MJk10JG(4 +0J+t4/MJk10JG(40J+t10J+t10J+t10JG(4/MJk^rfR>(0J35X!*]Ab!-\5o!AK?/OoeQ:M#EM: +=oaBWOpP&@/MJb10J+u7rfRFP0JG(41&[:80ENg[F8h=*=thW^F8_7(6SL)ZrfRG@0J+t4M#NPA +7kcMK0J,foOoU=;0E +0LodROoS#O0EEbHrfR@e0JQc/Op+3,/MJkkrfRIu0J+t10PC?I!-A+%!CpemOofta1&[790RNe^ +#"('u/MJk^rfRA>0ed8>OpuS5B_~> +=o]gS>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?$bN=?=$fA +?$bN=?=$fA?$bNUrepo,?<[;8!-8't!.XlR!FCQ\Mumj(L]*23 +EWCmnN!X?->$bB=?$cFON!4E3>$bN=ra#V/AGhAkLOFSf?+Q\Mu[Pj?3+5Xrepr"?=7gON!3`u>$bNZreq&*?$bNUrepr7?s\'VN"(8WGB\I`It +=o]@&3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;sr`9=p3'K;c4uc=:Y5!D,/r`98"5!Cqi<;or&69[Rm4]MD^"\q6@4ucC<l +r`9)!rD!Jl90GI-r`9.t5#D5[#!G.63'KN*r`91l5!DgB$4p3i/3'KP) +=o]0h/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJbtrfRLi/MJb10J.AFOoS\`0EEaqrK718Hi9*1 +7kcMLM#NPCLbUS80J+t16iN5QLbLD70J,foOp-1d/MJc4rfR@N0JH#qOp+c<0J+u7rfR@N0J,$X +Op3Tl0JG(4BE"%sF"f1";uVp`HS@-*0O"I="*6.M;uMjZHi>](/MJk10J+tkr/q:t0J+t10JH]0 +Op,nY0JGkMrfRG30JG(4M#NP@7kcVK6\t`)"`l@L0J.JIOp+c+0RNe^#"('u/MJl7rfR@e0JIkQOp"];/MJdU0E`s]/MJmWOon'*0J38X +!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(!%n1(3\<$;0J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1o.U1X!.Y~> +=o]gS>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB\req)&>$bB=?$bBfrepqi?=%=DN!4')?oItJR2Yd??6%("+=K^D>fCnJc8s\>$bN=?$bNKrJUf%?@Dg3!dA$rrI"[$ +repi4rI"fuG@Y#srepo.?@i*7#%V%H>$bNjrepr"?=&3^N!+!(>$bD3?3FG<>$bP6N!!Ts?<[>7 +!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.!*]A.3a,in? +=o]@&3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'KN*r`9=f4ub_c4ucO@l[ +dTD4ub_c<;or%69[Rm:B";u7m8mr3'I7B!`V?HrDsA+5!Cqi3'K;c4ubb' +=o]0h/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJl7rfRLR0J+t10J/+[Op=?+0J+t10PCBJ!G>@0 +Op,#@0J+tGrK7Ch/MJb1/MLB-Op5tZ0J+t4BE"%sB.Yeh1&d==LbLM7HiB04HS@$*0J.AFOonW: +0N7t6#BhdQ0J+t1M#NP?7kcVKF8h=+=thN^/OTN#!f/NtrK7PE0eb15/MJb10J,$VOp>VR0J+t4 +/U%,V"]I*//MKQjOon'*0JWNh"YDD[0JH#qOp!Hj0JJ=^Op*Qo0J+u*rfRA10JH#rOp?dp0J+t1 +0R!GY#u`N00J+t4/MM8FOoef@M#NP@0eb150O"I=",JZc1&[7D0eb:50JG(40J+t48,eZ5Lb1;7 +/MJb10J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t1r\+=( +r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+=(r\+j70J+t1 +0J+t10J+t10G4A9~> +=o]gS>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bNjreq(m?$bB=>$c7KN!=]6?]\##Cg&`?%IVk!f()mrJV,>?s[#C>$bB=?(?O1"`7RP>$bb$cXVMun$+L]359?s[#C??6%(",C8j@/Z#m?s[/C?=$fA?$bB=? +=TB6t4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c +4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ubn.76?4ub_i +<;ou!4p3i/4uc=:dTJ3'K;c<;or$4[(hgr`98&4ub_c6N'sf69[@mr`92$5!Ct* +55eR^4pEu14ub_i<;or#4[)jE=8kAb3'L=@ +=TB'd0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J,foOp?ds/MJb1/OTN##`(/d0J+t10PCBJ!CqM9 +Op?.^0J+t10O"I=#?*3./MJb1F8h=,;_TdW/MMPNOp"9//ML-&Oook]/P#c&#"('r0J+t^rfR@R +0J-r:Op5)D0J+t18,\SQ0J+t4rK7@P0J+t10So^k!CqtEOpaW2/MJk10JG(40O"@:#A5_B0J+t4 +M#NPA0eb150J.AFOonlA/Q;Y3#BhdT/MJb1M#NP>6SL)ZrfRG@0J+t18,\SQ7kcMKrfRJA0JG(4 +0JWNh#r++f/MJk10JJ=^Ooe!)M#NP@0eb:50So^k"'RB48,eY\HS@-*0JG(40J+t4/SG'G#\PhC +0JG(40J38X$nX.e/MJk10JG(40J38X$nX.e/MJk10JG(40J38X$nX.e/MJk10JG(40J38X3\<$; +0JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t10JG(40J+t1r\+=( +r\+=(r\+I,0JF+>J,~> +=TB^N?$bB=>%IVk#_u_i?$bB=IK#00D-gCP>$cdZN!*g#>$c(FN!"Q9>%mkn#%V%D?$bN=?=$fA??5q%#BsKX?&F7t#Cg&d>$bB=L]357A6rGMreq#9?$bN=?=&EdMumNrL]359?s[/C?AJN="*.^SB`'Kt)#^9TY +?=$fA?<[>7$sHtD>$bN=?=$fA?<[>7$sHtD>$bN=?=$fA?<[>7$sHtD>$bN=?=$fA?<[>73a,in +?=$fA?(3'K;c3'L+5 +=TB'g/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MLB-Op>VR/MJb1/R&.:%!+*S0J+t1/OP>WF$onh +&hu'l0J+t10P>`90J+t10J+u7rfRFP0J+t10`@.;0eb15BE"%r=thOTrfRb40J+t10J+tkHWi*T +0RNe^#"L@!0J+tkrfRD*/MJbTrfRMB/MJb1/MM8AOpk8@0J+t10J+t10J/+XOp5PQ/MJk18,eYV +LbLD7/MJkWrfR@r0J.AFOp>/E/MJb1/T^oS"%P%!;uVp`F"K("/T^oS%Wa +=TB^R>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$c7KN!FQ5>$bB=>&sV$%"2Gc?%EDII:W;8 +&n#$L?8?(# +?@i*7#&%=H?$bBLreq);>$bB=>$cXQN!sQ,?$bN=B`$bNPrepr'?$bB=>(-C/"))"ID>oItI9Kr`>(-C/%XhYe?$bN=AH%MiLL+/>reptf>$bBQrepu8?s[#\req;1?$bN=?=$fA?$bN=?=$fA?$bN=?=$fA?$bN=ra$":?=$fA?$bN=ra$":?=$fA?$bN=ra$":?=$fA?$bN=ra$+=?$bN=? +!<3'K;c3'K;c3(NsL +&l(VM4ub_c4ubMc3&j)]4ub_hr`9;'3'K;c3(!UG"]RHF3&jn: +!<5jZi +B.tnk/MJbTrfR@r0J/+[Op=?./MJb1/T^oS"%P$sF8h=*=thN^1&[7F6SL)G/MK[b0JG(4/MLi: +OpPbQ0J+t10J+t^rfR>(/MR-d">DD]0So^k"BmK20RNe^$qE!*/MJk10JG(4/OTK"IP!6*0J+t4 +/MJk10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t4/MJb1/MJk10JG(40J+t4/MJk10JG(4 +0J+t10JG(40J+t4/MJk10JG(40J+t4/MJk10JG(40J+t10JG(40J+t4/MJk10JG(40J+t4/MJk1 +r\+I,0JF+>J,~> +!<=DE>#\g3?$bB=>$bB?>&sV$ +&q+(i?$>69?$bB=>%mno"c$8f>$?^\MumZrB`3l!A6N;C?$bB= +>%%;f#$tJ>>$bBfreptn?$bB=ErM"& +G@"HZ>$bBLrepr'?$bB=>(-C/"))"EIK#0.EaDpU@/Z#oA6rGG>$blU?=$fA>$cFP +N!X]3?$h/d"C>8$bN=?=$fA>%ISjITg&]?$bN=?$bB=>$bN=?=$fA?$bN=?=$fA +?$bN=?=$fA?$bN=?=$fA?$bN=?=$fA?$bN= +ra#_2?="lWJ,~> +=9'.$3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'R:Bs#pTG4ub_c<;or-4ZGVb3'K;c3'K;c9E%um +8,bIX4ub_c4ubMc3&j)]4uc(34ubMu +r`9=n4ub_c4uc(3:-LX$ +3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc5!Cqi4ub_i3'KMc5!Cqi4ub_i3'K;c3'K;c3'K;c3'K;c +3'K;c3'KMc4ub_c5!Cqi3'K;c3'K;c3'K;c3'K;c3'K;c3'KMc4ub_c5!Cqi4ub_i3'KMc5!Cqi +4ub_i#<4n,5!CqB!.Y~> +=9&sf/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MR-d#;Ina0J+t1M#NPG6S0uD/MJb1/MJb1BE"%o +>5g)`0J+t10J+k1/M/Y.0J-K-Op5PQ/MJb1>5jZfB.Y\h1&[7:0J.AFOq)Ob0J+t10J+t1/MJb1 +8,eYUHS$p'0J,ZjOomBi0JNHg#=C's/MJb16i3#UF"f1"/MJb1/MJb1/URJ[!/UW;#%oVA0J+l' +rfRLb0J+t10J-K-Oof8M6iN5SLbLD7/MJb1HiB016SL*JrfRCS/MJb[rfRe=0J+t10J+t10J+t1 +0J/+[OpOW10J+t10J+u%rfR=]0J36d""c2Y>5jZfLbUS81&[7D0J+t4/MJb1/MJb1>5j\7F"f1" +/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10JG(40J+t4/MJk10JG(40J+t4/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJk10J+t10JG(4/MJb1/MJb1/MJb1/MJb1/MJb1/MJk10J+t10JG(40J+t4/MJk10JG(4 +0J+t4#;%V]0JG'k!.Y~> +=9'UQ>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$h/d#@LkA?$bB=>$bB=GQ*O$ +ErK5P?$>69?$bB=ErM"#G?S0V@/Z#c??$bB= +B`$bB=AG_;pI9p)`>$bB=>$bB=>(Q[3!/LQ4#'XBW?$bB=Jc:T1A6rGpreptn>$bBQreqA=?$bB=>$bB=ErM#II9p)` +>$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?=$fA?$bN=?=$fA?$bB=>$bB=>$bB=>$bB= +>$bB=>$bN=?$bB=>$bB=>$bB=>$bB=>$bB=>$bN=?$bN=?=$fA +? +=9'-s4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c +4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c4ub_c5!o6M!*&nV!^8S,r`9P.4ubMc3&j)]4ub_c9E&!* +76W[p3'K;c3'K;]4ubMc3'L1< +=9&sc0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10Lu,*!/US*!\c2nrfR_H0J+k1/M/Y.0J+t1BE"&, +;_TdW/MJb1/MJb.0J+k1/MMAIOp4i:0J+t1G5dX-;_TdT;uVp]HS$uNOq'u6/MJb1/MJb1/M/Y. +BE"%uB.Y\h/MLB-Op#hX0J,foOpQpr0J+t10J+l4rK7V:0eG(20J+t10J+t18,\SN>5jZgB.Yeh +0J36d#;Iea/MJb1F8h=(=tN\POp?.^0J+t10JWNh!\c2\rK7:;/MJc'rfRap/MJb1/MJb1/MJb1 +/OTN#$&C8e0J+t10J,!WOod?l/cCh7/MJl7rfRCf0J+tWrfR_;/MJb1/MJb1/MJb1HiB1X;_TdW +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb10J+t4/MJk10JG(40J+t4/MJb10J+t4/MJk10J+t10J+t10J+t1 +0J+t1s"FU.0J+sk!.Y~> +=9'UM?0=s!/LMV!a]&@req;A?$>69?$bB=>$bB9?$c^XN!=-&?oIqJQcI[N"0N)>$bB=>$bB=>$>69 +GQ*O*G?S0V>$c7KN!+Q4?$bB=IK#0,Ea!>ZN!Fi9?$bB`req>->$bB=>$bB=>$bB= +>%IVk$&;hj?5aB^>$bNjrepu#?$bB=>$bB=>$bB=Jc:UXD-gCP +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=?$bN=?=$fA?$bB=?$bN=?k4? +=9'.$3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3(s6P#>76?4ubMc8,cR!:,kEs3'K;]4ub_c5"klV +&P##E3'K;c3'K;c3&j)]3'K>#=8tGe3'K;c<;ou!4p!]-9E%uo9/oH@ +=9&sf/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/SG'G#A5_B0J+k1>5jZoF"K't/MJb.0J+t10PCBJ +&R$k?/MJb1/MJb1/M/Y./MJdTOp3Wp/MJb1M#NP?0eb15BE"%qB.[5jZgLbUJ8/T^oS$sG>:0J+t10J+t10JWNh +Ik`W/0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10F'0`/MJb1&cdF~> +=9'UQ>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>'Kt)#BsKX?$bB9?$bB=>$bB=>$>69>$bD2N!$bB=L]358?s[#CGQ*O&G?T%dN":JG>$bB=>$bB=>$bB9 +?@i*7#&%=H>$bBfrepts>$>6\req/->$>69?$bB=>$bB=>$cXVMue?Dreq#) +?(-C/#BF-S?$bBCrJV4m>$>69?$bB=>$bnAN!"W;>%%>g",C&dErM"$LL=:l>(-C/%!#ZX?$bB=,QN>~> +!<76?4ub_c9E%up<&d'@r`9:e3'K;c3'I4A"%>C59E%uq9/nmp8,cR#:-LX$3'K;c3'K;c +3'K;ur`9Cp4ub_c4ub_c9E%up9/o+!r`92$3'L=@ +!<T0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10RNe^#=gI"/MJb.G5dX6;_9RT/M/Y./MJb1/Q;Y3 +&Vr"m/M/Y.0J+t10J+k1/M0KlOoU=:/HIOmrfRG@/MJb.HiB007kf;hOq(YI0J+t10J+t10J+t1 +0`@.<0eG(2/OTK"">DD]/VsCh#tHR$/MJb1/MMPNOpt>A0J+t10J+t10J+t5rK71O;uVp`B.Yeh +0O"I=#A5_B0J+t1BE"%rLb1<:rfRIQ/MJb1/OTK""&gm*BE"%sB.Y\h>5jZqF"f1"/MJb1/MJb1 +/MJc'rfRRd0J+t10J+t1BE"%rB.YelrfRA>/MN"[Op,#C/M/Z4rfR[[/MJb1/MJb1/MJbTrfVbX +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJa^0J+t10J+sk!.Y~> +!<=DE>#Sa2?$bB9J,YB9D-C+L>$>69>$bB=>&F7t +&VjOr>$>69?$>V=Mu\Y3=ohr?req#9>$bB9Jc:T0BO68hN"0l3?%ISj"C>8<>)3*9$#!LK>$bB=>$cdZN"'W-?oItG?Sreq%l>$bB=>%ISj")V@JGQ*O(G?S0VErM".I9p)`>$bB=>$bB= +>$bB`req/#?$d!`N!46.>$>6freq8!>$bB=>$bB=>$bBLreu>X +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bA +#=8tJa3!hc.3'K;]4ub_irDsP' +3'K;]4ub_c4ub_c3'K;pr`9(rr'p`^r`94t3&j)crE'"_rDsIm3&j)]4ub_c4ub_c5!o6M##IKC +3'K;lr`94t3'K;gr`9D*3'K;c3'K;c3;lnf4ubMc3'K;c3'K;c3(s6P!`1jFr`97r4ub_c;#XN# +76!Ij4ub_( +0eG(2/MJdTOps-"/M/Y./MJb.0J+t5rK7_) +/MJb.0J+t10J+t1/MJbhrfR8.r)s)ArfRD*/M/Y1rK@18rK7XF/M/Y.0J+t10J+t10Lu,*#(&$U +/MJb[rfRD*/MJbHrfRSD/MJb1/MJb1/cChA0eFt2/MJb1/MJb1/SG'G!dcLtrfRFt0J+t1HiB04 +;_9[T0J,ZjOoeQ66iN5RLbLD40J+u"rfRD?/M/Z"rfRCZ/MJc'rfRai/MJb1/MJb1/MJb1/M[3e +#r+"c/MJb1/MN"[Oon3./M[6f!f/F3rfRG@0eG(26iE/V/MJb1/MJb1/MJb1F8h>P=thN^/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +#V@_^0J+t1&cdF~> +$bB9?$>69>$bB9?$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=@/Z#g?s6l?>$bD2N"'0$>$>69>$bB9?$bB9?$bBVrepi.r,Mdcrepu.>$>6=rJ^barJV4o>$>69?0=s#(^)a +>$bBQrepu.>$bBGreq/=>$bB=>$bB=>5aBh?s6`?>$bB=>$bB=>'Kt)!eFNlreq#)?$>6^repu">$bB`req>(>$bB=>$bB=>$bB=>%%;f +$"-qC>$bB=>$d!`N!!a">%%>g!f's"req#9?s6l?AGqGq>$bB=>$bB=>$bB=IK#1TEaDpU>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +#[1P~> +!<dTD3'K;c6N1$s<&d'$4ub_c3'K;]4ubMprDsLu3'K;]4ub_c4ub_c +3'L12 +!<0J+t10RNe^"+)^R>5jZhF"K't/MK]n +OonW70J36d"#2AZ1&[7F0eFt2/MJb1/MJb1/ML-&OpQIh/M/Y.0J+t5rK@14!AHn?OoftaM#NP@ +=thN[0N7t6%!F?m6UsXF>#R")0J36dImYeA/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/I4$^0J+t10G4A9~> +!<=D6>!lV">$bB9?$>69>$bB9?$>69>$bB9?$>69>$bB9?$>69>$bB= +>$bB=>$bB=>$bB=>&F7t#D$2b>$bB=B`$bB9?$bB9?$c^NN!+!(>$>V=MunQ:D>oIpIs:[C"Fjf_>'Kt)!/LPt!e#9Jrepts?$bB=>$bB=>%%;f!c;+Xrepu(>$bB=rJUqg?$bn@ +N!!p#?<[;d"(5;9@/Z#o?s6`?>$bB=>$bB=>$c(FN!Y&A>$>69?]\#%"DYqA8#XnEc"u`?<[;dIq2_h>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB==pSG +!< +!<0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J*Sb/MJb1/MJah!.Y~> +!<=CQ=p\M=>$bB9?$>69>$c7KN"C2>>$>69>$bB9?%!-aN"'<$>$bB=>$>69 +>$bB?o8Ef_>$bBQrepo&?@Dg3!-e-q"*.^OJb4m(?]\#%=MDd>$bB= +>$bB=>$c7KN!"i=?>]\#"F"0U?>0=s!J+SV=ohrHrJUhl>$cXVN!=<+>$bB?L]358Ip-/^AH%Mj +LK\"fB`$bB=>$bB=>$bB\req/(?oIsIp-/^AH%MgJTCaK#)?Si?$bB=>$bAX!.Y~> +!< +!<=thO,rfRCs/MJbhrfRFt/MJb1 +1&[7 +!<=CH=oa?WMu[Pg=oa-QMu[_c=oi/hrepl/?M7P&B_75eLL+.f?@Vs5!c;+rrephop5B&n>$gi[ +"FXH[>%mno$AVqk>$bB=>$bBVreq;,?$bBVreq#)>$bB= +@/Z#eI9Kr\L]359A6N;C??c@,"Ct\B>&sV$"FXHW??cC-%sM2`>$bB=>$bB=>$bB=L]35=A6rGC +?$>69L\6T.LK\#.reu>N?$bB=>$bB=,QN>~> +!<3&j)]4ub_c4ub_h +r`9G+4ub_c3'K;c3)olY"?e_.3(!IC##mcG4ubMboN),i3&jn:=+ +!< +!<=CI=o_t/N;HcY?N#f_@/!h+D0KOi=o`F5aB\?sE2?$?.LN!ac4?$>69Jc:T:BNe_G>$bB9?fFmG6!'jN!+?2>$cdZ +N!4'%?fCsEaDpU>(-C/"EI[P>(-C/%WPZY>$>69??$bB=>)3*9"Ct\B>%mbk#)?Si?$?^\N.5ME?$bB=>$bAX +!.Y~> +!<C54oJH33'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c +3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c3'K;c#rk+. +4ub_c4r43L~> +!<= +/M[6f!/UP)!\c3IrfR@e/M10*OoTk-;ZL#"OoR69/HCV+OoS#I/cCh41&!7#0SoFc"(s2;0`@.; +0eFt2BDmtr;_TdT>5jZgF"Jst6\t`)#(&$U0J+l4rfRCO/MJc4rfRaY/M/Y./MJb.0J+k1/SG'G +$"kqD/MJb.0J,foOp-Xq/M/YHqN;%d0J+k1/R&+9s+p]%s)\3Q"&gm*6iE0t/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1 +/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1/MJb1#q[h_ +0J+t10G4A9~> +!<=CI=o`F=Mu\A)=o`78Mu\Y-=o`UBMu[Df=o`dGMue]ApK@QJrephjr)s)Erephtr`T;4repo6 +>%%>g!/LJU!a]&Yrepr">$>tGMu\G-D#eVTMu[8b=oa?WMu[Pd>5aB[@/!h*?AJ65"*[pP?N#fc +?s6`?GQ!I'D-gCLErM"$I9Kf\A;C/C#(^)a?$bBfreq=t>$>69>$bB9?'Kt) +$$T]Z>$bB9?$>6GqMYW!?&sS#s+gW*s*aok")V@JAGqI:>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB= +>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=>$bB=$!LY= +? +!< +!<5jZfF"K't/UoH+0J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t1 +0J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J+t10J*G^/MJah!.Y~> +!<=CI=oa!MMu[nq=o`dGMu\(r=oa!MN!4uI>$>oIq +I9L1\Mu\G-=or#6?N#fbA6N/drephorE92Arepi,r`T;4repl5?MRb)AH%MfL\=mOB_@;dG?S0` +repi.r`T;=rJU`)rE92Lrepts>$>$bB9??6%( +"a=-V>$>e?N!G,G>$bB=>(?O1!,_^=!+,V-"(#/;ErM"#I9Kr\>(9j^?$bAX!.Y~> +!< +!< +!<=CI=oa?WMu[Dc=oa-QMu[Pc=o`F$>tGMu\G(=o`F=Mu\G,=o_t/N;Zo[GQ*O&E`ulM +Mu\Y1=o`F=N!"i=>$h/d!+>b/!.k-.!,_^=!-eF$!.FWG!,_^o!.FQE!.FO!"*[pPGQ*O'G?S0e +rJUc4?N"(+N!!To@#+]>!,_X;!,_^o!.k)Prepi4qHEo,rE92/rJU__q-!cLrephorE92$>69>$bB9?$>69>$bB9?$>69>$bB9?$>69>$bB9 +?$>69>#\g3? +!< +!<";(]7oNS]/M1W7OoS\[/HA0:OoS\a;ZLJ0 +Ooo>K/URJ[!_4hGr/q%Ir@J">rfRA>/OtWqOoT.l/HBG_OoT.o/H@L'P5?g5B9JE]r[e+KrfR8. +q(2S#rK7.8r@J"Jr/q):0`3L&8,eYOM"N>"G5dX)0uY_=0J+k1/M/Y./MJb.0J+k1/M/Y./MJb. +0J+k1/M/Y./MJb.0J+k1/M/Y./MJb.0J+k1/M/Y.0J+t10J+t10J+t10J+t10J+t1&cdF~> +!<=CJ=o`+4Mu\Y1=o_t/Mu[8Z=o`U@MumZr@/Z&Z=o`dGMu\)"=o`F=Mu\A+=oa?WMumNn?N#f_ +?N"%.?AJN="*.RKAH%MfL](BV@/Z#a@/a=0L]35>EbK-'BPhd'>$?.LMu[nm=o`+3Mu[nsD#eeZ +N!"9->(Q[3!bbbXr/:VdrE927repr7>%i]iMu\)!=o`dGMu\)$=o_n-N;Hc\GDqK$r`T;=repi. +q-!c)rJU_arE92$>69>$bB9?$>69>$bB9 +?$>69>$bB9?$>69>$bB9?$>69?~> +!<!)*;m!)WSQ!(Hlg!_YL:rDs"_ +:Ae/n6MreC8,cQj:.tLd!)*/J!)WYr!(-WDrDrt_rAXdGr`9)!r\smQr`9(iq)A@Cr`9(rr&=[H +r)Wkgq`"RKr`9(mof*%B=&_\F3"S853'K;]4ubMc3&j)]3#;RF~> +!<5^#Q>5aTd0eFt\rfR7or@J"QrfR8.r[e+;oo]Ah/URJ[!(Zc8!,):o!.4Vq!)rl[!bX)>rK71K +F8V1$8,Oq=>5jZcF(bE6!,)-[!.4^.!(Zu>rK7.7r@J"JrfR8;r[e+krfR7bq(2SFrfR8.r%.nP +r/q%`q^he\rfR7oodp8EP)*:s/J'Tf/MJb.0J+k1/M/Y./J8&6~> +!<=CJ=o`UBMu\;'=o`78Mu\G$=o`dEMue-5rJ^MT!.k-.!,2:6!-eF$!-eEG!+,V_"(#/7L]354 +ErB/AErCq!?s6`Srepi$rE92Arepi.r`T;4oo&rr>(Q[3!,2+1!-eF$!.k&O!,_^o!d@gUrJUbf +IJf$(B`)$6ErM!uI$bB9?$>69=sO)u~> +!<Z3'L=@H6(BAs~> +!<SsBDmtq7kH;k +rK7.nr[e+nrfR7[r@J"rrfR7br[e+Roo]B'0So^k!&=7#!&=G8##d**0J+kTrfR=q/Q;V2!/UQ9 +!(Zo +!<=CJ=oa!MMu[nq=o`dGMu\(n=o`dAMu\G)=o_t/N;HcYJc:T.B`;08B`S*!+>ba#&ROI?&F4s!/LK2 +!,275!.Xd&!-e9C!FCQ\Mu[8a=oa-QMu[nt=o`UAN!+W6>$d!`Mu[Da=o`dGMu\)"=o`UAMue]? +qcWuNrephorE9S8A8#Xa>$>TuN/(el>528%,QN>~> +!<TT +!<a!*]7O!&4A7 +s)S6gLku"m",JZ`BE"%p7kfKGq(2U[!.Y~> +!<=CJ=oa?WMu[Dc=oa-QMu[P^=o`U=Mu[np=ohrHrepi.qcWuJreph`r`T;Brepi$r`T;0r/:Z- +L]*/4LLC*b!/LQ4!FT75=oa-QMu[8b=o`F4Mue-5repi4pK@Q;repi4qcWu:repo&>'Ke$!Jb@c +=o_n(Mun$'?Mdn+AH%MfL\t%mno!/L>Q!/LQ4!,2:6!-8$s!-7s?!+,V_ +s*Xs"LPPhe",C8fGQ*O%BO66nq-!eE!.Y~> +!<2ul;E:dY+?!([#i!(ZuI!(HW`!(-ZE +!'U<_!*&kU"%#sg8,P=H9DhTk:.n>T91;$5r`9(ppc&:<<;or!8,G7G7K-?i9/ocE +!<5TrRB7#")FpE)$F(],a0N7t6!-@oe!AK?/OoS\_/HA`KOof8JHhrm+HUIW] +!(6UG!Jj8@/HA5B_~> +!<=CK=o`78Mu\Y1=o_t/N::!OBSZME!Jb(Y=o`dGMu[nq=p&/\JS>!c!-8't!-8$A!,_Ih!,2@8 +!+c(f!/LJU")*IKEr9)BGCb>EIg:CGI]\#!.FWG!FCQ\Mu[nq=o`F=Mun3,Jbk<+JRnU\ +!+bqb!Jb@`=o`78Mu\;(=o_t(Mu[_o=o`dGMu\(t=o`+3N;HcYGQ*O%LL0j]!,_=d!c;+lrephj +JQhhP!@.Yq~> +!<2ul;E4]GKa4o@8>8,63d6N&kD55nU` +:AQpM55@/<55.#:6N1$d8,,%D7K$9f55R;>7K-?i9/ocGb`d~> +!<5=<]8,Y">1&d=9 +F8@Hg0_m:#0_[.!8,eYO>50ZL;uMjZ0`*F%;uVp]B.\K.Oo^ABpalM#M#EJ5B_~> +!<=CK=o`78Mu\)!=o_n.Mu\Ft=pA;RLQ%1IAGB=.Jc:T.B_,C1A;?,&AGfU2EqtXoB`2*7@/c)b +IJR+I?MRb)?M@V'B`fCn?Mdn+D>oIqG?TRqMue]Spf[])L]*/5LN6_q=p/5gN/VHI +=o`F8Mue]IrE92Prephjq-!c/repi,qcWu?rephtqH(Q[3JQheO!@.Yq~> +!<7$>:fL7d7J/VC4\&.84nCW75".X12uu0=rDs&"90W85"A;ft<'L(:"&;os +6Mi_F5#bT[55I5=7JKpk<)?Ca69$qf:f'T33;5B5(BAs~> +!<*>&)nLXf0;_e,#!CLr,Oo]VYq^hnRLiY<4/H]XAB/'*4 +!,):o!,)-[!([$O#A5VUH\d#i;tV^F6X",+6h;l20iLI8/HJ4^rK750`!@$;tuL_LjO;X7kH;[H[A\B/b^gt&cdF~> +!<=CJ=p'>7LLg6b")WU?AF*M"AG01/Ef>s4nQH!)D.*3D!G$WWMue?7qcX)BLOERl=p&u(G@(&J +!-eF$!-e9C!,2@j#Bs?^JVSf)D=q'8A9)m7AFit+?u9HM=oi/`rJUf5G@:>P"F#f`LL0aZ"+?,` +B_ts9@#'\l?M[h*D>9%sLOjr!BNeSMJUqZh>5)2$,QN>~> +!<[6*4Zu!Q2ul;E5"eO3p,E(955R;A4ubMb +pG`LM91qcD69RLl3'R0u!'Yrnp,E'h!.Y~> +!< +!<=CI=o`*\=oi;RjB;XnA7T#j=o`78Mu[8]=p&u(I:1?("(#MOAGKC2@!?g*p0%K-?Mdn.?$h&/!+(4[p0%JB!.Y~> +!< +!< +!<=Br>,,7&A9)43>(KlJ=oflKJ,~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th,QN>~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +!< +!< +!<=Br>(Kk.>*2th+96o~> +*rm*:/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/:fd33.X&m2usfqJ,~> +*rlp*1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1P%-//V,LW/HH@^J,~> +*rmQi8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8qC/s>(Kk\=of`GJ,~> +!< +!< +!<=8%=u])W8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei +8m4f;>(Kk.>3T2k+96o~> +*WR!9/3#1?3&ETG3&i`S/3#UG3%R$K1cR$G3&ETG`Af\*3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG +3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETGJN/3?T/Zif!.Y~> +*WQg)1G(C7/L)i'/M/2!1G(1'/Met1,:t]'/L)i'`@Wo&/L)i'/L)i'/L)i'/L)i'/L)i'/L)i' +/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'JLuF)T.L'S!.Y~> +*WRHh8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi`EG)j>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"MmiJQdV.T3;7 +!< +!<1G(C71G(C71G(C71G(C71G(C71G(C71G(C7/L)i' +/M/2!1G(1'/Met1,:t]'/L)i'/M/2!1Wh:1,:t]',:t]',:t]',:t]',:t]',:t]',:t]',:t]' +,:t]',:t]',:t]',:t]',:t]',:t]',:t^&/V,M./HH@^J,~> +!<=DD=o_1n=o_1n=o_1n=o_1n=o_1n=uo8Z8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi +>$=L$8m5Ci>"Vt%8Qn_i>"Mmi>$=L$9$1(Kl3=of`GJ,~> +#QPZ#/3#IG3%Y"f!%e(.!%e(.!%e(.!%d+h!%e(.!%e(.!%e(.!%e(.!%e(.!%e%-2(U^<3%R$? +3%R$?3%R$?3%R$?3%R$?3%R$?3%R$K1cR$G3&ETG3&i`S/3#UG3%R$K1cR&*3&i`S/3#IG/3#IG +/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#IG/3#J;30cH((BAs~> +#QPJh1G'h'/Mm>W!&OR*!&OR*!&OR*!&NUd!&OR*!&OR*!&OR*!&OR*!&OR*!&OO)2)?g?/Met7 +/Met7/Met7/Met7/Met7/Met7/Met1,:t]'/L)i'/M/2!1G(1'/Met1,:t^j/N=t,1G'h'1G'h' +1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'h'1G'i&/X7mg%fh+~> +#QQ,R8m4ei>"\`s!)!2n!)!2n!)!2n!(u6S!)!2n!)!2n!)!2n!)!2n!)!2n!)!/m2+h%E>"Vsj +>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>"Vt%8Qn_i>"Mmi>$=L$8m5Ci>"Vt%8Qna*=u])W8m4ei8m4ei +8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei8m4f;>*W7l+96o~> +!<b`d~> +!< +!<=DD=u/cS>"Vsj>$=O%8m5Cj>"Vt%8m4hj>"Vsj>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"Vsj>"SZr +!)!2n!)!2n!)!2n!)!2n!)!2n!_QWgj&uFTrE91nrE91nrE91nrE91nr)u'O>"Vt%8Qn_i8m4hj +8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi`EG)j>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"MmiJQg6#!?_Am~> +!rs,s/H%O.2#TB62#TB62#TB62#TB61upV8/3#1?3%R$?3&iHK/3#U?3%R$K/3#1?3%R$?r&>TG +3&ETG3%R$G3%R$?3&ETG3%R$G3%R$?3&LRn!%e(.!%e(.!%e(.!%e(.!\?;^rAXd.jZ!5krAXd. +rAXd.rAXd.rAXd.rAZhh3%R$?3%R$?3%R$?3%R$?3%R$?3%R$?3%R$?3&i`S/3#UG3%R$K1cR$G +3&ETG3&i`S/3#UG3%W333]&fI3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG3&ETG +3&ETG3&ETG3&ETG3&ETGLH#;N!.Y~> +!rrrc1]8m*,Q01o,Q01o,Q01o,Q01o,NLEq1G(C7/Met7/M/b11G(17/Met11G(C7/Met7r%/gC +/L)i'/Met'/Met7/L)i'/Met'/Met7/L13G!&OR*!&OR*!&OR*!&OR*!])Dar@J"*jXgHgr@J"* +r@J"*r@J"*r@J"*r@L&d/Met7/Met7/Met7/Met7/Met7/Met7/Met7/M/2!1G(1'/Met1,:t]' +/L)i'/M/2!1G(1'/MkO$3[644/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i'/L)i' +/L)i'/L)i'/L)i'/L)i'LFiN;!.Y~> +!rsTM9)Von8c;fm8c;fm8c;fm8c;fm8`X%o8m4hj>"Vsj>$=O%8m5Cj>"Vt%8m4hj>"Vsjr)t"2 +>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"Vsj>"SZr!)!2n!)!2n!)!2n!)!2n!_QWgrE91nj]VXVrE91n +rE91nrE91nrE91nrE;6S>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj>$=L$8m5Ci>"Vt%8Qn_i +>"Mmi>$=L$8m5Ci>"Zq@3_
  • "Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"MmiLKX^$!.Y~> +"ooH!3%R$?r\sm/rAXd.rAXd.rAXd.rAY]H3%R$?3&ETG3%R$G3%R$?3&ETG3%R$G3%Xte!&XX6 +!&XX6!&XX6!&XX6!&XX6!\?;fjZ"#,3%R$K/3#1?3%R$?3&iHK/3#U?3%Xte!%e(.*@s0$3&ETG +3%R$G3%R$?3&ETG3%R$G3%R$G3&iJf2ukN.2ukN.2ukN.2ukMh2ukN.2ukN.2ukN.2ukN.2ukN. +2ukN-3&N6H/3#1?/3#1?/3#1?/3#1?/3#1?/3#1?/3#1?3&ETG3&i`S/3#UG3%R$K1cR$G3&ETG +`Afn83%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G +3%Vs,!>b`d~> +"oo8f/Met7r[e++r@J"*r@J"*r@J"*r@JpD/Met7/L)i'/Met'/Met7/L)i'/Met'/Mm;V!$hFo +!$hFo!$hFo!$hFo!$hFo!])DQjXh6(/Met11G(C7/Met7/M/b11G(17/Mm;V!&OR**A]9'/L)i' +/Met'/Met7/L)i'/Met'/Met'/M/dW/H@U*/H@U*/H@U*/H@Td/H@U*/H@U*/H@U*/H@U*/H@U* +/H@U)/N#=91G(C71G(C71G(C71G(C71G(C71G(C71G(C7/L)i'/M/2!1G(1'/Met1,:t]'/L)i' +`@X+q/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met' +/Mk9r!=o0\~> +"oooP>"Vsjr`T:orE91nrE91nrE91nrE:+3>"Vsj>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"\]r!(m,m +!(m,m!(m,m!(m,m!(m,m!_QWfj]WEl>"Vt%8m4hj>"Vsj>$=O%8m5Cj>"\]r!)!2n*D0L->"Mmi +>"Vsi>"Vsj>"Mmi>"Vsi>"Vsi>$=Ps=o_1n=o_1n=o_1n=o_1S=o_1n=o_1n=o_1n=o_1n=o_1n +=o_1m=uAoU8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi +`EG;o>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi +>"Z\9!?_Am~> +!< +!< +!<=DB=qjS4>"Vsj>$=O%8m5Cj>"Vt%8m4jJ=oq<"8cDln9)Von9)Von9)Von9)Von9)Dd18m4hj +8m4ei8m4hj8Qn_i8m4ei8m4hj8Qnab=o_.m=o_.m=o_.m=o_.m=pIZ'8Qo:i>"[m[1J1hS8m4hj +>"Vsj>$=O%8m5Cj>"Vt%8m4hj8Qn_i8m4ei8m4hj8Qn_i8m4ei8m4hj8c;fm9)Von9)Von9)Von +9)Von9)Vop8m4jI=o_1n=o_1n=o_1n=o_1n=o_1m=u])W8m5Ci>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj +>"Vsj>"Vt%8Qn_i>"Mmi>$=L$8m5Ci>"Vt%8Qna(=u&ZQ8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei +8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei9(uKi+96o~> +!WWZBJJWkRJJXIc!=]$Z~> +!rrW9')iCA')iCR&e>Tc%h]Bc%hB9`&e>Kc%hdt7#8.O[&e>Tc')iCA')`=@')`=@')`=@')N1H +&e>Tc&e>Tf%h]EP&crRV&,m1C%h]EP&ciLUrX]#ArX]#ArX]#ArX]#ArXT>K%h]Kc&e>Tc%he(: +!##8A'bV#i%hB9`&e>Kc%h]B`&e>Tc%h]EP&crRV&,m1C%h]EP&crRV&,m1C%h]EP')iCA')`=@ +')`=@')`=@')`=@')`=E&e>Tc%hdt7;A'KQ%hB9`&e>Kc%h]B`&e>Tc%h]Bc%hB9c%h]Bc&e>Tc +&e>Tc&e>Tc&e>Tc&e>Tc&e>Tc&e>Tc&eY]f%h]Kc&e>Tf%h]Bc&e>Tc&eY]f`"2k\0b4m-&eY]f +&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>WL%flt:J,~> +!rrrP,lSnd,lSnu,Tn?T+=&'T+ +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/slides/users/slides.tex b/executable_names/doc/slides/users/slides.tex new file mode 100644 index 0000000000000000000000000000000000000000..ad987272eee8bf30ae05bbbcf8d8a03ed869978c --- /dev/null +++ b/executable_names/doc/slides/users/slides.tex @@ -0,0 +1,274 @@ +% +% Slides for SLURM talk at User's meeting +% on +% 2003-04-08 +% +% This presentation was built using a modified version of the +% ``prosper'' latex class and `alienglow' style +% (See ./tex/prosper.cls and ./tex/PPRlinuxglow.sty) +% +% For the "interactive" PDF slides, uncomment the pdf option below +% to enable overlays. For printed slides, uncomment the ps option. +% +\documentclass[% +letterpaper, +pdf, +%ps, +%nocolorBG, +%colorBG, +slideColor, +%slideBW, +%draft, +alienglow +]{prosper} + +\usepackage{epsfig} + +% +% Talk Title, SubTitle, etc. +% +\title{SLURM} +\subtitle{The Simple Linux Utility for \\ Resource Management} +\author{Mark A. Grondona} +\email{mgrondona@llnl.gov} +\disclaimer{LLNL internal use only} + +% +% PPRalienglow.sty was directly modified to fit the two images below. +% If these are changed, you may need to adjust some values in that file. +% +\institution{\epsfig{file=linux_llnl.eps,scale=.25}} +\Logo{\epsfig{file=fry.eps,scale=.3}} + +% +% Set default transition method. Valid methods are +% Replace, Split, Blinds, Box, Wipe, Dissolve, & Glitter +% +\DefaultTransition{Replace} + +% +\begin{document} + +% +% Make the title page +\maketitle + +\begin{slide}{Overview} +\begin{itemize} +\item What is SLURM? +\item What SLURM is Not +\item SLURM Design Criteria +\item SLURM Components and Architecture +\item Simple Examples +\item SLURM and RMS Differences +\end{itemize} +\end{slide} + +% +% Prepare a 5 overlay slide using the handy "itemstep" environment +% +\overlays{5}{% +\begin{slide}{What is SLURM?} +\begin{itemstep} + \item Simple resource manager: + \begin{itemstep} + \item Allocates access to resources (nodes) + \item Distributes work to allocated resources. + \item Manages conflicting requests for resources by maintaining a + simple queue of pending work. + \end{itemstep} + \item Open Source replacement for RMS +\end{itemstep} +\end{slide}} + +% +\overlays{3}{% +\begin{slide}{What SLURM is Not} +\begin{itemstep} + \item A sophisticated job scheduler. + \item A meta-batch system. + \item A comprehensive cluster administration or monitoring package. +\end{itemstep} +\end{slide}} + +%% +%% +\begin{slide}{SLURM Design Criteria} +\begin{itemize} + \item Simple + \item Efficient + \item Scalable to clusters with thousands of nodes + \item Fault Tolerant + \item Secure + \item Open Source +\end{itemize} +\end{slide} + +% +% Prepare overlays using the onlySlide* command. Slides 2-5 will +% show the diagrams entities0-5.eps respectively. The onlySlide* +% environment deallocates the space taken by the slide contents. +% +\overlays{5}{% +\begin{slide}{SLURM Entities} + \onlySlide*{1}{% + \begin{itemize} + \item Nodes + \item Partitions + \item Jobs + \item Job Steps + \end{itemize}} + \begin{center} + \onlySlide*{2}{\epsfig{file=entities0.eps,scale=0.5}} + \onlySlide*{3}{\epsfig{file=entities1.eps,scale=0.5}} + \onlySlide*{4}{\epsfig{file=entities2.eps,scale=0.5}} + \onlySlide*{5}{\epsfig{file=entities3.eps,scale=0.5}} + \onlyInPS{\epsfig{file=entities3.eps,scale=0.5}} + \end{center} +\end{slide}} + +% +% +\overlays{2}{% +\begin{slide}{SLURM Architecture} +\onlySlide*{1}{% +\begin{itemize} + \item Two daemons + \begin{itemize} + \item {\tt slurmctld}: controller daemon + \item {\tt slurmd}: compute node daemon + \end{itemize} + \item Five simple commands + \begin{itemize} + \item {\tt scontrol, sinfo, squeue, scancel, srun} + \end{itemize} +\end{itemize}} +\onlySlide*{2}{% + \begin{center} + \epsfig{file=arch.eps,scale=0.3} + \end{center}} + \onlyInPS{\hfill \epsfig{file=arch.eps,scale=0.3} \hfill} +\end{slide}} + +% +% Simple use of tabular environment. +% +\begin{slide}{User Commands} +\begin{tabular}{rc} +{\tt scontrol} & SLURM administration utility \\ +{\tt sinfo} & Partition and node state \\ +{\tt squeue} & Query job state \\ +{\tt scancel} & Cancel pending jobs \\ +{\tt srun} & Allocate resources and run job steps \\ +\end{tabular} +\end{slide} + + +% +% Use of verbatim environment within a slide. +% The font size is shrunk to footnotesize and TeX's baselineskip is +% decreased by 20% because the default monospace font was so darn big. +% +\begin{slide}{Simple SLURM Examples} +\begin{itemize} +\item Basic interface very similar to RMS +\end{itemize} +\renewcommand{\baselinestretch}{0.8} +\footnotesize +\begin{verbatim} +grondo@dev0 ~ > sinfo +PARTITION NODES STATE CPUS MEMORY TMP_DISK NODES +------------------------------------------------------ +debug 18 IDLE 2 2012 64324 dev[0-17] +grondo@dev0 ~ > srun -N4 hostname +dev0 +dev1 +dev2 +dev3 +grondo@dev0 ~ > +\end{verbatim} +\renewcommand{\baselinestretch}{1.0} +\end{slide} + +% +% +\begin{slide}{Simple SLURM Examples} +\begin{itemize} +\item Killing an interactive job +\end{itemize} +\renewcommand{\baselinestretch}{0.8} +\footnotesize +\begin{verbatim} +grondo@dev0 ~ > srun -n8 sleep 30 +srun: interrupt (one more within 1 sec to abort) +srun: task[0-7]: running +srun: sending Ctrl-C to job +srun: error: dev0: task[0-1]: Interrupt +srun: error: dev1: task[2-3]: Interrupt +srun: error: dev3: task[6-7]: Interrupt +srun: error: dev2: task[4-5]: Interrupt +grondo@dev0 ~ > +\end{verbatim} +\renewcommand{\baselinestretch}{1.0} +\end{slide} + +% +% +\begin{slide}{Simple SLURM Examples} +\begin{itemize} +\item Killing a queued job +\end{itemize} +\renewcommand{\baselinestretch}{0.8} +\footnotesize +\begin{verbatim} +grondo@dev0 ~ > squeue +JobId Partition Name User St TimeLim Prio Nodes + 14 debug sleep grondo R 0:30 0.99 dev[0-3] +grondo@dev0 ~ > scancel 14 +grondo@dev0 ~ > squeue +JobId Partition Name User St TimeLim Prio Nodes +grondo@dev0 ~ > +\end{verbatim} +\renewcommand{\baselinestretch}{1.0} +\end{slide} + +% +% +\begin{slide}{SLURM and RMS Differences} +\raggedright +\begin{itemize} +\item SLURM infrastructure is much simpler + \begin{itemize} + \item SLURM uses a simple configuration file not database + \item Initially, no back-end database \\ + (future versions of SLURM may have this) + \end{itemize} +\item SLURM Open Source and locally developed to fit our needs +\item Job submission and query will mostly be through DPCS, so no changes + there +\end{itemize} +\end{slide} + +% +% +\begin{slide}{prun vs. srun} +\raggedright +\begin{itemize} +\item Most used user command, {\tt srun}, very similar to RMS's {\tt prun} + with minor differences: + \begin{itemize} + \item Basic options: -n, -N, -c, -I, -O, -v are the same + \item I/O redirection -- -e, -i, -o -- are similar + \item Other options differ moderately to significantly + \item Signal Handling in {\tt srun} slightly different + \item We will try to offer a ``prun'' wrapper for {\tt srun} in early versions + \end{itemize} +\end{itemize} +\end{slide} + +% +\begin{slide}{Any Questions?} +\hfill \hfill \epsfig{file=slurm.eps,scale=0.5} \hfill +\end{slide} + +\end{document} diff --git a/executable_names/doc/slides/users/tex/PPRalienglow.sty b/executable_names/doc/slides/users/tex/PPRalienglow.sty new file mode 100644 index 0000000000000000000000000000000000000000..ae7c9bac2011a5c3fc2a155f57d7ca0b38b97a3c --- /dev/null +++ b/executable_names/doc/slides/users/tex/PPRalienglow.sty @@ -0,0 +1,69 @@ +%%============================================================================= +%% PPRalienglow.sty (a slide style for Prosper) +%% Copyright 2000-2001 Frédéric Goualard +%% +%% This program may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.2 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.2 or later is part of all distributions of LaTeX +%% version 1999/12/01 or later. +%% +%% This program consists of the files listed in manifest.txt +%% +%% CVSId : $Id$ +%%============================================================================= +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{PPRalienglow}[2000/10/18] +\typeout{`Alien glow' style for prosper ---} +\typeout{(c) 2000 Frederic Goualard, CWI, The Netherlands} +\typeout{CVSId: $Id$} +\typeout{ } + +\IfFileExists{pst-grad}{\RequirePackage{pst-grad}}{\RequirePackage{gradient}} + +\newrgbcolor{myblue}{.357 .541 .710} +\newrgbcolor{mydarkblue}{0.257 0.441 0.61} + +\FontTitle{% + \usefont{T1}{pag}{b}{n}\fontsize{20.74pt}{20pt}\selectfont% + \mydarkblue}{% + \usefont{T1}{pag}{b}{n}\fontsize{20.74pt}{20pt}\selectfont% + \mydarkblue} +\FontText{\myblue\usefont{T1}{phv}{m}{n}\fontsize{14.4pt}{14pt}% + \selectfont}{% + \myblue\usefont{T1}{phv}{m}{n}\fontsize{14.4pt}{14pt}\selectfont} + +\ColorFoot{\myblue} + +\newcommand{\slidetitle}[1]{% + \rput[lt](1,4){\fontTitle{#1}}} + +%\LogoPosition{-0.5,-0.5} +\LogoPosition{-0.0,-0.8} + +\newcommand{\alienglowFrame}[1]{% + \psframe[framearc=0.25,fillstyle=solid,fillcolor=black](-0.9,-.9)(12.25,8.925) + \rput[l](-.5,6.6){\includegraphics[width=12.0cm,height=10pt]{rule-glow.ps}} + \PutLogo % Mandatory + {#1}} + + +\myitem{1}{\includegraphics[width=.4cm]{bullet-glow.ps}} +\myitem{2}{\includegraphics[width=.3cm]{arrow-glow.ps}} +\myitem{3}{\includegraphics[width=.2cm]{bullet-glow.ps}} + +\NewSlideStyle{t}{5.5,2.4}{alienglowFrame} + +\RequirePackage{semhelv} + +\PDFCroppingBox{5 10 590 810} + + +\endinput + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/executable_names/doc/slides/users/tex/prosper.cls b/executable_names/doc/slides/users/tex/prosper.cls new file mode 100644 index 0000000000000000000000000000000000000000..60fde7aa9d0a6068acf1c8a4ca563b6ac216d3e1 --- /dev/null +++ b/executable_names/doc/slides/users/tex/prosper.cls @@ -0,0 +1,850 @@ +%%============================================================================= +%% prosper.cls +%% Copyright 2000-2001 Frédéric Goualard and Peter Møller Neergaard +%% +%% This program may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.2 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.2 or later is part of all distributions of LaTeX +%% version 1999/12/01 or later. +%% +%% This program consists of the files listed in manifest.txt +%% +%% CVSId : $Id$ +%%============================================================================= + +\def\Prosper@Version{2001/07/17, v. 1.5} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{prosper}[\Prosper@Version] +\typeout{(c) 2000-2001 Frederic Goualard, EPFL, Switzerland} +\typeout{ and Peter Møller Neergaard, Boston Univ., USA} +\typeout{CVSId: $Id$} + +\newif\ifDVItoPS +\DeclareOption{ps}{\global\DVItoPStrue} +\DeclareOption{pdf}{\global\DVItoPSfalse} + +\newif\ifisDraft +\DeclareOption{draft}{\global\isDrafttrue% + \PassOptionsToClass{draft}{seminar}} +\DeclareOption{final}{\global\isDraftfalse% + \PassOptionsToClass{final}{seminar}} + +\newif\ifinColor +\DeclareOption{slideColor}{\global\inColortrue} +\DeclareOption{slideBW}{\global\inColorfalse} + +\newif\ifallPages +\DeclareOption{total}{\global\allPagestrue} +\DeclareOption{nototal}{\global\allPagesfalse} + +\newif\ifcolorBG +\DeclareOption{nocolorBG}{\global\colorBGfalse} +\DeclareOption{colorBG}{\global\colorBGtrue} + +\newif\ifAccumulate +\DeclareOption{accumulate}{\global\Accumulatetrue} +\DeclareOption{noaccumulate}{\global\Accumulatefalse} + +\newif\ifnoFooter +\DeclareOption{noFooter}{\global\noFootertrue} +\noFooterfalse + +\newif\if@distiller +\@distillerfalse +\DeclareOption{distiller}{\global\@distillertrue} + +\DeclareOption{YandY}{\gdef\@pdf@driver{dvipsone}} +\DeclareOption{ps2pdf}{\gdef\@pdf@driver{ps2pdf}} +\DeclareOption{vtex}{\gdef\@pdf@driver{vtex}} + +%% Default style file = default +\def\Style@chosen{default} +\DeclareOption*{\global\let\Style@chosen=\CurrentOption} + +\ExecuteOptions{final,slideBW,total,nocolorBG,noaccumulate,ps,ps2pdf} +\ProcessOptions\relax + +\RequirePackage{graphicx} % MUST be loaded *before* seminar + +\LoadClass[portrait,semlayer,semcolor,leqno]{seminar} +\InputIfFileExists{seminar.bug}{}\relax +\InputIfFileExists{seminar.bg2}{}\relax +\InputIfFileExists{seminar-bg2-lepennec.fix}{}\relax + +\RequirePackage[\@pdf@driver,bookmarks,% + letterpaper,% +% pdfmenubar=false,% + pdfhighlight=/I,% +% pdftoolbar=false,% + pdffitwindow=true,% + pdfcenterwindow=true,% +% pdfwindowui=false,% + menucolor=menucolor,% +% pdfview=Fit,% + pdfstartview=Fit]{hyperref} + +\rotateheaderstrue +%\slidewidth=222mm +%\slideheight=150mm +%\slidewidth=11in +%\slideheight=8.5in +\renewcommand{\slideleftmargin}{0.01in} + +% overlays environment +% Parameter: # of slides in the overlay +% slide 0 is the one for PostScript file +\newbox\theoverlays +\newcounter{overlaysCount} +\newcounter{limitOverlays} + +\newcount\@tempoLimit \@tempoLimit=0 +\newif\ifcollapsedBookmarks +% Default: collapsed bookmarks tree +\collapsedBookmarkstrue +% Add a bookmark for each master slide +\def\@addBookmarkOnSlide#1#2{% + \ifnum#1=0 + \def\Hy@temp{#2}% + \pdfmark{pdfmark=/OUT, + Raw={/Page \thetrueSlideCounter + /View [ /XYZ null null null ] + /Title (\expandafter\strip@prefix\meaning\Hy@temp)} + }% + \else + \@tempoLimit=#1% + \advance \@tempoLimit by -1 + \ifcollapsedBookmarks + \@tempoLimit=-\@tempoLimit + \fi + \def\Hy@temp{#2}% + \pdfmark{pdfmark=/OUT, + Raw={/Count \number\@tempoLimit /Page \thetrueSlideCounter + /View [ /XYZ null null null ] + /Title (\expandafter\strip@prefix\meaning\Hy@temp)} + }% + \fi +} + + +%% Some code to be added when creating a PDF file +\def\Cropping@Box{0 0 595 890} % By default: cropping to a4 paper dimensions +\ifDVItoPS +\else + \AtEndOfClass{% + \hypersetup{pdfpagescrop=\Cropping@Box}% + } +\if@distiller +\else + \AtBeginDvi{% + \pdfmark{pdfmark=/PAGES, + Raw={/Rotate 90}} + }% +\fi +\fi +\newcommand{\PDFCroppingBox}[1]{% + \gdef\Cropping@Box{#1} + } + +%% PDFtransition +%% Transition from one page to another. +%% Possible values: +%% (Split, Blinds, Box, Wipe, Dissolve, Glitter, R) +\def\Split{} \def\Blinds{} \def\Box{} \def\Wipe{} \def\Dissolve{} +\def\Glitter{} \def\R{} \def\Replace{} +\newcommand{\PDFtransition}[1]{% + \@ifundefined{#1} + {% + \ClassError{prosper}{Undefined transition #1}{% + Possible values: Split, Blinds, Box, Wipe, Dissolve, Glitter, R}} + {% + \hypersetup{pdfpagetransition={#1}} + }% +} + +%% Default transition between pages (for values, see \PDFtransition) +\def\@defaultTransition{R} +\newcommand{\DefaultTransition}[1]{\gdef\@defaultTransition{#1}} + + +\let\@cartouche\@empty +%% \slideCaption : Definition of caption to appear on every slide. +\newcommand{\slideCaption}[1]{\gdef\@cartouche{#1}} + +%%----------------------------------------------------------------------------- +%% Definitions for fonts and colors +%% #1: font and color if slide in color +%% #2: font and color if slide in BW +\def\@fontTitleColor{\ClassError{prosper}{% + no font specified for title in color}{Use macro \string\FontTitle}} +\def\@fontTitleBW{\ClassError{prosper}{% + no font specified for title in B\string&W}{Use macro \string\FontTitle}} +\def\@fontSubtitleColor{\@fontTitleColor\fontsize{16pt}{16pt}\selectfont\itshape} +\def\@fontSubtitleBW{\@fontTitleBW\fontsize{14pt}{16pt}\selectfont\itshape} +\def\@fontTextColor{\ClassError{prosper}{% + no font specified for texte in color}{Use macro \string\FontText}} +\def\@fontTextBW{\ClassError{prosper}{% + no font specified for text in B\string&W}{Use macro \string\FontText}} +\def\@colorFoot{\black} +\newcommand{\FontTitle}[2]{% + \gdef\@fontTitleColor{#1}% + \gdef\@fontTitleBW{#2}} +\newcommand{\FontSubtitle}[2]{% + \gdef\@fontSubtitleColor{#1}% + \gdef\@fontSubtitleBW{#2}} +\newcommand{\FontText}[2]{% + \gdef\@fontTextColor{#1}% + \gdef\@fontTextBW{#2}} +\newcommand{\ColorFoot}[1]{\gdef\@colorFoot{#1}} + +\newcommand{\fontTitle}[1]{% + {\ifinColor\@fontTitleColor\else\@fontTitleBW\fi #1}} +\newcommand{\fontText}[1]{% + {\ifinColor\@fontTextColor\else\@fontTextBW\fi #1}} +%%- End of definitions for fonts and colors ----------------------------------- + +% Width of the text area +\newlength{\slideWidth} + +\def\@titleSpacing{\vspace*{10pt}} +\newcommand{\titleSpacing}[1]{\gdef\@titleSpacing{#1}} + +\def\@myendminipage{% + \global\let\@oldendminipage=\endminipage% + \global\let\endminipage=\@newendminipage% +} + +\def\@normalendminipage{% + \global\let\endminipage=\@oldendminipage% +} +\def\@newendminipage{% + \par + \unskip + \ifvoid\@mpfootins\else + \vskip\skip\@mpfootins + \normalcolor + \footnoterule + \unvbox\@mpfootins + \fi + \@minipagefalse %% added 24 May 89 + \color@endgroup + \egroup + \typeout{Vertical size: \the\ht\@tempboxa} + \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}} + +%% Redefinition of the slide environment +\newcounter{trueSlideCounter} +\def\thetrueslideCounter{\arabic{trueSlideCounter}} +\let\slide@seminar=\slide +\let\endslide@seminar=\endslide +\let\slide=\relax +\let\endslide=\relax +\newenvironment{SlideNormal}[2][\@defaultTransition]{% + \stepcounter{trueSlideCounter}% + \PDFtransition{#1}% + \begin{slide@seminar}% + \def\@tempa{#2}% + \ifx\@tempa\@empty + \else + \@addBookmarkOnSlide{0}{#2}% + \slidetitle{#2}% + \fi + \begin{posit@Box}% + \begin{minipage}{\slideWidth}% + \begin{raggedright}% + \@DefMyItem + \ifinColor\@fontTextColor\else\@fontTextBW\fi + }{% + \par\end{raggedright}% + \end{minipage} + \end{posit@Box}\end{slide@seminar}} +% Slides in overlays +\newenvironment{SlideOverlay}[2][\@defaultTransition]{% + \ifDVItoPS + \begin{slide@seminar}% + \slidetitle{#2}% + \begin{posit@Box}% + \begin{minipage}{\slideWidth}% + \begin{raggedright}% + \@DefMyItem + \ifinColor\@fontTextColor\else\@fontTextBW\fi + \else %% DVI -> PDF + \stepcounter{trueSlideCounter}% + \PDFtransition{#1}% + \begin{slide@seminar}% + \@prepareResetCounters + \def\@tempa{#2}% + \ifx\@tempa\@empty + \else + \@ifundefined{@okForBookmark}{% + \gdef\@okForBookmark{}% + \@addBookmarkOnSlide{\number\c@limitOverlays}{#2}% + }{\@addBookmarkOnSlide{0}{#2}}% + \slidetitle{#2}% + \fi + \begin{posit@Box}% + \begin{minipage}{\slideWidth}% + \begin{raggedright}% + \@DefMyItem + \ifinColor\@fontTextColor\else\@fontTextBW\fi + {\overlay{1}}% + \fi + }{% + \ifDVItoPS + \par\end{raggedright}% + \end{minipage}\end{posit@Box}\end{slide@seminar}% + \else %% DVI -> PDF + \par\end{raggedright}% + \end{minipage}\end{posit@Box}\end{slide@seminar}% + \addtocounter{slide}{-1}% + \fi +} +\let\slide=\SlideNormal +\let\endslide=\endSlideNormal + +\newcommand{\NewSlideStyle}[4][11cm]{% + \setlength{\slideWidth}{#1}% + \global\pslongbox{posit@Box}{\rput[#2](#3)}% + \newslideframe{the#4}{\csname #4\endcsname{##1}}% + \slidepagestyle{GenericPageStyle}% + \slideframe{the#4}% +} + + +% Definition of the bullet for itemize env. +\def\@prosperItemi{{\scriptsize\green% + \raisebox{2pt}{\ensuremath{\bullet}}}} +\def\@prosperItemii{{\scriptsize\green% + \raisebox{2pt}{\ensuremath{\bullet}}}} +\def\@prosperItemiii{{\scriptsize\green% + \raisebox{2pt}{\ensuremath{\bullet}}}} +\newcommand{\myitem}[2]{% + \ifnum#1=1 + \gdef\@prosperItemi{#2}% + \else + \ifnum#1=2 + \gdef\@prosperItemii{#2}% + \else + \ifnum#1=3 + \gdef\@prosperItemiii{#2}% + \else + \ClassError{prosper}{Undefined item level}{Available levels: 1,2,3}% + \fi + \fi + \fi +} + +\def\@DefMyItem{% + \global\let\labelitemi=\@prosperItemi + \global\let\labelitemii=\@prosperItemii + \global\let\labelitemiii=\@prosperItemiii +} + +%% displaying of a logo (to be defined in every style) +\newcommand{\LogoPosition}[1]{\gdef\@PosLogo{#1}} +\def\@PosLogo{\ClassError{prosper}{no default position for positioning the logo given}{Use macro \string\LogoPosition\space in the style file}} +\let\@thelogo\@empty +\newcommand{\Logo}{% + \@ifnextchar({\Logo@one}{\Logo@two}% +} +\def\Logo@one(#1)#2{% + \gdef\@PosLogo{#1}% + \gdef\@thelogo{#2}% +} +\def\Logo@two#1{% + \gdef\@thelogo{#1}% +} + +\newcommand{\PutLogo}{% + \ifx\@thelogo\@empty\else\rput[lb](\@PosLogo){\@thelogo}\fi +} + +\expandafter\ifx\csname realpageref\endcsname\relax% + \gdef\realpageref#1{\expandafter\real@setref + \csname r@#1\endcsname\@secondoffive{#1}} +\fi + +\newpagestyle{GenericPageStyle}{\hfill }{\ifnoFooter\else\hfill% + \ifisDraft + {\@colorFoot\tiny \textbf{\jobname.tex}~--~\@Title~--~\@Author~--~\number\day/\number\month/\number\year~--~\timenow~--~p.~\thepage\ifallPages/\realpageref{last@page}\fi}% + \else + \ifshowVersion + {\@colorFoot\tiny \textbf{\jobname.tex}~--~\@Title~--~\@Author~--~\number\day/\number\month/\number\year~--~\timenow~--~p.~\thepage\ifallPages/\realpageref{last@page}\fi}% + \else + {\@colorFoot\tiny \hfill \hfill \hfill \hfill \@cartouche~--~p.~\thepage\ifallPages/\realpageref{last@page}\hfill\fi}% + \fi\fi\fi +} + +\IfFileExists{PPR\Style@chosen.sty}{% + \RequirePackage{PPR\Style@chosen}% +}{\ClassError{prosper}{unknown Prosper style file: PPR\Style@chosen.sty}{% + Sorry, no additional help}} + + +\def\nobabel{% +\let\labelitemi\@ltiORI% +\let\labelitemii\@ltiiORI% +\let\labelitemiii\@ltiiiORI% +\let\labelitemiv\@ltivORI} + +% A new itemize environment that does not attempt to justify sentences +\let\Itemize=\itemize +\let\endItemize=\enditemize +\let\orig@item=\item +\renewenvironment{itemize}{\global\let\cur@item=\item + \global\let\item=\orig@item% + \begin{Itemize}\begin{raggedright}}{% + \end{raggedright}\end{Itemize}\global\let\item=\cur@item} +\let\orig@center=\center +\let\orig@endcenter=\endcenter +\def\center{\global\let\cur@item=\item \global\let\item=\orig@item + \orig@center} +\def\endcenter{\orig@endcenter \global\let\item=\cur@item} + +% itemstep : itemize environment with step-by-step displaying +% Warning: no more than 4 nesting levels allowed!! +\newcounter{item@step} +\newenvironment{itemstep}[1][1]{% + \begin{Itemize}\begin{raggedright}% + \ifnum\the\@itemdepth=1% + \setcounter{item@step}{#1}% + \addtocounter{item@step}{-1}% + \fi% + \def\item{\stepcounter{item@step}% + \FromSlide{\theitem@step}\orig@item}% + }{\end{raggedright}\end{Itemize}\ifnum\the\@itemdepth=0\setcounter{item@step}{0}\fi} + +%% Displaying the version caption +\newif\ifshowVersion +\showVersionfalse +\newcommand{\displayVersion}{\global\showVersiontrue} + +\newcommand{\timenow}{% + \@tempcnta=\time \divide\@tempcnta by 60 \number\@tempcnta:\multiply + \@tempcnta by 60 \@tempcntb=\time \advance\@tempcntb by -\@tempcnta + \ifnum\@tempcntb <10 0\number\@tempcntb\else\number\@tempcntb\fi} + +\newcommand{\lastpage@putlabel}{\addtocounter{page}{-1}% + \immediate\write\@auxout{\string + \newlabel{last@page}{{}{\theslide}{\relax }{}{}}}% + \addtocounter{page}{1}} +\AtEndDocument{\ifallPages\clearpage\lastpage@putlabel\fi} + +\let\@Subtitle\@empty +\newcommand{\subtitle}[1]{\gdef\@Subtitle{#1}} +\renewcommand{\title}[1]{\gdef\@Title{#1}% + \ifx\@cartouche\@empty\gdef\@cartouche{#1}\fi} +\renewcommand{\author}[1]{\gdef\@Author{#1}} + +\let\@disclaimer\@empty +\newcommand{\disclaimer}[1]{\gdef\@disclaimer{#1}} + +\let\@email\@empty +\newcommand{\email}[1]{\gdef\@email{#1}} + +\let\@institution\@empty +\newcommand{\institution}[1]{\gdef\@institution{#1}} + +\renewcommand{\maketitle}{% + %% Tests whether the 'french' style from B. Gaulle is loaded + \expandafter\ifx\csname frenchTeXmods\endcsname\relax% + \else + \PackageWarning{prosper}{This page intentionnally left blank to overcome an incompatibility bug between B. Gaulle 'french' package and the seminar class.} + \begin{center} + {\black\small + \textsf{prosper} class: page intentionnally left blank to overcome an incompatibility bug between B. Gaulle 'french' package and the seminar class.}% + \end{center} + \clearpage \setcounter{page}{0}% + \fi + \begin{slide}{}% + \ptsize{10}% + \begin{center}% + \@titleSpacing\par + \normalfont + {\ifinColor\@fontTitleColor\else\@fontTitleBW\fi\@Title\par}% + \ifx\@Subtitle\@empty\else + + {\ifinColor\@fontSubtitleColor\else\@fontSubtitleBW\fi\@Subtitle\par} + \fi + + \vskip.5em + \@Author + + \ifx\@email\@empty\else + \vskip-5pt + {\fontsize{7}{7}\selectfont\texttt{\@email}} + \fi + \ifx\@institution\@empty% + \else + \vskip.8em + \@institution + \fi + \ifx\@disclaimer\@empty% + \else + \vfill \vfill + {\fontsize{6}{6}\selectfont\textsf{\@disclaimer}} + \fi + \vfill + \end{center} + \end{slide} +} + +%% Overlays environment +\newcounter{overlay@page} +\newenvironment{Overlays}{% + \global\let\slide\SlideOverlay + \global\let\endslide\endSlideOverlay + \setcounter{overlay@page}{\value{slide}}}{% + \global\let\slide\SlideNormal + \global\let\endslide\endSlideNormal + \global\let\@okForBookmark\relax + \setcounter{slide}{\value{overlay@page}}\stepcounter{slide}} + + +% fromSlide, onlySlide, untilSlide +% Masks or not the parameter. +% The stared version does not advance the position pointer and does not +% interpret its argument (to be used for graphics and commands containing +% PStricks links) + +% The following uses some pstricks hackery to exclude material from a +% slide. We use pstricks' postscript commands to place material on +% slide one which will never be printed. +\long\def\@on@overlay@one#1{% + \pst@Verb{(1) BOL}{\ignorespaces #1}\pst@Verb{(\curr@overlay) BOL}} +% [2001/07/16] PMN: The grouping and \ignorespaces around the argument +% is necessary for downwards compatibility. +% \ignorespaces is as found in \overlays from seminar and +% the grouping changes the spacing behavour in TeX. + +\long\def\fromSlide{% + \@ifstar\fromSlide@E\fromSlide@NE} +\long\def\fromSlide@NE#1{% + \let\prosper@next\@gobble% + \ifDVItoPS% + \ifAccumulate% + \let\prosper@next\@iden% + \fi% + \else% + \ifnum#1>\value{overlaysCount}% + \let\prosper@next\@on@overlay@one% + \else% + \let\prosper@next\@iden% + \fi% + \fi% + \prosper@next} + +\long\def\fromSlide@E#1{% + \let\prosper@next\@gobble% + \ifDVItoPS% + \ifAccumulate% + \let\prosper@next\@iden% + \fi% + \else% + \ifnum#1>\value{overlaysCount}% + \else% + \let\prosper@next\@iden% + \fi% + \fi% + \prosper@next} + +\long\def\untilSlide{% + \@ifstar\untilSlide@E\untilSlide@NE} +\long\def\untilSlide@NE#1{% + \let\prosper@next\@gobble% + \ifDVItoPS% + \ifAccumulate% + \let\prosper@next\@iden% + \fi% + \else% + \ifnum#1<\value{overlaysCount}% + \let\prosper@next\@on@overlay@one% + \else% + \let\prosper@next\@iden% + \fi% + \fi% + \prosper@next} + +\long\def\untilSlide@E#1{% + \let\prosper@next\@gobble% + \ifDVItoPS% + \ifAccumulate% + \let\prosper@next\@iden% + \fi% + \else% + \ifnum#1<\value{overlaysCount}% + \else% + \let\prosper@next\@iden% + \fi% + \fi% + \prosper@next} + +\long\def\onlySlide{% + \@ifstar\onlySlide@E\onlySlide@NE} +\long\def\onlySlide@NE#1{% + \let\prosper@next\@gobble% + \ifDVItoPS% + \ifAccumulate% + \let\prosper@next\@iden% + \fi% + \else% + \ifnum#1=\value{overlaysCount}% + \let\prosper@next\@iden% + \else% + \let\prosper@next\@on@overlay@one% + \fi% + \fi% + \prosper@next} + +\long\def\onlySlide@E#1{% + \let\prosper@next\@gobble% + \ifDVItoPS% + \ifAccumulate% + \let\prosper@next\@iden% + \fi% + \else% + \ifnum#1=\value{overlaysCount}% + \let\prosper@next\@iden% + \fi% + \fi% + \prosper@next} + +% FromSlide, OnlySlide, UntilSlide +% Masks or not the following material. Advances the position pointer +\newcommand{\FromSlide}[1]{% +\ifDVItoPS% +\else% + \ifnum#1>\value{overlaysCount}% + \overlay{1}% + \fi% +\fi} +\newcommand{\UntilSlide}[1]{% +\ifDVItoPS% +\else% + \ifnum#1<\value{overlaysCount}% + \overlay{1}% + \fi +\fi} +\newcommand{\OnlySlide}[1]{% +\ifDVItoPS% +\else% + \ifnum#1=\value{overlaysCount}% + \else% + \overlay{1}% + \fi +\fi} + +% Overlays. Parameter to state the number of slides composing the overlay +%\def\stepcounter#1{% +% \ifInOverlays +% \ifnum\value{overlayscount}<2 +% \else +% \addtocounter{#1}\@ne +% \fi +% \else +% \addtocounter{#1}\@ne +% \fi +% \begingroup +% \let\@elt\@stpelt +% \csname cl@#1\endcsname +% \endgroup +%} + +\newif\ifInOverlays +\InOverlaysfalse +\long\def\overlays#1#2{% + \bgroup + \aftergroup\@cleanupOverlay + \global\InOverlaystrue + \setcounter{limitOverlays}{#1}% + \setcounter{overlaysCount}{1}% + \ifDVItoPS + #2 + \else + \begin{Overlays}% + \bgroup + \loop + \@everyOverlay + #2 + \ifnum\value{overlaysCount}<\value{limitOverlays}% + \stepcounter{overlaysCount}% + \repeat + \egroup + \end{Overlays}% + \fi + \egroup +} + +\def\@cleanupOverlay{% + \global\InOverlaysfalse + \setcounter{nbAffected}{0} +} + +\def\@listctr{} +\AtBeginDocument{% + \def\@pdfcreator{LaTeX with hyperref and prosper packages}% + {\begingroup \escapechar\m@ne\xdef\@gtempa{{\string\reset@color}}\endgroup + \expandafter\@ifundefined\@gtempa\relax{% + \global\let\orig@reset@color=\reset@color + \gdef\reset@color{\orig@reset@color\pst@endcolor}}}% + \let\Label=\label + \def\label#1{% + \ifInOverlays + \ifnum\value{overlaysCount}=1 + \Label{#1} + \fi + \else + \Label{#1} + \fi + } + + % For amsmath environments + \let\Label@in@display=\label@in@display + \def\label@in@display#1{% + \ifInOverlays + \ifnum\value{overlaysCount}=1 + \Label@in@display{#1} + \fi + \else + \Label@in@display{#1}% + \fi +}% + + \let\overlay@loop=\relax + \let\stepcounter=\stepcounter +% Macro \overlay taken from semlayer.sty +\def\overlay#1{% + \ifoverlays\ifx\@overlay\relax\nooverlays@err\fi\fi + \ifslide + \@tempcnta=#1 + \@testfalse + \ifnum\@tempcnta>-1 \ifnum\@tempcnta<10 \@testtrue\fi\fi + \if@test + \c@overlay=\@tempcnta + \ifnum\c@overlay=0 + \advance\c@slide by -1 + \refstepcounter{slide}% + \else + \advance\c@overlay by -1 + \refstepcounter{overlay}% + \ifoverlays + \xdef\overlay@list{\overlay@list,\the\c@overlay}% + \fi + \fi + \ifoverlays + \@overlay{\the\c@overlay}% + \fi + \else + \@seminarerr{\string\overlay\space argument must be + an integer between 0 and 9}\@eha + \fi + \else + \@seminarerr{\string\overlay\space can only be used + in slide environments}\@eha + \fi + \ignorespaces}% +} % AtBeginDocument + +\let\@everyOverlay\relax +%% Macros to be executed before each overlayed slide +\def\everyOverlay#1{\gdef\@everyOverlay{#1}} + +\newcounter{nbAffected} +\newcounter{savecountAffected} +\def\saveCtr#1{% + \stepcounter{nbAffected} + \expandafter\@saveCtr\the\csname c@#1\endcsname{#1} +} +\def\@saveCtr#1#2{ + \expandafter\gdef\csname @sac\the\c@nbAffected\endcsname{\fromSlide*{2}{\setcounter{#2}{#1}}} +} + +\def\@prepareResetCounters{% + \ifnum\value{nbAffected}>0 + \setcounter{savecountAffected}{1} + \loop + \csname @sac\the\c@savecountAffected\endcsname + \ifnum\value{savecountAffected}<\value{nbAffected} + \stepcounter{savecountAffected} + \repeat + \fi +} + + +% \part +\let\part=\relax +\newcommand{\part}[2][\@defaultTransition]{% + \begin{slide}[#1]{}% + \vspace*{1.5cm}\@addBookmarkOnSlide{0}{#2}% + \begin{center}% + \fontTitle{#2}% + \end{center} + \end{slide}} + +% Uses #1 if PDF option, otherwise #2 +% [7/13/01] PMN: More robust implementation as it does not scan the +% arguments for \if. +\newcommand{\PDForPS}{% + \ifDVItoPS + \let\prosper@next\@secondoftwo + \else + \let\prosper@next\@firstoftwo + \fi + \prosper@next} +% #1 appears on the slide only on PS mode +\newcommand{\onlyInPS}{% + \ifDVItoPS + \let\prosper@next\@iden + \else + \let\prosper@next\@gobble + \fi + \prosper@next} +% #1 appears on the slide only on PDF mode +\newcommand{\onlyInPDF}{ + \ifDVItoPS + \let\prosper@next\@gobble + \else + \let\prosper@next\@iden + \fi + \prosper@next} + +% To be used in conjunction with babel/french to allow ones own labels +\def\NoFrenchBabelItemize{% +\AtBeginDocument{% +\renewenvironment{itemize}% +{\ifnum \@itemdepth >\thr@@\@toodeep\else + \advance\@itemdepth\@ne + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% + \expandafter + \list + \csname\@itemitem\endcsname% + {\let\@trivlist\@trivlistORI + \settowidth{\labelwidth}{\textendash}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \ifnum\@listdepth=0 + \setlength{\itemindent}{\parindent}% + \else + \addtolength{\leftmargin}{\parindent}% + \fi + \setlength{\itemsep}{\z@}% + \setlength{\parsep}{\z@}% + \setlength{\topsep}{\z@}% + \setlength{\partopsep}{\z@}% + \addtolength{\topsep}{-\parskip}% + \addtolength{\partopsep}{\parskip}% + }% + \fi}% + {\endlist}% +}} + +\ptsize{14} + +\endinput + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/executable_names/doc/survey/ChangeLog b/executable_names/doc/survey/ChangeLog new file mode 100644 index 0000000000000000000000000000000000000000..90e50a3dffb4112da9b25d544f0fba663711c87b --- /dev/null +++ b/executable_names/doc/survey/ChangeLog @@ -0,0 +1,17 @@ +ChangeLog for the "external" latex document report.tex, llnl.tex. + +Wed Feb 13 04:23:26 PST 2002 garlick + Added Mark Grondona to authors. + + Added references to SQMX, GNU Queue, and Clubmask systems + (not fleshed out). + + Removed open source claim for Condor per Tim Mattson's email + Jan 11, 2002. + + Commented out "Enjoy SLURM" picture. + + Overview and beginning of Architecture rewritten. + +Wed Feb 20 09:04:10 PST 2002 garlick + Split off from pubdesign document diff --git a/executable_names/doc/survey/Makefile b/executable_names/doc/survey/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..6be471975767c728dce135ceef926d927173098d --- /dev/null +++ b/executable_names/doc/survey/Makefile @@ -0,0 +1,42 @@ +# The following comments are to remind me how the automatic variables work: +# $@ - target +# $% - target member +# $< - First prerequisite +# $? - All (newer) prerequisites +# $^ - All prerequisites +# $+ - $^ but with repetitions +# $* - $* stem of pattern (for "foo.c" in %.c:%.o this would be "foo") +# 'info "GNU make"': "Using variables": "Automatic" also lists a few more. + +REPORT = report + +TEX = $(REPORT).tex +FIGS = +PLOTS = +BIB = project.bib + +%.eps: %.gnuplot %.data + gnuplot $< +%.eps: %.fig + fig2dev -Lps $< $@ +%.eps: %.obj + tgif -print -eps $< +%.ps: %.dvi + dvips -t letter -o $(@F) $(. A capability is uniquely constructed for a + program. Each process must present the program's capability + to the Elan3 device driver via elan3_attach() in order to + communicate. ELAN_CAPABILITY includes: + - 128-bit secret key + - description of the assignment of tasks to nodes + - range of Elan hardware context numbers assigned to jobs + +context An Elan3 adapter resource needed for communication. + One is assigned to each process that is using the Elan + on a node. There are 4096 contexts available on the adapter; + ranges are defined in for the batch system, + kernel comms, and users. + +program description + An abstraction added to the kernel by Quadrics, similar to + a process group, but impossible for an application to detach + from. Using the calls prototyped in , it is + possible to signal programs, collect aggregate accounting + information for programs, and assign Elan capabilities and + contexts to programs. + + +SLURM Partition Manager Support + +The Partition Manager (PM) allocates node resources to parallel jobs for +SLURM. In the presense of a Quadrics Elan3 interconnect, it also allocates +program descriptions and Elan contexts. + +A program description is allocated for each parallel job. Program +descriptions are managed by the PM as a monotonically increasing integer +value greater than zero. + +A range of Elan context numbers is allocated to each parallel program. The +number of contexts in the range is the number of processes per node that will +be making Elan communications calls. Elan contexts are managed by the PM as +a monotonically increasing integer value in the range of +ELAN_RMS_BASE_CONTEXT_NUM to ELAN_RMS_TOP_CONTEXT_NUM (inclusive), +defined in . + +On selecting nodes for a job: only contiguous nodes can utilize the hardware +broadcast feature so preference should be given to contiguous ranges of nodes. +This is a hardware limitation. Broadcast packets on the switch are +routed using a data structure that includes the tree depth and link range. +The tree depth targets all the leaf nodes "below" the node at the specified +depth, and the range trims links off each side of the range. One can't mask +out nodes in the middle, and a broadcast or flood DMA will fail if any of +the destinations fail. The same limitation should apply to federated switches +as they are simply a degenerate fat tree with additional depth (not as fat +at the top as the 128-way building blocks). + +I'll put this in the elan design document in slurm-doc. + + +SLURM Job Manager Support + +The Job Manager (JM) manages the setup and execution of parallel jobs for +SLURM. When running a job that uses the Elan interconnect, the job manager +must initialize and distribute Elan capabilities and manage program +descriptions. Additional environment setup is necessary to support Quadrics +MPI jobs. + +When JM initializes the ELAN_CAPABILITY data structure for a job, it should +first call the elan3_nullcap() function to set all structure members to known +values. The following members are then initialized: + +cap.Type Set to either ELAN_CAP_TYPE_BLOCK or ELAN_CAP_TYPE_CYCLIC + depending on how the processes in a program are to be + addressed. Next "|=" ELAN_CAP_TYPE_BROADCASTABLE if the + allocated nodes are contiguous in address. Finally, + "|=" ELAN_CAP_TYPE_MULTI_RAIL. + +cap.RailMask Set to 1. SLURM only supports one rail at this time. + +cap.UserKey This is a 128-bit secret key, unique to the program. A rogue + user who knows this key could "dummy up" a capability on + one of the nodes running the program and perform remote DMA's + into the address space of the program's processes. The key + is generated in some non-deterministic way, such as an MD5 + algorithm seeded by /dev/random. Values are assigned in + 32-bit blocks by addressing cap.UserKey.Values[0-3]. + +cap.LowContext Set to the lower bound of the range of contexts assigned + to the parallel program. + +cap.HighContext Set to the upper bound of the range of contexts assigned + to the parallel program. + +cap.Entries Set to the number of processes in the parallel program. + +cap.LowNode Set to the lower bound of the range of nodes assigned to + the parallel program (may have holes, see cap.Bitmap). + +cap.HighNode Set to the upper bound of the range of nodes assigned to + the parallel program. + +cap.Bitmap The bitmap includes a bit for each possible process in the + program in the LowNode - HighNode range. If there are + two tasks per node, bits zero and one represent the two tasks + on LowNode; two and three the two tasks on LowNode+1, etc.. + the BT_SET macro is used to set the bits in the bitmap. + If a node in the LowNode - HighNode range is not allocated to + the program, its bits are clear. + +The capability and the program description are passed to each node running +the parallel program in such a way as to avoid exposing the UserKey to +rogue users. The portion of the job manger that runs on each node must +then execute a sequence of calls to prepare to execute the processes for +this parallel program. + +First, the job manager forks. The parent waits for the child to terminate +and then calls rms_prgdestroy(). The parent could call rms_prgsignal() to +signal all processes in the program (on the node) when a program is to be +aborted. The child calls rms_prgcreate() to create the program description, +and rms_prgaddcap() to make the capability available to processes that are +members of the program description. The child then forks each process in turn +and waits for all processes to terminate. + +Next, in each process, rms_setcap() is called with the program's capability +index (assigned in rms_prgaddcap() and this process's context number index, +relative to the LowContext - HighContext range in the capability. +The MPI runtime will subsequently call rms_ncaps() and rms_getcap() to +retrieve the capability for presentation to elan3_attach(). +Each process also sets several environment variables that are referenced by +the elan/MPI runtime: + +RMS_NNODES Set to the number of nodes assigned to the program. + +RMS_NPROCS Set to the number of processes in the program. + +RMS_NODEID Set to the node ID for this node, indexed relative to the + program , e.g. an eight node program would run on nodes 0 + through 7 regardless of the Elan ID of the nodes and whether + or not they are contiguous. + +RMS_PROCID Set to the process ID of this process, indexed relative + to the program, e.g. a 16 process program would consist of + processes 0 through 15. (If running two tasks per node + under block allocation, processes 0 and 1 would be allocated + to node 0; if cyclic allocation, processes 0 and 8 would be + allocated to node 0). + +RMS_RANK Set to the MPI rank for the process. Same as RMS_PROCID. + +Finally, the process forks once more, and the parent waits for the child, +while the child execs the MPI process. +(XXX This fork was determined experimentally to be necessary, reason unknown). +(XXX Are RMS_MACHINE, RMS_RESOURCEID, RMS_JOBID useful or necessary?) + + +SLURM Switch Manager Support + +The Switch Manager (SM) monitors the state of any networking equipment and +should be consulted by the partition manager to determine Elan/Elite link +status before allocating a set of nodes to a parallel program. + +Elite switch status is available via a JTAG connection. Inside the Elite +switch assembly, JTAG is used to extract switch status from the Elite switch +components, and I2C to distribute this information inside the switch chassis. +The I2C is available externally via a parallel port attached to the management +node. A Quadrics JTAG kernel module makes this information available to +applications such as the SLURM switch manager. + + + +Notes + +Switch manager interface to Elite jtag needs to be detailed. See "jtest" +program. + +Support for multi-rail is omitted. This should not be difficult to add, but +until we have test hardware, I suggest we leave it. Infrastructure should +be designed so it is possible to send >1 capability per program to nodes +running multirail. + +Pdsh 1.5+/qshell implements the above runtime for single rail as a test. +as a test. (XXX Need to test with more complex applications than "mping". +See pdsh/qswutil.c for details). + +How does execution of TotalView impact this design? + +RMS includes a network error fixup facility. This is a big kludge which +works around hardware failures, such as pulling the Elan cable out when a job +is running. Do we need this? + +RMS can generate backtraces when a program terminates abnormally. +It also handles "elan exceptions". Investigate and determine if we should +also do this. + + +Module Testing + + +Integration and System Testing + + +References + +Quadrics documentation, available online: + http://www.quadrics.com/onlinedocs/QM-1/html/index.html + +- "RMS Reference Manual" +- "Elan Programming Manual" diff --git a/executable_names/doc/txt/heritage.txt b/executable_names/doc/txt/heritage.txt new file mode 100644 index 0000000000000000000000000000000000000000..361bc5d01a22692febeae2980ba740d835365df9 --- /dev/null +++ b/executable_names/doc/txt/heritage.txt @@ -0,0 +1,120 @@ +Record below the origins of code imported into SLURM from any source. +This is critical to insure SLURM can be properly licensed. A sample +entry follows. + +Origin: http://www.UNI.edu/whatever/sample.[ch] +Date: 5/23/02 +Destination: src/directory/sample.[ch] +License: GPL, UNI copyright, UNI patent, etc. (list all) +Imported by: Joe Slurm +Notes: modules to do whatever + +====================================================================== + +Origin: MPICH2 source code, http://www-unix.mcs.anl.gov/mpi/mpich2/ +Date: 2005 +Destination: src/api/pmi.[ch] +License: Open Source, see listing for details +Imported by: Morris Jette +Notes: pmi.h is taken directly from the MPICH2 code base, + pmi.c is an LLNL implementation of the functions defined + in pmi.h + +Origin: LLNL Software Development Toolbox +Date: 2002 +Destination: src/common/cbuf.[ch] +License: GPL +Imported by: Mark Grondona +Notes: + +Origin: LLNL ConMan, http://www.llnl.gov/linux/conman +Date: 2001 +Destination: src/common/fd.[ch] +License: GPL +Imported by: Mark Grondona +Notes: + +Origin: GNU libc +Date: 2001 +Destination: src/common/getopt1.c, getopt.[ch] +License: GPL +Imported by: Morris Jette +Notes: + +Origin: LLNL Software Development Toolbox +Date: 2001 +Destination: src/common/list.[ch] +License: GPL +Imported by: Mark Grondona +Notes: + +Origin: ????????????????? +Date: 2001 +Destination: src/common/log.[ch] +License: "All rights reserved", "can be used freely for any purpose." +Imported by: Mark Grondona +Notes: SLURM code is based upon SSL code with substantial changes + +Origin: GNU autoconf info document +Date: 2005 +Destination: src/common/malloc.[ch] +License: GPL +Imported by: Morris Jette +Notes: + +Origin: OpenBSD libc +Date: 2001 +Destination: src/common/strlcpy.[ch] +License: OpenBSD +Imported by: Mark Grondona +Notes: + +Origin: LLNL ConMan, http://www.llnl.gov/linux/conman +Date: 2002 +Destination: src/common/util-net.[ch] +License: GPL +Imported by: Mark Grondona +Notes: + +Origin: GNU taskset command source +Date: 2005 +Destination: src/plugins/task/affinity/schedutils.c +License: GPL +Imported by: Andy Riebs +Notes: + +Origin: http://aspn.activestate.com/ASPN/Cookbook/Tcl/Recipe/415982 +Date: 1/13/2006 +Destination: testsuite/expect/globals.example +License: None +Imported by: Morris Jette +Notes: Just the function dec2hex16 imported from on-line code + "cookbook." + +Origin: +Date: +Destination: +License: +Imported by: +Notes: + +Origin: +Date: +Destination: +License: +Imported by: +Notes: + +Origin: +Date: +Destination: +License: +Imported by: +Notes: + +Origin: +Date: +Destination: +License: +Imported by: +Notes: diff --git a/executable_names/doc/txt/slurmctld.locks b/executable_names/doc/txt/slurmctld.locks new file mode 100644 index 0000000000000000000000000000000000000000..61eff454aea727bc9fc8d019cec06c3b88e5d99f --- /dev/null +++ b/executable_names/doc/txt/slurmctld.locks @@ -0,0 +1,67 @@ +slurmctld/controller.c +RPC's and required locks Moe Jette + +============================================================================ +Locks (in priority order): Config, Job, Node, Partition + +RPC code Frequency Function to service + Locks needed +============================================================================ + +REQUEST_BUILD_INFO: Rare controller.c:fill_ctld_conf + Read Config + + +REQUEST_NODE_INFO: V Common node_mgr.c:pack_all_node + Read Node + + +REQUEST_JOB_INFO: V Common job_mgr.c:pack_all_jobs + Read Job + + +REQUEST_PARTITION_INFO: V Common partition_mgr.c:pack_all_part + Read Partition + + +REQUEST_JOB_STEP_CREATE: +REQUEST_RESOURCE_ALLOCATION : Common job_mgr.c:job_allocate +REQUEST_IMMEDIATE_RESOURCE_ALLOCATION : (Both use slurm_rpc_allocate_resources) + Read Node, Partition + Write Job + + +REQUEST_JOB_WILL_RUN : Common job_mgr.c:job_allocate + Read Node, Partition + Write Job + + +REQUEST_CANCEL_JOB_STEP: Common job_mgr.c:job_cancel or job_step_cancel + Write Job, Node + + +REQUEST_SUBMIT_BATCH_JOB: Common job_mgr.c:job_allocate + Read Config, Node, Partition + Write Job + + +MESSAGE_NODE_REGISTRATION_STATUS: Common node_mgr.c:validate_node_specs + Write Node + + +REQUEST_RECONFIGURE: V Rare read_config.c:read_slurm_conf + Write Config, Job, Node, Partition + + +REQUEST_UPDATE_JOB: Rare job_mgr.c:update_job + Write Job + Read Node, Partition + + +REQUEST_UPDATE_NODE: Rare node_mgr.c:update_node + Write Node + + +REQUEST_UPDATE_PARTITION: Rare partition_mgr.c:update_part + Write Partition + Read Node diff --git a/executable_names/doc/txt/testing.txt b/executable_names/doc/txt/testing.txt new file mode 100644 index 0000000000000000000000000000000000000000..db3bc19d21f049664a798b3e99fb5dd117c5080d --- /dev/null +++ b/executable_names/doc/txt/testing.txt @@ -0,0 +1,59 @@ +SLURM Testing Intrastructure +---------------------------- + +The testing infrastructure for SLURM is based on Dejagnu, and consequently on +expect/tcl. + +Directory Structure +------------------- +The entire testing infrastructure is located under the slurm/testsuite +directory. + +testsuite/config + contains the default config files for dejagnu. + +testsuite/slurm_unit + Has a directory structure that mirrors slurm/src, and + contains the unit test cases for them. For example, the directory + slurm_unit/common will contain unit test cases for modules located in + src/common. + +testsuite/slurm* + any directory starting with slurm may contain testcases to run. Dejagnu + will find and execute an ".exp" files that are located in the slurm* + directories, and any of it's subdirectories. + + +Testing Scripts +--------------- +Drop in a .exp file into a testsuite/slurm[*] directory. Dejagnu will +automagically run it when either "make check" or "runtest" are executed. +By using the functions pass, fail, untested, unresolved, and note to express +the results of test cases, DejaGNU records these results and prints out +summaries of all test cases. + +Unit Testing +------------ +To unit test using our infrastructure, + +#include + +pass( char*, ... ) +fail( char*, ... ) +untested( char*, ... ) +unresolved( char*, ... ) +note( char*, ... ) + +totals() + +Note: All of the funtctions, except totals, behave like printf. + +There is a runall.exp that will be placed in every unit testing directory, +that will run all programs that end with "test". If you have special needs +from the launching test script, you must write your own. If you write your +own .exp file to launch your scipts, please use names that do not end in +"test" to avoid strange resluts. + + + + diff --git a/executable_names/etc/bluegene.conf.example b/executable_names/etc/bluegene.conf.example new file mode 100644 index 0000000000000000000000000000000000000000..123b5dacae7e6f3ede143dea7898d3601692b697 --- /dev/null +++ b/executable_names/etc/bluegene.conf.example @@ -0,0 +1,73 @@ +############################################################################### +# Global specifications for BlueGene system +# +# BlrtsImage: BlrtsImage used for creation of all bgblocks. +# LinuxImage: LinuxImage used for creation of all bgblocks. +# MloaderImage: MloaderImage used for creation of all bgblocks. +# RamDiskImage: RamDiskImage used for creation of all bgblocks. +# LayoutMode: Mode in which slurm will create blocks: +# STATIC: Use defined non-overlapping bgblocks +# OVERLAP: Use defined bgblocks, which may overlap +# DYNAMIC: Create bgblocks as needed for each job +# BasePartitionNodeCnt: Number of c-nodes per base partition. +# NodeCardNodeCnt: Number of c-nodes per node card. +# NumPsets: The Numpsets used for creation of all bgblocks +# equals this value multiplied by the number of +# base partitions in the bgblock. +# +# BridgeAPILogFile : Pathname of file in which to write the Bridge +# API logs. +# BridgeAPIVerbose: How verbose the Bridge API logs should be +# 0: Log only error and warning messages +# 1: Log level 0 and information messasges +# 2: Log level 1 and basic debug messages +# 3: Log level 2 and more debug message +# 4: Log all messages +# +# NOTE: The bgl_serial value is set at configuration time using the +# "--with-bgl-serial=" option. Its default value is "BGL". +############################################################################### +BlrtsImage=/bgl/BlueLight/ppcfloor/bglsys/bin/rts_hw.rts +LinuxImage=/bgl/BlueLight/ppcfloor/bglsys/bin/zImage.elf +MloaderImage=/bgl/BlueLight/ppcfloor/bglsys/bin/mmcs-mloader.rts +RamDiskImage=/bgl/BlueLight/ppcfloor/bglsys/bin/ramdisk.elf +LayoutMode=STATIC +BasePartitionNodeCnt=512 +NodeCardNodeCnt=32 +Numpsets=8 + +BridgeAPILogFile=/var/log/slurm/bridgeapi.log +BridgeAPIVerbose=0 + +############################################################################### +# Define the static/overlap partitions (bgblocks) +# +# Nodes: The base partitions (midplanes) in the bgblock using XYZ coordinates +# Type: Connection type "MESH" or "TORUS" or "SMALL", default is "TORUS" +# Type SMALL will divide a midplane into multiple bgblock +# based on options NodeCards (count of single node card bglblocks) +# and Quarters (count of quarter midplane bglblocks) to determine +# type of small blocks. +# +# IMPORTANT NOTES: +# * Ordering is very important for laying out switch wires. Please create +# blocks with smap, and once done don't change the order of blocks created. +# * A bgblock is implicitly created containing all resources on the system +# * Bgblocks must not overlap in static mode (except for implicitly +# created bgblock). This will be the case when smap is used to create +# a configuration file. +# * All Nodes defined here must also be defined in the slurm.conf file +# * Define only the numeric coordinates of the bgblocks here. The prefix +# will be based upon the NodeName defined in slurm.conf. +############################################################################### +# LEAVE NEXT LINE AS A COMMENT, Full-system bgblock, implicitly created +# BP=[000x333] Type=TORUS # 4x4x4 = 64 midplanes +############################################################################### +# smap bgblock layout here: +BPs=[000x133] Type=TORUS # 2x4x4 = 32 +BPs=[200x233] Type=TORUS # 1x4x4 = 16 +BPs=[300x313] Type=TORUS # 1x2x4 = 8 +BPs=[320x323] Type=TORUS # 1x1x4 = 4 +BPs=[330x331] Type=TORUS # 1x1x2 = 2 +BPs=[332x332] Type=TORUS # 1x1x1 = 1 +BPs=[333x333] Type=SMALL NodeCards=4 Quarters=3 # 1x1x1 = 4-32 c-node blocks 3-128 c-node blocks diff --git a/executable_names/etc/federation.conf.example b/executable_names/etc/federation.conf.example new file mode 100644 index 0000000000000000000000000000000000000000..5c376ae43f200dab3daa8757bbfe7ff12117e7b5 --- /dev/null +++ b/executable_names/etc/federation.conf.example @@ -0,0 +1,10 @@ +# +# Global specifications for Federation Switch Plugin +# +# AdapterName: Adapter names can be in these forms +# sni0 +# sni[0-1] +# sni[0,1] +# sni[0-1,2] + +AdapterName=sni[0-1] diff --git a/executable_names/etc/init.d.slurm b/executable_names/etc/init.d.slurm new file mode 100644 index 0000000000000000000000000000000000000000..045a38e9094229b472c3a69df15878afca40fa2b --- /dev/null +++ b/executable_names/etc/init.d.slurm @@ -0,0 +1,198 @@ +#!/bin/bash +# +# chkconfig: 345 90 10 +# description: SLURM is a simple resource management system which \ +# manages exclusive access to a set of compute \ +# resources and distributes work to those resources. +# +# processname: /usr/sbin/slurmd +# pidfile: /var/run/slurmd.pid +# +# processname: /usr/sbin/slurmctld +# pidfile: /var/run/slurmctld.pid +# +# config: /etc/sysconfig/slurm +# +### BEGIN INIT INFO +# Provides: slurm +# Required-Start: $local_fs $syslog $network $named munge +# Required-Stop: $local_fs $syslog $network $named munge +# Default-Start: 3 5 +# Default-Stop: 0 1 2 6 +# Short-Description: slurm daemon management +# Description: Start slurm to provide resource management +### END INIT INFO + +BINDIR=/usr/bin +CONFDIR=/etc/slurm +LIBDIR=/usr/lib +SBINDIR=/usr/sbin + +# Source function library. +if [ -f /etc/rc.status ]; then + . /etc/rc.status + SUSE=1 + STARTPROC=startproc + + rc_reset +else + [ -f /etc/rc.d/init.d/functions ] || exit 0 + . /etc/rc.d/init.d/functions + SUSE=0 + STARTPROC=daemon + + function rc_status() { + RETVAL=$? + } + function rc_exit () { + exit $RETVAL + } + RETVAL=0 +fi + +# We can not use a starter program without losing environment +# variables that are critical on Blue Gene systems +if [ -d /bgl/BlueLight/ppcfloor ]; then + STARTPROC="" +fi + +# Source slurm specific configuration +if [ -f /etc/sysconfig/slurm ] ; then + . /etc/sysconfig/slurm +else + SLURMCTLD_OPTIONS="" + SLURMD_OPTIONS="" +fi + +[ -f $CONFDIR/slurm.conf ] || exit 1 + +# setup library paths for slurm and munge support +export LD_LIBRARY_PATH="$LIBDIR:$LD_LIBRARY_PATH" + +start() { + echo -n "starting $1: " + unset HOME MAIL USER USERNAME + $STARTPROC $SBINDIR/$1 $2 + rc_status -v + echo + touch /var/lock/subsys/slurm +} + +stop() { + echo -n "stopping $1: " + killproc $1 -TERM + rc_status -v + echo + rm -f /var/lock/subsys/slurm +} + +startall() { + for prog in `$BINDIR/scontrol show daemons`; do + optvar=`echo ${prog}_OPTIONS | tr "a-z" "A-Z"` + start $prog ${!optvar} + done +} + +# status() with slight modifications to take into account +# instantiations of job manager slurmd's, which should not be +# counted as "running" +# +slurmstatus() { + local base=${1##*/} + local pid + local rpid + local pidfile + + pidfile=`grep -i ${base}pid $CONFDIR/slurm.conf | grep -v '^ *#'` + if [ $? = 0 ]; then + pidfile=${pidfile##*=} + pidfile=${pidfile%#*} + else + pidfile=/var/run/${base}.pid + fi + + pid=`pidof -o $$ -o $$PPID -o %PPID -x $1 || \ + pidof -o $$ -o $$PPID -o %PPID -x ${base}` + + if [ -f $pidfile ]; then + read rpid < $pidfile + if [ "$rpid" != "" -a "$pid" != "" ]; then + for i in $pid ; do + if [ "$i" = "$rpid" ]; then + echo $"${base} (pid $pid) is running..." + return 0 + fi + done + elif [ "$rpid" != "" -a "$pid" = "" ]; then + echo $"${base} dead but pid file exists" + return 1 + fi + + fi + + if [ "$base" = "slurmctld" -a "$pid" != "" ] ; then + echo $"${base} (pid $pid) is running..." + return 0 + fi + + echo $"${base} is stopped" + + return 3 +} + + +# +# The pathname substitution in daemon command assumes prefix and +# exec_prefix are same. This is the default, unless the user requests +# otherwise. +# +# Any node can be a slurm controller and/or server. +# +case "$1" in + start) + startall + ;; + startclean) + SLURMCTLD_OPTIONS="-c $SLURMCTLD_OPTIONS" + SLURMD_OPTIONS="-c $SLURMD_OPTIONS" + startall + ;; + stop) + for prog in `$BINDIR/scontrol show daemons`; do + stop $prog + done + ;; + status) + for prog in `$BINDIR/scontrol show daemons`; do + slurmstatus $prog + done + ;; + restart) + $0 stop + $0 start + ;; + condrestart) + if [ -f /var/lock/subsys/slurm ]; then + for prog in `$BINDIR/scontrol show daemons`; do + stop $prog + start $prog + done + fi + ;; + reconfig) + for prog in `$BINDIR/scontrol show daemons`; do + killproc $prog -HUP + done + ;; + test) + for prog in `$BINDIR/scontrol show daemons`; do + echo "$prog runs here" + done + ;; + *) + echo "Usage: $0 {start|startclean|stop|status|restart|reconfig|condrestart|test}" + exit 1 + ;; +esac + +rc_exit diff --git a/executable_names/etc/ptrace.patch b/executable_names/etc/ptrace.patch new file mode 100644 index 0000000000000000000000000000000000000000..d64c332f805bf654d1bda4b7a4ad6e681c435aff --- /dev/null +++ b/executable_names/etc/ptrace.patch @@ -0,0 +1,125 @@ + + +CHAOS kernels must implement ptrace semantics required by the TotalView +debugger. In order to initiate a parallel job under debugger control, a +resource manager or job launch utility must be able to start all tasks +in a stopped state, notify TotalView, and then allow TotalView debugger +servers to attach to all tasks. This functionality requires the ability to: + + * Detach from a traced process and leave the process stopped + * Attach to a stopped process + +Under Linux (CHAOS 1.2), both of the above are impossible without the +following patch by Vic Zandy: + + * initial posting + * follow up + +Further discussion of Vic's patch can be found in this thread +. The main +objections to the patch seemed to be + + * It causes a behavior change for ptrace() + * No apparent agreement on the "right" thing to do when attaching to + a stopped process. + +[Any Etnus or Quadrics references to patches available?] + +On a vanilla 2.6.4 kernel, the ptrace() test is able to accomplish part +1 of the test (detaching from a process and leaving the process +stopped), but part 2 (attaching to a stopped process) appears to still +be failing. + +It is possible to workaround a failure of step 2. Technically, it is not +the attach that hangs when doing a ptrace() of a stopped process, but +the subsequent call to waitpid(). Since the process was already stopped, +the waitpid() never returns. Perhaps Etnus has implemented a workaround +for this behavior. + +Testing: + +The followinbg piece of test code can be used to verify that the proper +functionality exists in the current kernel: + +testptrace.c + +This test should succeed when run without any arguments. + +------------------------------------------------------------------------ + + + +Linux Kernel: Re: [PATCH] ptrace on stopped processes (2.4) +From: Vic Zandy@cs.wisc.edu +Date: Mar 18 2002 + + +This is a repost of the ptrace patch to 2.4 kernels +we've discussed in recent months. + +Since the last post, I have updated it to linux 2.4.18 +(no changes) and tested it with subterfuge and uml. + +Subterfuge seems to be unaffected. + +UML needs minor modifications; I've discussed them with +Jeff Dike and (I believe) he is happy. + +I believe I have addressed everyone's concerns. + +The patch fixes these two bugs: + + 1. gdb and other tools cannot attach to a stopped + process. The wait that follows the PTRACE_ATTACH + will block indefinitely. + + 2. It is not possible to use PTRACE_DETACH to leave + a process stopped, because ptrace ignores SIGSTOPs + sent by the tracing process. + +Vic + +--- /home/vic/p/linux-2.4.18.orig/kernel/ptrace.c Wed Mar 13 13:14:54 2002 ++++ /home/vic/p/linux-2.4.18/kernel/ptrace.c Mon Mar 18 21:58:11 2002 +@@ -54,6 +54,7 @@ + + int ptrace_attach(struct task_struct *task) + { ++ int stopped; + task_lock(task); + if (task->pid <= 1) + goto bad; +@@ -90,7 +91,13 @@ + } + write_unlock_irq(&tasklist_lock); + ++ stopped = (task->state == TASK_STOPPED); + send_sig(SIGSTOP, task, 1); ++ /* If it was stopped when we got here, ++ clear the pending SIGSTOP. */ ++ if (stopped) ++ wake_up_process(task); ++ + return 0; + + bad: +--- /home/vic/p/linux-2.4.18.orig/arch/i386/kernel/signal.c Wed Mar 13 +13:16:44 2002 ++++ /home/vic/p/linux-2.4.18/arch/i386/kernel/signal.c Wed Mar 13 +16:31:38 2002 +@@ -620,9 +620,9 @@ + continue; + current->exit_code = 0; + +- /* The debugger continued. Ignore SIGSTOP. */ +- if (signr == SIGSTOP) +- continue; ++ /* The debugger continued. */ ++ if (signr == SIGSTOP && current->ptrace & PT_PTRACED) ++ continue; /* ignore SIGSTOP */ + + /* Update the siginfo structure. Is this good? */ + if (signr != info.si_signo) { +- + +------------------------------------------------------------------------ diff --git a/executable_names/etc/slurm.conf.example b/executable_names/etc/slurm.conf.example new file mode 100644 index 0000000000000000000000000000000000000000..9d48acbc59346500a841d5a7e1dff2634b5ff52d --- /dev/null +++ b/executable_names/etc/slurm.conf.example @@ -0,0 +1,77 @@ +# +# Example slurm.conf file. Please run configurator.html +# (in doc/html) to build a configuration file customized +# for your environment. +# +# +# slurm.conf file generated by configurator.html. +# +# See the slurm.conf man page for more information. +# +ControlMachine=linux0 +#ControlAddr= +#BackupController= +#BackupAddr= +# +SlurmUser=slurm +SlurmctldPort=6817 +SlurmdPort=6818 +AuthType=auth/munge +#JobCredentialPrivateKey= +#JobCredentialPublicCertificate= +StateSaveLocation=/tmp +SlurmdSpoolDir=/tmp/slurmd +SwitchType=switch/none +MpiDefault=none +SlurmctldPidFile=/var/run/slurmctld.pid +SlurmdPidFile=/var/run/slurmd.pid +ProctrackType=proctrack/pgid +#PluginDir= +CacheGroups=0 +#FirstJobId= +ReturnToService=0 +#MaxJobCount= +#PlugStackConfig= +#PropagatePrioProcess= +#PropagateResourceLimits= +#PropagateResourceLimitsExcept= +#Prolog= +#Epilog= +#SrunProlog= +#SrunEpilog= +#TaskProlog= +#TaskEpilog= +#TaskPlugin= +#TmpFs= +#UsePAM= +# +# TIMERS +SlurmctldTimeout=300 +SlurmdTimeout=300 +InactiveLimit=0 +MinJobAge=300 +KillWait=30 +Waittime=0 +# +# SCHEDULING +SchedulerType=sched/backfill +#SchedulerAuth= +#SchedulerPort= +#SchedulerRootFilter= +SelectType=select/linear +FastSchedule=1 +# +# LOGGING +SlurmctldDebug=3 +#SlurmctldLogFile= +SlurmdDebug=3 +#SlurmdLogFile= +JobCompType=jobcomp/none +#JobCompLoc= +JobAcctType=jobacct/none +#JobAcctLogfile= +#JobAcctFrequency= +# +# COMPUTE NODES +NodeName=linux[1-32] Procs=1 State=UNKNOWN +PartitionName=debug Nodes=linux[1-32] Default=YES MaxTime=INFINITE State=UP diff --git a/executable_names/etc/slurm.epilog.clean b/executable_names/etc/slurm.epilog.clean new file mode 100644 index 0000000000000000000000000000000000000000..4ae37ae465198be462561aec8bce51ecd5599914 --- /dev/null +++ b/executable_names/etc/slurm.epilog.clean @@ -0,0 +1,37 @@ +#!/bin/sh +# +# This script will kill any user processes on a node when the last +# SLURM job there ends. For example, if a user directly logs into +# an allocated node SLURM will not kill that process without this +# script being executed as an epilog. +# +# SLURM_BIN can be used for testing with private version of SLURM +#SLURM_BIN="/usr/bin/" +# +if [ x$SLURM_UID == "x" ] ; then + exit 0 +fi +if [ x$SLURM_JOBID == "x" ] ; then + exit 0 +fi + +# +# Don't try to kill user root or system daemon jobs +# +if [ $SLURM_UID -lt 100 ] ; then + exit 0 +fi + +job_list=`${SLURM_BIN}squeue --noheader --format=%i --user=$SLURM_UID --node=localhost` +for job_id in $job_list +do + if [ $job_id -ne $SLURM_JOBID ] ; then + exit 0 + fi +done + +# +# No other SLURM jobs, purge all remaining processes of this user +# +pkill -KILL -U $SLURM_UID +exit 0 diff --git a/executable_names/slurm.spec b/executable_names/slurm.spec new file mode 100644 index 0000000000000000000000000000000000000000..7a7d2c3377687f0b7e4dbbba3c7da07ce91ac186 --- /dev/null +++ b/executable_names/slurm.spec @@ -0,0 +1,359 @@ +# $Id$ + +# Note that this package is not relocatable + +Name: See META file +Version: See META file +Release: See META file + +Summary: Simple Linux Utility for Resource Management + +License: GPL +Group: System Environment/Base +Source: %{name}-%{version}-%{release}.tgz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release} +URL: http://www.llnl.gov/linux/slurm +%ifos linux +BuildRequires: python openssl-devel >= 0.9.6 +%endif +%ifos aix5.3 +Requires: openssl >= 0.9.6 munge-libs proctrack >= 3 +BuildRequires: openssl-devel >= 0.9.6 munge-libs munge-devel proctrack >= 3 +%endif + +# +# If "--with debug" is set compile with --enable-debug +# and do not strip binaries +# +# (See /usr/share/doc/rpm-*/conditionalbuilds) +# +%if %{?_with_debug:1}%{!?_with_debug:0} + %define _enable_debug --enable-debug +%endif +# +# Never allow rpm to strip binaries as this will break +# parallel debugging capability +# +%define __os_install_post /usr/lib/rpm/brp-compress +%define debug_package %{nil} + +# +# Should unpackaged files in a build root terminate a build? +# +# Note: The default value should be 0 for legacy compatibility. +# This was added due to a bug in Suse Linux. For a good reference, see +# http://slforums.typo3-factory.net/index.php?showtopic=11378 +%define _unpackaged_files_terminate_build 0 + +%{!?_slurm_sysconfdir: %define _slurm_sysconfdir /etc/slurm} +%define _sysconfdir %_slurm_sysconfdir + +%package devel +Summary: Development package for SLURM. +Group: Development/System +Requires: slurm + +%package auth-none +Summary: SLURM auth NULL implementation (no authentication) +Group: System Environment/Base +Requires: slurm + +%package auth-authd +Summary: SLURM auth implementation using Brent Chun's authd +Group: System Environment/Base +Requires: slurm authd + +%package auth-munge +Summary: SLURM auth implementation using Chris Dunlap's Munge +Group: System Environment/Base +Requires: slurm munge + +%package bluegene +Summary: SLURM interfaces to IBM Blue Gene system +Group: System Environment/Base +Requires: slurm + +%package switch-elan +Summary: SLURM switch plugin for Quadrics Elan3 or Elan4. +Group: System Environment/Base +Requires: slurm qsnetlibs + +%package aix-federation +Summary: SLURM interfaces to IBM AIX and Federation switch. +Group: System Environment/Base +Requires: slurm + +%package proctrack-sgi-job +Summary: SLURM process tracking plugin for SGI job containers. +Group: System Environment/Base +Requires: slurm + +%description +SLURM is an open source, fault-tolerant, and highly +scalable cluster management and job scheduling system for Linux clusters +containing up to thousands of nodes. Components include machine status, +partition management, job management, and scheduling modules. + +%description devel +Development package for SLURM. This package includes the header files +and static libraries for the SLURM API. + +%description auth-none +SLURM NULL authentication module + +%description auth-authd +SLURM authentication module for Brent Chun's authd + +%description auth-munge +SLURM authentication module for Chris Dunlap's Munge + +%description bluegene +SLURM plugin interfaces to IBM Blue Gene system + +%description switch-elan +SLURM switch plugin for Quadrics Elan3 or Elan4. + +%description aix-federation +SLURM plugins for IBM AIX and Federation switch. + +%description proctrack-sgi-job +SLURM process tracking plugin for SGI job containers. +(See http://oss.sgi.com/projects/pagg). + +%prep +%setup -n %{name}-%{version}-%{release} + +%build +%configure --program-prefix=%{?_program_prefix:%{_program_prefix}} \ + --sysconfdir=%{_sysconfdir} \ + %{?_enable_debug} \ + %{?with_proctrack} \ + %{?with_ssl} \ + %{?with_munge} \ + %{?with_cflags} + +# +# The following was stolen from the E17 packages: +# Build with make -j if SMP is defined in the current environment. +# +if [ "x$SMP" != "x" ]; then + (make "MAKE=make -k -j $SMP"; exit 0) + make +else + make +fi +############################################################################# + +%install +rm -rf "$RPM_BUILD_ROOT" +mkdir -p "$RPM_BUILD_ROOT" +DESTDIR="$RPM_BUILD_ROOT" make install + +%ifos aix5.3 +mv ${RPM_BUILD_ROOT}%{_bindir}/srun ${RPM_BUILD_ROOT}%{_sbindir} +mv ${RPM_BUILD_ROOT}%{_bindir}/slaunch ${RPM_BUILD_ROOT}%{_sbindir} +%endif + +if [ -d /etc/init.d ]; then + install -D -m755 etc/init.d.slurm $RPM_BUILD_ROOT/etc/init.d/slurm +fi +install -D -m644 etc/slurm.conf.example ${RPM_BUILD_ROOT}%{_sysconfdir}/slurm.conf.example +install -D -m644 etc/bluegene.conf.example ${RPM_BUILD_ROOT}%{_sysconfdir}/bluegene.conf.example +install -D -m644 etc/federation.conf.example ${RPM_BUILD_ROOT}%{_sysconfdir}/federation.conf.example +install -D -m755 etc/slurm.epilog.clean ${RPM_BUILD_ROOT}%{_sysconfdir}/slurm.epilog.clean + +# Delete unpackaged files: +rm -f $RPM_BUILD_ROOT/%{_libdir}/slurm/*.{a,la} + +# Build conditional file list for main package +LIST=./slurm.files +touch $LIST +if [ -d /etc/init.d ]; then + echo "/etc/init.d/slurm" >> $LIST +fi +test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/task_affinity.so && + echo %{_libdir}/slurm/task_affinity.so >> $LIST + +# Build file lists for optional plugin packages +for plugin in auth_munge auth_authd; do + LIST=./${plugin}.files + touch $LIST + test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/${plugin}.so && + echo %{_libdir}/slurm/${plugin}.so > $LIST +done + +LIST=./switch_elan.files +touch $LIST +test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/switch_elan.so && + echo %{_libdir}/slurm/switch_elan.so >> $LIST +test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/proctrack_rms.so && + echo %{_libdir}/slurm/proctrack_rms.so >> $LIST + +LIST=./aix_federation.files +touch $LIST +test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/switch_federation.so && + echo %{_libdir}/slurm/switch_federation.so >> $LIST +test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/proctrack_aix.so && + echo %{_libdir}/slurm/proctrack_aix.so >> $LIST +test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/checkpoint_aix.so && + echo %{_libdir}/slurm/checkpoint_aix.so >> $LIST +echo "%config %{_sysconfdir}/federation.conf.example" >> $LIST + +LIST=./bluegene.files +touch $LIST +test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/select_bluegene.so && + echo "%{_libdir}/slurm/select_bluegene.so" >> $LIST +test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/libsched_if64.so && + echo "%{_libdir}/slurm/libsched_if64.so" >> $LIST +echo "%{_mandir}/man5/bluegene.*" >> $LIST +echo "%{_sbindir}/slurm_epilog" >> $LIST +echo "%{_sbindir}/slurm_prolog" >> $LIST +echo "%{_sbindir}/sfree" >> $LIST +echo "%config %{_sysconfdir}/bluegene.conf.example" >> $LIST + +LIST=./sgi-job.files +touch $LIST +test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/proctrack_sgi_job.so && +echo "%{_libdir}/slurm/proctrack_sgi_job.so" >> $LIST + +############################################################################# + +%clean +rm -rf $RPM_BUILD_ROOT +############################################################################# + +%files -f slurm.files +%defattr(-,root,root,0755) +%doc AUTHORS +%doc NEWS +%doc README +%doc RELEASE_NOTES +%doc DISCLAIMER +%doc COPYING +%doc etc/slurm.conf.example +%doc doc/html +%{_bindir}/* +%{_sbindir}/slurmctld +%{_sbindir}/slurmd +%{_sbindir}/slurmstepd +%ifos aix5.3 +%{_sbindir}/srun +%{_sbindir}/slaunch +%endif +%{_libdir}/*.so* +%{_libdir}/slurm/src/* +%{_mandir}/man1/* +%{_mandir}/man5/slurm.* +%{_mandir}/man5/wiki.* +%{_mandir}/man8/* +%dir %{_sysconfdir} +%dir %{_libdir}/slurm +%{_libdir}/slurm/checkpoint_none.so +%{_libdir}/slurm/jobacct_linux.so +%{_libdir}/slurm/jobacct_none.so +%{_libdir}/slurm/jobcomp_none.so +%{_libdir}/slurm/jobcomp_filetxt.so +%{_libdir}/slurm/jobcomp_script.so +%{_libdir}/slurm/proctrack_pgid.so +%{_libdir}/slurm/proctrack_linuxproc.so +%{_libdir}/slurm/sched_backfill.so +%{_libdir}/slurm/sched_builtin.so +%{_libdir}/slurm/sched_hold.so +%{_libdir}/slurm/sched_gang.so +%{_libdir}/slurm/sched_wiki2.so +%{_libdir}/slurm/select_cons_res.so +%{_libdir}/slurm/select_linear.so +%{_libdir}/slurm/switch_none.so +%{_libdir}/slurm/mpi_none.so +%{_libdir}/slurm/mpi_mpichgm.so +%{_libdir}/slurm/mpi_mvapich.so +%{_libdir}/slurm/mpi_lam.so +%{_libdir}/slurm/task_none.so +%dir %{_libdir}/slurm/src +%config %{_sysconfdir}/slurm.conf.example +%config %{_sysconfdir}/slurm.epilog.clean +############################################################################# + +%files devel +%defattr(-,root,root) +%dir %attr(0755,root,root) %{_prefix}/include/slurm +%{_prefix}/include/slurm/* +%{_libdir}/libpmi.a +%{_libdir}/libpmi.la +%{_libdir}/libslurm.a +%{_libdir}/libslurm.la +%{_mandir}/man3/* +############################################################################# + +%files auth-none +%defattr(-,root,root) +%{_libdir}/slurm/auth_none.so +############################################################################# + +%files -f auth_munge.files auth-munge +%defattr(-,root,root) +############################################################################# + +%files -f auth_authd.files auth-authd +%defattr(-,root,root) +############################################################################# + +%files -f bluegene.files bluegene +%defattr(-,root,root) +############################################################################# + +%files -f switch_elan.files switch-elan +%defattr(-,root,root) +############################################################################# + +%files -f aix_federation.files aix-federation +%defattr(-,root,root) +############################################################################# + +%files -f sgi-job.files proctrack-sgi-job +%defattr(-,root,root) + +%pre +#if [ -x /etc/init.d/slurm ]; then +# if /etc/init.d/slurm status | grep -q running; then +# /etc/init.d/slurm stop +# fi +#fi + +%post +if [ -x /sbin/ldconfig ]; then + /sbin/ldconfig %{_libdir} + /sbin/ldconfig %{_libdir} + if [ $1 = 1 ]; then + [ -x /sbin/chkconfig ] && /sbin/chkconfig --add slurm + fi +fi +if [ ! -f ${RPM_BUILD_ROOT}%{_sysconfdir}/slurm.conf ]; then + echo "You need to build and install a slurm.conf file" + echo "Edit ${RPM_BUILD_ROOT}%{_sysconfdir}/slurm.conf.example and copy it to slurm.conf or" + echo "Build a new one using http://www.llnl.gov/linux/slurm/configurator.html" +fi + + +%preun +if [ "$1" = 0 ]; then + if [ -x /etc/init.d/slurm ]; then + [ -x /sbin/chkconfig ] && /sbin/chkconfig --del slurm + if /etc/init.d/slurm status | grep -q running; then + /etc/init.d/slurm stop + fi + fi +fi + +%postun +if [ "$1" = 0 ]; then + if [ -x /sbin/ldconfig ]; then + /sbin/ldconfig %{_libdir} + fi +fi +############################################################################# + + +%changelog +* Tue Feb 14 2006 Morris Jette +- See the NEWS file for update details diff --git a/executable_names/slurm/pmi.h b/executable_names/slurm/pmi.h new file mode 100644 index 0000000000000000000000000000000000000000..abdc7e7bc9bc021c1f005f131ab0aa4dbb1fbae4 --- /dev/null +++ b/executable_names/slurm/pmi.h @@ -0,0 +1,829 @@ +/*****************************************************************************\ + * pmi.h - Process Management Interface for MPICH2, implemented by SLURM + * See http://www-unix.mcs.anl.gov/mpi/mpich2/ + * + * NOTE: Dynamic Process Management functions (PMI part 2) are not supported + * at this time. Functions required for MPI-1 (PMI part 1) are supported. + ***************************************************************************** + * COPYRIGHT + * + * The following is a notice of limited availability of the code, and + * disclaimer which must be included in the prologue of the code and in all + * source listings of the code. + * + * Copyright Notice + 2002 University of Chicago + * + * Permission is hereby granted to use, reproduce, prepare derivative + * works, and to redistribute to others. This software was authored by: + * + * Argonne National Laboratory Group + * W. Gropp: (630) 252-4318; FAX: (630) 252-5986; e-mail: gropp@mcs.anl.gov + * E. Lusk: (630) 252-7852; FAX: (630) 252-5986; e-mail: lusk@mcs.anl.gov + * Mathematics and Computer Science Division Argonne National Laboratory, + * Argonne IL 60439 + * + * GOVERNMENT LICENSE + * + * Portions of this material resulted from work developed under a U.S. + * Government Contract and are subject to the following license: the + * Government is granted for itself and others acting on its behalf a + * paid-up, nonexclusive, irrevocable worldwide license in this computer + * software to reproduce, prepare derivative works, and perform publicly + * and display publicly. + * + * DISCLAIMER + * + * This computer code material was prepared, in part, as an account of work + * sponsored by an agency of the United States Government. Neither the + * United States, nor the University of Chicago, nor any of their + * employees, makes any warranty express or implied, or assumes any legal + * liability or responsibility for the accuracy, completeness, or + * usefulness of any information, apparatus, product, or process disclosed, + * or represents that its use would not infringe privately owned rights. + * + * MCS Division Argonne National Laboratory + * University of Chicago +\*****************************************************************************/ + +#ifndef PMI_H +#define PMI_H + +/* prototypes for the PMI interface in MPICH2 */ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*D +PMI_CONSTANTS - PMI definitions + +Error Codes: ++ PMI_SUCCESS - operation completed successfully +. PMI_FAIL - operation failed +. PMI_ERR_NOMEM - input buffer not large enough +. PMI_ERR_INIT - PMI not initialized +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_KEY - invalid key argument +. PMI_ERR_INVALID_KEY_LENGTH - invalid key length argument +. PMI_ERR_INVALID_VAL - invalid val argument +. PMI_ERR_INVALID_VAL_LENGTH - invalid val length argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +. PMI_ERR_INVALID_NUM_ARGS - invalid number of arguments +. PMI_ERR_INVALID_ARGS - invalid args argument +. PMI_ERR_INVALID_NUM_PARSED - invalid num_parsed length argument +. PMI_ERR_INVALID_KEYVALP - invalid keyvalp argument +- PMI_ERR_INVALID_SIZE - invalid size argument + +Booleans: ++ PMI_TRUE - true +- PMI_FALSE - false + +D*/ +#define PMI_SUCCESS 0 +#define PMI_FAIL -1 +#define PMI_ERR_INIT 1 +#define PMI_ERR_NOMEM 2 +#define PMI_ERR_INVALID_ARG 3 +#define PMI_ERR_INVALID_KEY 4 +#define PMI_ERR_INVALID_KEY_LENGTH 5 +#define PMI_ERR_INVALID_VAL 6 +#define PMI_ERR_INVALID_VAL_LENGTH 7 +#define PMI_ERR_INVALID_LENGTH 8 +#define PMI_ERR_INVALID_NUM_ARGS 9 +#define PMI_ERR_INVALID_ARGS 10 +#define PMI_ERR_INVALID_NUM_PARSED 11 +#define PMI_ERR_INVALID_KEYVALP 12 +#define PMI_ERR_INVALID_SIZE 13 +#define PMI_ERR_INVALID_KVS 14 + +typedef int PMI_BOOL; +#define PMI_TRUE 1 +#define PMI_FALSE 0 + +/* PMI Group functions */ + +/*@ +PMI_Init - initialize the Process Manager Interface + +Output Parameter: +. spawned - spawned flag + +Return values: ++ PMI_SUCCESS - initialization completed successfully +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - initialization failed + +Notes: +Initialize PMI for this process group. The value of spawned indicates whether +this process was created by 'PMI_Spawn_multiple'. 'spawned' will be 'PMI_TRUE' if +this process group has a parent and 'PMI_FALSE' if it does not. + +@*/ +int PMI_Init( int *spawned ); + +/*@ +PMI_Initialized - check if PMI has been initialized + +Output Parameter: +. initialized - boolean value + +Return values: ++ PMI_SUCCESS - initialized successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to set the variable + +Notes: +On successful output, initialized will either be 'PMI_TRUE' or 'PMI_FALSE'. + ++ PMI_TRUE - initialize has been called. +- PMI_FALSE - initialize has not been called or previously failed. + +@*/ +int PMI_Initialized( PMI_BOOL *initialized ); + +/*@ +PMI_Finalize - finalize the Process Manager Interface + +Return values: ++ PMI_SUCCESS - finalization completed successfully +- PMI_FAIL - finalization failed + +Notes: + Finalize PMI for this process group. + +@*/ +int PMI_Finalize( void ); + +/*@ +PMI_Get_size - obtain the size of the process group + +Output Parameters: +. size - pointer to an integer that receives the size of the process group + +Return values: ++ PMI_SUCCESS - size successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the size + +Notes: +This function returns the size of the process group to which the local process +belongs. + +@*/ +int PMI_Get_size( int *size ); + +/*@ +PMI_Get_rank - obtain the rank of the local process in the process group + +Output Parameters: +. rank - pointer to an integer that receives the rank in the process group + +Return values: ++ PMI_SUCCESS - rank successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the rank + +Notes: +This function returns the rank of the local process in its process group. + +@*/ +int PMI_Get_rank( int *rank ); + +/*@ +PMI_Get_universe_size - obtain the universe size + +Output Parameters: +. size - pointer to an integer that receives the size + +Return values: ++ PMI_SUCCESS - size successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the size + + +@*/ +int PMI_Get_universe_size( int *size ); + +/*@ +PMI_Get_appnum - obtain the application number + +Output parameters: +. appnum - pointer to an integer that receives the appnum + +Return values: ++ PMI_SUCCESS - appnum successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the size + + +@*/ +int PMI_Get_appnum( int *appnum ); + +/*@ +PMI_Publish_name - publish a name + +Input parameters: +. service_name - string representing the service being published +. port - string representing the port on which to contact the service + +Return values: ++ PMI_SUCCESS - port for service successfully published +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to publish service + + +@*/ +int PMI_Publish_name( const char service_name[], const char port[] ); + +/*@ +PMI_Unpublish_name - unpublish a name + +Input parameters: +. service_name - string representing the service being unpublished + +Return values: ++ PMI_SUCCESS - port for service successfully published +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to unpublish service + + +@*/ +int PMI_Unpublish_name( const char service_name[] ); + +/*@ +PMI_Lookup_name - lookup a service by name + +Input parameters: +. service_name - string representing the service being published + +Output parameters: +. port - string representing the port on which to contact the service + +Return values: ++ PMI_SUCCESS - port for service successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to lookup service + + +@*/ +int PMI_Lookup_name( const char service_name[], char port[] ); + +/*@ +PMI_Get_id - obtain the id of the process group + +Input Parameter: +. length - length of the id_str character array + +Output Parameter: +. id_str - character array that receives the id of the process group + +Return values: ++ PMI_SUCCESS - id successfully obtained +. PMI_ERR_INVALID_ARG - invalid rank argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to return the id + +Notes: +This function returns a string that uniquely identifies the process group +that the local process belongs to. The string passed in must be at least +as long as the number returned by 'PMI_Get_id_length_max()'. + +@*/ +int PMI_Get_id( char id_str[], int length ); + +/*@ +PMI_Get_kvs_domain_id - obtain the id of the PMI domain + +Input Parameter: +. length - length of id_str character array + +Output Parameter: +. id_str - character array that receives the id of the PMI domain + +Return values: ++ PMI_SUCCESS - id successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to return the id + +Notes: +This function returns a string that uniquely identifies the PMI domain +where keyval spaces can be shared. The string passed in must be at least +as long as the number returned by 'PMI_Get_id_length_max()'. + +@*/ +int PMI_Get_kvs_domain_id( char id_str[], int length ); + +/*@ +PMI_Get_id_length_max - obtain the maximum length of an id string + +Output Parameters: +. length - the maximum length of an id string + +Return values: ++ PMI_SUCCESS - length successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the maximum length + +Notes: +This function returns the maximum length of a process group id string. + +@*/ +int PMI_Get_id_length_max( int *length ); + +/*@ +PMI_Barrier - barrier across the process group + +Return values: ++ PMI_SUCCESS - barrier successfully finished +- PMI_FAIL - barrier failed + +Notes: +This function is a collective call across all processes in the process group +the local process belongs to. It will not return until all the processes +have called 'PMI_Barrier()'. + +@*/ +int PMI_Barrier( void ); + +/*@ +PMI_Get_clique_size - obtain the number of processes on the local node + +Output Parameters: +. size - pointer to an integer that receives the size of the clique + +Return values: ++ PMI_SUCCESS - size successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the clique size + +Notes: +This function returns the number of processes in the local process group that +are on the local node along with the local process. This is a simple topology +function to distinguish between processes that can communicate through IPC +mechanisms (e.g., shared memory) and other network mechanisms. + +@*/ +int PMI_Get_clique_size( int *size ); + +/*@ +PMI_Get_clique_ranks - get the ranks of the local processes in the process group + +Input Parameters: +. length - length of the ranks array + +Output Parameters: +. ranks - pointer to an array of integers that receive the local ranks + +Return values: ++ PMI_SUCCESS - ranks successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to return the ranks + +Notes: +This function returns the ranks of the processes on the local node. The array +must be at least as large as the size returned by 'PMI_Get_clique_size()'. This +is a simple topology function to distinguish between processes that can +communicate through IPC mechanisms (e.g., shared memory) and other network +mechanisms. + +@*/ +int PMI_Get_clique_ranks( int ranks[], int length ); + +/*@ +PMI_Abort - abort the process group associated with this process + +Input Parameters: ++ exit_code - exit code to be returned by this process +- error_msg - error message to be printed + +Return values: +. none - this function should not return +@*/ +int PMI_Abort(int exit_code, const char error_msg[]); + +/* PMI Keymap functions */ +/*@ +PMI_KVS_Get_my_name - obtain the name of the keyval space the local process group has access to + +Input Parameters: +. length - length of the kvsname character array + +Output Parameters: +. kvsname - a string that receives the keyval space name + +Return values: ++ PMI_SUCCESS - kvsname successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to return the kvsname + +Notes: +This function returns the name of the keyval space that this process and all +other processes in the process group have access to. The output parameter, +kvsname, must be at least as long as the value returned by +'PMI_KVS_Get_name_length_max()'. + +@*/ +int PMI_KVS_Get_my_name( char kvsname[], int length ); + +/*@ +PMI_KVS_Get_name_length_max - obtain the length necessary to store a kvsname + +Output Parameter: +. length - maximum length required to hold a keyval space name + +Return values: ++ PMI_SUCCESS - length successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to set the length + +Notes: +This function returns the string length required to store a keyval space name. + +A routine is used rather than setting a maximum value in 'pmi.h' to allow +different implementations of PMI to be used with the same executable. These +different implementations may allow different maximum lengths; by using a +routine here, we can interface with a variety of implementations of PMI. + +@*/ +int PMI_KVS_Get_name_length_max( int *length ); + +/*@ +PMI_KVS_Get_key_length_max - obtain the length necessary to store a key + +Output Parameter: +. length - maximum length required to hold a key string. + +Return values: ++ PMI_SUCCESS - length successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to set the length + +Notes: +This function returns the string length required to store a key. + +@*/ +int PMI_KVS_Get_key_length_max( int *length ); + +/*@ +PMI_KVS_Get_value_length_max - obtain the length necessary to store a value + +Output Parameter: +. length - maximum length required to hold a keyval space value + +Return values: ++ PMI_SUCCESS - length successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to set the length + +Notes: +This function returns the string length required to store a value from a +keyval space. + +@*/ +int PMI_KVS_Get_value_length_max( int *length ); + +/*@ +PMI_KVS_Create - create a new keyval space + +Input Parameter: +. length - length of the kvsname character array + +Output Parameters: +. kvsname - a string that receives the keyval space name + +Return values: ++ PMI_SUCCESS - keyval space successfully created +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to create a new keyval space + +Notes: +This function creates a new keyval space. Everyone in the same process group +can access this keyval space by the name returned by this function. The +function is not collective. Only one process calls this function. The output +parameter, kvsname, must be at least as long as the value returned by +'PMI_KVS_Get_name_length_max()'. + +@*/ +int PMI_KVS_Create( char kvsname[], int length ); + +/*@ +PMI_KVS_Destroy - destroy keyval space + +Input Parameters: +. kvsname - keyval space name + +Return values: ++ PMI_SUCCESS - keyval space successfully destroyed +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to destroy the keyval space + +Notes: +This function destroys a keyval space created by 'PMI_KVS_Create()'. + +@*/ +int PMI_KVS_Destroy( const char kvsname[] ); + +/*@ +PMI_KVS_Put - put a key/value pair in a keyval space + +Input Parameters: ++ kvsname - keyval space name +. key - key +- value - value + +Return values: ++ PMI_SUCCESS - keyval pair successfully put in keyval space +. PMI_ERR_INVALID_KVS - invalid kvsname argument +. PMI_ERR_INVALID_KEY - invalid key argument +. PMI_ERR_INVALID_VAL - invalid val argument +- PMI_FAIL - put failed + +Notes: +This function puts the key/value pair in the specified keyval space. The +value is not visible to other processes until 'PMI_KVS_Commit()' is called. +The function may complete locally. After 'PMI_KVS_Commit()' is called, the +value may be retrieved by calling 'PMI_KVS_Get()'. All keys put to a keyval +space must be unique to the keyval space. You may not put more than once +with the same key. + +@*/ +int PMI_KVS_Put( const char kvsname[], const char key[], const char value[]); + +/*@ +PMI_KVS_Commit - commit all previous puts to the keyval space + +Input Parameters: +. kvsname - keyval space name + +Return values: ++ PMI_SUCCESS - commit succeeded +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - commit failed + +Notes: +This function commits all previous puts since the last 'PMI_KVS_Commit()' into +the specified keyval space. It is a process local operation. + +@*/ +int PMI_KVS_Commit( const char kvsname[] ); + +/*@ +PMI_KVS_Get - get a key/value pair from a keyval space + +Input Parameters: ++ kvsname - keyval space name +. key - key +- length - length of value character array + +Output Parameters: +. value - value + +Return values: ++ PMI_SUCCESS - get succeeded +. PMI_ERR_INVALID_KVS - invalid kvsname argument +. PMI_ERR_INVALID_KEY - invalid key argument +. PMI_ERR_INVALID_VAL - invalid val argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - get failed + +Notes: +This function gets the value of the specified key in the keyval space. + +@*/ +int PMI_KVS_Get( const char kvsname[], const char key[], char value[], int length); + +/*@ +PMI_KVS_Iter_first - initialize the iterator and get the first value + +Input Parameters: ++ kvsname - keyval space name +. key_len - length of key character array +- val_len - length of val character array + +Output Parameters: ++ key - key +- value - value + +Return values: ++ PMI_SUCCESS - keyval pair successfully retrieved from the keyval space +. PMI_ERR_INVALID_KVS - invalid kvsname argument +. PMI_ERR_INVALID_KEY - invalid key argument +. PMI_ERR_INVALID_KEY_LENGTH - invalid key length argument +. PMI_ERR_INVALID_VAL - invalid val argument +. PMI_ERR_INVALID_VAL_LENGTH - invalid val length argument +- PMI_FAIL - failed to initialize the iterator and get the first keyval pair + +Notes: +This function initializes the iterator for the specified keyval space and +retrieves the first key/val pair. The end of the keyval space is specified +by returning an empty key string. key and val must be at least as long as +the values returned by 'PMI_KVS_Get_key_length_max()' and +'PMI_KVS_Get_value_length_max()'. + +@*/ +int PMI_KVS_Iter_first(const char kvsname[], char key[], int key_len, char val[], int val_len); + +/*@ +PMI_KVS_Iter_next - get the next keyval pair from the keyval space + +Input Parameters: ++ kvsname - keyval space name +. key_len - length of key character array +- val_len - length of val character array + +Output Parameters: ++ key - key +- value - value + +Return values: ++ PMI_SUCCESS - keyval pair successfully retrieved from the keyval space +. PMI_ERR_INVALID_KVS - invalid kvsname argument +. PMI_ERR_INVALID_KEY - invalid key argument +. PMI_ERR_INVALID_KEY_LENGTH - invalid key length argument +. PMI_ERR_INVALID_VAL - invalid val argument +. PMI_ERR_INVALID_VAL_LENGTH - invalid val length argument +- PMI_FAIL - failed to get the next keyval pair + +Notes: +This function retrieves the next keyval pair from the specified keyval space. +'PMI_KVS_Iter_first()' must have been previously called. The end of the keyval +space is specified by returning an empty key string. The output parameters, +key and val, must be at least as long as the values returned by +'PMI_KVS_Get_key_length_max()' and 'PMI_KVS_Get_value_length_max()'. + +@*/ +int PMI_KVS_Iter_next(const char kvsname[], char key[], int key_len, char val[], int val_len); + +/* PMI Process Creation functions */ + +/*S +PMI_keyval_t - keyval structure used by PMI_Spawn_mulitiple + +Fields: ++ key - name of the key +- val - value of the key + +S*/ +typedef struct PMI_keyval_t +{ + char * key; + char * val; +} PMI_keyval_t; + +/*@ +PMI_Spawn_multiple - spawn a new set of processes + +Input Parameters: ++ count - count of commands +. cmds - array of command strings +. argvs - array of argv arrays for each command string +. maxprocs - array of maximum processes to spawn for each command string +. info_keyval_sizes - array giving the number of elements in each of the + 'info_keyval_vectors' +. info_keyval_vectors - array of keyval vector arrays +. preput_keyval_size - Number of elements in 'preput_keyval_vector' +- preput_keyval_vector - array of keyvals to be pre-put in the spawned keyval space + +Output Parameter: +. errors - array of errors for each command + +Return values: ++ PMI_SUCCESS - spawn successful +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - spawn failed + +Notes: +This function spawns a set of processes into a new process group. The 'count' +field refers to the size of the array parameters - 'cmd', 'argvs', 'maxprocs', +'info_keyval_sizes' and 'info_keyval_vectors'. The 'preput_keyval_size' refers +to the size of the 'preput_keyval_vector' array. The 'preput_keyval_vector' +contains keyval pairs that will be put in the keyval space of the newly +created process group before the processes are started. The 'maxprocs' array +specifies the desired number of processes to create for each 'cmd' string. +The actual number of processes may be less than the numbers specified in +maxprocs. The acceptable number of processes spawned may be controlled by +``soft'' keyvals in the info arrays. The ``soft'' option is specified by +mpiexec in the MPI-2 standard. Environment variables may be passed to the +spawned processes through PMI implementation specific 'info_keyval' parameters. +@*/ +int PMI_Spawn_multiple(int count, + const char * cmds[], + const char ** argvs[], + const int maxprocs[], + const int info_keyval_sizesp[], + const PMI_keyval_t * info_keyval_vectors[], + int preput_keyval_size, + const PMI_keyval_t preput_keyval_vector[], + int errors[]); + + +/*@ +PMI_Parse_option - create keyval structures from a single command line argument + +Input Parameters: ++ num_args - length of args array +- args - array of command line arguments starting with the argument to be parsed + +Output Parameters: ++ num_parsed - number of elements of the argument array parsed +. keyvalp - pointer to an array of keyvals +- size - size of the allocated array + +Return values: ++ PMI_SUCCESS - success +. PMI_ERR_INVALID_NUM_ARGS - invalid number of arguments +. PMI_ERR_INVALID_ARGS - invalid args argument +. PMI_ERR_INVALID_NUM_PARSED - invalid num_parsed length argument +. PMI_ERR_INVALID_KEYVALP - invalid keyvalp argument +. PMI_ERR_INVALID_SIZE - invalid size argument +- PMI_FAIL - fail + +Notes: +This function removes one PMI specific argument from the command line and +creates the corresponding 'PMI_keyval_t' structure for it. It returns +an array and size to the caller. The array must be freed by 'PMI_Free_keyvals()'. +If the first element of the args array is not a PMI specific argument, the function +returns success and sets num_parsed to zero. If there are multiple PMI specific +arguments in the args array, this function may parse more than one argument as long +as the options are contiguous in the args array. + +@*/ +int PMI_Parse_option(int num_args, char *args[], int *num_parsed, PMI_keyval_t **keyvalp, int *size); + +/*@ +PMI_Args_to_keyval - create keyval structures from command line arguments + +Input Parameters: ++ argcp - pointer to argc +- argvp - pointer to argv + +Output Parameters: ++ keyvalp - pointer to an array of keyvals +- size - size of the allocated array + +Return values: ++ PMI_SUCCESS - success +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - fail + +Notes: +This function removes PMI specific arguments from the command line and +creates the corresponding 'PMI_keyval_t' structures for them. It returns +an array and size to the caller that can then be passed to 'PMI_Spawn_multiple()'. +The array can be freed by 'PMI_Free_keyvals()'. The routine 'free()' should +not be used to free this array as there is no requirement that the array be +allocated with 'malloc()'. + +@*/ +int PMI_Args_to_keyval(int *argcp, char *((*argvp)[]), PMI_keyval_t **keyvalp, int *size); + +/*@ +PMI_Free_keyvals - free the keyval structures created by PMI_Args_to_keyval + +Input Parameters: ++ keyvalp - array of keyvals +- size - size of the array + +Return values: ++ PMI_SUCCESS - success +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - fail + +Notes: + This function frees the data returned by 'PMI_Args_to_keyval' and 'PMI_Parse_option'. + Using this routine instead of 'free' allows the PMI package to track + allocation of storage or to use interal storage as it sees fit. +@*/ +int PMI_Free_keyvals(PMI_keyval_t keyvalp[], int size); + +/*@ +PMI_Get_options - get a string of command line argument descriptions that may be printed to the user + +Input Parameters: +. length - length of str + +Output Parameters: ++ str - description string +- length - length of string or necessary length if input is not large enough + +Return values: ++ PMI_SUCCESS - success +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +. PMI_ERR_NOMEM - input length too small +- PMI_FAIL - fail + +Notes: + This function returns the command line options specific to the pmi implementation +@*/ +int PMI_Get_options(char *str, int *length); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/executable_names/slurm/slurm.h.in b/executable_names/slurm/slurm.h.in new file mode 100644 index 0000000000000000000000000000000000000000..db1b8eca991d63759e06c3a314f6494dec4a1de5 --- /dev/null +++ b/executable_names/slurm/slurm.h.in @@ -0,0 +1,1777 @@ +/*****************************************************************************\ + * slurm.h - Definitions for all of the SLURM RPCs + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette , + * Joey Ekstrom et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_H +#define _SLURM_H + +/* BEGIN_C_DECLS should be used at the beginning of your declarations, + so that C++ compilers don't mangle their names. Use _END_C_DECLS at + the end of C declarations. */ +#undef BEGIN_C_DECLS +#undef END_C_DECLS +#ifdef __cplusplus +# define BEGIN_C_DECLS extern "C" { +# define END_C_DECLS } +#else +# define BEGIN_C_DECLS /* empty */ +# define END_C_DECLS /* empty */ +#endif + +/* PARAMS is a macro used to wrap function prototypes, so that compilers + that don't understand ANSI C prototypes still work, and ANSI C + compilers can issue warnings about type mismatches. */ +#undef PARAMS +#if defined (__STDC__) || defined (_AIX) \ + || (defined (__mips) && defined (_SYSTYPE_SVR4)) \ + || defined(WIN32) || defined(__cplusplus) +# define PARAMS(protos) protos +#else +# define PARAMS(protos) () +#endif + +/* Define to 1 if you have Blue Gene system support. */ +#undef HAVE_BG + +/* Define to 1 if you have the `elan3' library (-lelan3). */ +#undef HAVE_ELAN + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +BEGIN_C_DECLS + +#include + +#if HAVE_STDINT_H +# include /* for uint16_t, uint32_t definitions */ +#endif +#if HAVE_INTTYPES_H +# include /* for uint16_t, uint32_t definitions */ +#endif +#include /* for FILE definitions */ +#include /* for time_t definitions */ +#include + +/* Define slurm_addr below to avoid including extraneous slurm headers */ +#ifdef HAVE_SYS_SOCKET_H +# ifndef __slurm_addr_defined +# include +# define __slurm_addr_defined + typedef struct sockaddr_in slurm_addr ; +# endif +#endif + +#ifndef __slurm_cred_t_defined +# define __slurm_cred_t_defined + typedef struct slurm_job_credential * slurm_cred_t; +#endif + +/* Define switch_jobinfo_t below to avoid including extraneous slurm headers */ +#ifndef __switch_jobinfo_t_defined +# define __switch_jobinfo_t_defined + typedef struct switch_jobinfo *switch_jobinfo_t; /* opaque data type */ +#endif + +/* Define select_jobinfo_t below to avoid including extraneous slurm headers */ +#ifndef __select_jobinfo_t_defined +# define __select_jobinfo_t_defined + typedef struct select_jobinfo *select_jobinfo_t; /* opaque data type */ +#endif + +/* Define jobacctinfo_t below to avoid including extraneous slurm headers */ +#ifndef __jobacctinfo_t_defined +# define __jobacctinfo_t_defined + typedef struct jobacctinfo *jobacctinfo_t; /* opaque data type */ +#endif + +/*****************************************************************************\ + * DEFINITIONS FOR VERSION MANAGEMENT +\*****************************************************************************/ + +#define SLURM_VERSION_NUM(a,b,c) (((a) << 16) + ((b) << 8) + (c)) +#define SLURM_VERSION_MAJOR(a) (((a) >> 16) & 0xff) +#define SLURM_VERSION_MINOR(a) (((a) >> 8) & 0xff) +#define SLURM_VERSION_MICRO(a) ((a) & 0xff) + +/* Define the API's version. Update in META as needed. + * Also defined in config.h. + * High-order byte is major version. Update when existing APIs change. + * Middle byte is minor version. Update when new functions are added. + * Low-order byte is micro version. Update on patches and bug fixes. */ +#ifndef SLURM_API_VERSION +#undef SLURM_API_VERSION +#endif + +/*****************************************************************************\ + * DEFINITIONS FOR INPUT VALUES +\*****************************************************************************/ + +/* INFINITE is used to identify unlimited configurations, */ +/* eg. the maximum count of nodes any job may use in some partition */ +#define INFINITE (0xffffffff) +#define NO_VAL (0xfffffffe) +#define MAX_TASKS_PER_NODE 64 + +/* Job step ID of batch scripts */ +#define SLURM_BATCH_SCRIPT (0xfffffffe) + +/* last entry must be JOB_END, keep in sync with job_state_string and + * job_state_string_compact, if a job is in the process of de- + * allocating nodes, its final state is ORed with JOB_COMPLETING */ +enum job_states { + JOB_PENDING, /* queued waiting for initiation */ + JOB_RUNNING, /* allocated resources and executing */ + JOB_SUSPENDED, /* allocated resources, execution suspended */ + JOB_COMPLETE, /* completed execution successfully */ + JOB_CANCELLED, /* cancelled by user */ + JOB_FAILED, /* completed execution unsuccessfully */ + JOB_TIMEOUT, /* terminated on reaching time limit */ + JOB_NODE_FAIL, /* terminated on node failure */ + JOB_END /* not a real state, last entry in table */ +}; +#define JOB_COMPLETING (0x8000) + +#define MAIL_JOB_BEGIN 0x0001 /* notify when job begins */ +#define MAIL_JOB_END 0x0002 /* notify when job ends */ +#define MAIL_JOB_FAIL 0x0004 /* notify if job fails */ + +#define NICE_OFFSET 10000 /* offset for job's nice value */ + +/* Reason for job to be pending rather than executing. If multiple reasons + * exists, only one is given for the sake of system efficiency */ +enum job_wait_reason { + WAIT_NO_REASON = 0, /* not set or job not pending */ + WAIT_PRIORITY, /* higher priority jobs exist */ + WAIT_DEPENDENCY, /* depedent job has not completed */ + WAIT_RESOURCES, /* required resources not available */ + WAIT_PART_NODE_LIMIT, /* request exceeds partition node limit */ + WAIT_PART_TIME_LIMIT, /* request exceeds partition time limit */ + WAIT_PART_STATE, /* requested partition is down */ + WAIT_HELD, /* job is held, priority==0 */ + WAIT_TIME /* job waiting for specific begin time */ +}; + +enum job_acct_types { + JOB_START, + JOB_STEP, + JOB_SUSPEND, + JOB_TERMINATED +}; + +#ifdef HAVE_BG +# define SYSTEM_DIMENSIONS 3 /* for job geometry */ +#else +# define SYSTEM_DIMENSIONS 0 /* for job geometry */ +#endif + +enum connection_type { + SELECT_MESH, /* nodes wired in mesh */ + SELECT_TORUS, /* nodes wired in torus */ + SELECT_NAV, /* nodes wired in torus else mesh */ + SELECT_SMALL /* nodes in a small partition */ +}; + +enum node_use_type { + SELECT_COPROCESSOR_MODE,/* use extra processor for communications */ + SELECT_VIRTUAL_NODE_MODE,/* application uses both processors */ + SELECT_NAV_MODE /* either mode is acceptable */ +}; + +enum select_data_type { + SELECT_DATA_START, /* data-> uint16_t start[SYSTEM_DIMENSIONS] */ + SELECT_DATA_GEOMETRY, /* data-> uint16_t geometry[SYSTEM_DIMENSIONS] */ + SELECT_DATA_ROTATE, /* data-> uint16_t rotate */ + SELECT_DATA_NODE_USE, /* data-> uint16_t node_use */ + SELECT_DATA_CONN_TYPE, /* data-> uint16_t connection_type */ + SELECT_DATA_BLOCK_ID, /* data-> char bg_block_id */ + SELECT_DATA_QUARTER, /* data-> uint16_t quarter */ + SELECT_DATA_NODECARD, /* data-> uint16_t nodecard */ + SELECT_DATA_NODE_CNT, /* data-> uint32_t node_cnt */ + SELECT_DATA_ALTERED, /* data-> uint16_t altered */ + SELECT_DATA_MAX_PROCS /* data-> uint32_t max_procs */ +}; + +enum select_print_mode { + SELECT_PRINT_HEAD, /* Print just the header */ + SELECT_PRINT_DATA, /* Print just the data */ + SELECT_PRINT_MIXED, /* Print "field=value" */ + SELECT_PRINT_BG_ID /* Print just the BG_ID */ +}; + +enum select_node_cnt { + SELECT_GET_NODE_SCALING, /* Give scaling factor for node count */ + SELECT_APPLY_NODE_MIN_OFFSET, /* Apply min offset to variable */ + SELECT_APPLY_NODE_MAX_OFFSET, /* Apply max offset to variable */ + SELECT_SET_NODE_CNT /* Set altered node cnt */ +}; + +/* jobacct data types */ +enum jobacct_data_type { + JOBACCT_DATA_TOTAL, /* data-> jobacctinfo_t */ + JOBACCT_DATA_PIPE, /* data-> file descriptor */ + JOBACCT_DATA_RUSAGE, /* data-> struct rusage */ + JOBACCT_DATA_MAX_VSIZE, /* data-> uint32_t vsize */ + JOBACCT_DATA_MAX_VSIZE_ID, /* data-> jobacct_id_t vsize */ + JOBACCT_DATA_TOT_VSIZE, /* data-> uint32_t vsize */ + JOBACCT_DATA_MAX_RSS, /* data-> uint32_t psize */ + JOBACCT_DATA_MAX_RSS_ID, /* data-> jobacct_id_t psize */ + JOBACCT_DATA_TOT_RSS, /* data-> uint32_t psize */ + JOBACCT_DATA_MAX_PAGES, /* data-> uint32_t psize */ + JOBACCT_DATA_MAX_PAGES_ID, /* data-> jobacct_id_t psize */ + JOBACCT_DATA_TOT_PAGES, /* data-> uint32_t psize */ + JOBACCT_DATA_MIN_CPU, /* data-> uint32_t psize */ + JOBACCT_DATA_MIN_CPU_ID, /* data-> jobacct_id_t psize */ + JOBACCT_DATA_TOT_CPU /* data-> uint32_t psize */ +}; + +/* Possible task distributions across the nodes */ +typedef enum task_dist_states { + SLURM_DIST_CYCLIC, /* distribute tasks 1 per node, round robin */ + SLURM_DIST_BLOCK, /* distribute tasks filling node by node */ + SLURM_DIST_ARBITRARY, /* arbitrary task distribution */ + SLURM_DIST_PLANE, /* distribute tasks by filling up + planes of lllp first and then by + going across the nodes See + documentation for more + information */ + SLURM_DIST_CYCLIC_CYCLIC,/* distribute tasks 1 per node, + round robin, same for lowest + level of logical processor (lllp) */ + SLURM_DIST_CYCLIC_BLOCK, /* cyclic for node and block for lllp */ + SLURM_DIST_BLOCK_CYCLIC, /* block for node and cyclic for lllp */ + SLURM_DIST_BLOCK_BLOCK, /* block for node and block for lllp */ + SLURM_NO_LLLP_DIST, /* No distribution specified for lllp */ + SLURM_DIST_UNKNOWN /* unknown dist */ +} task_dist_states_t; + +typedef enum cpu_bind_type { /* cpu binding type from --cpu_bind=... */ + /* the following auto-binding flags are mutually exclusive */ + CPU_BIND_TO_THREADS= 0x01, /* =threads */ + CPU_BIND_TO_CORES = 0x02, /* =cores */ + CPU_BIND_TO_SOCKETS= 0x04, /* =sockets */ + /* verbose can be set with any other flag */ + CPU_BIND_VERBOSE = 0x08, /* =v, */ + /* the following manual binding flags are mutually exclusive */ + /* CPU_BIND_NONE needs to be the first in this sub-list */ + CPU_BIND_NONE = 0x10, /* =no */ + CPU_BIND_RANK = 0x20, /* =rank */ + CPU_BIND_MAP = 0x40, /* =map_cpu: */ + CPU_BIND_MASK = 0x80 /* =mask_cpu: */ +} cpu_bind_type_t; + +typedef enum mem_bind_type { /* memory binding type from --mem_bind=... */ + /* verbose can be set with any other flag */ + MEM_BIND_VERBOSE= 0x01, /* =v, */ + /* the following manual binding flags are mutually exclusive */ + /* MEM_BIND_NONE needs to be the first in this sub-list */ + MEM_BIND_NONE = 0x02, /* =no */ + MEM_BIND_RANK = 0x04, /* =rank */ + MEM_BIND_MAP = 0x08, /* =map_mem: */ + MEM_BIND_MASK = 0x10, /* =mask_mem: */ + MEM_BIND_LOCAL = 0x20 /* =local */ +} mem_bind_type_t; + +/* The last entry in node_states must be STATE_END, keep in sync with + * node_state_string. values may be ORed with NODE_STATE_FLAGS below. + * Node states typically alternate between NODE_STATE_IDLE and + * NODE_STATE_ALLOCATED. The NODE_STATE_COMPLETING flag will be set + * when jobs are in the process of terminating. */ +enum node_states { + NODE_STATE_UNKNOWN, /* node's initial state, unknown */ + NODE_STATE_DOWN, /* node in non-usable state */ + NODE_STATE_IDLE, /* node idle and available for use */ + NODE_STATE_ALLOCATED, /* node has been allocated to a job */ + NODE_STATE_END /* last entry in table */ +}; +#define NODE_STATE_BASE 0x00ff +#define NODE_STATE_FLAGS 0xff00 +#define NODE_RESUME 0x0100 /* Restore a DRAINED, DRAINING, or + * DOWN node to service (e.g. IDLE or + * ALLOCATED). Used in + * slurm_update_node() request */ +#define NODE_STATE_DRAIN 0x0200 /* node not be be allocated work */ +#define NODE_STATE_COMPLETING 0x0400 /* node is completing allocated job */ +#define NODE_STATE_NO_RESPOND 0x0800 /* node is not responding */ + +/* used to define the size of the credential.signature size + * used to define the key size of the io_stream_header_t + */ +#define SLURM_SSL_SIGNATURE_LENGTH 128 + +/* Used as show_flags for slurm_get_ and slurm_load_ function calls. + * Values can be can be ORed */ +#define SHOW_ALL 1 /* Show info for "hidden" partitions */ + +/* Define keys for ctx_key argument of slurm_step_ctx_get() and + * slurm_step_ctx_set() */ +enum ctx_keys { + SLURM_STEP_CTX_STEPID, /* get the created job step id */ + SLURM_STEP_CTX_TASKS, /* get array of task count on each node */ + SLURM_STEP_CTX_TID, /* get array of task IDs for specified node */ + SLURM_STEP_CTX_RESP, /* get job step create response message */ + SLURM_STEP_CTX_CRED, + SLURM_STEP_CTX_SWITCH_JOB, + SLURM_STEP_CTX_NUM_HOSTS, + SLURM_STEP_CTX_HOST, + SLURM_STEP_CTX_JOBID, + SLURM_STEP_CTX_USER_MANAGED_SOCKETS +}; + +typedef enum select_type_plugin_info { + SELECT_TYPE_INFO_NONE = 0, /* Initiatlization value */ + CR_CPU, /* Resources are shared down to the level of + * logical processors which can be socket, + * core, or thread depending on the system.*/ + CR_SOCKET, /* Resources are shared down to the socket level. + * Jobs will not be co-allocated within a sockets */ + CR_CORE, /* Resources are shared down to the core level + * Jobs will not be co-allocated within a core */ + CR_MEMORY, /* Memory as consumable resources, Memory is not + * over-commited when selected as a CR. Jobs could + * be co-allocated within cores */ + CR_SOCKET_MEMORY, /* Socket and Memory are CRs */ + CR_CORE_MEMORY, /* Core and Memory are CRs */ + CR_CPU_MEMORY, /* CPU and Memory are CRs */ +} select_type_plugin_info_t ; + +/*****************************************************************************\ + * PROTOCOL DATA STRUCTURE DEFINITIONS +\*****************************************************************************/ + +typedef struct job_descriptor { /* For submit, allocate, and update requests */ + uint16_t contiguous; /* 1 if job requires contiguous nodes, + * 0 otherwise,default=0 */ + uint16_t kill_on_node_fail; /* 1 if node failure to kill job, + * 0 otherwise,default=1 */ + char **environment; /* environment variables to set for job, + * name=value pairs, one per line */ + uint16_t env_size; /* element count in environment */ + char *features; /* comma separated list of required features, + * default NONE */ + uint16_t immediate; /* 1 if allocate to run or fail immediately, + * 0 if to be queued awaiting resources */ + uint32_t job_id; /* job ID, default set by SLURM */ + char *name; /* name of the job, default "" */ + /* job constraints: */ + uint32_t job_min_procs; /* minimum processors per node, default=0 */ + uint32_t job_min_sockets; /* minimum sockets per node, default=0 */ + uint32_t job_min_cores; /* minimum cores per processor, default=0 */ + uint32_t job_min_threads; /* minimum threads per core, default=0 */ + uint32_t job_min_memory; /* minimum real memory per node, default=0 */ + uint32_t job_max_memory; /* maximum real memory per node, default=0 */ + uint32_t job_min_tmp_disk; /* minimum tmp disk per node, default=0 */ + char *partition; /* name of requested partition, + * default in SLURM config */ + uint32_t priority; /* relative priority of the job, + * explicitly set only for user root, + * 0 == held (don't initiate) */ + char *req_nodes; /* comma separated list of required nodes + * default NONE */ + char *exc_nodes; /* comma separated list of nodes excluded + * from job's allocation, default NONE */ + uint16_t shared; /* 1 if job can share nodes with other jobs, + * 0 if job needs exclusive access to the node, + * or NO_VAL to accept the system default. */ + uint32_t time_limit; /* maximum run time in minutes, default is + * partition limit */ + uint32_t num_procs; /* total count of processors required, + * default=0 */ + uint32_t min_nodes; /* minimum number of nodes required by job, + * default=0 */ + uint32_t max_nodes; /* maximum number of nodes usable by job, + * default=0 */ + uint32_t min_sockets; /* minimum number of sockets per node required + * by job, default=0 */ + uint32_t max_sockets; /* maximum number of sockets per node usable + * by job, default=unlimited (NO_VAL) */ + uint32_t min_cores; /* minimum number of cores per cpu required + * by job, default=0 */ + uint32_t max_cores; /* maximum number of cores per cpu usable + * by job, default=unlimited (NO_VAL) */ + uint32_t min_threads; /* minimum number of threads per core required + * by job, default=0 */ + uint32_t max_threads; /* maximum number of threads per core usable + * by job, default=unlimited (NO_VAL) */ + uint16_t cpus_per_task; /* number of processors required for each task */ + uint16_t ntasks_per_node;/* number of tasks to invoke on each node */ + uint16_t ntasks_per_socket;/* number of tasks to invoke on each socket */ + uint16_t ntasks_per_core;/* number of tasks to invoke on each core */ + char *script; /* the actual job script, default NONE */ + char **argv; /* arguments to the script */ + uint16_t argc; /* number of arguments to the script */ + char *err; /* pathname of stderr */ + char *in; /* pathname of stdin */ + char *out; /* pathname of stdout */ + uint32_t user_id; /* set only if different from current UID, + * can only be explicitly set by user root */ + uint32_t group_id; /* group to assume, if run as root. */ + char *work_dir; /* pathname of working directory */ + char *alloc_node; /* node making resource allocation request + * NOTE: Normally set by slurm_submit* or + * slurm_allocate* function */ + uint32_t alloc_sid; /* local sid making resource allocation request + * NOTE: Normally set by slurm_submit* or + * slurm_allocate* function */ + + /* If the requested allocation is not immediately available, + * The controller sends the RESPONSE_RESOURCE_ALLOCATION message to + * the address designated by the alloc_hostname and alloc_port. + * All other messages (SRUN_PING, SRUN_TIMEOUT, etc.) are sent to + * the address designated by other_hostname/other_port. + */ + char *alloc_resp_hostname; + uint16_t alloc_resp_port; + char *other_hostname; + uint16_t other_port; + + uint32_t dependency; /* defer until specified job completes */ + uint16_t overcommit; /* over subscribe resources, for batch only */ + uint32_t num_tasks; /* number of tasks to be started, for batch only */ + uint16_t nice; /* requested priority change, + * NICE_OFFSET == no change */ + char *account; /* charge to specified account */ + char *network; /* network use spec */ + char *comment; /* arbitrary comment (used by Moab scheduler) */ + uint16_t task_dist; /* see enum task_dist_state */ + uint32_t plane_size; /* plane size when task_dist = + SLURM_DIST_PLANE */ + time_t begin_time; /* delay initiation until this time */ + uint16_t mail_type; /* see MAIL_JOB_ definitions above */ + char *mail_user; /* user to receive notification */ + uint16_t no_requeue; /* disable job requeue option */ +/* + * The following parameters are only meaningful on a Blue Gene + * system at present. Some will be of value on other system. Don't remove these + * they are needed for LCRM and others that can't talk to the opaque data type + * select_jobinfo. + */ +#if SYSTEM_DIMENSIONS + uint16_t geometry[SYSTEM_DIMENSIONS]; /* node count in various + * dimensions, e.g. X, Y, and Z */ +#endif + uint16_t conn_type; /* see enum connection_type */ + uint16_t rotate; /* permit geometry rotation if set */ +/* End of Blue Gene specific values */ + + select_jobinfo_t select_jobinfo; /* opaque data type, + * SLURM internal use only */ +} job_desc_msg_t; + +typedef struct job_info { + uint32_t job_id; /* job ID */ + char *name; /* name of the job */ + uint16_t batch_flag; /* 1 if batch: queued job with script */ + uint32_t alloc_sid; /* local sid making resource alloc */ + char *alloc_node; /* local node making resource alloc */ + uint32_t user_id; /* user the job runs as */ + uint32_t group_id; /* group job sumitted as */ + uint16_t job_state; /* state of the job, see enum job_states */ + uint32_t time_limit; /* maximum run time in minutes or INFINITE */ + time_t submit_time; /* time of job submission */ + time_t start_time; /* time execution begins, actual or expected */ + time_t end_time; /* time of termination, actual or expected */ + time_t suspend_time; /* time job last suspended or resumed */ + time_t pre_sus_time; /* time job ran prior to last suspend */ + uint32_t priority; /* relative priority of the job, + * 0=held, 1=required nodes DOWN/DRAINED */ + char *nodes; /* list of nodes allocated to job */ + int *node_inx; /* list index pairs into node_table for *nodes: + * start_range_1, end_range_1, + * start_range_2, .., -1 */ + char *partition; /* name of assigned partition */ + uint16_t num_cpu_groups;/* elements in below cpu arrays */ + uint32_t *cpus_per_node;/* cpus per node */ + uint32_t *cpu_count_reps;/* how many nodes have same cpu count */ + uint32_t num_procs; /* number of processors required by job */ + uint32_t num_nodes; /* minimum number of nodes required by job */ + uint32_t max_nodes; /* maximum number of nodes usable by job */ + uint32_t min_sockets; /* minimum number of sockets per node */ + uint32_t max_sockets; /* maximum number of sockets per node */ + uint32_t min_cores; /* minimum number of cores per cpu */ + uint32_t max_cores; /* maximum number of cores per cpu */ + uint32_t min_threads; /* minimum number of threads per core */ + uint32_t max_threads; /* maximum number of threads per core */ + uint16_t shared; /* 1 if job can share nodes with other jobs */ + uint16_t contiguous; /* 1 if job requires contiguous nodes */ + uint16_t cpus_per_task; /* number of processors required for each task */ + uint16_t ntasks_per_node;/* number of tasks to invoke on each node */ + uint16_t ntasks_per_socket;/* number of tasks to invoke on each socket */ + uint16_t ntasks_per_core;/* number of tasks to invoke on each core */ + /* job constraints: */ + uint32_t job_min_procs; /* minimum processors per node, default=0 */ + uint32_t job_min_sockets; /* minimum sockets per node, default=0 */ + uint32_t job_min_cores; /* minimum cores per processor, default=0 */ + uint32_t job_min_threads; /* minimum threads per core, default=0 */ + uint32_t job_min_memory; /* minimum real memory per node, default=0 */ + uint32_t job_max_memory; /* maximum real memory per node, default=0 */ + uint32_t job_min_tmp_disk; /* minimum tmp disk per node, default=0 */ + char *req_nodes; /* comma separated list of required nodes */ + int *req_node_inx; /* required list index pairs into node_table: + * start_range_1, end_range_1, + * start_range_2, .., -1 */ + char *exc_nodes; /* comma separated list of excluded nodes */ + int *exc_node_inx; /* excluded list index pairs into node_table: + * start_range_1, end_range_1, + * start_range_2, .., -1 */ + char *features; /* comma separated list of required features */ + uint32_t dependency; /* defer until specified job completes */ + uint32_t exit_code; /* exit code for job (status from wait call) */ + char *account; /* charge to specified account */ + uint16_t wait_reason; /* reason job still pending, see + * slurm.h:enum job_wait_reason */ + char *network; /* network specification */ + char *comment; /* arbitrary comment (used by Moab scheduler) */ + select_jobinfo_t select_jobinfo; /* opaque data type, + * process using select_g_get_jobinfo() */ +} job_info_t; + +typedef struct job_info_msg { + time_t last_update; /* time of latest info */ + uint32_t record_count; /* number of records */ + job_info_t *job_array; /* the job records */ +} job_info_msg_t; + +typedef struct job_step_specs { + uint32_t job_id; /* job ID */ + uint32_t user_id; /* user the job runs as */ + uint32_t node_count; /* count of required nodes */ + uint32_t cpu_count; /* count of required processors */ + uint32_t num_tasks; /* number of tasks required */ + uint16_t relative; /* first node to use of job's allocation */ + uint16_t task_dist; /* see enum task_dist_state */ + uint32_t plane_size; /* plane size when task_dist = + SLURM_DIST_PLANE */ + uint16_t port; /* port to contact initiating srun */ + char *host; /* host to contact initiating srun */ + char *node_list; /* list of required nodes */ + char *network; /* network use spec */ + char *name; /* name of the job step, default "" */ + uint8_t overcommit; /* flag, 1 to allow overcommit of processors, + 0 to disallow overcommit. */ +} job_step_create_request_msg_t; + +typedef struct slurm_step_layout { + uint16_t node_cnt; /* node count */ + uint32_t task_cnt; /* total number of tasks in the step */ + char *node_list; /* list of nodes in step */ + /* Array of length "node_cnt". Each element of the array + is the number of tasks assigned to the corresponding node */ + uint32_t *tasks; + + /* Array (of length "node_cnt") of task ID arrays. The length + of each subarray is designated by the corresponding value in + the tasks array. */ + uint32_t **tids; /* host id => task id mapping */ + + uint16_t task_dist; /* see enum task_dist_state */ + uint32_t plane_size; /* plane size when task_dist = + SLURM_DIST_PLANE */ +} slurm_step_layout_t; + +typedef struct job_step_create_response_msg { + uint32_t job_step_id; /* assigned job step id */ + slurm_step_layout_t *step_layout; /* information about how the + step is laid out */ + slurm_cred_t cred; /* slurm job credential */ + switch_jobinfo_t switch_job; /* switch context, opaque + data structure */ +} job_step_create_response_msg_t; + +typedef struct slurm_step_io_fds { + struct { + int fd; + uint32_t taskid; + uint32_t nodeid; + } in, out, err; +} slurm_step_io_fds_t; + +#define SLURM_STEP_IO_FDS_INITIALIZER {{0, (uint32_t)-1, (uint32_t)-1},\ + {1, (uint32_t)-1, (uint32_t)-1},\ + {2, (uint32_t)-1, (uint32_t)-1}} + +typedef struct launch_tasks_response_msg { + uint32_t return_code; + char *node_name; + uint32_t srun_node_id; + uint32_t count_of_pids; + uint32_t *local_pids; + uint32_t *task_ids; /* array of length count_of_pids */ +} launch_tasks_response_msg_t; + +typedef struct task_ext_msg { + uint32_t num_tasks; + uint32_t *task_id_list; + uint32_t return_code; +} task_exit_msg_t; + +typedef struct { + uint16_t argc; + char **argv; + uint16_t envc; + char **env; + char *cwd; + bool user_managed_io; + + /* START - only used if user_managed_io is false */ + bool buffered_stdio; + bool labelio; + char *remote_output_filename; + char *remote_error_filename; + char *remote_input_filename; + slurm_step_io_fds_t local_fds; + /* END - only used if user_managed_io is false */ + + uint32_t gid; + bool multi_prog; + uint32_t slurmd_debug; /* remote slurmd debug level */ + bool parallel_debug; + char *task_prolog; + char *task_epilog; + uint16_t cpu_bind_type; /* use cpu_bind_type_t */ + char *cpu_bind; + uint16_t mem_bind_type; /* use mem_bind_type_t */ + char *mem_bind; +} slurm_job_step_launch_t; + +typedef struct { + void (*task_start)(launch_tasks_response_msg_t *); + void (*task_finish)(task_exit_msg_t *); +} slurm_job_step_launch_callbacks_t; + + +typedef struct { + uint32_t job_id; /* job ID */ + uint16_t step_id; /* step ID */ + uint32_t user_id; /* user the job runs as */ + uint32_t num_tasks; /* number of tasks */ + time_t start_time; /* step start time */ + time_t run_time; /* net run time (factor out time suspended) */ + char *partition; /* name of assigned partition */ + char *nodes; /* list of nodes allocated to job_step */ + char *name; /* name of job step */ + char *network; /* network specs for job step */ + int *node_inx; /* list index pairs into node_table for *nodes: + * start_range_1, end_range_1, + * start_range_2, .., -1 */ +} job_step_info_t; + +typedef struct job_step_info_response_msg { + time_t last_update; /* time of latest info */ + uint32_t job_step_count; /* number of records */ + job_step_info_t *job_steps; /* the job step records */ +} job_step_info_response_msg_t; + +typedef struct node_info { + char *name; /* node name */ + uint16_t node_state; /* see enum node_states */ + uint16_t cpus; /* configured count of cpus running on + * the node */ + uint16_t sockets; /* number of sockets per node */ + uint16_t cores; /* number of cores per CPU */ + uint16_t threads; /* number of threads per core */ + uint32_t real_memory; /* configured MB of real memory on the node */ + uint32_t tmp_disk; /* configured MB of total disk in TMP_FS */ + uint32_t weight; /* arbitrary priority of node for scheduling */ + char *features; /* arbitrary list of features for node */ + char *reason; /* reason for node being DOWN or DRAINING */ +} node_info_t; + +typedef struct node_info_msg { + time_t last_update; /* time of latest info */ + uint32_t record_count; /* number of records */ + node_info_t *node_array; /* the node records */ +} node_info_msg_t; + +typedef struct job_alloc_info_msg { + uint32_t job_id; /* job ID */ +} job_alloc_info_msg_t; + +typedef struct partition_info { + char *name; /* name of the partition */ + uint32_t max_time; /* minutes or INFINITE */ + uint32_t max_nodes; /* per job or INFINITE */ + uint32_t min_nodes; /* per job */ + uint32_t total_nodes; /* total number of nodes in the partition */ + uint32_t total_cpus; /* total number of cpus in the partition */ + uint32_t node_scaling; /* select plugin node scaling factor */ + uint16_t default_part; /* 1 if this is default partition */ + uint16_t hidden; /* 1 if partition is hidden by default */ + uint16_t root_only; /* 1 if allocate must come for user root */ + uint16_t shared; /* 1 if job can share nodes, + * 2 if job must share nodes */ + uint16_t state_up; /* 1 if state is up, 0 if down */ + char *nodes; /* list names of nodes in partition */ + int *node_inx; /* list index pairs into node_table: + * start_range_1, end_range_1, + * start_range_2, .., -1 */ + char *allow_groups; /* comma delimited list of groups, + * null indicates all */ +} partition_info_t; + +typedef struct delete_partition_msg { + char *name; /* name of partition to be delete */ +} delete_part_msg_t; + +typedef struct resource_allocation_response_msg { + uint32_t job_id; /* assigned job id */ + char *node_list; /* assigned list of nodes */ + uint16_t num_cpu_groups;/* elements in below cpu arrays */ + uint32_t *cpus_per_node;/* cpus per node */ + uint32_t *cpu_count_reps;/* how many nodes have same cpu count */ + uint16_t node_cnt; /* count of nodes */ + uint32_t error_code; /* error code for warning message */ + select_jobinfo_t select_jobinfo; /* opaque data structure, + * use select_g_get_jobinfo() to access conents */ +} resource_allocation_response_msg_t; + +typedef struct job_alloc_info_response_msg { + uint32_t job_id; /* assigned job id */ + char *node_list; /* assigned list of nodes */ + uint16_t num_cpu_groups;/* elements in below cpu arrays */ + uint32_t *cpus_per_node;/* cpus per node */ + uint32_t *cpu_count_reps;/* how many nodes have same cpu count */ + uint16_t node_cnt; /* count of nodes */ + slurm_addr *node_addr; /* network addresses */ + uint32_t error_code; /* error code for warning message */ + select_jobinfo_t select_jobinfo; /* opaque data structure, + * use select_g_get_jobinfo() to access conents */ +} job_alloc_info_response_msg_t; + +typedef struct partition_info_msg { + time_t last_update; /* time of latest info */ + uint32_t record_count; /* number of records */ + partition_info_t *partition_array; /* the partition records */ +} partition_info_msg_t; + +typedef struct slurm_ctl_conf { + time_t last_update; /* last update time of the build parameters */ + char *authtype; /* authentication type */ + char *backup_addr; /* comm path of slurmctld secondary server */ + char *backup_controller;/* name of slurmctld secondary server */ + uint16_t cache_groups; /* cache /etc/groups to avoid initgroups(2) */ + char *checkpoint_type; /* checkpoint plugin type */ + char *control_addr; /* comm path of slurmctld primary server */ + char *control_machine; /* name of slurmctld primary server */ + char *epilog; /* pathname of job epilog */ + uint32_t first_job_id; /* first slurm generated job_id to assign */ + uint32_t next_job_id; /* next slurm generated job_id to assign */ + uint16_t fast_schedule; /* 1 to *not* check configurations by node + * (only check configuration file, faster) */ + uint16_t inactive_limit;/* seconds of inactivity before a + * inactive resource allocation is released */ + char *job_acct_logfile; /* job accounting log location */ + uint16_t job_acct_freq; /* poll frequency for job accounting plugins */ + char *job_acct_type; /* job accounting type */ + char *job_comp_type; /* job completion logger type */ + char *job_comp_loc; /* job completion logging location */ + uint16_t kill_wait; /* seconds between SIGXCPU to SIGKILL + * on job termination */ + char *mail_prog; /* pathname of mail program */ + uint16_t max_job_cnt; /* maximum number of active jobs */ + uint16_t min_job_age; /* COMPLETED jobs over this age (secs) + * purged from in memory records */ + char *mpi_default; /* Default version of MPI in use */ + uint16_t msg_timeout; /* message timeout */ + char *plugindir; /* pathname to plugins */ + char *plugstack; /* pathname to plugin stack config file */ + char *proctrack_type; /* process tracking plugin type */ + char *prolog; /* pathname of job prolog */ + uint16_t propagate_prio_process; /* 1 if process priority should + * be propagated */ + char *propagate_rlimits;/* Propagate (all/specific) resource limits */ + char *propagate_rlimits_except;/* Propagate all rlimits except these */ + uint16_t ret2service; /* 1 return DOWN node to service at + * registration */ + char *schedtype; /* type of scheduler to use */ + uint16_t schedport; /* port for scheduler connection */ + uint16_t schedrootfltr; /* 1 if rootOnly partitions should be + * filtered from scheduling (if needed) */ + char *select_type; /* type of node selector to use */ + uint16_t select_type_param; /* Parameters + * describing the select_type plugin */ + uint32_t slurm_user_id; /* uid of slurm_user_name */ + char *slurm_user_name; /* user that slurmctld runs as */ + uint16_t slurmctld_debug; /* slurmctld logging level */ + char *slurmctld_logfile;/* where slurmctld error log gets written */ + char *slurmctld_pidfile;/* where to put slurmctld pidfile */ + uint32_t slurmctld_port;/* default communications port to slurmctld */ + uint16_t slurmctld_timeout;/* seconds that backup controller waits + * on non-responding primarly controller */ + uint16_t slurmd_debug; /* slurmd logging level */ + char *slurmd_logfile; /* where slurmd error log gets written */ + uint32_t slurmd_port; /* default communications port to slurmd */ + char *slurmd_spooldir; /* where slurmd put temporary state info */ + char *slurmd_pidfile; /* where to put slurmd pidfile */ + uint16_t slurmd_timeout;/* how long slurmctld waits for slurmd before + * considering node DOWN */ + char *slurm_conf; /* pathname of slurm config file */ + char *state_save_location;/* pathname of slurmctld state save + * directory */ + char *switch_type; /* switch or interconnect type */ + char *task_epilog; /* pathname of task launch epilog */ + char *task_plugin; /* task launch plugin */ + char *task_prolog; /* pathname of task launch prolog */ + char *tmp_fs; /* pathname of temporary file system */ + uint16_t wait_time; /* default job --wait time */ + char *job_credential_private_key; /* path to private key */ + char *job_credential_public_certificate;/* path to public certificate*/ + char *srun_prolog; /* srun prolog program */ + char *srun_epilog; /* srun epilog program */ + char *node_prefix; /* prefix of nodes in partition only set in + bluegene clusters NULL otherwise */ + uint16_t tree_width; /* number of threads per node to span */ + uint16_t use_pam; /* enable/disable PAM support */ +} slurm_ctl_conf_t; + +typedef struct submit_response_msg { + uint32_t job_id; /* job ID */ + uint32_t step_id; /* step ID */ + uint32_t error_code; /* error code for warning message */ +} submit_response_msg_t; + +typedef struct slurm_update_node_msg { + char *node_names; /* comma separated list of required nodes */ + uint16_t node_state; /* see enum node_states */ + char *reason; /* reason for node being DOWN or DRAINING */ +} update_node_msg_t; + +typedef struct partition_info update_part_msg_t; + +/* Opaque data type for slurm_step_ctx_* functions */ +typedef struct slurm_step_ctx_struct *slurm_step_ctx; + +/*****************************************************************************\ + * RESOURCE ALLOCATION FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_init_job_desc_msg - initialize job descriptor with + * default values + * OUT job_desc_msg - user defined job descriptor + */ +extern void slurm_init_job_desc_msg PARAMS((job_desc_msg_t * job_desc_msg)); + +/* + * slurm_allocate_resources - allocate resources for a job request + * If the requested resources are not immediately available, the slurmctld + * will send the job_alloc_resp_msg to the sepecified node and port. + * IN job_desc_msg - description of resource allocation request + * OUT job_alloc_resp_msg - response to request. This only represents + * a job allocation if resources are immediately. Otherwise it just contains + * the job id of the enqueued job request. + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the allocated using slurm_free_resource_allocation_response_msg + */ +extern int slurm_allocate_resources PARAMS(( + job_desc_msg_t * job_desc_msg , + resource_allocation_response_msg_t ** job_alloc_resp_msg)); + +/* + * slurm_allocate_resources_blocking + * allocate resources for a job request. This call will block until + * the allocation is granted, or the specified timeout limit is reached. + * IN req - description of resource allocation request + * IN timeout - amount of time, in seconds, to wait for a response before + * giving up. + * A timeout of zero will wait indefinitely. + * IN pending_callback - If the allocation cannot be granted immediately, + * the controller will put the job in the PENDING state. If + * pending callback is not NULL, it will be called with the job_id + * of the pending job as the sole parameter. + * + * RET allocation structure on success, NULL on error set errno to + * indicate the error (errno will be ETIMEDOUT if the timeout is reached + * with no allocation granted) + * NOTE: free the allocation structure using + * slurm_free_resource_allocation_response_msg + */ +extern resource_allocation_response_msg_t * + slurm_allocate_resources_blocking PARAMS(( + const job_desc_msg_t *user_req, time_t timeout, + void (*pending_callback)(uint32_t job_id))); + +/* + * slurm_free_resource_allocation_response_msg - free slurm resource + * allocation response message + * IN msg - pointer to allocation response message + * NOTE: buffer is loaded by slurm_allocate_resources + */ +extern void slurm_free_resource_allocation_response_msg PARAMS(( + resource_allocation_response_msg_t * msg)); + +/* + * slurm_free_job_alloc_info_response_msg - free slurm resource + * allocation lookup message + * IN msg - pointer to job allocation info response message + * NOTE: buffer is loaded by slurm_allocation_lookup + */ +extern void slurm_free_job_alloc_info_response_msg PARAMS(( + job_alloc_info_response_msg_t * msg)); + +/* + * slurm_allocation_lookup - retrieve info for an existing resource allocation + * IN job_id - job allocation identifier + * OUT resp - job allocation information + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free "info" using slurm_free_job_alloc_info_response_msg + */ +extern int slurm_allocation_lookup PARAMS(( + uint32_t job_id, job_alloc_info_response_msg_t **info)); +/* + * slurm_allocation_lookup_lite - retrieve minor info for an existing + * resource allocation + * IN job_id - job allocation identifier + * OUT resp - job allocation information + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free "info" using slurm_free_job_alloc_info_response_msg + */ +extern int slurm_allocation_lookup_lite PARAMS(( + uint32_t job_id, resource_allocation_response_msg_t **info)); + +/* + * slurm_job_step_create - create a job step for a given job id + * IN slurm_step_alloc_req_msg - description of job step request + * OUT slurm_step_alloc_resp_msg - response to request + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the response using slurm_free_job_step_create_response_msg + */ +extern int slurm_job_step_create PARAMS(( + job_step_create_request_msg_t * slurm_step_alloc_req_msg, + job_step_create_response_msg_t ** slurm_step_alloc_resp_msg)); + +/* + * slurm_read_hostfile - Read a SLURM hostfile specified by "filename". + * "filename" must contain a list of SLURM NodeNames, one per line. + * Reads up to "n" number of hostnames from the file. Returns a + * string representing a hostlist ranged string of the contents of + * the file. This is a helper function, it does not contact any + * SLURM daemons. + * + * IN filename - name of SLURM Hostlist file to be read. + * IN n - number of NodeNames required + * RET - a string representing the hostlist. Returns NULL if there are + * fewer than "n" hostnames in the file, or if an error occurs. + * + * NOTE: Returned string must be freed with free(). + */ +extern char *slurm_read_hostfile PARAMS((char *filename, int n)); + +/* + * slurm_free_job_step_create_response_msg - free slurm + * job step create response message + * IN msg - pointer to job step create response message + * NOTE: buffer is loaded by slurm_job_step_create + */ +extern void slurm_free_job_step_create_response_msg PARAMS(( + job_step_create_response_msg_t *msg)); + +/* + * slurm_submit_batch_job - issue RPC to submit a job for later execution + * NOTE: free the response using slurm_free_submit_response_response_msg + * IN job_desc_msg - description of batch job request + * OUT slurm_alloc_msg - response to request + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_submit_batch_job PARAMS(( + job_desc_msg_t * job_desc_msg, + submit_response_msg_t ** slurm_alloc_msg)); + +/* + * slurm_free_submit_response_response_msg - free slurm + * job submit response message + * IN msg - pointer to job submit response message + * NOTE: buffer is loaded by slurm_submit_batch_job + */ +extern void slurm_free_submit_response_response_msg PARAMS(( + submit_response_msg_t *msg)); + +/* + * slurm_job_will_run - determine if a job would execute immediately if + * submitted now + * IN job_desc_msg - description of resource allocation request + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_job_will_run PARAMS(( + job_desc_msg_t * job_desc_msg)); + + +/*****************************************************************************\ + * JOB/STEP SIGNALING FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_kill_job - send the specified signal to all steps of an existing job + * IN job_id - the job's id + * IN signal - signal number + * IN batch_flag - 1 to signal batch shell only, otherwise 0 + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_kill_job PARAMS((uint32_t job_id, uint16_t signal, + uint16_t batch_flag)); + +/* + * slurm_kill_job_step - send the specified signal to an existing job step + * IN job_id - the job's id + * IN step_id - the job step's id + * IN signal - signal number + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_kill_job_step PARAMS((uint32_t job_id, uint32_t step_id, + uint16_t signal)); + +/* + * slurm_signal_job - send the specified signal to all steps of an existing job + * IN job_id - the job's id + * IN signal - signal number + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_signal_job PARAMS((uint32_t job_id, uint16_t signal)); + +/* + * slurm_signal_job_step - send the specified signal to an existing job step + * IN job_id - the job's id + * IN step_id - the job step's id - use SLURM_BATCH_SCRIPT as the step_id + * to send a signal to a job's batch script + * IN signal - signal number + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_signal_job_step PARAMS((uint32_t job_id, uint32_t step_id, + uint16_t signal)); + + +/*****************************************************************************\ + * JOB/STEP COMPLETION FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_complete_job - note the completion of a job and all of its steps + * IN job_id - the job's id + * IN job_return_code - the highest exit code of any task of the job + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_complete_job PARAMS((uint32_t job_id, + uint32_t job_return_code)); + +/* + * slurm_terminate_job - terminates all steps of an existing job by sending + * a REQUEST_TERMINATE_JOB rpc to all slurmd in the the job allocation, + * and then calls slurm_complete_job(). + * IN job_id - the job's id + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_terminate_job PARAMS((uint32_t job_id)); + +/* + * slurm_terminate_job_step - terminates a job step by sending a + * REQUEST_TERMINATE_TASKS rpc to all slurmd of a job step, and then + * calls slurm_complete_job_step() after verifying that all + * nodes in the job step no longer have running tasks from the job + * step. (May take over 35 seconds to return.) + * IN job_id - the job's id + * IN step_id - the job step's id - use SLURM_BATCH_SCRIPT as the step_id + * to terminate a job's batch script + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_terminate_job_step PARAMS(( + uint32_t job_id, uint32_t step_id)); + +/*****************************************************************************\ + * SLURM TASK SPAWNING FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_step_ctx_create - Create a job step and its context. + * IN step_req - description of job step request + * RET the step context or NULL on failure with slurm errno set + * NOTE: Free allocated memory using slurm_step_ctx_destroy. + */ +extern slurm_step_ctx slurm_step_ctx_create PARAMS(( + const job_step_create_request_msg_t *step_req)); + +/* + * slurm_step_ctx_get - get parameters from a job step context. + * IN ctx - job step context generated by slurm_step_ctx_create + * RET SLURM_SUCCESS or SLURM_ERROR (with slurm_errno set) + */ +extern int slurm_step_ctx_get PARAMS((slurm_step_ctx ctx, + int ctx_key, ...)); + +/* + * slurm_jobinfo_ctx_get - get parameters from jobinfo context. + * IN jobinfo - job information from context, returned by slurm_step_ctx_get() + * IN data_type - type of data required, specific to the switch type + * OUT data - the requested data type + * RET SLURM_SUCCESS or SLURM_ERROR (with slurm_errno set) + */ +extern int slurm_jobinfo_ctx_get PARAMS((switch_jobinfo_t jobinfo, + int data_type, void *data)); + +/* + * slurm_step_ctx_daemon_per_node_hack - Hack the step context + * to run a single process per node, regardless of the settings + * selected at slurm_step_ctx_create time. + * + * This is primarily used on AIX by the slurm_ll_api in support of + * poe. The slurm_ll_api will want to launch a single pmd daemon + * on each node regardless of the number of tasks running on each + * node. + * IN ctx - job step context generated by slurm_step_ctx_create + * RET SLURM_SUCCESS or SLURM_ERROR (with slurm_errno set) + */ +extern int slurm_step_ctx_daemon_per_node_hack PARAMS((slurm_step_ctx ctx)); + +/* + * slurm_step_ctx_destroy - free allocated memory for a job step context. + * IN ctx - job step context generated by slurm_step_ctx_create + * RET SLURM_SUCCESS or SLURM_ERROR (with slurm_errno set) + */ +extern int slurm_step_ctx_destroy PARAMS((slurm_step_ctx ctx)); + +/* + * slurm_job_step_launch_t_init - initialize a user-allocated + * slurm_job_step_launch_t structure with default values. + * default values. This function will NOT allocate any new memory. + * IN ptr - pointer to a structure allocated by the use. The structure will + * be intialized. + */ +extern void slurm_job_step_launch_t_init PARAMS((slurm_job_step_launch_t *ptr)); + +/* + * slurm_step_launch - launch a parallel job step + * IN ctx - job step context generated by slurm_step_ctx_create + * RET SLURM_SUCCESS or SLURM_ERROR (with errno set) + */ +extern int slurm_step_launch PARAMS((slurm_step_ctx ctx, + const slurm_job_step_launch_t *params, + const slurm_job_step_launch_callbacks_t *callbacks)); + +/* + * Block until all tasks have started. + */ +extern int slurm_step_launch_wait_start PARAMS((slurm_step_ctx ctx)); + +/* + * Block until all tasks have finished (or failed to start altogether). + */ +extern void slurm_step_launch_wait_finish PARAMS((slurm_step_ctx ctx)); + +/* + * Abort an in-progress launch, or terminate the fully launched job step. + * + * Can be called from a signal handler. + */ +void slurm_step_launch_abort PARAMS((slurm_step_ctx ctx)); + +/*****************************************************************************\ + * SLURM CONTROL CONFIGURATION READ/PRINT/UPDATE FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_api_version - Return a single number reflecting the SLURM API's + * version number. Use the macros SLURM_VERSION_NUM, SLURM_VERSION_MAJOR, + * SLURM_VERSION_MINOR, and SLURM_VERSION_MICRO to work with this value + * RET API's version number + */ +extern long slurm_api_version PARAMS((void)); + +/* + * slurm_load_ctl_conf - issue RPC to get slurm control configuration + * information if changed since update_time + * IN update_time - time of current configuration data + * IN slurm_ctl_conf_ptr - place to store slurm control configuration + * pointer + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the response using slurm_free_ctl_conf + */ +extern int slurm_load_ctl_conf PARAMS(( + time_t update_time, + slurm_ctl_conf_t **slurm_ctl_conf_ptr)); + +/* + * slurm_free_ctl_conf - free slurm control information response message + * IN msg - pointer to slurm control information response message + * NOTE: buffer is loaded by slurm_load_ctl_conf + */ +extern void slurm_free_ctl_conf PARAMS((slurm_ctl_conf_t* slurm_ctl_conf_ptr)); + +/* + * slurm_print_ctl_conf - output the contents of slurm control configuration + * message as loaded using slurm_load_ctl_conf + * IN out - file to write to + * IN slurm_ctl_conf_ptr - slurm control configuration pointer + */ +extern void slurm_print_ctl_conf PARAMS(( + FILE * out, slurm_ctl_conf_t* slurm_ctl_conf)); + + +/*****************************************************************************\ + * SLURM JOB CONTROL CONFIGURATION READ/PRINT/UPDATE FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_load_jobs - issue RPC to get slurm all job configuration + * information if changed since update_time + * IN update_time - time of current configuration data + * IN job_info_msg_pptr - place to store a job configuration pointer + * IN show_flags - job filtering options + * RET 0 or -1 on error + * NOTE: free the response using slurm_free_job_info_msg + */ +extern int slurm_load_jobs PARAMS(( + time_t update_time, job_info_msg_t **job_info_msg_pptr, + uint16_t show_flags)); + +/* + * slurm_free_job_info - free the job information response message + * IN msg - pointer to job information response message + * NOTE: buffer is loaded by slurm_load_jobs. + */ +extern void slurm_free_job_info_msg PARAMS((job_info_msg_t * job_buffer_ptr)); + +/* + * slurm_print_job_info_msg - output information about all Slurm + * jobs based upon message as loaded using slurm_load_jobs + * IN out - file to write to + * IN job_info_msg_ptr - job information message pointer + * IN one_liner - print as a single line if true + */ +extern void slurm_print_job_info_msg PARAMS(( + FILE * out, job_info_msg_t * job_info_msg_ptr, int one_liner )); + +/* + * slurm_print_job_info - output information about a specific Slurm + * job based upon message as loaded using slurm_load_jobs + * IN out - file to write to + * IN job_ptr - an individual job information record pointer + * IN one_liner - print as a single line if true + */ +extern void slurm_print_job_info PARAMS(( FILE*, job_info_t * job_ptr, + int one_liner )); + +/* + * slurm_sprint_job_info - output information about a specific Slurm + * job based upon message as loaded using slurm_load_jobs + * IN job_ptr - an individual job information record pointer + * IN one_liner - print as a single line if true + * RET out - char * containing formatted output (must be freed after call) + * NULL is returned on failure. + */ +extern char *slurm_sprint_job_info PARAMS(( job_info_t * job_ptr, + int one_liner )); + +/* + * slurm_get_end_time - get the expected end time for a given slurm job + * IN jobid - slurm job id + * end_time_ptr - location in which to store scheduled end time for job + * RET 0 or -1 on error + */ +extern int slurm_get_end_time PARAMS((uint32_t jobid, time_t *end_time_ptr)); + +/* + * slurm_get_rem_time - get the expected time remaining for a given job + * IN jobid - slurm job id + * RET remaining time in seconds or -1 on error + */ +extern long slurm_get_rem_time PARAMS((uint32_t jobid)); + +/* + * slurm_pid2jobid - issue RPC to get the slurm job_id given a process_id + * on this machine + * IN job_pid - process_id of interest on this machine + * OUT job_id_ptr - place to store a slurm job_id + * RET 0 or -1 on error + */ +extern int slurm_pid2jobid PARAMS(( pid_t job_pid, uint32_t * job_id_ptr )) ; + +/* + * slurm_update_job - issue RPC to a job's configuration per request, + * only usable by user root or (for some parameters) the job's owner + * IN job_msg - description of job updates + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_update_job PARAMS(( job_desc_msg_t * job_msg )) ; + +/* + * slurm_get_select_jobinfo - get data from a select job credential + * IN jobinfo - updated select job credential + * IN data_type - type of data to enter into job credential + * IN/OUT data - the data to enter into job credential + * RET 0 or -1 on error + */ +extern int slurm_get_select_jobinfo PARAMS((select_jobinfo_t jobinfo, + enum select_data_type data_type, void *data)); + +/*****************************************************************************\ + * SLURM JOB STEP CONFIGURATION READ/PRINT/UPDATE FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_get_job_steps - issue RPC to get specific slurm job step + * configuration information if changed since update_time. + * a job_id value of zero implies all jobs, a step_id value of + * zero implies all steps + * IN update_time - time of current configuration data + * IN job_id - get information for specific job id, zero for all jobs + * IN step_id - get information for specific job step id, zero for all + * job steps + * IN step_response_pptr - place to store a step response pointer + * IN show_flags - job step filtering options + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the response using slurm_free_job_step_info_response_msg + */ +extern int slurm_get_job_steps PARAMS(( + time_t update_time, uint32_t job_id, uint32_t step_id, + job_step_info_response_msg_t **step_response_pptr, + uint16_t show_flags)); + +/* + * slurm_free_job_step_info_response_msg - free the job step + * information response message + * IN msg - pointer to job step information response message + * NOTE: buffer is loaded by slurm_get_job_steps. + */ +extern void slurm_free_job_step_info_response_msg PARAMS(( + job_step_info_response_msg_t * msg)); + +/* + * slurm_print_job_step_info_msg - output information about all Slurm + * job steps based upon message as loaded using slurm_get_job_steps + * IN out - file to write to + * IN job_step_info_msg_ptr - job step information message pointer + * IN one_liner - print as a single line if true + */ +extern void slurm_print_job_step_info_msg PARAMS(( + FILE * out, job_step_info_response_msg_t * job_step_info_msg_ptr, + int one_liner )); + +/* + * slurm_print_job_step_info - output information about a specific Slurm + * job step based upon message as loaded using slurm_get_job_steps + * IN out - file to write to + * IN job_ptr - an individual job step information record pointer + * IN one_liner - print as a single line if true + */ +extern void slurm_print_job_step_info PARAMS(( + FILE * out, job_step_info_t * step_ptr, int one_liner )); + +/* + * slurm_job_step_layout_get - get the slurm_step_layout_t structure for + * a particular job step + * + * IN job_id + * IN step_id + * RET pointer to a slurm_step_layout_t (free with + * slurm_free_step_layout) on success, and NULL on error. + */ +extern slurm_step_layout_t *slurm_job_step_layout_get PARAMS((uint32_t job_id, + uint32_t step_id)); +/* + * slurm_sprint_job_step_info - output information about a specific Slurm + * job step based upon message as loaded using slurm_get_job_steps + * IN job_ptr - an individual job step information record pointer + * IN one_liner - print as a single line if true + * RET out - char * containing formatted output (must be freed after call) + * NULL is returned on failure. + */ +extern char *slurm_sprint_job_step_info PARAMS(( job_step_info_t * step_ptr, + int one_liner )); + +void slurm_job_step_layout_free PARAMS((slurm_step_layout_t *layout)); + +/*****************************************************************************\ + * SLURM NODE CONFIGURATION READ/PRINT/UPDATE FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_load_node - issue RPC to get slurm all node configuration information + * if changed since update_time + * IN update_time - time of current configuration data + * IN node_info_msg_pptr - place to store a node configuration pointer + * IN show_flags - node filtering options + * RET 0 or a slurm error code + * NOTE: free the response using slurm_free_node_info_msg + */ +extern int slurm_load_node PARAMS(( + time_t update_time, node_info_msg_t **node_info_msg_pptr, + uint16_t show_flags)); + +/* + * slurm_free_node_info - free the node information response message + * IN msg - pointer to node information response message + * NOTE: buffer is loaded by slurm_load_node. + */ +extern void slurm_free_node_info_msg PARAMS(( + node_info_msg_t * node_buffer_ptr )); + +/* + * slurm_print_node_info_msg - output information about all Slurm nodes + * based upon message as loaded using slurm_load_node + * IN out - file to write to + * IN node_info_msg_ptr - node information message pointer + * IN one_liner - print as a single line if true + */ +extern void slurm_print_node_info_msg PARAMS(( + FILE * out, node_info_msg_t * node_info_msg_ptr, int one_liner )) ; + +/* + * slurm_print_node_table - output information about a specific Slurm nodes + * based upon message as loaded using slurm_load_node + * IN out - file to write to + * IN node_ptr - an individual node information record pointer + * IN one_liner - print as a single line if true + */ +extern void slurm_print_node_table PARAMS(( + FILE * out, node_info_t * node_ptr, int one_liner )); + +/* + * slurm_sprint_node_table - output information about a specific Slurm nodes + * based upon message as loaded using slurm_load_node + * IN node_ptr - an individual node information record pointer + * IN one_liner - print as a single line if true + * RET out - char * containing formatted output (must be freed after call) + * NULL is returned on failure. + */ +extern char *slurm_sprint_node_table PARAMS(( node_info_t * node_ptr, + int one_liner )); + +/* + * slurm_update_node - issue RPC to a node's configuration per request, + * only usable by user root + * IN node_msg - description of node updates + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_update_node PARAMS(( update_node_msg_t * node_msg )); + + +/*****************************************************************************\ + * SLURM PARTITION CONFIGURATION READ/PRINT/UPDATE FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_init_part_desc_msg - initialize partition descriptor with + * default values + * OUT job_desc_msg - user defined partition descriptor + */ +extern void slurm_init_part_desc_msg PARAMS((update_part_msg_t * update_part_msg )); + +/* + * slurm_load_partitions - issue RPC to get slurm all partition configuration + * information if changed since update_time + * IN update_time - time of current configuration data + * IN partition_info_msg_pptr - place to store a partition configuration + * pointer + * IN show_flags - partitions filtering options + * RET 0 or a slurm error code + * NOTE: free the response using slurm_free_partition_info_msg + */ +extern int slurm_load_partitions PARAMS(( + time_t update_time, partition_info_msg_t **part_buffer_ptr, + uint16_t show_flags)); + +/* + * slurm_free_partition_info_msg - free the partition information + * response message + * IN msg - pointer to partition information response message + * NOTE: buffer is loaded by slurm_load_partitions + */ +extern void slurm_free_partition_info_msg PARAMS(( + partition_info_msg_t * part_info_ptr )); + +/* + * slurm_print_partition_info_msg - output information about all Slurm + * partitions based upon message as loaded using slurm_load_partitions + * IN out - file to write to + * IN part_info_ptr - partitions information message pointer + * IN one_liner - print as a single line if true + */ +extern void slurm_print_partition_info_msg PARAMS(( + FILE * out, partition_info_msg_t * part_info_ptr, int one_liner )); + +/* + * slurm_print_partition_info - output information about a specific Slurm + * partition based upon message as loaded using slurm_load_partitions + * IN out - file to write to + * IN part_ptr - an individual partition information record pointer + * IN one_liner - print as a single line if true + */ +extern void slurm_print_partition_info PARAMS(( + FILE *out , partition_info_t * part_ptr, int one_liner )); + +/* + * slurm_sprint_partition_info - output information about a specific Slurm + * partition based upon message as loaded using slurm_load_partitions + * IN part_ptr - an individual partition information record pointer + * IN one_liner - print as a single line if true + * RET out - char * with formatted output (must be freed after call) + * NULL is returned on failure. + */ +extern char *slurm_sprint_partition_info PARAMS(( + partition_info_t * part_ptr, int one_liner )); +/* + * slurm_update_partition - issue RPC to update a partition's configuration + * per request, only usable by user root + * IN part_msg - description of partition updates + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_update_partition PARAMS(( update_part_msg_t * part_msg )); + +/* + * slurm_delete_partition - issue RPC to delete a partition, only usable + * by user root + * IN part_msg - description of partition to delete + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_delete_partition PARAMS(( delete_part_msg_t * part_msg )); + +/*****************************************************************************\ + * SLURM PING/RECONFIGURE/SHUTDOWN FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_ping - issue RPC to have Slurm controller (slurmctld) + * IN controller - 1==primary controller, 2==secondary controller + * RET 0 or a slurm error code + */ +extern int slurm_ping PARAMS(( int primary )); + +/* + * slurm_reconfigure - issue RPC to have Slurm controller (slurmctld) + * reload its configuration file + * RET 0 or a slurm error code + */ +extern int slurm_reconfigure PARAMS(( void )); + +/* + * slurm_shutdown - issue RPC to have Slurm controller (slurmctld) + * cease operations, both the primary and backup controller + * are shutdown. + * IN core - controller generates a core file if set + * RET 0 or a slurm error code + */ +extern int slurm_shutdown PARAMS(( uint16_t core )); + +/*****************************************************************************\ + * SLURM JOB SUSPEND FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_suspend - suspend execution of a job. + * IN job_id - job on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_suspend PARAMS(( uint32_t job_id )); + +/* + * slurm_resume - resume execution of a previously suspended job. + * IN job_id - job on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_resume PARAMS(( uint32_t job_id )); + +/* + * slurm_requeue - re-queue a batch job, if already running + * then terminate it first + * RET 0 or a slurm error code + */ +extern int slurm_requeue PARAMS(( uint32_t job_id )); + +/*****************************************************************************\ + * SLURM JOB CHECKPOINT FUNCTIONS +\*****************************************************************************/ + +/* + * slurm_checkpoint_able - determine if the specified job step can presently + * be checkpointed + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * OUT start_time - time at which checkpoint request was issued + * RET 0 (can be checkpoined) or a slurm error code + */ +extern int slurm_checkpoint_able PARAMS(( uint32_t job_id, uint32_t step_id, + time_t *start_time )); + +/* + * slurm_checkpoint_disable - disable checkpoint requests for some job step + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_disable PARAMS(( uint32_t job_id, + uint32_t step_id )); + + +/* + * slurm_checkpoint_enable - enable checkpoint requests for some job step + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_enable PARAMS(( uint32_t job_id, + uint32_t step_id )); + +/* + * slurm_checkpoint_create - initiate a checkpoint requests for some job step. + * the job will continue execution after the checkpoint operation completes + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * IN max_wait - maximum wait for operation to complete, in seconds + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_create PARAMS(( uint32_t job_id, + uint32_t step_id, uint16_t max_wait )); + +/* + * slurm_checkpoint_vacate - initiate a checkpoint requests for some job step. + * the job will terminate after the checkpoint operation completes + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * IN max_wait - maximum wait for operation to complete, in seconds + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_vacate PARAMS(( uint32_t job_id, + uint32_t step_id, uint16_t max_wait )); + +/* + * slurm_checkpoint_restart - restart execution of a checkpointed job step. + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_restart PARAMS(( uint32_t job_id, + uint32_t step_id )); + +/* + * slurm_checkpoint_complete - note the completion of a job step's checkpoint + * operation. + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * IN begin_time - time at which checkpoint began + * IN error_code - error code, highest value for all complete calls is preserved + * IN error_msg - error message, preserved for highest error_code + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_complete PARAMS(( uint32_t job_id, + uint32_t step_id, time_t begin_time, + uint32_t error_code, char *error_msg )); + +/* + * slurm_checkpoint_error - gather error information for the last checkpoint + * operation for some job step + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * OUT error_code - error number associated with the last checkpoint operation, + * this value is dependent upon the checkpoint plugin used and may be + * completely unrelated to slurm error codes, the highest value for all + * complete calls is preserved + * OUT error_msg - error message, preserved for highest error_code, value + * must be freed by the caller to prevent memory leak + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_error PARAMS(( uint32_t job_id, + uint32_t step_id, uint32_t *error_code, + char **error_msg )); + +/*****************************************************************************\ + * SLURM HOSTLIST FUNCTIONS +\*****************************************************************************/ + +/* The hostlist opaque data type + * + * A hostlist is a list of hostnames optimized for a prefixXXXX style + * naming convention, where XXXX is a decimal, numeric suffix. + */ +#ifndef __hostlist_t_defined +# define __hostlist_t_defined + typedef struct hostlist * hostlist_t; +#endif + +/* + * slurm_hostlist_create(): + * + * Create a new hostlist from a string representation. + * + * The string representation (str) may contain one or more hostnames or + * bracketed hostlists separated by either `,' or whitespace. A bracketed + * hostlist is denoted by a common prefix followed by a list of numeric + * ranges contained within brackets: e.g. "tux[0-5,12,20-25]" + * + * To support systems with 3-D topography, a rectangular prism may + * be described using two three digit numbers separated by "x": e.g. + * "bgl[123x456]". This selects all nodes between 1 and 4 inclusive + * in the first dimension, between 2 and 5 in the second, and between + * 3 and 6 in the third dimension for a total of 4*4*4=64 nodes + * + * Note: if this module is compiled with WANT_RECKLESS_HOSTRANGE_EXPANSION + * defined, a much more loose interpretation of host ranges is used. + * Reckless hostrange expansion allows all of the following (in addition to + * bracketed hostlists): + * + * o tux0-5,tux12,tux20-25 + * o tux0-tux5,tux12,tux20-tux25 + * o tux0-5,12,20-25 + * + * If str is NULL, and empty hostlist is created and returned. + * + * If the create fails, hostlist_create() returns NULL. + * + * The returned hostlist must be freed with hostlist_destroy() + * + */ +extern hostlist_t slurm_hostlist_create PARAMS(( const char *hostlist )); + +/* + * slurm_hostlist_shift(): + * + * Returns the string representation of the first host in the hostlist + * or NULL if the hostlist is empty or there was an error allocating memory. + * The host is removed from the hostlist. + * + * Note: Caller is responsible for freeing the returned memory. + */ +extern char * slurm_hostlist_shift PARAMS(( hostlist_t hl )); + +/* + * slurm_hostlist_destroy(): + * + * Destroy a hostlist object. Frees all memory allocated to the hostlist. + */ +extern void slurm_hostlist_destroy PARAMS(( hostlist_t hl )); + +END_C_DECLS + +#endif diff --git a/executable_names/slurm/slurm_errno.h b/executable_names/slurm/slurm_errno.h new file mode 100644 index 0000000000000000000000000000000000000000..8aa54df3380c1cece89017cd7ba153a6df9ab9ba --- /dev/null +++ b/executable_names/slurm/slurm_errno.h @@ -0,0 +1,226 @@ +/*****************************************************************************\ + * slurm_errno.h - error codes and functions for slurm + ****************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew , + * Jim Garlick , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#ifndef _SLURM_ERRNO_H +#define _SLURM_ERRNO_H + +/* BEGIN_C_DECLS should be used at the beginning of your declarations, + so that C++ compilers don't mangle their names. Use _END_C_DECLS at + the end of C declarations. */ +#undef BEGIN_C_DECLS +#undef END_C_DECLS +#ifdef __cplusplus +# define BEGIN_C_DECLS extern "C" { +# define END_C_DECLS } +#else +# define BEGIN_C_DECLS /* empty */ +# define END_C_DECLS /* empty */ +#endif + +/* PARAMS is a macro used to wrap function prototypes, so that compilers + that don't understand ANSI C prototypes still work, and ANSI C + compilers can issue warnings about type mismatches. */ +#undef PARAMS +#if defined (__STDC__) || defined (_AIX) \ + || (defined (__mips) && defined (_SYSTYPE_SVR4)) \ + || defined(WIN32) || defined(__cplusplus) +# define PARAMS(protos) protos +#else +# define PARAMS(protos) () +#endif + +BEGIN_C_DECLS + +#include + +/* set errno to the specified value - then return -1 */ +#define slurm_seterrno_ret(errnum) do { \ + slurm_seterrno(errnum); \ + return (errnum ? -1 : 0); \ + } while (0) + +/* general return codes */ +#define SLURM_SUCCESS 0 +#define SLURM_ERROR -1 +#define SLURM_FAILURE -1 + +/* general communication layer return codes */ +#define SLURM_SOCKET_ERROR -1 +#define SLURM_PROTOCOL_SUCCESS 0 +#define SLURM_PROTOCOL_ERROR -1 + +enum { + /* General Message error codes */ + SLURM_UNEXPECTED_MSG_ERROR = 1000, + SLURM_COMMUNICATIONS_CONNECTION_ERROR, + SLURM_COMMUNICATIONS_SEND_ERROR, + SLURM_COMMUNICATIONS_RECEIVE_ERROR, + SLURM_COMMUNICATIONS_SHUTDOWN_ERROR, + SLURM_PROTOCOL_VERSION_ERROR, + SLURM_PROTOCOL_IO_STREAM_VERSION_ERROR, + SLURM_PROTOCOL_AUTHENTICATION_ERROR, + SLURM_PROTOCOL_INSANE_MSG_LENGTH, + + /* communication failures to/from slurmctld */ + SLURMCTLD_COMMUNICATIONS_CONNECTION_ERROR = 1800, + SLURMCTLD_COMMUNICATIONS_SEND_ERROR, + SLURMCTLD_COMMUNICATIONS_RECEIVE_ERROR, + SLURMCTLD_COMMUNICATIONS_SHUTDOWN_ERROR, + + /* _info.c/communcation layer RESPONSE_SLURM_RC message codes */ + SLURM_NO_CHANGE_IN_DATA = 1900, + + /* slurmctld error codes */ + ESLURM_INVALID_PARTITION_NAME = 2000, + ESLURM_DEFAULT_PARTITION_NOT_SET, + ESLURM_ACCESS_DENIED, + ESLURM_JOB_MISSING_REQUIRED_PARTITION_GROUP, + ESLURM_REQUESTED_NODES_NOT_IN_PARTITION, + ESLURM_TOO_MANY_REQUESTED_CPUS, + ESLURM_TOO_MANY_REQUESTED_NODES, + ESLURM_ERROR_ON_DESC_TO_RECORD_COPY, + ESLURM_JOB_MISSING_SIZE_SPECIFICATION, + ESLURM_JOB_SCRIPT_MISSING, + ESLURM_USER_ID_MISSING, + ESLURM_DUPLICATE_JOB_ID, + ESLURM_PATHNAME_TOO_LONG, + ESLURM_NOT_TOP_PRIORITY, + ESLURM_REQUESTED_NODE_CONFIG_UNAVAILABLE, + ESLURM_REQUESTED_PART_CONFIG_UNAVAILABLE, + ESLURM_NODES_BUSY, + ESLURM_INVALID_JOB_ID, + ESLURM_INVALID_NODE_NAME, + ESLURM_WRITING_TO_FILE, + ESLURM_TRANSITION_STATE_NO_UPDATE, + ESLURM_ALREADY_DONE, + ESLURM_INTERCONNECT_FAILURE, + ESLURM_BAD_DIST, + ESLURM_JOB_PENDING, + ESLURM_BAD_TASK_COUNT, + ESLURM_INVALID_JOB_CREDENTIAL, + ESLURM_IN_STANDBY_MODE, + ESLURM_INVALID_NODE_STATE, + ESLURM_INVALID_FEATURE, + ESLURM_INVALID_AUTHTYPE_CHANGE, + ESLURM_INVALID_CHECKPOINT_TYPE_CHANGE, + ESLURM_INVALID_SCHEDTYPE_CHANGE, + ESLURM_INVALID_SELECTTYPE_CHANGE, + ESLURM_INVALID_SWITCHTYPE_CHANGE, + ESLURM_FRAGMENTATION, + ESLURM_NOT_SUPPORTED, + ESLURM_DISABLED, + ESLURM_DEPENDENCY, + ESLURM_BATCH_ONLY, + ESLURM_TASKDIST_ARBITRARY_UNSUPPORTED, + ESLURM_TASKDIST_REQUIRES_OVERCOMMIT, + ESLURM_JOB_HELD, + + /* switch specific error codes, specific values defined in plugin module */ + ESLURM_SWITCH_MIN = 3000, + ESLURM_SWITCH_MAX = 3099, + ESLURM_JOBCOMP_MIN = 3100, + ESLURM_JOBCOMP_MAX = 3199, + ESLURM_SCHED_MIN = 3200, + ESLURM_SCHED_MAX = 3299, + /* reserved for other plugin specific error codes up to 3999 */ + + /* slurmd error codes */ + ESLRUMD_PIPE_ERROR_ON_TASK_SPAWN = 4000, + ESLURMD_KILL_TASK_FAILED, + ESLURMD_KILL_JOB_ALREADY_COMPLETE, + ESLURMD_INVALID_JOB_CREDENTIAL, + ESLURMD_UID_NOT_FOUND, + ESLURMD_GID_NOT_FOUND, + ESLURMD_CREDENTIAL_EXPIRED, + ESLURMD_CREDENTIAL_REVOKED, + ESLURMD_CREDENTIAL_REPLAYED, + ESLURMD_CREATE_BATCH_DIR_ERROR, + ESLURMD_MODIFY_BATCH_DIR_ERROR, + ESLURMD_CREATE_BATCH_SCRIPT_ERROR, + ESLURMD_MODIFY_BATCH_SCRIPT_ERROR, + ESLURMD_SETUP_ENVIRONMENT_ERROR, + ESLURMD_SHARED_MEMORY_ERROR, + ESLURMD_SET_UID_OR_GID_ERROR, + ESLURMD_SET_SID_ERROR, + ESLURMD_CANNOT_SPAWN_IO_THREAD, + ESLURMD_FORK_FAILED, + ESLURMD_EXECVE_FAILED, + ESLURMD_IO_ERROR, + ESLURMD_PROLOG_FAILED, + ESLURMD_EPILOG_FAILED, + ESLURMD_SESSION_KILLED, + ESLURMD_TOOMANYSTEPS, + ESLURMD_STEP_EXISTS, + ESLURMD_JOB_NOTRUNNING, + ESLURMD_STEP_SUSPENDED, + ESLURMD_STEP_NOTSUSPENDED, + + /* slurmd errors in user batch job */ + ESCRIPT_CHDIR_FAILED = 4100, + ESCRIPT_OPEN_OUTPUT_FAILED, + ESCRIPT_NON_ZERO_RETURN, + + /* socket specific SLURM communications error */ + SLURM_PROTOCOL_SOCKET_IMPL_ZERO_RECV_LENGTH = 5000, + SLURM_PROTOCOL_SOCKET_IMPL_NEGATIVE_RECV_LENGTH, + SLURM_PROTOCOL_SOCKET_IMPL_NOT_ALL_DATA_SENT, + ESLURM_PROTOCOL_INCOMPLETE_PACKET , + SLURM_PROTOCOL_SOCKET_IMPL_TIMEOUT , + SLURM_PROTOCOL_SOCKET_ZERO_BYTES_SENT, + + /* slurm_auth errors */ + ESLURM_AUTH_CRED_INVALID = 6000, + ESLURM_AUTH_FOPEN_ERROR, + ESLURM_AUTH_NET_ERROR, + ESLURM_AUTH_UNABLE_TO_SIGN +}; + +/* look up an errno value */ +char * slurm_strerror PARAMS((int errnum)); + +/* set an errno value */ +void slurm_seterrno PARAMS((int errnum)); + +/* get an errno value */ +int slurm_get_errno PARAMS((void)); + +/* print message: error string for current errno value */ +void slurm_perror PARAMS((char *msg)); + +END_C_DECLS + +#endif /* !_SLURM_ERRNO_H */ diff --git a/executable_names/slurm/spank.h b/executable_names/slurm/spank.h new file mode 100644 index 0000000000000000000000000000000000000000..d31fb6bb3bb847d2ff8a2297d7183cb2c0f7e603 --- /dev/null +++ b/executable_names/slurm/spank.h @@ -0,0 +1,271 @@ +/*****************************************************************************\ + * spank.h - Stackable Plug-in Architecture for Node job Kontrol + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#ifndef SPANK_H +#define SPANK_H + +#undef BEGIN_C_DECLS +#undef END_C_DECLS +#ifdef __cplusplus +# define BEGIN_C_DECLS extern "C" { +# define END_C_DECLS } +#else /* !__cplusplus */ +# define BEGIN_C_DECLS /* empty */ +# define END_C_DECLS /* empty */ +#endif /* !__cplusplus */ + +/* SPANK handle. Plug-in's context for running SLURM job + */ +typedef struct spank_handle * spank_t; + +/* Prototype for all spank plugin operations + */ +typedef int (spank_f) (spank_t spank, int ac, char *argv[]); + +/* SPANK plugin operations. SPANK plugin should have at least one of + * these functions defined non-NULL. + * + * Plug-in callbacks are completed at the following points in slurmd: + * + * slurmd -> slurmstepd + * `-> init () + * + drop privileges (initgroups(), seteuid(), chdir()) + * `-> user_init () + * + for each task + * | + fork () + * | `-> user_task_init () + * | + execve () + * | + * + reclaim privileges + * + for each task + * | `-> task_post_fork () + * | + * + for each task + * | + wait () + * | `-> task_exit () + * `-> fini () + * + */ + +extern spank_f slurm_spank_init; +extern spank_f slurm_spank_user_init; +extern spank_f slurm_spank_task_init; +extern spank_f slurm_spank_task_post_fork; +extern spank_f slurm_spank_task_exit; +extern spank_f slurm_spank_exit; + + +/* Items which may be obtained from the spank handle using the + * spank_get_item () call. The expected list of variable arguments may + * be found in the comments below. + * + * For example, S_JOB_NCPUS takes (uint16_t *), a pointer to uint16_t, so + * the get item call would look like: + * + * uint16_t ncpus; + * spank_err_t rc = spank_get_item (spank, S_JOB_NCPUS, &ncpus); + * + * while S_JOB_PID_TO_GLOBAL_ID takes (pid_t, uint32_t *), so it would + * be called as: + * + * uint32_t global_id; + * spank_err_t rc; + * rc = spank_get_item (spank, S_JOB_PID_TO_GLOBAL_ID, pid, &global_id); + */ +enum spank_item { + S_JOB_UID, /* User id (uid_t *) */ + S_JOB_GID, /* Primary group id (gid_t *) */ + S_JOB_ID, /* SLURM job id (uint32_t *) */ + S_JOB_STEPID, /* SLURM job step id (uint32_t *) */ + S_JOB_NNODES, /* Total number of nodes in job (uint32_t *) */ + S_JOB_NODEID, /* Relative id of this node (uint32_t *) */ + S_JOB_LOCAL_TASK_COUNT, /* Number of local tasks (uint32_t *) */ + S_JOB_TOTAL_TASK_COUNT, /* Total number of tasks in job (uint32_t *) */ + S_JOB_NCPUS, /* Number of CPUs used by this job (uint16_t *) */ + S_JOB_ARGV, /* Command args (int, char ***) */ + S_JOB_ENV, /* Job env array (char ***) */ + S_TASK_ID, /* Local task id (int *) */ + S_TASK_GLOBAL_ID, /* Global task id (uint32_t *) */ + S_TASK_EXIT_STATUS, /* Exit status of task if exited (int *) */ + S_TASK_PID, /* Task pid (pid_t *) */ + S_JOB_PID_TO_GLOBAL_ID, /* global task id from pid (pid_t, uint32_t *) */ + S_JOB_PID_TO_LOCAL_ID, /* local task id from pid (pid_t, uint32_t *) */ + S_JOB_LOCAL_TO_GLOBAL_ID,/* local id to global id (uint32_t, uint32_t *) */ + S_JOB_GLOBAL_TO_LOCAL_ID,/* global id to local id (uint32_t, uint32_t *) */ + S_JOB_SUPPLEMENTARY_GIDS /* Array of suppl. gids (gid_t **, int *) */ +}; + +typedef enum spank_item spank_item_t; + +/* SPANK error codes. + */ +enum spank_err { + ESPANK_SUCCESS = 0, /* Success. */ + ESPANK_ERROR = 1, /* Generic error. */ + ESPANK_BAD_ARG = 2, /* Bad argument. */ + ESPANK_NOT_TASK = 3, /* Not in task context. */ + ESPANK_ENV_EXISTS = 4, /* Environment variable exists && !overwrite */ + ESPANK_ENV_NOEXIST = 5, /* No such environment variable */ + ESPANK_NOSPACE = 6, /* Buffer too small. */ + ESPANK_NOT_REMOTE = 7, /* Function only may be called in remote context */ + ESPANK_NOEXIST = 8, /* Id/pid doesn't exist on this node */ + ESPANK_NOT_EXECD = 9 /* Lookup by pid requested, but no tasks running */ +}; + +typedef enum spank_err spank_err_t; + +/* + * SPANK plugin options + */ + +/* + * SPANK option callback. `val' is an integer value provided by + * the plugin to distinguish between plugin-local options, `optarg' + * is an argument passed by the user (if applicable), and `remote' + * specifies whether this call is being made locally (e.g. in srun) + * or remotely (e.g. in slurmd). + */ +typedef int (*spank_opt_cb_f) (int val, const char *optarg, int remote); + +struct spank_option { + char * name; /* long option provided by plugin */ + char * arginfo; /* one word description of argument if required */ + char * usage; /* Usage text */ + int has_arg; /* Does option require argument? */ + int val; /* value to return using callback */ + spank_opt_cb_f cb; /* Callback function to check option value */ +}; + +/* + * Plugin may declare spank_options option table: + */ +extern struct spank_option spank_options []; + +/* + * SPANK plugin option table must end with the following entry: + */ +#define SPANK_OPTIONS_TABLE_END { NULL, NULL, NULL, 0, 0, NULL } + +/* + * Maximum allowed length of SPANK option name: + */ +#define SPANK_OPTION_MAXLEN 75 + + +/* SPANK interface prototypes + */ +BEGIN_C_DECLS + +/* + * Determine whether plugin is loaded "local" or "remote." + * + * Returns: + * = 1 remote context, i.e. plugin is loaded in slurmd. + * = 0 local context, i.e. plugin loaded in srun. + * < 0 spank handle was not valid. + */ +int spank_remote (spank_t spank); + + +/* Get the value for the current job or task item specified, + * storing the result in the subsequent pointer argument(s). + * Refer to the spank_item_t comments for argument types. + * For S_JOB_ARGV and S_JOB_ENV items the result returned to + * the caller should not be freed or modified. + * + * Returns ESPANK_SUCCESS on success, ESPANK_NOTASK if an S_TASK* + * item is requested from outside a task context, ESPANK_BAD_ARG + * if invalid args are passed to spank_get_item, and + * ESPANK_NOT_REMOTE if not called from slurmd context. + */ +spank_err_t spank_get_item (spank_t spank, spank_item_t item, ...); + +/* Place a copy of environment variable "var" from the job's environment + * into buffer "buf" of size "len." + * + * Returns ESPANK_SUCCESS on success, o/w spank_err_t on failure: + * ESPANK_BAD_ARG = spank handle invalid or len < 0. + * ESPANK_ENV_NOEXIST = environment variable doesn't exist in job's env. + * ESPANK_NOSPACE = buffer too small, truncation occurred. + * ESPANK_NOT_REMOTE = not called in remote context (i.e. from slurmd). + */ +spank_err_t spank_getenv (spank_t spank, const char *var, char *buf, int len); + +/* + * Set the environment variable "var" to "val" in the environment of + * the current job or task in the spank handle. If overwrite != 0 an + * existing value for var will be overwritten. + * + * Returns ESPANK_SUCCESS on success, o/w spank_err_t on failure: + * ESPANK_ENV_EXISTS = var exists in job env and overwrite == 0. + * ESPANK_BAD_ARG = spank handle invalid or var/val are NULL. + * ESPANK_NOT_REMOTE = not called from slurmd. + */ +spank_err_t spank_setenv (spank_t spank, const char *var, const char *val, + int overwrite); + +/* + * Unset environment variable "var" in the environment of current job or + * task in the spank handle. + * + * Returns ESPANK_SUCCESS on sucess, o/w spank_err_t on failure: + * ESPANK_BAD_ARG = spank handle invalid or var is NULL. + * SPANK_NOT_REMOTE = not called from slurmd. + */ +spank_err_t spank_unsetenv (spank_t spank, const char *var); + +/* + * SLURM logging functions which are exported to plugins. + */ +extern void slurm_info (const char *format, ...); +extern void slurm_error (const char *format, ...); +extern void slurm_verbose (const char *format, ...); +extern void slurm_debug (const char *format, ...); +extern void slurm_debug2 (const char *format, ...); +extern void slurm_debug3 (const char *format, ...); + +END_C_DECLS + +/* + * All spank plugins must issue the following for the SLURM plugin + * loader. + */ +#define SPANK_PLUGIN(__name, __ver) \ + const char plugin_name [] = #__name; \ + const char plugin_type [] = "spank"; \ + const unsigned int plugin_version = __ver; + + +#endif /* !SPANK_H */ diff --git a/executable_names/src/Makefile.am b/executable_names/src/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..e64a539bdaee5f9187f5ac8916dbab79d0f55f49 --- /dev/null +++ b/executable_names/src/Makefile.am @@ -0,0 +1,4 @@ + +SUBDIRS = common api slurmctld slurmd plugins srun sacct sbcast \ + scontrol scancel squeue sinfo smap sview slaunch salloc sbatch sattach + diff --git a/executable_names/src/Makefile.in b/executable_names/src/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..c51f1d2c998105cb53a703651e4e7cc938486c62 --- /dev/null +++ b/executable_names/src/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +SUBDIRS = common api slurmctld slurmd plugins srun sacct sbcast \ + scontrol scancel squeue sinfo smap sview slaunch salloc sbatch sattach + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/api/Makefile.am b/executable_names/src/api/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..5786d011ae3400b44d757e1111a9ec9ef41e9970 --- /dev/null +++ b/executable_names/src/api/Makefile.am @@ -0,0 +1,122 @@ +# +# Makefile for slurm API library + +AUTOMAKE_OPTIONS = foreign + +INCLUDES = -I$(top_srcdir) + +if WITH_GNU_LD +VERSION_SCRIPT = \ + version.map +OTHER_FLAGS = \ + -Wl,--version-script=$(VERSION_SCRIPT) +endif + +# libslurm version information : +# +# Update META file information before a public release only! +# +# Note that libtool builds libslurm.so... +# where major = API_MAJOR = (API_CURRENT - API_AGE) +# and age = API_AGE +# and rev = API_REVISION +# +# The following examples are based upon initial values of API_CURRENT = 6, +# API_AGE = 4, API_REVISION = 6. +# +# If any interfaces have been added: increment API_CURRENT, increment API_AGE, +# and set API_REVISION = 0 (e.g. libslurm.so.2.4.6 -> libslurm.so.2.5.0) +# +# If any interfaces have been removed: increment API_CURRENT, set API_AGE = 0, +# and set API_REVISION = 0 (e.g. libslurm.so.2.4.6 -> libslurm.so.7.0.0) +# +# If any interfaces have changed: increment API_CURRENT only +# (e.g. libslurm.so.2.4.6 -> libslurm.so.3.4.6) +# +# If the interfaces have not changed, but underlying code has changed at all: +# increment API_REVISION only (e.g. libslurm.so.2.4.6 -> libslurm.so.2.4.7) +# +current = $(SLURM_API_CURRENT) +age = $(SLURM_API_AGE) +rev = $(SLURM_API_REVISION) + +lib_LTLIBRARIES = libslurm.la libpmi.la + +# BUILT_SOURCES tells automake that when "make" is called, these targets +# need to be built before anything else. For instance, this takes care +# of libpmi.la's dependency on libslurm.la, as long as you use "make" +# and NOT "make libpmi.la". +BUILT_SOURCES = $(VERSION_SCRIPT) libslurm.la + +# Note that libslurmhelper is mostly the same as libslurm, except that +# it exports ALL symbols, including those from libcommon, libeio, etc. +# Also, libslurmhelper is a convenience library, it is not installed. +noinst_LTLIBRARIES = libslurmhelper.la + +slurmapi_src = \ + allocate.c \ + cancel.c \ + checkpoint.c \ + complete.c \ + config_info.c \ + init_msg.c \ + job_info.c job_info.h \ + job_step_info.c \ + node_info.c \ + node_select_info.c node_select_info.h \ + partition_info.c \ + signal.c \ + slurm_pmi.c slurm_pmi.h \ + step_ctx.c step_ctx.h \ + step_io.c step_io.h \ + step_launch.c step_launch.h \ + pmi_server.c pmi_server.h \ + submit.c \ + suspend.c \ + reconfigure.c \ + update_config.c + +common_dir = $(top_builddir)/src/common + +slurmapi_add = \ + $(common_dir)/libcommon.la \ + $(common_dir)/libspank.la \ + $(common_dir)/libeio.la \ + -lpthread + +libslurm_la_SOURCES = $(slurmapi_src) +libslurm_la_LIBADD = $(slurmapi_add) +libslurm_la_LDFLAGS = \ + $(LIB_LDFLAGS) \ + -version-info $(current):$(rev):$(age) \ + $(OTHER_FLAGS) + +libslurmhelper_la_SOURCES = $(slurmapi_src) +libslurmhelper_la_LIBADD = $(slurmapi_add) +libslurmhelper_la_LDFLAGs = \ + $(LIB_LDFLAGS) \ + -version-info $(current):$(rev):$(age) + +libpmi_la_SOURCES = pmi.c +libpmi_la_LIBADD = $(top_builddir)/src/api/libslurm.la +libpmi_la_LDFLAGS = $(LIB_LDFLAGS) + +force: +$(libslurm_la_LIBADD) : force + @cd `dirname $@` && $(MAKE) `basename $@` + +# FIXME - don't export the client_io_handler_ symbols once srun is no longer +# calling them directly +$(VERSION_SCRIPT) : + (echo "{ global:"; \ + echo " islurm_*;"; \ + echo " slurm_*;"; \ + echo " client_io_handler_*;"; \ + echo " local: *;"; \ + echo "};") > $(VERSION_SCRIPT) + +CLEANFILES = \ + $(VERSION_SCRIPT) + +DISTCLEANFILES = \ + $(VERSION_SCRIPT) diff --git a/executable_names/src/api/Makefile.in b/executable_names/src/api/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..9bada56df42dc651959067c27ea7caf3400ea9a1 --- /dev/null +++ b/executable_names/src/api/Makefile.in @@ -0,0 +1,721 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for slurm API library + +SOURCES = $(libpmi_la_SOURCES) $(libslurm_la_SOURCES) $(libslurmhelper_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/api +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(libdir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libpmi_la_DEPENDENCIES = $(top_builddir)/src/api/libslurm.la +am_libpmi_la_OBJECTS = pmi.lo +libpmi_la_OBJECTS = $(am_libpmi_la_OBJECTS) +am__DEPENDENCIES_1 = $(common_dir)/libcommon.la \ + $(common_dir)/libspank.la $(common_dir)/libeio.la +libslurm_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am__objects_1 = allocate.lo cancel.lo checkpoint.lo complete.lo \ + config_info.lo init_msg.lo job_info.lo job_step_info.lo \ + node_info.lo node_select_info.lo partition_info.lo signal.lo \ + slurm_pmi.lo step_ctx.lo step_io.lo step_launch.lo \ + pmi_server.lo submit.lo suspend.lo reconfigure.lo \ + update_config.lo +am_libslurm_la_OBJECTS = $(am__objects_1) +libslurm_la_OBJECTS = $(am_libslurm_la_OBJECTS) +libslurmhelper_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libslurmhelper_la_OBJECTS = $(am__objects_1) +libslurmhelper_la_OBJECTS = $(am_libslurmhelper_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libpmi_la_SOURCES) $(libslurm_la_SOURCES) \ + $(libslurmhelper_la_SOURCES) +DIST_SOURCES = $(libpmi_la_SOURCES) $(libslurm_la_SOURCES) \ + $(libslurmhelper_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +INCLUDES = -I$(top_srcdir) +@WITH_GNU_LD_TRUE@VERSION_SCRIPT = \ +@WITH_GNU_LD_TRUE@ version.map + +@WITH_GNU_LD_TRUE@OTHER_FLAGS = \ +@WITH_GNU_LD_TRUE@ -Wl,--version-script=$(VERSION_SCRIPT) + + +# libslurm version information : +# +# Update META file information before a public release only! +# +# Note that libtool builds libslurm.so... +# where major = API_MAJOR = (API_CURRENT - API_AGE) +# and age = API_AGE +# and rev = API_REVISION +# +# The following examples are based upon initial values of API_CURRENT = 6, +# API_AGE = 4, API_REVISION = 6. +# +# If any interfaces have been added: increment API_CURRENT, increment API_AGE, +# and set API_REVISION = 0 (e.g. libslurm.so.2.4.6 -> libslurm.so.2.5.0) +# +# If any interfaces have been removed: increment API_CURRENT, set API_AGE = 0, +# and set API_REVISION = 0 (e.g. libslurm.so.2.4.6 -> libslurm.so.7.0.0) +# +# If any interfaces have changed: increment API_CURRENT only +# (e.g. libslurm.so.2.4.6 -> libslurm.so.3.4.6) +# +# If the interfaces have not changed, but underlying code has changed at all: +# increment API_REVISION only (e.g. libslurm.so.2.4.6 -> libslurm.so.2.4.7) +# +current = $(SLURM_API_CURRENT) +age = $(SLURM_API_AGE) +rev = $(SLURM_API_REVISION) +lib_LTLIBRARIES = libslurm.la libpmi.la + +# BUILT_SOURCES tells automake that when "make" is called, these targets +# need to be built before anything else. For instance, this takes care +# of libpmi.la's dependency on libslurm.la, as long as you use "make" +# and NOT "make libpmi.la". +BUILT_SOURCES = $(VERSION_SCRIPT) libslurm.la + +# Note that libslurmhelper is mostly the same as libslurm, except that +# it exports ALL symbols, including those from libcommon, libeio, etc. +# Also, libslurmhelper is a convenience library, it is not installed. +noinst_LTLIBRARIES = libslurmhelper.la +slurmapi_src = \ + allocate.c \ + cancel.c \ + checkpoint.c \ + complete.c \ + config_info.c \ + init_msg.c \ + job_info.c job_info.h \ + job_step_info.c \ + node_info.c \ + node_select_info.c node_select_info.h \ + partition_info.c \ + signal.c \ + slurm_pmi.c slurm_pmi.h \ + step_ctx.c step_ctx.h \ + step_io.c step_io.h \ + step_launch.c step_launch.h \ + pmi_server.c pmi_server.h \ + submit.c \ + suspend.c \ + reconfigure.c \ + update_config.c + +common_dir = $(top_builddir)/src/common +slurmapi_add = \ + $(common_dir)/libcommon.la \ + $(common_dir)/libspank.la \ + $(common_dir)/libeio.la \ + -lpthread + +libslurm_la_SOURCES = $(slurmapi_src) +libslurm_la_LIBADD = $(slurmapi_add) +libslurm_la_LDFLAGS = \ + $(LIB_LDFLAGS) \ + -version-info $(current):$(rev):$(age) \ + $(OTHER_FLAGS) + +libslurmhelper_la_SOURCES = $(slurmapi_src) +libslurmhelper_la_LIBADD = $(slurmapi_add) +libslurmhelper_la_LDFLAGs = \ + $(LIB_LDFLAGS) \ + -version-info $(current):$(rev):$(age) + +libpmi_la_SOURCES = pmi.c +libpmi_la_LIBADD = $(top_builddir)/src/api/libslurm.la +libpmi_la_LDFLAGS = $(LIB_LDFLAGS) +CLEANFILES = \ + $(VERSION_SCRIPT) + +DISTCLEANFILES = \ + $(VERSION_SCRIPT) + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/api/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/api/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libpmi.la: $(libpmi_la_OBJECTS) $(libpmi_la_DEPENDENCIES) + $(LINK) -rpath $(libdir) $(libpmi_la_LDFLAGS) $(libpmi_la_OBJECTS) $(libpmi_la_LIBADD) $(LIBS) +libslurm.la: $(libslurm_la_OBJECTS) $(libslurm_la_DEPENDENCIES) + $(LINK) -rpath $(libdir) $(libslurm_la_LDFLAGS) $(libslurm_la_OBJECTS) $(libslurm_la_LIBADD) $(LIBS) +libslurmhelper.la: $(libslurmhelper_la_OBJECTS) $(libslurmhelper_la_DEPENDENCIES) + $(LINK) $(libslurmhelper_la_LDFLAGS) $(libslurmhelper_la_OBJECTS) $(libslurmhelper_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allocate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cancel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkpoint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complete.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_msg.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_step_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node_select_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pmi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pmi_server.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reconfigure.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_pmi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/step_ctx.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/step_io.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/step_launch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/submit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/suspend.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/update_config.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-libLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ + ctags distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-libLTLIBRARIES install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am uninstall-libLTLIBRARIES + + +force: +$(libslurm_la_LIBADD) : force + @cd `dirname $@` && $(MAKE) `basename $@` + +# FIXME - don't export the client_io_handler_ symbols once srun is no longer +# calling them directly +$(VERSION_SCRIPT) : + (echo "{ global:"; \ + echo " islurm_*;"; \ + echo " slurm_*;"; \ + echo " client_io_handler_*;"; \ + echo " local: *;"; \ + echo "};") > $(VERSION_SCRIPT) +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/api/allocate.c b/executable_names/src/api/allocate.c new file mode 100644 index 0000000000000000000000000000000000000000..54862e13b0bc8642980b8a212ef4839c17df1fc5 --- /dev/null +++ b/executable_names/src/api/allocate.c @@ -0,0 +1,747 @@ +/*****************************************************************************\ + * allocate.c - allocate nodes for a job or step with supplied contraints + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include /* for ntohs() */ + +#ifndef __USE_XOPEN_EXTENDED +extern pid_t getsid(pid_t pid); /* missing from */ +#endif + +#include +#include + +#include "src/common/read_config.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/hostlist.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/forward.h" +#include "src/common/fd.h" +#include "src/common/slurm_auth.h" + +#define BUFFER_SIZE 1024 +#define MAX_ALLOC_WAIT 60 /* seconds */ +#define MIN_ALLOC_WAIT 5 /* seconds */ + +typedef struct { + slurm_addr address; + int fd; + char *hostname; + uint16_t port; +} listen_t; + +static int _handle_rc_msg(slurm_msg_t *msg); +static listen_t *_create_allocation_response_socket(); +static void _destroy_allocation_response_socket(listen_t *listen); +static resource_allocation_response_msg_t *_wait_for_allocation_response( + uint32_t job_id, const listen_t *listen, int timeout); + +/* + * slurm_allocate_resources - allocate resources for a job request + * IN job_desc_msg - description of resource allocation request + * OUT slurm_alloc_msg - response to request + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the allocated using slurm_free_resource_allocation_response_msg + */ +int +slurm_allocate_resources (job_desc_msg_t *req, + resource_allocation_response_msg_t **resp) +{ + int rc; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + bool host_set = false; + char host[64]; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + /* + * set Node and session id for this request + */ + if (req->alloc_sid == NO_VAL) + req->alloc_sid = getsid(0); + + if ( (req->alloc_node == NULL) + && (getnodename(host, sizeof(host)) == 0) ) { + req->alloc_node = host; + host_set = true; + } + + req_msg.msg_type = REQUEST_RESOURCE_ALLOCATION; + req_msg.data = req; + + rc = slurm_send_recv_controller_msg(&req_msg, &resp_msg); + + /* + * Clear this hostname if set internally to this function + * (memory is on the stack) + */ + if (host_set) + req->alloc_node = NULL; + + if (rc == SLURM_SOCKET_ERROR) + return SLURM_SOCKET_ERROR; + + switch (resp_msg.msg_type) { + case RESPONSE_SLURM_RC: + if (_handle_rc_msg(&resp_msg) < 0) + return SLURM_PROTOCOL_ERROR; + *resp = NULL; + break; + case RESPONSE_RESOURCE_ALLOCATION: + *resp = (resource_allocation_response_msg_t *) resp_msg.data; + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + } + + return SLURM_PROTOCOL_SUCCESS; +} + + +/* + * slurm_allocate_resources_blocking + * allocate resources for a job request. This call will block until + * the allocation is granted, or the specified timeout limit is reached. + * IN req - description of resource allocation request + * IN timeout - amount of time, in seconds, to wait for a response before + * giving up. + * A timeout of zero will wait indefinitely. + * IN pending_callback - If the allocation cannot be granted immediately, + * the controller will put the job in the PENDING state. If + * pending callback is not NULL, it will be called with the job_id + * of the pending job as the sole parameter. + * + * RET allocation structure on success, NULL on error set errno to + * indicate the error (errno will be ETIMEDOUT if the timeout is reached + * with no allocation granted) + * NOTE: free the allocation structure using + * slurm_free_resource_allocation_response_msg + */ +resource_allocation_response_msg_t * +slurm_allocate_resources_blocking (const job_desc_msg_t *user_req, + time_t timeout, + void(*pending_callback)(uint32_t job_id)) +{ + int rc; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + resource_allocation_response_msg_t *resp = NULL; + char *hostname = NULL; + uint32_t job_id; + job_desc_msg_t *req; + listen_t *listen = NULL; + int errnum = SLURM_SUCCESS; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + /* make a copy of the user's job description struct so that we + * can make changes before contacting the controller */ + req = (job_desc_msg_t *)xmalloc(sizeof(job_desc_msg_t)); + if (req == NULL) + return NULL; + memcpy(req, user_req, sizeof(job_desc_msg_t)); + + /* + * set Node and session id for this request + */ + if (req->alloc_sid == NO_VAL) + req->alloc_sid = getsid(0); + + if (user_req->alloc_node != NULL) { + req->alloc_node = xstrdup(user_req->alloc_node); + } else if ((hostname = xshort_hostname()) != NULL) { + req->alloc_node = hostname; + } else { + error("Could not get local hostname," + " forcing immediate allocation mode."); + req->immediate = 1; + } + + if (!req->immediate) { + listen = _create_allocation_response_socket(hostname); + if (listen == NULL) { + xfree(req); + return NULL; + } + req->alloc_resp_hostname = listen->hostname; + req->alloc_resp_port = listen->port; + } + + req_msg.msg_type = REQUEST_RESOURCE_ALLOCATION; + req_msg.data = req; + + rc = slurm_send_recv_controller_msg(&req_msg, &resp_msg); + + if (rc == SLURM_SOCKET_ERROR) { + int errnum = errno; + destroy_forward(&req_msg.forward); + destroy_forward(&resp_msg.forward); + if (!req->immediate) + _destroy_allocation_response_socket(listen); + xfree(req); + errno = errnum; + return NULL; + } + + switch (resp_msg.msg_type) { + case RESPONSE_SLURM_RC: + if (_handle_rc_msg(&resp_msg) < 0) { + /* will reach this when the allocation fails */ + errnum = errno; + } else { + /* shouldn't get here */ + errnum = -1; + } + break; + case RESPONSE_RESOURCE_ALLOCATION: + /* Yay, the controller has acknowledge our request! But did + we really get an allocation yet? */ + resp = (resource_allocation_response_msg_t *) resp_msg.data; + if (resp->node_cnt > 0) { + /* yes, allocation has been granted */ + errno = SLURM_PROTOCOL_SUCCESS; + } else if (!req->immediate) { + /* no, we need to wait for a response */ + job_id = resp->job_id; + slurm_free_resource_allocation_response_msg(resp); + if (pending_callback != NULL) + pending_callback(job_id); + resp = _wait_for_allocation_response(job_id, listen, + timeout); + /* If NULL, we didn't get the allocation in + the time desired, so just free the job id */ + if (resp == NULL) { + errnum = errno; + slurm_complete_job(job_id, -1); + } + } + break; + default: + errnum = SLURM_UNEXPECTED_MSG_ERROR; + return NULL; + } + + destroy_forward(&req_msg.forward); + destroy_forward(&resp_msg.forward); + if (!req->immediate) + _destroy_allocation_response_socket(listen); + xfree(req); + errno = errnum; + return resp; +} + + +/* + * slurm_job_will_run - determine if a job would execute immediately if + * submitted now + * IN job_desc_msg - description of resource allocation request + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +int slurm_job_will_run (job_desc_msg_t *req) +{ + slurm_msg_t req_msg; + int rc; + + /* req.immediate = true; implicit */ + slurm_msg_t_init(&req_msg); + req_msg.msg_type = REQUEST_JOB_WILL_RUN; + req_msg.data = req; + + if (slurm_send_recv_controller_rc_msg(&req_msg, &rc) < 0) + return SLURM_SOCKET_ERROR; + + if (rc) + slurm_seterrno_ret(rc); + + return SLURM_PROTOCOL_SUCCESS; +} + +/* + * slurm_job_step_create - create a job step for a given job id + * IN slurm_step_alloc_req_msg - description of job step request + * OUT slurm_step_alloc_resp_msg - response to request + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the response using slurm_free_job_step_create_response_msg + */ +int +slurm_job_step_create (job_step_create_request_msg_t *req, + job_step_create_response_msg_t **resp) +{ + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + req_msg.msg_type = REQUEST_JOB_STEP_CREATE; + req_msg.data = req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch (resp_msg.msg_type) { + case RESPONSE_SLURM_RC: + if (_handle_rc_msg(&resp_msg) < 0) + return SLURM_PROTOCOL_ERROR; + *resp = NULL; + break; + case RESPONSE_JOB_STEP_CREATE: + *resp = (job_step_create_response_msg_t *) resp_msg.data; + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_PROTOCOL_SUCCESS ; +} + +/* + * slurm_allocation_lookup - retrieve info for an existing resource allocation + * IN jobid - job allocation identifier + * OUT info - job allocation information + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the "resp" using slurm_free_resource_allocation_response_msg + */ +int +slurm_allocation_lookup(uint32_t jobid, + job_alloc_info_response_msg_t **info) +{ + job_alloc_info_msg_t req; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + + req.job_id = jobid; + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + req_msg.msg_type = REQUEST_JOB_ALLOCATION_INFO; + req_msg.data = &req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch(resp_msg.msg_type) { + case RESPONSE_SLURM_RC: + if (_handle_rc_msg(&resp_msg) < 0) + return SLURM_ERROR; + *info = NULL; + break; + case RESPONSE_JOB_ALLOCATION_INFO: + *info = (job_alloc_info_response_msg_t *)resp_msg.data; + return SLURM_PROTOCOL_SUCCESS; + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_PROTOCOL_SUCCESS; +} + +/* + * slurm_allocation_lookup_lite - retrieve info for an existing resource + * allocation with out the addrs and such + * IN jobid - job allocation identifier + * OUT info - job allocation information + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the "resp" using slurm_free_resource_allocation_response_msg + */ +int +slurm_allocation_lookup_lite(uint32_t jobid, + resource_allocation_response_msg_t **info) +{ + job_alloc_info_msg_t req; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + + req.job_id = jobid; + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + req_msg.msg_type = REQUEST_JOB_ALLOCATION_INFO_LITE; + req_msg.data = &req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch(resp_msg.msg_type) { + case RESPONSE_SLURM_RC: + if (_handle_rc_msg(&resp_msg) < 0) + return SLURM_ERROR; + *info = NULL; + break; + case RESPONSE_JOB_ALLOCATION_INFO_LITE: + *info = (resource_allocation_response_msg_t *) resp_msg.data; + return SLURM_PROTOCOL_SUCCESS; + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_PROTOCOL_SUCCESS; +} + +/* + * Handle a return code message type. + * if return code is nonzero, sets errno to return code and returns < 0. + * Otherwise, returns 0 (SLURM_SUCCES) + */ +static int +_handle_rc_msg(slurm_msg_t *msg) +{ + int rc = ((return_code_msg_t *) msg->data)->return_code; + slurm_free_return_code_msg(msg->data); + + if (rc) + slurm_seterrno_ret(rc); + else + return SLURM_SUCCESS; +} + +/* + * Read a SLURM hostfile specified by "filename". "filename" must contain + * a list of SLURM NodeNames, one per line. Reads up to "n" number of hostnames + * from the file. Returns a string representing a hostlist ranged string of + * the contents of the file. This is a helper function, it does not + * contact any SLURM daemons. + * + * Returns a string representing the hostlist. Returns NULL if there are fewer + * than "n" hostnames in the file, or if an error occurs. + * + * Returned string must be freed with free(). + */ +char *slurm_read_hostfile(char *filename, int n) +{ + FILE *fp = NULL; + char in_line[BUFFER_SIZE]; /* input line */ + int i, j; + int line_size; + int line_num = 0; + hostlist_t hostlist = NULL; + char *nodelist = NULL; + + if (filename == NULL || strlen(filename) == 0) + return NULL; + + if((fp = fopen(filename, "r")) == NULL) { + error("slurm_allocate_resources error opening file %s, %m", + filename); + return NULL; + } + + hostlist = hostlist_create(NULL); + if (hostlist == NULL) + return NULL; + + while (fgets(in_line, BUFFER_SIZE, fp) != NULL) { + line_num++; + line_size = strlen(in_line); + if (line_size == (BUFFER_SIZE - 1)) { + error ("Line %d, of hostfile %s too long", + line_num, filename); + fclose (fp); + return NULL; + } + + for (i = 0; i < line_size; i++) { + if (in_line[i] == '\n') { + in_line[i] = '\0'; + break; + } + if (in_line[i] == '\0') + break; + if (in_line[i] != '#') + continue; + if ((i > 0) && (in_line[i - 1] == '\\')) { + for (j = i; j < line_size; j++) { + in_line[j - 1] = in_line[j]; + } + line_size--; + continue; + } + in_line[i] = '\0'; + break; + } + + hostlist_push(hostlist, in_line); + if(hostlist_count(hostlist) == n) + break; + } + fclose(fp); + + if (hostlist_count(hostlist) <= 0) { + error("Hostlist is empty!\n"); + goto cleanup_hostfile; + } + if (hostlist_count(hostlist) < n) { + error("Too few NodeNames in SLURM Hostfile"); + goto cleanup_hostfile; + } + + nodelist = (char *)malloc(0xffff); + if (!nodelist) { + error("Nodelist xmalloc failed"); + goto cleanup_hostfile; + } + + if (hostlist_ranged_string(hostlist, 0xffff, nodelist) == -1) { + error("Hostlist is too long for the allocate RPC!"); + free(nodelist); + nodelist = NULL; + goto cleanup_hostfile; + } + + debug2("Hostlist from SLURM_HOSTFILE = %s\n", nodelist); + +cleanup_hostfile: + hostlist_destroy(hostlist); + + return nodelist; +} + +/*************************************************************************** + * Support functions for slurm_allocate_resources_blocking() + ***************************************************************************/ +static listen_t *_create_allocation_response_socket(char *interface_hostname) +{ + listen_t *listen = NULL; + + listen = xmalloc(sizeof(listen_t)); + if (listen == NULL) + return NULL; + + /* port "0" lets the operating system pick any port */ + slurm_set_addr(&listen->address, 0, interface_hostname); + if ((listen->fd = slurm_init_msg_engine(&listen->address)) < 0) { + error("slurm_init_msg_engine_port error %m"); + return NULL; + } + if (slurm_get_stream_addr(listen->fd, &listen->address) < 0) { + error("slurm_get_stream_addr error %m"); + slurm_shutdown_msg_engine(listen->fd); + return NULL; + } + listen->hostname = xstrdup(interface_hostname); + /* FIXME - screw it! I can't seem to get the port number through + slurm_* functions */ + listen->port = ntohs(listen->address.sin_port); + fd_set_nonblocking(listen->fd); + + return listen; +} + +static void _destroy_allocation_response_socket(listen_t *listen) +{ + xassert(listen != NULL); + + slurm_shutdown_msg_engine(listen->fd); + if (listen->hostname) + xfree(listen->hostname); + xfree(listen); +} + +/* process RPC from slurmctld + * IN msg: message recieved + * OUT resp: resource allocation response message + * RET 1 if resp is filled in, 0 otherwise */ +static int +_handle_msg(slurm_msg_t *msg, resource_allocation_response_msg_t **resp) +{ + uid_t req_uid = g_slurm_auth_get_uid(msg->auth_cred); + uid_t uid = getuid(); + uid_t slurm_uid = (uid_t) slurm_get_slurm_user_id(); + int rc = 0; + + if ((req_uid != slurm_uid) && (req_uid != 0) && (req_uid != uid)) { + error ("Security violation, slurm message from uid %u", + (unsigned int) req_uid); + return 0; + } + + switch (msg->msg_type) { + case RESPONSE_RESOURCE_ALLOCATION: + debug2("resource allocation response received"); + slurm_send_rc_msg(msg, SLURM_SUCCESS); + *resp = msg->data; + rc = 1; + break; + default: + error("received spurious message type: %d\n", + msg->msg_type); + } + return rc; +} + +/* Accept RPC from slurmctld and process it. + * IN slurmctld_fd: file descriptor for slurmctld communications + * OUT resp: resource allocation response message + * RET 1 if resp is filled in, 0 otherwise */ +static int +_accept_msg_connection(int listen_fd, + resource_allocation_response_msg_t **resp) +{ + int conn_fd; + slurm_msg_t *msg = NULL; + slurm_addr cli_addr; + char host[256]; + uint16_t port; + int rc = 0; + + conn_fd = slurm_accept_msg_conn(listen_fd, &cli_addr); + if (conn_fd < 0) { + error("Unable to accept connection: %m"); + return rc; + } + + slurm_get_addr(&cli_addr, &port, host, sizeof(host)); + debug2("got message connection from %s:%d", host, port); + + msg = xmalloc(sizeof(slurm_msg_t)); + slurm_msg_t_init(msg); + + if((rc = slurm_receive_msg(conn_fd, msg, 0)) != 0) { + slurm_free_msg(msg); + + if (errno == EINTR) { + slurm_close_accepted_conn(conn_fd); + *resp = NULL; + return 0; + } + + error("_accept_msg_connection[%s]: %m", host); + return SLURM_ERROR; + } + + rc = _handle_msg(msg, resp); /* handle_msg frees msg */ + slurm_free_msg(msg); + + slurm_close_accepted_conn(conn_fd); + return rc; +} + +/* Wait up to sleep_time for RPC from slurmctld indicating resource allocation + * has occured. + * IN sleep_time: delay in seconds (0 means unbounded wait) + * OUT resp: resource allocation response message + * RET 1 if resp is filled in, 0 otherwise */ +static int +_wait_for_alloc_rpc(const listen_t *listen, int sleep_time, + resource_allocation_response_msg_t **resp) +{ + struct pollfd fds[1]; + int rc; + int timeout_ms; + + fds[0].fd = listen->fd; + fds[0].events = POLLIN; + + if (sleep_time != 0) { + timeout_ms = sleep_time * 1000; + } else { + timeout_ms = -1; + } + while ((rc = poll(fds, 1, timeout_ms)) < 0) { + switch (errno) { + case EAGAIN: + case EINTR: + *resp = NULL; + return -1; + case ENOMEM: + case EINVAL: + case EFAULT: + error("poll: %m"); + *resp = NULL; + return -1; + default: + error("poll: %m. Continuing..."); + } + } + + if (rc == 0) { /* poll timed out */ + errno = ETIMEDOUT; + } else if (fds[0].revents & POLLIN) { + return (_accept_msg_connection(listen->fd, resp)); + } + + return 0; +} + +static resource_allocation_response_msg_t * +_wait_for_allocation_response(uint32_t job_id, const listen_t *listen, + int timeout) +{ + resource_allocation_response_msg_t *resp = NULL; + int errnum; + + debug("job %u queued and waiting for resources", job_id); + if (_wait_for_alloc_rpc(listen, timeout, &resp) <= 0) { + errnum = errno; + /* Maybe the resource allocation response RPC got lost + * in the mail; surely it should have arrived by now. + * Let's see if the controller thinks that the allocation + * has been granted. + */ + if (slurm_allocation_lookup_lite(job_id, &resp) >= 0) { + return resp; + } + if (slurm_get_errno() == ESLURM_JOB_PENDING) { + debug3("Still waiting for allocation"); + errno = errnum; + return NULL; + } else { + debug3("Unable to confirm allocation for job %u: %m", + job_id); + return NULL; + } + } + + return resp; +} diff --git a/executable_names/src/api/cancel.c b/executable_names/src/api/cancel.c new file mode 100644 index 0000000000000000000000000000000000000000..c4bf682ff1bc291fff9986ff5befa8873a7c925c --- /dev/null +++ b/executable_names/src/api/cancel.c @@ -0,0 +1,119 @@ +/*****************************************************************************\ + * cancel.c - cancel a slurm job or job step + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "src/common/macros.h" +#include "src/common/slurm_protocol_api.h" + +/* + * slurm_kill_job - send the specified signal to all steps of an existing job + * IN job_id - the job's id + * IN signal - signal number + * IN batch_flag - 1 to signal batch shell only, otherwise 0 + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +int +slurm_kill_job ( uint32_t job_id, uint16_t signal, uint16_t batch_flag ) +{ + int rc; + slurm_msg_t msg; + job_step_kill_msg_t req; + + slurm_msg_t_init(&msg); + /* + * Request message: + */ + req.job_id = job_id; + req.job_step_id = NO_VAL; + req.signal = signal; + req.batch_flag = (uint16_t) batch_flag; + msg.msg_type = REQUEST_CANCEL_JOB_STEP; + msg.data = &req; + + if (slurm_send_recv_controller_rc_msg(&msg, &rc) < 0) + return SLURM_FAILURE; + + if (rc) + slurm_seterrno_ret(rc); + + return SLURM_SUCCESS; +} + +/* + * Kill a job step with job id "job_id" and step id "step_id", optionally + * sending the processes in the job step a signal "signal" + * IN job_id - the job's id + * IN step_id - the job step's id + * IN signal - signal number + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +int +slurm_kill_job_step (uint32_t job_id, uint32_t step_id, uint16_t signal) +{ + int rc; + slurm_msg_t msg; + job_step_kill_msg_t req; + + slurm_msg_t_init(&msg); + /* + * Request message: + */ + req.job_id = job_id; + req.job_step_id = step_id; + req.signal = signal; + req.batch_flag = false; + msg.msg_type = REQUEST_CANCEL_JOB_STEP; + msg.data = &req; + + if (slurm_send_recv_controller_rc_msg(&msg, &rc) < 0) + return SLURM_FAILURE; + + if (rc) + slurm_seterrno_ret(rc); + + return SLURM_SUCCESS; +} diff --git a/executable_names/src/api/checkpoint.c b/executable_names/src/api/checkpoint.c new file mode 100644 index 0000000000000000000000000000000000000000..fb76c9e56f65db9c7209c1dbb95001e324966d83 --- /dev/null +++ b/executable_names/src/api/checkpoint.c @@ -0,0 +1,296 @@ +/*****************************************************************************\ + * checkpoint.c - Process checkpoint related functions. + * $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "src/common/checkpoint.h" +#include "src/common/slurm_protocol_api.h" + +static int _handle_rc_msg(slurm_msg_t *msg); +static int _checkpoint_op (uint16_t op, uint16_t data, + uint32_t job_id, uint32_t step_id); +/* + * _checkpoint_op - perform many checkpoint operation for some job step. + * IN op - operation to perform + * IN data - operation-specific data + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * RET 0 or a slurm error code + */ +static int _checkpoint_op (uint16_t op, uint16_t data, + uint32_t job_id, uint32_t step_id) +{ + int rc; + checkpoint_msg_t ckp_req; + slurm_msg_t req_msg; + + slurm_msg_t_init(&req_msg); + ckp_req.op = op; + ckp_req.data = data; + ckp_req.job_id = job_id; + ckp_req.step_id = step_id; + req_msg.msg_type = REQUEST_CHECKPOINT; + req_msg.data = &ckp_req; + + if (slurm_send_recv_controller_rc_msg(&req_msg, &rc) < 0) + return SLURM_ERROR; + + slurm_seterrno(rc); + return rc; +} + +/* + * slurm_checkpoint_able - determine if the specified job step can presently + * be checkpointed + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * OUT start_time - time at which checkpoint request was issued + * RET 0 (can be checkpoined) or a slurm error code + */ +extern int slurm_checkpoint_able (uint32_t job_id, uint32_t step_id, + time_t *start_time) +{ + int rc; + slurm_msg_t req_msg, resp_msg; + checkpoint_msg_t ckp_req; + checkpoint_resp_msg_t *resp; + + ckp_req.op = CHECK_ABLE; + ckp_req.job_id = job_id; + ckp_req.step_id = step_id; + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + req_msg.msg_type = REQUEST_CHECKPOINT; + req_msg.data = &ckp_req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch(resp_msg.msg_type) { + case RESPONSE_CHECKPOINT: + resp = (checkpoint_resp_msg_t *) resp_msg.data; + *start_time = resp->event_time; + slurm_free_checkpoint_resp_msg(resp_msg.data); + rc = SLURM_SUCCESS; + break; + case RESPONSE_SLURM_RC: + rc = _handle_rc_msg(&resp_msg); + break; + default: + *start_time = (time_t) NULL; + rc = SLURM_ERROR; + } + return rc; +} + +/* + * slurm_checkpoint_disable - disable checkpoint requests for some job step + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_disable (uint32_t job_id, uint32_t step_id) +{ + return _checkpoint_op (CHECK_DISABLE, 0, job_id, step_id); +} + + +/* + * slurm_checkpoint_enable - enable checkpoint requests for some job step + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_enable (uint32_t job_id, uint32_t step_id) +{ + return _checkpoint_op (CHECK_ENABLE, 0, job_id, step_id); +} + +/* + * slurm_checkpoint_create - initiate a checkpoint requests for some job step. + * the job will continue execution after the checkpoint operation completes + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * IN max_wait - maximum wait for operation to complete, in seconds + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_create (uint32_t job_id, uint32_t step_id, + uint16_t max_wait) +{ + return _checkpoint_op (CHECK_CREATE, max_wait, job_id, step_id); +} + +/* + * slurm_checkpoint_vacate - initiate a checkpoint requests for some job step. + * the job will terminate after the checkpoint operation completes + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * IN max_wait - maximum wait for operation to complete, in seconds + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_vacate (uint32_t job_id, uint32_t step_id, + uint16_t max_wait) +{ + return _checkpoint_op (CHECK_VACATE, max_wait, job_id, step_id); +} + +/* + * slurm_checkpoint_restart - restart execution of a checkpointed job step. + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_restart (uint32_t job_id, uint32_t step_id) +{ + return _checkpoint_op (CHECK_RESTART, 0, job_id, step_id); +} + +/* + * slurm_checkpoint_complete - note the completion of a job step's checkpoint + * operation. + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * IN begin_time - time at which checkpoint began + * IN error_code - error code, highest value for all complete calls is preserved + * IN error_msg - error message, preserved for highest error_code + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_complete (uint32_t job_id, uint32_t step_id, + time_t begin_time, uint32_t error_code, char *error_msg) +{ + int rc; + slurm_msg_t msg; + checkpoint_comp_msg_t req; + + slurm_msg_t_init(&msg); + req.job_id = job_id; + req.step_id = step_id; + req.begin_time = begin_time; + req.error_code = error_code; + req.error_msg = error_msg; + msg.msg_type = REQUEST_CHECKPOINT_COMP; + msg.data = &req; + + if (slurm_send_recv_controller_rc_msg(&msg, &rc) < 0) + return SLURM_ERROR; + if (rc) + slurm_seterrno_ret(rc); + return SLURM_SUCCESS; +} + +/* + * slurm_checkpoint_error - gather error information for the last checkpoint + * operation for some job step + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * OUT error_code - error number associated with the last checkpoint operation, + * this value is dependent upon the checkpoint plugin used and may be + * completely unrelated to slurm error codes, the highest value for all + * complete calls is preserved + * OUT error_msg - error message, preserved for highest error_code, value + * must be freed by the caller to prevent memory leak + * RET 0 or a slurm error code + */ +extern int slurm_checkpoint_error ( uint32_t job_id, uint32_t step_id, + uint32_t *error_code, char **error_msg) +{ + int rc; + slurm_msg_t msg; + checkpoint_msg_t req; + slurm_msg_t resp_msg; + checkpoint_resp_msg_t *ckpt_resp; + + if ((error_code == NULL) || (error_msg == NULL)) + return EINVAL; + + /* + * Request message: + */ + req.op = CHECK_ERROR; + req.job_id = job_id; + req.step_id = step_id; + slurm_msg_t_init(&msg); + slurm_msg_t_init(&resp_msg); + msg.msg_type = REQUEST_CHECKPOINT; + msg.data = &req; + + rc = slurm_send_recv_controller_msg(&msg, &resp_msg); + + if (rc == SLURM_SOCKET_ERROR) + return rc; + + switch (resp_msg.msg_type) { + case RESPONSE_SLURM_RC: + *error_code = 0; + *error_msg = strdup(""); + rc = _handle_rc_msg(&resp_msg); + break; + case RESPONSE_CHECKPOINT: + ckpt_resp = (checkpoint_resp_msg_t *) resp_msg.data; + *error_code = ckpt_resp->error_code; + if (ckpt_resp->error_msg) + *error_msg = strdup(ckpt_resp->error_msg); + else + *error_msg = strdup(""); + slurm_free_checkpoint_resp_msg(ckpt_resp); + rc = SLURM_SUCCESS; + break; + default: + rc = SLURM_UNEXPECTED_MSG_ERROR; + } + + return rc; +} + +/* + * Handle a return code message type. + * Sets errno to return code and returns it + */ +static int +_handle_rc_msg(slurm_msg_t *msg) +{ + int rc = ((return_code_msg_t *) msg->data)->return_code; + slurm_free_return_code_msg(msg->data); + slurm_seterrno(rc); + return rc; +} diff --git a/executable_names/src/api/complete.c b/executable_names/src/api/complete.c new file mode 100644 index 0000000000000000000000000000000000000000..3a4c39641749888587a8c3250166c2830c6e4803 --- /dev/null +++ b/executable_names/src/api/complete.c @@ -0,0 +1,79 @@ +/*****************************************************************************\ + * complete.c - note the completion a slurm job or job step + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "src/common/read_config.h" +#include "src/common/slurm_protocol_api.h" + +/* + * slurm_complete_job - note the completion of a job allocation + * IN job_id - the job's id + * IN job_return_code - the highest exit code of any task of the job + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +int +slurm_complete_job ( uint32_t job_id, uint32_t job_return_code ) +{ + int rc; + slurm_msg_t req_msg; + complete_job_allocation_msg_t req; + + slurm_msg_t_init(&req_msg); + req.job_id = job_id; + req.job_rc = job_return_code; + + req_msg.msg_type= REQUEST_COMPLETE_JOB_ALLOCATION; + req_msg.data = &req; + + if (slurm_send_recv_controller_rc_msg(&req_msg, &rc) < 0) + return SLURM_ERROR; + + if (rc) + slurm_seterrno_ret(rc); + + return SLURM_PROTOCOL_SUCCESS; +} diff --git a/executable_names/src/api/config_info.c b/executable_names/src/api/config_info.c new file mode 100644 index 0000000000000000000000000000000000000000..51123322362c336a0225c7f1f671958729887b23 --- /dev/null +++ b/executable_names/src/api/config_info.c @@ -0,0 +1,257 @@ +/****************************************************************************\ + * config_info.c - get/print the system configuration information of slurm + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette and Kevin Tew . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include + +#include "src/api/job_info.h" +#include "src/common/parse_time.h" +#include "src/common/slurm_protocol_api.h" + +/* + * slurm_api_version - Return a single number reflecting the SLURM API's + * version number. Use the macros SLURM_VERSION_NUM, SLURM_VERSION_MAJOR, + * SLURM_VERSION_MINOR, and SLURM_VERSION_MICRO to work with this value + * RET API's version number + */ +extern long slurm_api_version (void) +{ + return (long) SLURM_API_VERSION; +} + +/* + * slurm_print_ctl_conf - output the contents of slurm control configuration + * message as loaded using slurm_load_ctl_conf + * IN out - file to write to + * IN slurm_ctl_conf_ptr - slurm control configuration pointer + */ +void slurm_print_ctl_conf ( FILE* out, + slurm_ctl_conf_info_msg_t * slurm_ctl_conf_ptr ) +{ + char time_str[32]; + + if ( slurm_ctl_conf_ptr == NULL ) + return ; + + slurm_make_time_str ((time_t *)&slurm_ctl_conf_ptr->last_update, + time_str, sizeof(time_str)); + fprintf(out, "Configuration data as of %s\n", time_str); + fprintf(out, "AuthType = %s\n", + slurm_ctl_conf_ptr->authtype); + fprintf(out, "BackupAddr = %s\n", + slurm_ctl_conf_ptr->backup_addr); + fprintf(out, "BackupController = %s\n", + slurm_ctl_conf_ptr->backup_controller); + fprintf(out, "CacheGroups = %u\n", + slurm_ctl_conf_ptr->cache_groups); + fprintf(out, "CheckpointType = %s\n", + slurm_ctl_conf_ptr->checkpoint_type); + fprintf(out, "ControlAddr = %s\n", + slurm_ctl_conf_ptr->control_addr); + fprintf(out, "ControlMachine = %s\n", + slurm_ctl_conf_ptr->control_machine); + fprintf(out, "Epilog = %s\n", + slurm_ctl_conf_ptr->epilog); + fprintf(out, "FastSchedule = %u\n", + slurm_ctl_conf_ptr->fast_schedule); + fprintf(out, "FirstJobId = %u\n", + slurm_ctl_conf_ptr->first_job_id); +#ifdef HAVE_XCPU + fprintf(out, "HAVE_XCPU = %d\n", HAVE_XCPU); +#endif + fprintf(out, "InactiveLimit = %u\n", + slurm_ctl_conf_ptr->inactive_limit); + fprintf(out, "JobAcctLogFile = %s\n", + slurm_ctl_conf_ptr->job_acct_logfile); + fprintf(out, "JobAcctFrequency = %u\n", + slurm_ctl_conf_ptr->job_acct_freq); + fprintf(out, "JobAcctType = %s\n", + slurm_ctl_conf_ptr->job_acct_type); + fprintf(out, "JobCompLoc = %s\n", + slurm_ctl_conf_ptr->job_comp_loc); + fprintf(out, "JobCompType = %s\n", + slurm_ctl_conf_ptr->job_comp_type); + fprintf(out, "JobCredentialPrivateKey = %s\n", + slurm_ctl_conf_ptr->job_credential_private_key); + fprintf(out, "JobCredentialPublicCertificate = %s\n", + slurm_ctl_conf_ptr->job_credential_public_certificate); + fprintf(out, "KillWait = %u\n", + slurm_ctl_conf_ptr->kill_wait); + fprintf(out, "MailProg = %s\n", + slurm_ctl_conf_ptr->mail_prog); + fprintf(out, "MaxJobCount = %u\n", + slurm_ctl_conf_ptr->max_job_cnt); + fprintf(out, "MessageTimeout = %u\n", + slurm_ctl_conf_ptr->msg_timeout); + fprintf(out, "MinJobAge = %u\n", + slurm_ctl_conf_ptr->min_job_age); + fprintf(out, "MpiDefault = %s\n", + slurm_ctl_conf_ptr->mpi_default); +#ifdef MULTIPLE_SLURMD + fprintf(out, "MULTIPLE_SLURMD = %d\n", MULTIPLE_SLURMD); +#endif + fprintf(out, "NEXT_JOB_ID = %u\n", + slurm_ctl_conf_ptr->next_job_id); + fprintf(out, "PluginDir = %s\n", + slurm_ctl_conf_ptr->plugindir); + fprintf(out, "PlugStackConfig = %s\n", + slurm_ctl_conf_ptr->plugstack); + fprintf(out, "ProctrackType = %s\n", + slurm_ctl_conf_ptr->proctrack_type); + fprintf(out, "Prolog = %s\n", + slurm_ctl_conf_ptr->prolog); + fprintf(out, "PropagatePrioProcess = %u\n", + slurm_ctl_conf_ptr->propagate_prio_process); + fprintf(out, "PropagateResourceLimits = %s\n", + slurm_ctl_conf_ptr->propagate_rlimits); + fprintf(out, "PropagateResourceLimitsExcept = %s\n", + slurm_ctl_conf_ptr->propagate_rlimits_except); + fprintf(out, "ReturnToService = %u\n", + slurm_ctl_conf_ptr->ret2service); + fprintf(out, "SchedulerPort = %u\n", + slurm_ctl_conf_ptr->schedport); + fprintf(out, "SchedulerRootFilter = %u\n", + slurm_ctl_conf_ptr->schedrootfltr); + fprintf(out, "SchedulerType = %s\n", + slurm_ctl_conf_ptr->schedtype); + fprintf(out, "SelectType = %s\n", + slurm_ctl_conf_ptr->select_type); + fprintf(out, "SlurmUser = %s(%u)\n", + slurm_ctl_conf_ptr->slurm_user_name, + slurm_ctl_conf_ptr->slurm_user_id); + fprintf(out, "SlurmctldDebug = %u\n", + slurm_ctl_conf_ptr->slurmctld_debug); + fprintf(out, "SlurmctldLogFile = %s\n", + slurm_ctl_conf_ptr->slurmctld_logfile); + fprintf(out, "SlurmctldPidFile = %s\n", + slurm_ctl_conf_ptr->slurmctld_pidfile); + fprintf(out, "SlurmctldPort = %u\n", + slurm_ctl_conf_ptr->slurmctld_port); + fprintf(out, "SlurmctldTimeout = %u\n", + slurm_ctl_conf_ptr->slurmctld_timeout); + fprintf(out, "SlurmdDebug = %u\n", + slurm_ctl_conf_ptr->slurmd_debug); + fprintf(out, "SlurmdLogFile = %s\n", + slurm_ctl_conf_ptr->slurmd_logfile); + fprintf(out, "SlurmdPidFile = %s\n", + slurm_ctl_conf_ptr->slurmd_pidfile); +#ifndef MULTIPLE_SLURMD + fprintf(out, "SlurmdPort = %u\n", + slurm_ctl_conf_ptr->slurmd_port); +#endif + fprintf(out, "SlurmdSpoolDir = %s\n", + slurm_ctl_conf_ptr->slurmd_spooldir); + fprintf(out, "SlurmdTimeout = %u\n", + slurm_ctl_conf_ptr->slurmd_timeout); + fprintf(out, "SLURM_CONFIG_FILE = %s\n", + slurm_ctl_conf_ptr->slurm_conf); + fprintf(out, "SLURM_VERSION = %s\n", SLURM_VERSION); + fprintf(out, "SrunProlog = %s\n", + slurm_ctl_conf_ptr->srun_prolog); + fprintf(out, "SrunEpilog = %s\n", + slurm_ctl_conf_ptr->srun_epilog); + fprintf(out, "StateSaveLocation = %s\n", + slurm_ctl_conf_ptr->state_save_location); + fprintf(out, "SwitchType = %s\n", + slurm_ctl_conf_ptr->switch_type); + fprintf(out, "TaskEpilog = %s\n", + slurm_ctl_conf_ptr->task_epilog); + fprintf(out, "TaskPlugin = %s\n", + slurm_ctl_conf_ptr->task_plugin); + fprintf(out, "TaskProlog = %s\n", + slurm_ctl_conf_ptr->task_prolog); + fprintf(out, "TmpFS = %s\n", + slurm_ctl_conf_ptr->tmp_fs); + fprintf(out, "TreeWidth = %u\n", + slurm_ctl_conf_ptr->tree_width); + fprintf(out, "UsePam = %u\n", + slurm_ctl_conf_ptr->use_pam); + fprintf(out, "WaitTime = %u\n", + slurm_ctl_conf_ptr->wait_time); +} + +/* + * slurm_load_ctl_conf - issue RPC to get slurm control configuration + * information if changed since update_time + * IN update_time - time of current configuration data + * IN slurm_ctl_conf_ptr - place to store slurm control configuration + * pointer + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the response using slurm_free_ctl_conf + */ +int +slurm_load_ctl_conf (time_t update_time, slurm_ctl_conf_t **confp) +{ + int rc; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + last_update_msg_t req; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + req.last_update = update_time; + req_msg.msg_type = REQUEST_BUILD_INFO; + req_msg.data = &req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch (resp_msg.msg_type) { + case RESPONSE_BUILD_INFO: + *confp = (slurm_ctl_conf_info_msg_t *) resp_msg.data; + break; + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *) resp_msg.data)->return_code; + slurm_free_return_code_msg(resp_msg.data); + if (rc) + slurm_seterrno_ret(rc); + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + return SLURM_PROTOCOL_SUCCESS; +} + diff --git a/executable_names/src/api/init_msg.c b/executable_names/src/api/init_msg.c new file mode 100644 index 0000000000000000000000000000000000000000..89c1bbc01155141d2da47df6af0e2538a9a52f1f --- /dev/null +++ b/executable_names/src/api/init_msg.c @@ -0,0 +1,155 @@ +/*****************************************************************************\ + * init_msg.c - initialize RPC messages contents + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include + +#include "src/common/slurm_protocol_api.h" +#include "src/common/forward.h" + +/* + * slurm_init_job_desc_msg - initialize job descriptor with + * default values + * OUT job_desc_msg - user defined job descriptor + */ +void slurm_init_job_desc_msg(job_desc_msg_t * job_desc_msg) +{ + job_desc_msg->account = NULL; + job_desc_msg->alloc_node = NULL; + job_desc_msg->alloc_sid = NO_VAL; + job_desc_msg->comment = NULL; + job_desc_msg->contiguous = (uint16_t) NO_VAL; + job_desc_msg->cpus_per_task = (uint16_t) NO_VAL; + job_desc_msg->ntasks_per_node = (uint16_t) NO_VAL; + job_desc_msg->ntasks_per_socket = (uint16_t) NO_VAL; + job_desc_msg->ntasks_per_core = (uint16_t) NO_VAL; + job_desc_msg->task_dist = SLURM_DIST_CYCLIC; + job_desc_msg->plane_size = NO_VAL; + job_desc_msg->dependency = NO_VAL; + job_desc_msg->environment = ((char **) NULL); + job_desc_msg->env_size = 0; + job_desc_msg->features = NULL; + job_desc_msg->immediate = 0; + job_desc_msg->job_id = NO_VAL; + job_desc_msg->job_min_cores = NO_VAL; + job_desc_msg->job_min_memory = NO_VAL; + job_desc_msg->job_min_procs = NO_VAL; + job_desc_msg->job_min_sockets = NO_VAL; + job_desc_msg->job_min_threads = NO_VAL; + job_desc_msg->job_min_tmp_disk= NO_VAL; + job_desc_msg->kill_on_node_fail = (uint16_t) NO_VAL; + job_desc_msg->name = NULL; + job_desc_msg->network = NULL; + job_desc_msg->nice = NICE_OFFSET; + job_desc_msg->ntasks_per_core = (uint16_t) NO_VAL; + job_desc_msg->ntasks_per_node = (uint16_t) NO_VAL; + job_desc_msg->ntasks_per_socket = (uint16_t) NO_VAL; + job_desc_msg->num_tasks = NO_VAL; + job_desc_msg->overcommit = (uint16_t) NO_VAL; + job_desc_msg->partition = NULL; + job_desc_msg->plane_size = NO_VAL; + job_desc_msg->priority = NO_VAL; + job_desc_msg->req_nodes = NULL; + job_desc_msg->exc_nodes = NULL; + job_desc_msg->script = NULL; + job_desc_msg->argv = ((char **) NULL); + job_desc_msg->argc = 0; + job_desc_msg->shared = (uint16_t) NO_VAL; + job_desc_msg->task_dist = (uint16_t) NO_VAL; + job_desc_msg->time_limit = NO_VAL; + job_desc_msg->num_procs = NO_VAL; + job_desc_msg->max_nodes = NO_VAL; + job_desc_msg->min_nodes = NO_VAL; + job_desc_msg->max_sockets = NO_VAL; + job_desc_msg->min_sockets = NO_VAL; + job_desc_msg->max_cores = NO_VAL; + job_desc_msg->min_cores = NO_VAL; + job_desc_msg->max_threads = NO_VAL; + job_desc_msg->min_threads = NO_VAL; + job_desc_msg->err = NULL; + job_desc_msg->in = NULL; + job_desc_msg->out = NULL; + job_desc_msg->user_id = NO_VAL; + job_desc_msg->group_id = NO_VAL; + job_desc_msg->work_dir = NULL; + job_desc_msg->alloc_resp_hostname = NULL; + job_desc_msg->alloc_resp_port = 0; + job_desc_msg->other_hostname = NULL; + job_desc_msg->other_port = 0; + job_desc_msg->mail_type = 0; + job_desc_msg->mail_user = NULL; + job_desc_msg->begin_time = 0; + job_desc_msg->no_requeue = (uint16_t) NO_VAL; +#if SYSTEM_DIMENSIONS +{ + int i; + for (i=0; igeometry[i] = (uint16_t) NO_VAL; +} +#endif + job_desc_msg->conn_type = (uint16_t) NO_VAL; + job_desc_msg->rotate = (uint16_t) NO_VAL; + job_desc_msg->select_jobinfo = NULL; +} + +/* + * slurm_init_part_desc_msg - initialize partition descriptor with + * default values + * OUT job_desc_msg - user defined partition descriptor + */ +void slurm_init_part_desc_msg (update_part_msg_t * update_part_msg) +{ + update_part_msg->name = NULL; + update_part_msg->nodes = NULL; + update_part_msg->allow_groups = NULL; + update_part_msg->max_time = (uint32_t) NO_VAL; + update_part_msg->max_nodes = (uint32_t) NO_VAL; + update_part_msg->min_nodes = (uint32_t) NO_VAL; + update_part_msg->hidden = (uint16_t) NO_VAL; + update_part_msg->default_part = (uint16_t) NO_VAL; + update_part_msg->root_only = (uint16_t) NO_VAL; + update_part_msg->shared = (uint16_t) NO_VAL; + update_part_msg->state_up = (uint16_t) NO_VAL; +} + diff --git a/executable_names/src/api/job_info.c b/executable_names/src/api/job_info.c new file mode 100644 index 0000000000000000000000000000000000000000..e0c8875cc6e2e01e351d8d392e3d8fecb1a2679b --- /dev/null +++ b/executable_names/src/api/job_info.c @@ -0,0 +1,753 @@ +/*****************************************************************************\ + * job_info.c - get/print the job state information of slurm + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "src/api/job_info.h" +#include "src/common/node_select.h" +#include "src/common/parse_time.h" +#include "src/common/slurm_auth.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/uid.h" +#include "src/common/xstring.h" +#include "src/common/forward.h" + +/* + * slurm_print_job_info_msg - output information about all Slurm + * jobs based upon message as loaded using slurm_load_jobs + * IN out - file to write to + * IN job_info_msg_ptr - job information message pointer + * IN one_liner - print as a single line if true + */ +extern void +slurm_print_job_info_msg ( FILE* out, job_info_msg_t *jinfo, int one_liner ) +{ + int i; + job_info_t *job_ptr = jinfo->job_array; + char time_str[32]; + + slurm_make_time_str ((time_t *)&jinfo->last_update, time_str, + sizeof(time_str)); + fprintf( out, "Job data as of %s, record count %d\n", + time_str, jinfo->record_count); + + for (i = 0; i < jinfo->record_count; i++) + slurm_print_job_info(out, &job_ptr[i], one_liner); +} + +static void _sprint_range(char *str, int lower, int upper) +{ + char tmp[128]; + convert_num_unit((float)lower, str, UNIT_NONE); + if (upper > 0) { + convert_num_unit((float)upper, tmp, UNIT_NONE); + strcat(str, "-"); + strcat(str, tmp); + } +} + +/* + * slurm_print_job_info - output information about a specific Slurm + * job based upon message as loaded using slurm_load_jobs + * IN out - file to write to + * IN job_ptr - an individual job information record pointer + * IN one_liner - print as a single line if true + */ +extern void +slurm_print_job_info ( FILE* out, job_info_t * job_ptr, int one_liner ) +{ + char *print_this = slurm_sprint_job_info(job_ptr, one_liner); + fprintf ( out, "%s", print_this); + xfree(print_this); +} + +/* + * slurm_sprint_job_info - output information about a specific Slurm + * job based upon message as loaded using slurm_load_jobs + * IN job_ptr - an individual job information record pointer + * IN one_liner - print as a single line if true + * RET out - char * containing formatted output (must be freed after call) + * NULL is returned on failure. + */ +extern char * +slurm_sprint_job_info ( job_info_t * job_ptr, int one_liner ) +{ + int i, j; + char time_str[32], select_buf[128]; + struct group *group_info = NULL; + char tmp1[128], tmp2[128], tmp3[128], tmp4[128]; + char tmp_line[128]; + uint16_t quarter = (uint16_t) NO_VAL; + uint16_t nodecard = (uint16_t) NO_VAL; + uint16_t term_sig = 0; + char *out = NULL; + +#ifdef HAVE_BG + char *nodelist = "BP_List"; + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_QUARTER, + &quarter); + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_NODECARD, + &nodecard); +#else + char *nodelist = "NodeList"; +#endif + + /****** Line 1 ******/ + snprintf(tmp_line, sizeof(tmp_line), + "JobId=%u UserId=%s(%u) ", + job_ptr->job_id, + uid_to_string((uid_t) job_ptr->user_id), job_ptr->user_id); + out = xstrdup(tmp_line); + group_info = getgrgid((gid_t) job_ptr->group_id ); + if ( group_info && group_info->gr_name[ 0 ] ) { + snprintf(tmp_line, sizeof(tmp_line), "GroupId=%s(%u)", + group_info->gr_name, job_ptr->group_id ); + } else { + snprintf(tmp_line, sizeof(tmp_line), "GroupId=(%u)", + job_ptr->group_id ); + } + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 2 ******/ + snprintf(tmp_line, sizeof(tmp_line), "Name=%s", job_ptr->name); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 3 ******/ + snprintf(tmp_line, sizeof(tmp_line), + "Priority=%u Partition=%s BatchFlag=%u", + job_ptr->priority, job_ptr->partition, + job_ptr->batch_flag); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 4 ******/ + snprintf(tmp_line, sizeof(tmp_line), + "AllocNode:Sid=%s:%u TimeLimit=", + job_ptr->alloc_node, job_ptr->alloc_sid); + xstrcat(out, tmp_line); + if (job_ptr->time_limit == INFINITE) + sprintf(tmp_line, "UNLIMITED "); + else if (job_ptr->time_limit == NO_VAL) + sprintf(tmp_line, "Partition_Limit "); + else + sprintf(tmp_line, "%u ", job_ptr->time_limit); + xstrcat(out, tmp_line); + if (WIFSIGNALED(job_ptr->exit_code)) + term_sig = WTERMSIG(job_ptr->exit_code); + snprintf(tmp_line, sizeof(tmp_line), + "ExitCode=%u:%u", + WEXITSTATUS(job_ptr->exit_code), term_sig); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 5 ******/ + slurm_make_time_str((time_t *)&job_ptr->start_time, time_str, + sizeof(time_str)); + snprintf(tmp_line, sizeof(tmp_line), + "JobState=%s StartTime=%s EndTime=", + job_state_string(job_ptr->job_state), time_str); + xstrcat(out, tmp_line); + if ((job_ptr->time_limit == INFINITE) && + (job_ptr->end_time > time(NULL))) + sprintf(tmp_line, "NONE"); + else { + slurm_make_time_str ((time_t *)&job_ptr->end_time, time_str, + sizeof(time_str)); + sprintf(tmp_line, "%s", time_str); + } + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 6 ******/ + snprintf(tmp_line, sizeof(tmp_line), "%s=%s", nodelist, job_ptr->nodes); + xstrcat(out, tmp_line); + if(job_ptr->nodes) { + if(quarter != (uint16_t) NO_VAL) { + if(nodecard != (uint16_t) NO_VAL) + sprintf(tmp_line, ".%u.%u", quarter, nodecard); + else + sprintf(tmp_line, ".%u", quarter); + xstrcat(out, tmp_line); + } + } + sprintf(tmp_line, " %sIndices=", nodelist); + xstrcat(out, tmp_line); + for (j = 0; (job_ptr->node_inx && (job_ptr->node_inx[j] != -1)); + j+=2) { + if (j > 0) + xstrcat(out, ","); + sprintf(tmp_line, "%d-%d", job_ptr->node_inx[j], + job_ptr->node_inx[j+1]); + xstrcat(out, tmp_line); + } + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 6a (optional) ******/ +#if 0 + /* mainly for debugging */ + convert_num_unit((float)job_ptr->num_cpu_groups, tmp1, UNIT_NONE); + snprintf(tmp_line, sizeof(tmp_line), + "NumCPUGroups=%s ", + tmp1); + xstrcat(out, tmp_line); +#endif + + if ((job_ptr->num_cpu_groups > 0) && + (job_ptr->cpus_per_node) && + (job_ptr->cpu_count_reps)) { + int length = 0; + xstrcat(out, "AllocCPUs="); + length += 10; + for (i = 0; i < job_ptr->num_cpu_groups; i++) { + if (length > 70) { + /* skip to last CPU group entry */ + if (i < job_ptr->num_cpu_groups - 1) { + continue; + } + /* add elipsis before last entry */ + xstrcat(out, "...,"); + length += 4; + } + + snprintf(tmp_line, sizeof(tmp_line), + "%d", + job_ptr->cpus_per_node[i]); + xstrcat(out, tmp_line); + length += strlen(tmp_line); + if (job_ptr->cpu_count_reps[i] > 1) { + snprintf(tmp_line, sizeof(tmp_line), + "*%d", + job_ptr->cpu_count_reps[i]); + xstrcat(out, tmp_line); + length += strlen(tmp_line); + } + if (i < job_ptr->num_cpu_groups - 1) { + xstrcat(out, ","); + length++; + } + } + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + } + + /****** Line 7 ******/ + convert_num_unit((float)job_ptr->num_procs, tmp1, UNIT_NONE); +#ifdef HAVE_BG + convert_num_unit((float)job_ptr->num_nodes, tmp2, UNIT_NONE); + sprintf(tmp_line, "ReqProcs=%s MinBPs=%s ", tmp1, tmp2); +#else + _sprint_range(tmp2, job_ptr->num_nodes, job_ptr->max_nodes); + sprintf(tmp_line, "ReqProcs=%s ReqNodes=%s ", tmp1, tmp2); +#endif + xstrcat(out, tmp_line); + + _sprint_range(tmp1, job_ptr->min_sockets, job_ptr->max_sockets); + if (job_ptr->min_cores > 0) { + _sprint_range(tmp2, job_ptr->min_cores, job_ptr->max_cores); + strcat(tmp1, ":"); + strcat(tmp1, tmp2); + if (job_ptr->min_threads > 0) { + _sprint_range(tmp2, job_ptr->min_threads, + job_ptr->max_threads); + strcat(tmp1, ":"); + strcat(tmp1, tmp2); + } + } + snprintf(tmp_line, sizeof(tmp_line), + "ReqS:C:T=%s", + tmp1); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 8 ******/ + convert_num_unit((float)job_ptr->cpus_per_task, tmp1, UNIT_NONE); + + snprintf(tmp_line, sizeof(tmp_line), + "Shared=%s Contiguous=%d CPUs/task=%s", + (job_ptr->shared == 0 ? "0" : + job_ptr->shared == 1 ? "1" : "OK"), + job_ptr->contiguous, tmp1); + xstrcat(out, tmp_line); + + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 9 ******/ + convert_num_unit((float)job_ptr->job_min_procs, tmp1, UNIT_NONE); + convert_num_unit((float)job_ptr->job_min_sockets, tmp2, UNIT_NONE); + convert_num_unit((float)job_ptr->job_min_cores, tmp3, UNIT_NONE); + convert_num_unit((float)job_ptr->job_min_threads, tmp4, UNIT_NONE); + snprintf(tmp_line, sizeof(tmp_line), + "MinProcs=%s MinSockets=%s MinCores=%s MinThreads=%s", + tmp1, tmp2, tmp3, tmp4); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 10 ******/ + convert_num_unit((float)job_ptr->job_min_memory, tmp1, UNIT_NONE); + convert_num_unit((float)job_ptr->job_min_tmp_disk, tmp2, UNIT_NONE); + snprintf(tmp_line, sizeof(tmp_line), + "MinMemory=%s MinTmpDisk=%s Features=%s", + tmp1, tmp2, job_ptr->features); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 11 ******/ + snprintf(tmp_line, sizeof(tmp_line), + "Dependency=%u Account=%s Reason=%s Network=%s", + job_ptr->dependency, job_ptr->account, + job_reason_string(job_ptr->wait_reason), job_ptr->network); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 12 ******/ + snprintf(tmp_line, sizeof(tmp_line), "Req%s=%s Req%sIndices=", + nodelist, job_ptr->req_nodes, nodelist); + xstrcat(out, tmp_line); + for (j = 0; (job_ptr->req_node_inx && (job_ptr->req_node_inx[j] != -1)); + j+=2) { + if (j > 0) + xstrcat(out, ","); + sprintf(tmp_line, "%d-%d", job_ptr->req_node_inx[j], + job_ptr->req_node_inx[j+1]); + xstrcat(out, tmp_line); + } + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 13 ******/ + snprintf(tmp_line, sizeof(tmp_line), "Exc%s=%s Exc%sIndices=", + nodelist, job_ptr->exc_nodes, nodelist); + xstrcat(out, tmp_line); + for (j = 0; (job_ptr->exc_node_inx && (job_ptr->exc_node_inx[j] != -1)); + j+=2) { + if (j > 0) + xstrcat(out, ","); + sprintf(tmp_line, "%d-%d", job_ptr->exc_node_inx[j], + job_ptr->exc_node_inx[j+1]); + xstrcat(out, tmp_line); + } + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 14 ******/ + slurm_make_time_str((time_t *)&job_ptr->submit_time, time_str, + sizeof(time_str)); + sprintf(tmp_line, "SubmitTime=%s ", time_str); + xstrcat(out, tmp_line); + if (job_ptr->suspend_time) { + slurm_make_time_str ((time_t *)&job_ptr->suspend_time, + time_str, sizeof(time_str)); + } else { + strncpy(time_str, "None", sizeof(time_str)); + } + sprintf(tmp_line, "SuspendTime=%s PreSusTime=%ld", + time_str, (long int)job_ptr->pre_sus_time); + xstrcat(out, tmp_line); + + /****** Line 15 (optional) ******/ + if (job_ptr->comment) { + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + sprintf(tmp_line, "Comment=%s ", job_ptr->comment); + xstrcat(out, tmp_line); + } + + /****** Line 16 (optional) ******/ + select_g_sprint_jobinfo(job_ptr->select_jobinfo, + select_buf, sizeof(select_buf), SELECT_PRINT_MIXED); + if (select_buf[0] != '\0') { + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + xstrcat(out, select_buf); + } + xstrcat(out, "\n\n"); + + return out; + +} +/* + * slurm_load_jobs - issue RPC to get slurm all job configuration + * information if changed since update_time + * IN update_time - time of current configuration data + * IN job_info_msg_pptr - place to store a job configuration pointer + * IN show_flags - job filtering options + * RET 0 or -1 on error + * NOTE: free the response using slurm_free_job_info_msg + */ +extern int +slurm_load_jobs (time_t update_time, job_info_msg_t **resp, + uint16_t show_flags) +{ + int rc; + slurm_msg_t resp_msg; + slurm_msg_t req_msg; + job_info_request_msg_t req; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + req.last_update = update_time; + req.show_flags = show_flags; + req_msg.msg_type = REQUEST_JOB_INFO; + req_msg.data = &req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch (resp_msg.msg_type) { + case RESPONSE_JOB_INFO: + *resp = (job_info_msg_t *)resp_msg.data; + break; + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *) resp_msg.data)->return_code; + slurm_free_return_code_msg(resp_msg.data); + if (rc) + slurm_seterrno_ret(rc); + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_PROTOCOL_SUCCESS ; +} + + +/* + * slurm_pid2jobid - issue RPC to get the slurm job_id given a process_id + * on this machine + * IN job_pid - process_id of interest on this machine + * OUT job_id_ptr - place to store a slurm job_id + * RET 0 or -1 on error + */ +extern int +slurm_pid2jobid (pid_t job_pid, uint32_t *jobid) +{ + int rc; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + job_id_request_msg_t req; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + /* + * Set request message address to slurmd on localhost + */ + slurm_set_addr(&req_msg.address, (uint16_t)slurm_get_slurmd_port(), + "localhost"); + + req.job_pid = job_pid; + req_msg.msg_type = REQUEST_JOB_ID; + req_msg.data = &req; + + rc = slurm_send_recv_node_msg(&req_msg, &resp_msg, 0); + + if(rc != 0 || !resp_msg.auth_cred) { + error("slurm_pid2jobid: %m"); + if(resp_msg.auth_cred) + g_slurm_auth_destroy(resp_msg.auth_cred); + return SLURM_ERROR; + } + if(resp_msg.auth_cred) + g_slurm_auth_destroy(resp_msg.auth_cred); + switch (resp_msg.msg_type) { + case RESPONSE_JOB_ID: + *jobid = ((job_id_response_msg_t *) resp_msg.data)->job_id; + slurm_free_job_id_response_msg(resp_msg.data); + break; + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *) resp_msg.data)->return_code; + slurm_free_return_code_msg(resp_msg.data); + if (rc) + slurm_seterrno_ret(rc); + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_PROTOCOL_SUCCESS; +} + +/* + * slurm_get_rem_time - get the expected time remaining for a given job + * IN jobid - slurm job id + * RET remaining time in seconds or -1 on error + */ +extern long slurm_get_rem_time(uint32_t jobid) +{ + time_t now = time(NULL); + time_t end_time; + long rc; + + if (slurm_get_end_time(jobid, &end_time) != SLURM_SUCCESS) + return -1L; + + rc = difftime(end_time, now); + if (rc < 0) + rc = 0L; + return rc; +} + +/* FORTRAN VERSIONS OF slurm_get_rem_time */ +extern int32_t islurm_get_rem_time__(uint32_t *jobid) +{ + time_t now = time(NULL); + time_t end_time; + int32_t rc; + + if ((jobid == NULL) + || (slurm_get_end_time(*jobid, &end_time) != SLURM_SUCCESS)) + return 0; + + rc = difftime(end_time, now); + if (rc < 0) + rc = 0; + return rc; +} +extern int32_t islurm_get_rem_time2__() +{ + uint32_t jobid; + char *slurm_jobid = getenv("SLURM_JOBID"); + + if (slurm_jobid == NULL) + return 0; + jobid = atol(slurm_jobid); + return islurm_get_rem_time__(&jobid); +} + + +/* + * slurm_get_end_time - get the expected end time for a given slurm job + * IN jobid - slurm job id + * end_time_ptr - location in which to store scheduled end time for job + * RET 0 or -1 on error + */ +extern int +slurm_get_end_time(uint32_t jobid, time_t *end_time_ptr) +{ + int rc; + slurm_msg_t resp_msg; + slurm_msg_t req_msg; + job_alloc_info_msg_t job_msg; + srun_timeout_msg_t *timeout_msg; + time_t now = time(NULL); + static uint32_t jobid_cache = 0; + static uint32_t jobid_env = 0; + static time_t endtime_cache = 0; + static time_t last_test_time = 0; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + if (!end_time_ptr) + slurm_seterrno_ret(EINVAL); + + if (jobid == 0) { + if (jobid_env) { + jobid = jobid_env; + } else { + char *env = getenv("SLURM_JOBID"); + if (env) { + jobid = (uint32_t) atol(env); + jobid_env = jobid; + } + } + if (jobid == 0) { + slurm_seterrno(ESLURM_INVALID_JOB_ID); + return SLURM_ERROR; + } + } + + /* Just use cached data if data less than 60 seconds old */ + if ((jobid == jobid_cache) + && (difftime(now, last_test_time) < 60)) { + *end_time_ptr = endtime_cache; + return SLURM_SUCCESS; + } + + job_msg.job_id = jobid; + req_msg.msg_type = REQUEST_JOB_END_TIME; + req_msg.data = &job_msg; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch (resp_msg.msg_type) { + case SRUN_TIMEOUT: + timeout_msg = (srun_timeout_msg_t *) resp_msg.data; + last_test_time = time(NULL); + jobid_cache = jobid; + endtime_cache = timeout_msg->timeout; + *end_time_ptr = endtime_cache; + slurm_free_srun_timeout_msg(resp_msg.data); + break; + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *) resp_msg.data)->return_code; + slurm_free_return_code_msg(resp_msg.data); + if (endtime_cache) + *end_time_ptr = endtime_cache; + else if (rc) + slurm_seterrno_ret(rc); + break; + default: + if (endtime_cache) + *end_time_ptr = endtime_cache; + else + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_SUCCESS; +} + +/* + * slurm_get_select_jobinfo - get data from a select job credential + * IN jobinfo - updated select job credential + * IN data_type - type of data to enter into job credential + * IN/OUT data - the data to enter into job credential + * RET 0 or -1 on error + */ +extern int slurm_get_select_jobinfo (select_jobinfo_t jobinfo, + enum select_data_type data_type, void *data) +{ + return select_g_get_jobinfo (jobinfo, data_type, data); +} + +/* + * slurm_job_node_ready - report if nodes are ready for job to execute now + * IN job_id - slurm job id + * RET: READY_* values as defined in api/job_info.h + */ +extern int slurm_job_node_ready(uint32_t job_id) +{ + slurm_msg_t req, resp; + job_id_msg_t msg; + int rc; + + slurm_msg_t_init(&req); + slurm_msg_t_init(&resp); + + req.msg_type = REQUEST_JOB_READY; + req.data = &msg; + msg.job_id = job_id; + + if (slurm_send_recv_controller_msg(&req, &resp) < 0) + return -1; + + if (resp.msg_type == RESPONSE_JOB_READY) { + rc = ((return_code_msg_t *) resp.data)->return_code; + slurm_free_return_code_msg(resp.data); + } else if (resp.msg_type == RESPONSE_SLURM_RC) { + int job_rc = ((return_code_msg_t *) resp.data) -> + return_code; + if ((job_rc == ESLURM_INVALID_PARTITION_NAME) + || (job_rc == ESLURM_INVALID_JOB_ID)) + rc = READY_JOB_FATAL; + else /* EAGAIN */ + rc = READY_JOB_ERROR; + slurm_free_return_code_msg(resp.data); + } else + rc = READY_JOB_ERROR; + + return rc; +} + diff --git a/executable_names/src/api/job_info.h b/executable_names/src/api/job_info.h new file mode 100644 index 0000000000000000000000000000000000000000..7cb1142fa0fe529e540172d17cdca4082b4a8a37 --- /dev/null +++ b/executable_names/src/api/job_info.h @@ -0,0 +1,57 @@ +/*****************************************************************************\ + * job_info.h - get/print the job state information of slurm + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _JOB_INFO_H +#define _JOB_INFO_H + +#include + +#define READY_JOB_FATAL -2 +#define READY_JOB_ERROR -1 +#define READY_NODE_STATE 0x01 +#define READY_JOB_STATE 0x02 + +/* + * slurm_job_node_ready - report if nodes are ready for job to execute now + * IN job_id - slurm job id + * RET: READY_* values as defined in api/job_info.h + */ +extern int slurm_job_node_ready(uint32_t job_id); + +#endif diff --git a/executable_names/src/api/job_step_info.c b/executable_names/src/api/job_step_info.c new file mode 100644 index 0000000000000000000000000000000000000000..571b5dbd96e26dcc8e8ab2e96b2557e4c5ca28f6 --- /dev/null +++ b/executable_names/src/api/job_step_info.c @@ -0,0 +1,231 @@ +/*****************************************************************************\ + * job_step_info.c - get/print the job step state information of slurm + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette , + * Joey Ekstrom , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "src/api/job_info.h" +#include "src/common/parse_time.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + +/* + * slurm_print_job_step_info_msg - output information about all Slurm + * job steps based upon message as loaded using slurm_get_job_steps + * IN out - file to write to + * IN job_step_info_msg_ptr - job step information message pointer + * IN one_liner - print as a single line if true + */ +void +slurm_print_job_step_info_msg ( FILE* out, + job_step_info_response_msg_t * job_step_info_msg_ptr, + int one_liner ) +{ + int i; + job_step_info_t *job_step_ptr = job_step_info_msg_ptr->job_steps ; + char time_str[32]; + + slurm_make_time_str ((time_t *)&job_step_info_msg_ptr->last_update, + time_str, sizeof(time_str)); + fprintf( out, "Job step data as of %s, record count %d\n", + time_str, job_step_info_msg_ptr->job_step_count); + + for (i = 0; i < job_step_info_msg_ptr-> job_step_count; i++) + { + slurm_print_job_step_info ( out, & job_step_ptr[i], + one_liner ) ; + } +} + +/* + * slurm_print_job_step_info - output information about a specific Slurm + * job step based upon message as loaded using slurm_get_job_steps + * IN out - file to write to + * IN job_ptr - an individual job step information record pointer + * IN one_liner - print as a single line if true + */ +void +slurm_print_job_step_info ( FILE* out, job_step_info_t * job_step_ptr, + int one_liner ) +{ + char *print_this = slurm_sprint_job_step_info(job_step_ptr, one_liner); + fprintf ( out, "%s", print_this); + xfree(print_this); +} + +/* + * slurm_sprint_job_step_info - output information about a specific Slurm + * job step based upon message as loaded using slurm_get_job_steps + * IN job_ptr - an individual job step information record pointer + * IN one_liner - print as a single line if true + * RET out - char * containing formatted output (must be freed after call) + * NULL is returned on failure. + */ +char * +slurm_sprint_job_step_info ( job_step_info_t * job_step_ptr, + int one_liner ) +{ + char time_str[32]; + char tmp_line[128]; + char *out = NULL; + + /****** Line 1 ******/ + slurm_make_time_str ((time_t *)&job_step_ptr->start_time, time_str, + sizeof(time_str)); + snprintf(tmp_line, sizeof(tmp_line), + "StepId=%u.%u UserId=%u Tasks=%u StartTime=%s", + job_step_ptr->job_id, job_step_ptr->step_id, + job_step_ptr->user_id, job_step_ptr->num_tasks, time_str); + out = xstrdup(tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 2 ******/ + snprintf(tmp_line, sizeof(tmp_line), + "Partition=%s Nodes=%s Name=%s Network=%s\n\n", + job_step_ptr->partition, job_step_ptr->nodes, + job_step_ptr->name, job_step_ptr->network); + xstrcat(out, tmp_line); + + return out; +} + +/* + * slurm_get_job_steps - issue RPC to get specific slurm job step + * configuration information if changed since update_time. + * a job_id value of zero implies all jobs, a step_id value of + * zero implies all steps + * IN update_time - time of current configuration data + * IN job_id - get information for specific job id, zero for all jobs + * IN step_id - get information for specific job step id, zero for all + * job steps + * IN job_info_msg_pptr - place to store a job configuration pointer + * IN show_flags - job step filtering options + * RET 0 on success, otherwise return -1 and set errno to indicate the error + * NOTE: free the response using slurm_free_job_step_info_response_msg + */ +int +slurm_get_job_steps (time_t update_time, uint32_t job_id, uint32_t step_id, + job_step_info_response_msg_t **resp, uint16_t show_flags) +{ + int rc; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + job_step_info_request_msg_t req; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + req.last_update = update_time; + req.job_id = job_id; + req.step_id = step_id; + req.show_flags = show_flags; + req_msg.msg_type = REQUEST_JOB_STEP_INFO; + req_msg.data = &req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch (resp_msg.msg_type) { + case RESPONSE_JOB_STEP_INFO: + *resp = (job_step_info_response_msg_t *) resp_msg.data; + break; + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *) resp_msg.data)->return_code; + slurm_free_return_code_msg(resp_msg.data); + if (rc) + slurm_seterrno_ret(rc); + *resp = NULL; + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_PROTOCOL_SUCCESS; +} + +extern slurm_step_layout_t * +slurm_job_step_layout_get(uint32_t job_id, uint32_t step_id) +{ + job_step_id_msg_t data; + slurm_msg_t req, resp; + int errnum; + + slurm_msg_t_init(&req); + slurm_msg_t_init(&resp); + + req.msg_type = REQUEST_STEP_LAYOUT; + req.data = &data; + data.job_id = job_id; + data.step_id = step_id; + + if (slurm_send_recv_controller_msg(&req, &resp) < 0) { + return NULL; + } + + switch (resp.msg_type) { + case RESPONSE_STEP_LAYOUT: + return (slurm_step_layout_t *)resp.data; + case RESPONSE_SLURM_RC: + errnum = ((return_code_msg_t *)resp.data)->return_code; + slurm_free_return_code_msg(resp.data); + errno = errnum; + return NULL; + default: + errno = SLURM_UNEXPECTED_MSG_ERROR; + return NULL; + } +} + +void +slurm_job_step_layout_free(slurm_step_layout_t *layout) +{ + slurm_step_layout_destroy(layout); +} diff --git a/executable_names/src/api/node_info.c b/executable_names/src/api/node_info.c new file mode 100644 index 0000000000000000000000000000000000000000..2cded07246cfabedbd82ac7300b8e9ffa790d159 --- /dev/null +++ b/executable_names/src/api/node_info.c @@ -0,0 +1,195 @@ +/*****************************************************************************\ + * node_info.c - get/print the node state information of slurm + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "src/common/parse_time.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + +/* + * slurm_print_node_info_msg - output information about all Slurm nodes + * based upon message as loaded using slurm_load_node + * IN out - file to write to + * IN node_info_msg_ptr - node information message pointer + * IN one_liner - print as a single line if true + */ +void +slurm_print_node_info_msg ( FILE * out, node_info_msg_t * node_info_msg_ptr, + int one_liner ) +{ + int i; + node_info_t * node_ptr = node_info_msg_ptr -> node_array ; + char time_str[32]; + + slurm_make_time_str ((time_t *)&node_info_msg_ptr->last_update, + time_str, sizeof(time_str)); + fprintf( out, "Node data as of %s, record count %d\n", + time_str, node_info_msg_ptr->record_count); + + for (i = 0; i < node_info_msg_ptr-> record_count; i++) { + slurm_print_node_table ( out, & node_ptr[i], one_liner ) ; + } +} + + +/* + * slurm_print_node_table - output information about a specific Slurm nodes + * based upon message as loaded using slurm_load_node + * IN out - file to write to + * IN node_ptr - an individual node information record pointer + * IN one_liner - print as a single line if true + */ +void +slurm_print_node_table ( FILE * out, node_info_t * node_ptr, int one_liner ) +{ + char *print_this = slurm_sprint_node_table(node_ptr, one_liner); + fprintf ( out, "%s", print_this); + xfree(print_this); +} + +/* + * slurm_sprint_node_table - output information about a specific Slurm nodes + * based upon message as loaded using slurm_load_node + * IN node_ptr - an individual node information record pointer + * IN one_liner - print as a single line if true + * RET out - char * containing formatted output (must be freed after call) + * NULL is returned on failure. + */ +char * +slurm_sprint_node_table (node_info_t * node_ptr, int one_liner ) +{ + uint16_t my_state = node_ptr->node_state; + char *comp_str = "", *drain_str = ""; + char tmp_line[100]; + char *out = NULL; + + if (my_state & NODE_STATE_COMPLETING) { + my_state &= (~NODE_STATE_COMPLETING); + comp_str = "+COMPLETING"; + } + if (my_state & NODE_STATE_DRAIN) { + my_state &= (~NODE_STATE_DRAIN); + drain_str = "+DRAIN"; + } + + /****** Line 1 ******/ + snprintf(tmp_line, sizeof(tmp_line), + "NodeName=%s State=%s%s%s CPUs=%u " + "RealMemory=%u TmpDisk=%u", + node_ptr->name, node_state_string(my_state), + comp_str, drain_str, node_ptr->cpus, + node_ptr->real_memory, node_ptr->tmp_disk); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 2 ******/ + snprintf(tmp_line, sizeof(tmp_line), + "Sockets=%u Cores=%u Threads=%u " + "Weight=%u Features=%s Reason=%s\n" , + node_ptr->sockets, node_ptr->cores, node_ptr->threads, + node_ptr->weight, node_ptr->features, + node_ptr->reason); + xstrcat(out, tmp_line); + + return out; +} + + +/* + * slurm_load_node - issue RPC to get slurm all node configuration information + * if changed since update_time + * IN update_time - time of current configuration data + * IN node_info_msg_pptr - place to store a node configuration pointer + * IN show_flags - node filtering options + * RET 0 or a slurm error code + * NOTE: free the response using slurm_free_node_info_msg + */ +extern int slurm_load_node (time_t update_time, + node_info_msg_t **resp, uint16_t show_flags) +{ + int rc; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + node_info_request_msg_t req; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + req.last_update = update_time; + req.show_flags = show_flags; + req_msg.msg_type = REQUEST_NODE_INFO; + req_msg.data = &req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch (resp_msg.msg_type) { + case RESPONSE_NODE_INFO: + *resp = (node_info_msg_t *) resp_msg.data; + break; + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *) resp_msg.data)->return_code; + slurm_free_return_code_msg(resp_msg.data); + if (rc) + slurm_seterrno_ret(rc); + *resp = NULL; + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_PROTOCOL_SUCCESS; +} diff --git a/executable_names/src/api/node_select_info.c b/executable_names/src/api/node_select_info.c new file mode 100644 index 0000000000000000000000000000000000000000..33f10786bab1d108d9e094a1b813c93a640797da --- /dev/null +++ b/executable_names/src/api/node_select_info.c @@ -0,0 +1,121 @@ +/*****************************************************************************\ + * node_select_info.c - get the node select plugin state information of slurm + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "src/api/node_select_info.h" +#include "src/common/slurm_protocol_api.h" + +/* + * slurm_load_node_select - issue RPC to get slurm all node select plugin + * information if changed since update_time + * IN update_time - time of current configuration data + * IN node_select_info_msg_pptr - place to store a node select configuration + * pointer + * RET 0 or a slurm error code + * NOTE: free the response using slurm_free_node_select_info_msg + */ +extern int slurm_load_node_select (time_t update_time, + node_select_info_msg_t **node_select_info_msg_pptr) +{ + int rc; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + node_info_select_request_msg_t req; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + req.last_update = update_time; + req_msg.msg_type = REQUEST_NODE_SELECT_INFO; + req_msg.data = &req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch (resp_msg.msg_type) { + case RESPONSE_NODE_SELECT_INFO: + *node_select_info_msg_pptr = (node_select_info_msg_t *) + resp_msg.data; + break; + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *) resp_msg.data)->return_code; + slurm_free_return_code_msg(resp_msg.data); + if (rc) + slurm_seterrno_ret(rc); + *node_select_info_msg_pptr = NULL; + break; + default: + *node_select_info_msg_pptr = NULL; + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_SUCCESS; +} + +/* + * slurm_free_node_select_info_msg - free buffer returned by + * slurm_load_node_select + * IN node_select_info_msg_pptr - data is freed and pointer is set to NULL + * RET 0 or a slurm error code + */ +extern int slurm_free_node_select_info_msg (node_select_info_msg_t ** + node_select_info_msg_pptr) +{ + if (node_select_info_msg_pptr == NULL) + return EINVAL; + + //free it + *node_select_info_msg_pptr = NULL; + return SLURM_SUCCESS; +} diff --git a/executable_names/src/api/node_select_info.h b/executable_names/src/api/node_select_info.h new file mode 100644 index 0000000000000000000000000000000000000000..61d5b5df80653d61af99e2e71091a0836049a589 --- /dev/null +++ b/executable_names/src/api/node_select_info.h @@ -0,0 +1,93 @@ +/*****************************************************************************\ + * node_select_info.h - get/free node select plugin state information from + * slurm + * NOTE: This header file is not currently exported + * NOTE: This software specifically supports only BlueGene/L for now. It + * will be made more general in the future + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _NODE_SELECT_INFO_H +#define _NODE_SELECT_INFO_H + +#include +#include + +typedef struct { + char *nodes; + char *owner_name; + char *bg_block_id; + int state; + int conn_type; + int node_use; + int quarter; + int nodecard; + int node_cnt; + int *bp_inx; /* list index pairs into node_table for *nodes: + * start_range_1, end_range_1, + * start_range_2, .., -1 */ +} bg_info_record_t; + +typedef struct { + time_t last_update; + uint32_t record_count; + bg_info_record_t *bg_info_array; +} node_select_info_msg_t; + +/* + * slurm_load_node_select - issue RPC to get slurm all node select plugin + * information if changed since update_time + * IN update_time - time of current configuration data + * IN node_select_info_msg_pptr - place to store a node select configuration + * pointer + * RET 0 or a slurm error code + * NOTE: free the response using slurm_free_node_select_info_msg + */ +extern int slurm_load_node_select (time_t update_time, + node_select_info_msg_t **node_select_info_msg_pptr); + +/* + * slurm_free_node_select_info_msg - free buffer returned by + * slurm_load_node_select + * IN node_select_info_msg_pptr - data is freed and pointer is set to NULL + * RET 0 or a slurm error code + */ +extern int slurm_free_node_select_info_msg (node_select_info_msg_t ** + node_select_info_msg_pptr); + +#endif + diff --git a/executable_names/src/api/partition_info.c b/executable_names/src/api/partition_info.c new file mode 100644 index 0000000000000000000000000000000000000000..21d1a43556b9ff50584c5833d7fccf0bbad38d09 --- /dev/null +++ b/executable_names/src/api/partition_info.c @@ -0,0 +1,272 @@ +/*****************************************************************************\ + * partition_info.c - get/print the partition state information of slurm + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "src/api/job_info.h" +#include "src/common/parse_time.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + +/* + * slurm_print_partition_info_msg - output information about all Slurm + * partitions based upon message as loaded using slurm_load_partitions + * IN out - file to write to + * IN part_info_ptr - partitions information message pointer + * IN one_liner - print as a single line if true + */ +void slurm_print_partition_info_msg ( FILE* out, + partition_info_msg_t * part_info_ptr, int one_liner ) +{ + int i ; + partition_info_t * part_ptr = part_info_ptr->partition_array ; + char time_str[32]; + + slurm_make_time_str ((time_t *)&part_info_ptr->last_update, time_str, + sizeof(time_str)); + fprintf( out, "Partition data as of %s, record count %d\n", + time_str, part_info_ptr->record_count); + + for (i = 0; i < part_info_ptr->record_count; i++) { + slurm_print_partition_info ( out, & part_ptr[i], one_liner ) ; + } + +} + +/* + * slurm_print_partition_info - output information about a specific Slurm + * partition based upon message as loaded using slurm_load_partitions + * IN out - file to write to + * IN part_ptr - an individual partition information record pointer + * IN one_liner - print as a single line if true + */ +void slurm_print_partition_info ( FILE* out, partition_info_t * part_ptr, + int one_liner ) +{ + char *print_this = slurm_sprint_partition_info(part_ptr, one_liner); + fprintf ( out, "%s", print_this); + xfree(print_this); +} + + +/* + * slurm_sprint_partition_info - output information about a specific Slurm + * partition based upon message as loaded using slurm_load_partitions + * IN part_ptr - an individual partition information record pointer + * IN one_liner - print as a single line if true + * RET out - char * containing formatted output (must be freed after call) + * NULL is returned on failure. + */ +char *slurm_sprint_partition_info ( partition_info_t * part_ptr, + int one_liner ) +{ + int j; + char tmp1[7], tmp2[7]; + char tmp_line[128]; + char *out = NULL; + + /****** Line 1 ******/ +#ifdef HAVE_BG + convert_num_unit((float)part_ptr->total_nodes, tmp1, UNIT_NONE); +#else + sprintf(tmp1, "%u", part_ptr->total_nodes); +#endif + convert_num_unit((float)part_ptr->total_cpus, tmp2, UNIT_NONE); + snprintf(tmp_line, sizeof(tmp_line), + "PartitionName=%s TotalNodes=%s TotalCPUs=%s ", + part_ptr->name, tmp1, tmp2); + xstrcat(out, tmp_line); + + if (part_ptr->root_only) + sprintf(tmp_line, "RootOnly=YES"); + else + sprintf(tmp_line, "RootOnly=NO"); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 2 ******/ + if (part_ptr->default_part) + sprintf(tmp_line, "Default=YES "); + else + sprintf(tmp_line, "Default=NO "); + xstrcat(out, tmp_line); + if (part_ptr->shared == SHARED_NO) + sprintf(tmp_line, "Shared=NO "); + else if (part_ptr->shared == SHARED_YES) + sprintf(tmp_line, "Shared=YES "); + else + sprintf(tmp_line, "Shared=FORCE "); + xstrcat(out, tmp_line); + if (part_ptr->state_up) + sprintf(tmp_line, "State=UP "); + else + sprintf(tmp_line, "State=DOWN "); + xstrcat(out, tmp_line); + if (part_ptr->max_time == INFINITE) + sprintf(tmp_line, "MaxTime=UNLIMITED "); + else + sprintf(tmp_line, "MaxTime=%u ", part_ptr->max_time); + xstrcat(out, tmp_line); + if (part_ptr->hidden) + sprintf(tmp_line, "Hidden=YES"); + else + sprintf(tmp_line, "Hidden=NO"); + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 3 ******/ + +#ifdef HAVE_BG + convert_num_unit((float)part_ptr->min_nodes, tmp1, UNIT_NONE); +#else + sprintf(tmp1, "%d", part_ptr->min_nodes); +#endif + sprintf(tmp_line, "MinNodes=%s ", tmp1); + xstrcat(out, tmp_line); + + if (part_ptr->max_nodes == INFINITE) + sprintf(tmp_line, "MaxNodes=UNLIMITED "); + else { +#ifdef HAVE_BG + convert_num_unit((float)part_ptr->max_nodes, tmp1, UNIT_NONE); +#else + sprintf(tmp1, "%d", part_ptr->max_nodes); +#endif + sprintf(tmp_line, "MaxNodes=%s ", tmp1); + } + xstrcat(out, tmp_line); + if ((part_ptr->allow_groups == NULL) || + (part_ptr->allow_groups[0] == '\0')) + sprintf(tmp_line, "AllowGroups=ALL"); + else { + snprintf(tmp_line, sizeof(tmp_line), + "AllowGroups=%s", part_ptr->allow_groups); + } + xstrcat(out, tmp_line); + if (one_liner) + xstrcat(out, " "); + else + xstrcat(out, "\n "); + + /****** Line 4 ******/ +#ifdef HAVE_BG + sprintf(tmp_line, "BasePartitions=%s BPIndices=", part_ptr->nodes); +#else + sprintf(tmp_line, "Nodes=%s NodeIndices=", part_ptr->nodes); +#endif + xstrcat(out, tmp_line); + for (j = 0; (part_ptr->node_inx && (part_ptr->node_inx[j] != -1)); + j+=2) { + if (j > 0) + xstrcat(out, ","); + sprintf(tmp_line, "%d-%d", part_ptr->node_inx[j], + part_ptr->node_inx[j+1]); + xstrcat(out, tmp_line); + } + if (one_liner) + xstrcat(out, "\n"); + else + xstrcat(out, "\n\n"); + + return out; +} + + + +/* + * slurm_load_partitions - issue RPC to get slurm all partition configuration + * information if changed since update_time + * IN update_time - time of current configuration data + * IN partition_info_msg_pptr - place to store a partition configuration + * pointer + * IN show_flags - partition filtering options + * RET 0 or a slurm error code + * NOTE: free the response using slurm_free_partition_info_msg + */ +extern int slurm_load_partitions (time_t update_time, + partition_info_msg_t **resp, uint16_t show_flags) +{ + int rc; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + part_info_request_msg_t req; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + req.last_update = update_time; + req.show_flags = show_flags; + req_msg.msg_type = REQUEST_PARTITION_INFO; + req_msg.data = &req; + + if (slurm_send_recv_controller_msg(&req_msg, &resp_msg) < 0) + return SLURM_ERROR; + + switch (resp_msg.msg_type) { + case RESPONSE_PARTITION_INFO: + *resp = (partition_info_msg_t *) resp_msg.data; + break; + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *) resp_msg.data)->return_code; + slurm_free_return_code_msg(resp_msg.data); + if (rc) + slurm_seterrno_ret(rc); + *resp = NULL; + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + break; + } + + return SLURM_PROTOCOL_SUCCESS; +} diff --git a/executable_names/src/api/pmi.c b/executable_names/src/api/pmi.c new file mode 100644 index 0000000000000000000000000000000000000000..afec20612e9520793186f02b2b0db0ae40d936e5 --- /dev/null +++ b/executable_names/src/api/pmi.c @@ -0,0 +1,1619 @@ +/*****************************************************************************\ + * pmi.c - Process Management Interface for MPICH2 + * See http://www-unix.mcs.anl.gov/mpi/mpich2/ + * + * NOTE: Dynamic Process Management functions (PMI part 2) are not supported + * at this time. Functions required for MPI-1 (PMI part 1) are supported. + ***************************************************************************** + * COPYRIGHT: For the function definitions + * + * The following is a notice of limited availability of the code, and + * disclaimer which must be included in the prologue of the code and in all + * source listings of the code. + * + * Copyright Notice + 2002 University of Chicago + * + * Permission is hereby granted to use, reproduce, prepare derivative + * works, and to redistribute to others. This software was authored by: + * + * Argonne National Laboratory Group + * W. Gropp: (630) 252-4318; FAX: (630) 252-5986; e-mail: gropp@mcs.anl.gov + * E. Lusk: (630) 252-7852; FAX: (630) 252-5986; e-mail: lusk@mcs.anl.gov + * Mathematics and Computer Science Division Argonne National Laboratory, + * Argonne IL 60439 + * + * GOVERNMENT LICENSE + * + * Portions of this material resulted from work developed under a U.S. + * Government Contract and are subject to the following license: the + * Government is granted for itself and others acting on its behalf a + * paid-up, nonexclusive, irrevocable worldwide license in this computer + * software to reproduce, prepare derivative works, and perform publicly + * and display publicly. + * + * DISCLAIMER + * + * This computer code material was prepared, in part, as an account of work + * sponsored by an agency of the United States Government. Neither the + * United States, nor the University of Chicago, nor any of their + * employees, makes any warranty express or implied, or assumes any legal + * liability or responsibility for the accuracy, completeness, or + * usefulness of any information, apparatus, product, or process disclosed, + * or represents that its use would not infringe privately owned rights. + * + * MCS Division Argonne National Laboratory + * University of Chicago + ***************************************************************************** + * COPYRIGHT: For the implementation of the functions + * + * Copyright (C) 2005-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +#include "src/api/slurm_pmi.h" +#include "src/common/macros.h" +#include "src/common/malloc.h" + +#define KVS_STATE_LOCAL 0 +#define KVS_STATE_DEFUNCT 1 + +#define KVS_KEY_STATE_GLOBAL 0 +#define KVS_KEY_STATE_LOCAL 1 + +/* default key names form is jobid.stepid[.taskid.sequence] */ +struct kvs_rec { + char * kvs_name; + uint16_t kvs_state; /* see KVS_STATE_* */ + uint16_t kvs_cnt; /* count of key-pairs */ + uint16_t kvs_inx; /* iteration index */ + uint16_t * kvs_key_states; /* see KVS_KEY_STATE_* */ + char ** kvs_keys; + char ** kvs_values; +}; + +static void _del_kvs_rec( struct kvs_rec *kvs_ptr ); +static void _init_kvs( char kvsname[] ); +static int _kvs_put( const char kvsname[], const char key[], + const char value[], int local); +static void _kvs_swap(struct kvs_rec *kvs_ptr, int inx1, int inx2); + +/* Global variables */ +long pmi_jobid; +long pmi_stepid; + +int pmi_init = 0; +int pmi_size; +int pmi_spawned; +int pmi_rank; +int pmi_debug; + +pthread_mutex_t kvs_mutex = PTHREAD_MUTEX_INITIALIZER; + +int kvs_rec_cnt = 0; +struct kvs_rec *kvs_recs; +int kvs_name_sequence = 0; + +/* PMI Group functions */ + +/*@ +PMI_Init - initialize the Process Manager Interface + +Output Parameter: +. spawned - spawned flag + +Return values: ++ PMI_SUCCESS - initialization completed successfully +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - initialization failed + +Notes: +Initialize PMI for this process group. The value of spawned indicates whether +this process was created by 'PMI_Spawn_multiple'. 'spawned' will be 'PMI_TRUE' +if this process group has a parent and 'PMI_FALSE' if it does not. + +@*/ +int PMI_Init( int *spawned ) +{ + char *env; + + env = getenv("PMI_DEBUG"); + if (env) + pmi_debug = atoi(env); + else + pmi_debug = 0; + if (pmi_debug) + fprintf(stderr, "In: PMI_Init\n"); + + if (spawned == NULL) + return PMI_ERR_INVALID_ARG; + + if (pmi_init) + goto replay; + + env = getenv("SLURM_JOBID"); + if (env) + pmi_jobid = atoi(env); + else + pmi_jobid = 1; + + env = getenv("SLURM_STEPID"); + if (env) + pmi_stepid = atoi(env); + else + pmi_stepid = 1; + + env = getenv("PMI_SPAWNED"); + if (env) + pmi_spawned = atoi(env); + else + pmi_spawned = 0; + + env = getenv("SLURM_NPROCS"); + if (!env) + env = getenv("PMI_SIZE"); + if (env) + pmi_size = atoi(env); + else + pmi_size = 1; + + env = getenv("SLURM_PROCID"); + if (!env) + env = getenv("PMI_RANK"); + if (env) + pmi_rank = atoi(env); + else + pmi_rank = 0; + + pmi_init = 1; + +replay: if (pmi_spawned) + *spawned = PMI_TRUE; + else + *spawned = PMI_FALSE; + return PMI_SUCCESS; +} + +/*@ +PMI_Initialized - check if PMI has been initialized + +Output Parameter: +. initialized - boolean value + +Return values: ++ PMI_SUCCESS - initialized successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to set the variable + +Notes: +On successful output, initialized will either be 'PMI_TRUE' or 'PMI_FALSE'. + ++ PMI_TRUE - initialize has been called. +- PMI_FALSE - initialize has not been called or previously failed. + +@*/ +int PMI_Initialized( PMI_BOOL *initialized ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Initialized\n"); + + if (initialized == NULL) + return PMI_ERR_INVALID_ARG; + + if (pmi_init) + *initialized = PMI_TRUE; + else + *initialized = PMI_FALSE; + + return PMI_SUCCESS; +} + +/*@ +PMI_Finalize - finalize the Process Manager Interface + +Return values: ++ PMI_SUCCESS - finalization completed successfully +- PMI_FAIL - finalization failed + +Notes: + Finalize PMI for this process group. + +@*/ +int PMI_Finalize( void ) +{ + int i; + + if (pmi_debug) + fprintf(stderr, "In: PMI_Finalize\n"); + + pmi_init = 0; + pthread_mutex_lock(&kvs_mutex); + for (i=0; ikvs_cnt; i++) { + if (kvs_ptr->kvs_keys[i]) + free(kvs_ptr->kvs_keys[i]); + if (kvs_ptr->kvs_values[i]) + free(kvs_ptr->kvs_values[i]); + } + if (kvs_ptr->kvs_name) + free(kvs_ptr->kvs_name); + return; +} + +/*@ +PMI_Get_size - obtain the size of the process group + +Output Parameters: +. size - pointer to an integer that receives the size of the process group + +Return values: ++ PMI_SUCCESS - size successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the size + +Notes: +This function returns the size of the process group to which the local process +belongs. + +@*/ +int PMI_Get_size( int *size ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_size\n"); + + if (size == NULL) + return PMI_ERR_INVALID_ARG; + + if (!pmi_init) { + int spawned; + PMI_Init(&spawned); + if (!pmi_init) + return PMI_FAIL; + } + + *size = pmi_size; + return PMI_SUCCESS; +} + +/*@ +PMI_Get_rank - obtain the rank of the local process in the process group + +Output Parameters: +. rank - pointer to an integer that receives the rank in the process group + +Return values: ++ PMI_SUCCESS - rank successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the rank + +Notes: +This function returns the rank of the local process in its process group. + +@*/ +int PMI_Get_rank( int *rank ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_rank\n"); + + if (rank == NULL) + return PMI_ERR_INVALID_ARG; + + if (!pmi_init) { + int spawned; + PMI_Init(&spawned); + if (!pmi_init) + return PMI_FAIL; + } + + *rank = pmi_rank; + return PMI_SUCCESS; +} + +/*@ +PMI_Get_universe_size - obtain the universe size +(NOTE: "universe size" indicates the maximum recommended +process count for the job.) + +Output Parameters: +. size - pointer to an integer that receives the size + +Return values: ++ PMI_SUCCESS - size successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the size + + +@*/ +int PMI_Get_universe_size( int *size ) +{ + char *env; + + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_universe_size\n"); + + if (size == NULL) + return PMI_ERR_INVALID_ARG; + + env = getenv("SLURM_NPROCS"); + if (env) { + *size = atoi(env); + return PMI_SUCCESS; + } + + env = getenv("SLURM_NNODES"); + if (env) { + /* FIXME: We want a processor count here */ + *size = atoi(env); + return PMI_SUCCESS; + } + + *size = 1; + return PMI_SUCCESS; +} + +/*@ +PMI_Get_appnum - obtain the application number + +Output parameters: +. appnum - pointer to an integer that receives the appnum + +Return values: ++ PMI_SUCCESS - appnum successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the size + + +@*/ +int PMI_Get_appnum( int *appnum ) +{ + char *env; + + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_appnum\n"); + + if (appnum == NULL) + return PMI_ERR_INVALID_ARG; + + env = getenv("SLURM_JOBID"); + if (env) { + *appnum = atoi(env); + return PMI_SUCCESS; + } + + *appnum =1; + return PMI_SUCCESS; +} + +/*@ +PMI_Publish_name - publish a name + +Input parameters: +. service_name - string representing the service being published +. port - string representing the port on which to contact the service + +Return values: ++ PMI_SUCCESS - port for service successfully published +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to publish service + + +@*/ +int PMI_Publish_name( const char service_name[], const char port[] ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Publish_name - NOT SUPPORTED\n"); + + if ((service_name == NULL) || (port == NULL)) + return PMI_ERR_INVALID_ARG; + + /* FIXME */ + return PMI_FAIL; +} + +/*@ +PMI_Unpublish_name - unpublish a name + +Input parameters: +. service_name - string representing the service being unpublished + +Return values: ++ PMI_SUCCESS - port for service successfully published +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to unpublish service + + +@*/ +int PMI_Unpublish_name( const char service_name[] ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Unpublish_name - NOT SUPPORTED\n"); + + if (service_name == NULL) + return PMI_ERR_INVALID_ARG; + + /* FIXME */ + return PMI_FAIL; +} + +/*@ +PMI_Lookup_name - lookup a service by name + +Input parameters: +. service_name - string representing the service being published + +Output parameters: +. port - string representing the port on which to contact the service + +Return values: ++ PMI_SUCCESS - port for service successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to lookup service + + +@*/ +int PMI_Lookup_name( const char service_name[], char port[] ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Lookup_name - NOT SUPPORTED\n"); + + if ((service_name == NULL) || (port == NULL)) + return PMI_ERR_INVALID_ARG; + + /* FIXME */ + return PMI_FAIL; +} + +/*@ +PMI_Get_id - obtain the id of the process group + +Input Parameter: +. length - length of the id_str character array + +Output Parameter: +. id_str - character array that receives the id of the process group + +Return values: ++ PMI_SUCCESS - id successfully obtained +. PMI_ERR_INVALID_ARG - invalid id_str argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to return the id + +Notes: +This function returns a string that uniquely identifies the process group +that the local process belongs to. The string passed in must be at least +as long as the number returned by 'PMI_Get_id_length_max()'. + +@*/ +int PMI_Get_id( char id_str[], int length ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_id\n"); + + if (length < PMI_MAX_ID_LEN) + return PMI_ERR_INVALID_LENGTH; + if (id_str == NULL) + return PMI_ERR_INVALID_ARG; + if (pmi_init == 0) + return PMI_FAIL; + + snprintf(id_str, length, "%ld.%ld", pmi_jobid, pmi_stepid); + return PMI_SUCCESS; +} + +/*@ +PMI_Get_kvs_domain_id - obtain the id of the PMI domain + +Input Parameter: +. length - length of id_str character array + +Output Parameter: +. id_str - character array that receives the id of the PMI domain + +Return values: ++ PMI_SUCCESS - id successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to return the id + +Notes: +This function returns a string that uniquely identifies the PMI domain +where keyval spaces can be shared. The string passed in must be at least +as long as the number returned by 'PMI_Get_id_length_max()'. + +@*/ +int PMI_Get_kvs_domain_id( char id_str[], int length ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_kvs_domain_id\n"); + + if (length < PMI_MAX_ID_LEN) + return PMI_ERR_INVALID_LENGTH; + if (id_str == NULL) + return PMI_ERR_INVALID_ARG; + if (pmi_init == 0) + return PMI_FAIL; + + snprintf(id_str, length, "%ld.%ld", pmi_jobid, pmi_stepid); + return PMI_SUCCESS; +} + +/*@ +PMI_Get_id_length_max - obtain the maximum length of an id string + +Output Parameters: +. length - the maximum length of an id string + +Return values: ++ PMI_SUCCESS - length successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the maximum length + +Notes: +This function returns the maximum length of a process group id string. + +@*/ +int PMI_Get_id_length_max( int *length ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_id_length_max\n"); + + if (length == NULL) + return PMI_ERR_INVALID_ARG; + + *length = PMI_MAX_ID_LEN; + return PMI_SUCCESS; +} + +/*@ +PMI_Barrier - barrier across the process group + +Return values: ++ PMI_SUCCESS - barrier successfully finished +- PMI_FAIL - barrier failed + +Notes: +This function is a collective call across all processes in the process group +the local process belongs to. It will not return until all the processes +have called 'PMI_Barrier()'. + +@*/ +int PMI_Barrier( void ) +{ + struct kvs_comm_set *kvs_set_ptr = NULL; + struct kvs_comm *kvs_ptr; + int i, j, k, rc = PMI_SUCCESS; + + if (pmi_debug) + fprintf(stderr, "In: PMI_Barrier\n"); + + /* Issue the RPC */ + if (slurm_get_kvs_comm_set(&kvs_set_ptr, pmi_rank, pmi_size) + != SLURM_SUCCESS) + return PMI_FAIL; + if (kvs_set_ptr == NULL) + return PMI_SUCCESS; + if (pmi_debug) + fprintf(stderr, "Past PMI_Barrier\n"); + + for (i=0; ikvs_comm_recs; i++) { + kvs_ptr = kvs_set_ptr->kvs_comm_ptr[i]; + for (j=0; jkvs_cnt; j++) { + k = _kvs_put(kvs_ptr->kvs_name, + kvs_ptr->kvs_keys[j], + kvs_ptr->kvs_values[j], + 0); + if (k != PMI_SUCCESS) + rc = k; + } + } + + /* Release temporary storage from RPC */ + slurm_free_kvs_comm_set(kvs_set_ptr); + return rc; +} + +/*@ +PMI_Get_clique_size - obtain the number of processes on the local node + +Output Parameters: +. size - pointer to an integer that receives the size of the clique + +Return values: ++ PMI_SUCCESS - size successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to return the clique size + +Notes: +This function returns the number of processes in the local process group that +are on the local node along with the local process. This is a simple topology +function to distinguish between processes that can communicate through IPC +mechanisms (e.g., shared memory) and other network mechanisms. + +@*/ +int PMI_Get_clique_size( int *size ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_clique_size - NOT SUPPORTED\n"); + + if (size == NULL) + return PMI_ERR_INVALID_ARG; + + /* FIXME */ + return PMI_FAIL; +} + +/*@ +PMI_Get_clique_ranks - get the ranks of the local processes in the process group + +Input Parameters: +. length - length of the ranks array + +Output Parameters: +. ranks - pointer to an array of integers that receive the local ranks + +Return values: ++ PMI_SUCCESS - ranks successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to return the ranks + +Notes: +This function returns the ranks of the processes on the local node. The array +must be at least as large as the size returned by 'PMI_Get_clique_size()'. This +is a simple topology function to distinguish between processes that can +communicate through IPC mechanisms (e.g., shared memory) and other network +mechanisms. + +@*/ +int PMI_Get_clique_ranks( int ranks[], int length ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_clique_ranks - NOT SUPPORTED\n"); + + if (ranks == NULL) + return PMI_ERR_INVALID_ARG; + + /* FIXME */ + return PMI_FAIL; +} + +/*@ +PMI_Abort - abort the process group associated with this process + +Input Parameters: ++ exit_code - exit code to be returned by this process +- error_msg - error message to be printed + +Return values: +. none - this function should not return +@*/ +int PMI_Abort(int exit_code, const char error_msg[]) +{ + if (pmi_debug) { + if (error_msg == NULL) + error_msg = "NULL"; + fprintf(stderr, "In: PMI_Abort(%d, %s)\n", exit_code, error_msg); + } + + exit(exit_code); +} + +/* PMI Keymap functions */ +/*@ +PMI_KVS_Get_my_name - obtain the name of the keyval space the local process +group has access to + +Input Parameters: +. length - length of the kvsname character array + +Output Parameters: +. kvsname - a string that receives the keyval space name + +Return values: ++ PMI_SUCCESS - kvsname successfully obtained +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to return the kvsname + +Notes: +This function returns the name of the keyval space that this process and all +other processes in the process group have access to. The output parameter, +kvsname, must be at least as long as the value returned by +'PMI_KVS_Get_name_length_max()'. + +@*/ +int PMI_KVS_Get_my_name( char kvsname[], int length ) +{ + int size; + + if (pmi_debug) + fprintf(stderr, "In: PMI_KVS_Get_my_name\n"); + + if (kvsname == NULL) + return PMI_ERR_INVALID_ARG; + if (pmi_init == 0) + return PMI_FAIL; + + size = snprintf(kvsname, length, "%ld.%ld", pmi_jobid, pmi_stepid); + if (size >= length) /* truncated */ + return PMI_ERR_INVALID_LENGTH; + + pthread_mutex_lock(&kvs_mutex); + _init_kvs(kvsname); + pthread_mutex_unlock(&kvs_mutex); + return PMI_SUCCESS; +} + +static void _init_kvs( char kvsname[] ) +{ + int i; + + i = kvs_rec_cnt; + kvs_rec_cnt++; + kvs_recs = realloc(kvs_recs, (sizeof(struct kvs_rec) * kvs_rec_cnt)); + kvs_recs[i].kvs_name = strndup(kvsname, PMI_MAX_KVSNAME_LEN); + kvs_recs[i].kvs_state = KVS_STATE_LOCAL; + kvs_recs[i].kvs_cnt = 0; + kvs_recs[i].kvs_inx = 0; + kvs_recs[i].kvs_key_states = NULL; + kvs_recs[i].kvs_keys = NULL; + kvs_recs[i].kvs_values = NULL; +} + +/*@ +PMI_KVS_Get_name_length_max - obtain the length necessary to store a kvsname + +Output Parameter: +. length - maximum length required to hold a keyval space name + +Return values: ++ PMI_SUCCESS - length successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to set the length + +Notes: +This function returns the string length required to store a keyval space name. + +A routine is used rather than setting a maximum value in 'pmi.h' to allow +different implementations of PMI to be used with the same executable. These +different implementations may allow different maximum lengths; by using a +routine here, we can interface with a variety of implementations of PMI. + +@*/ +int PMI_KVS_Get_name_length_max( int *length ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_KVS_Get_name_length_max\n"); + + if (length == NULL) + return PMI_ERR_INVALID_ARG; + + *length = PMI_MAX_KVSNAME_LEN; + return PMI_SUCCESS; +} + +/*@ +PMI_KVS_Get_key_length_max - obtain the length necessary to store a key + +Output Parameter: +. length - maximum length required to hold a key string. + +Return values: ++ PMI_SUCCESS - length successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to set the length + +Notes: +This function returns the string length required to store a key. + +@*/ +int PMI_KVS_Get_key_length_max( int *length ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_KVS_Get_key_length_max\n"); + + if (length == NULL) + return PMI_ERR_INVALID_ARG; + + *length = PMI_MAX_KEY_LEN; + return PMI_SUCCESS; +} + +/*@ +PMI_KVS_Get_value_length_max - obtain the length necessary to store a value + +Output Parameter: +. length - maximum length required to hold a keyval space value + +Return values: ++ PMI_SUCCESS - length successfully set +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to set the length + +Notes: +This function returns the string length required to store a value from a +keyval space. + +@*/ +int PMI_KVS_Get_value_length_max( int *length ) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_KVS_Get_value_length_max\n"); + + if (length == NULL) + return PMI_ERR_INVALID_ARG; + + *length = PMI_MAX_VAL_LEN; + return PMI_SUCCESS; +} + +/*@ +PMI_KVS_Create - create a new keyval space + +Input Parameter: +. length - length of the kvsname character array + +Output Parameters: +. kvsname - a string that receives the keyval space name + +Return values: ++ PMI_SUCCESS - keyval space successfully created +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - unable to create a new keyval space + +Notes: +This function creates a new keyval space. Everyone in the same process group +can access this keyval space by the name returned by this function. The +function is not collective. Only one process calls this function. The output +parameter, kvsname, must be at least as long as the value returned by +'PMI_KVS_Get_name_length_max()'. + +@*/ +int PMI_KVS_Create( char kvsname[], int length ) +{ + int size, rc; + + if (pmi_debug) + fprintf(stderr, "In: PMI_KVS_Create\n"); + + if (kvsname == NULL) + return PMI_ERR_INVALID_ARG; + if ((pmi_jobid < 0) || (pmi_stepid < 0)) + return PMI_FAIL; + + pthread_mutex_lock(&kvs_mutex); + size = snprintf(kvsname, length, "%ld.%ld.%d.%d", pmi_jobid, + pmi_stepid, pmi_rank, kvs_name_sequence); + if (size >= length) /* truncated */ + rc = PMI_ERR_INVALID_LENGTH; + else { + kvs_name_sequence++; + _init_kvs(kvsname); + rc = PMI_SUCCESS; + } + pthread_mutex_unlock(&kvs_mutex); + return rc; +} + +/*@ +PMI_KVS_Destroy - destroy keyval space + +Input Parameters: +. kvsname - keyval space name + +Return values: ++ PMI_SUCCESS - keyval space successfully destroyed +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - unable to destroy the keyval space + +Notes: +This function destroys a keyval space created by 'PMI_KVS_Create()'. + +@*/ +int PMI_KVS_Destroy( const char kvsname[] ) +{ + int i, found = 0; + + if (pmi_debug) + fprintf(stderr, "In: PMI_KVS_Destroy - NOT FULLY SUPPORTED\n"); + + if (kvsname == NULL) + return PMI_ERR_INVALID_ARG; + + pthread_mutex_lock(&kvs_mutex); + for (i=0; i PMI_MAX_KVSNAME_LEN)) + return PMI_ERR_INVALID_KVS; + if ((key == NULL) || (strlen(key) >PMI_MAX_KEY_LEN)) + return PMI_ERR_INVALID_KEY; + if ((value == NULL) || (strlen(value) > PMI_MAX_VAL_LEN)) + return PMI_ERR_INVALID_VAL; + + return _kvs_put(kvsname, key, value, 1); +} + +static int _kvs_put( const char kvsname[], const char key[], const char value[], + int local) +{ + int i, j, rc; + + /* find the proper kvs record */ + pthread_mutex_lock(&kvs_mutex); + for (i=0; i PMI_MAX_KVSNAME_LEN)) + return PMI_ERR_INVALID_ARG; + + /* Pack records into RPC for sending to slurmd_step + * NOTE: For performance reasons, we only send key-pairs + * which have been locally set rather than the full key-pair + * space. We do this by moving the local key-pairs to the + * head of the list and sending the count of local entries + * rather than the full set. */ + kvs_set.task_id = pmi_rank; + kvs_set.kvs_comm_recs = 0; + kvs_set.kvs_comm_ptr = NULL; + + pthread_mutex_lock(&kvs_mutex); + for (i=0; ikvs_name = + kvs_recs[i].kvs_name; + kvs_set.kvs_comm_ptr[kvs_set.kvs_comm_recs]->kvs_cnt = + local_pairs; + kvs_set.kvs_comm_ptr[kvs_set.kvs_comm_recs]->kvs_keys = + kvs_recs[i].kvs_keys; + kvs_set.kvs_comm_ptr[kvs_set.kvs_comm_recs]->kvs_values = + kvs_recs[i].kvs_values; + kvs_set.kvs_comm_recs++; + } + + /* Send the RPC */ + if (slurm_send_kvs_comm_set(&kvs_set, pmi_rank, pmi_size) + != SLURM_SUCCESS) + rc = PMI_FAIL; + else + rc = PMI_SUCCESS; + pthread_mutex_unlock(&kvs_mutex); + + /* Free any temporary storage */ + for (i=0; ikvs_key_states[inx1]; + kvs_ptr->kvs_key_states[inx1] = kvs_ptr->kvs_key_states[inx2]; + kvs_ptr->kvs_key_states[inx2] = tmp_16; + + tmp_char = kvs_ptr->kvs_keys[inx1]; + kvs_ptr->kvs_keys[inx1] = kvs_ptr->kvs_keys[inx2]; + kvs_ptr->kvs_keys[inx2] = tmp_char; + + tmp_char = kvs_ptr->kvs_values[inx1]; + kvs_ptr->kvs_values[inx1] = kvs_ptr->kvs_values[inx2]; + kvs_ptr->kvs_values[inx2] = tmp_char; +} + +/*@ +PMI_KVS_Get - get a key/value pair from a keyval space + +Input Parameters: ++ kvsname - keyval space name +. key - key +- length - length of value character array + +Output Parameters: +. value - value + +Return values: ++ PMI_SUCCESS - get succeeded +. PMI_ERR_INVALID_KVS - invalid kvsname argument +. PMI_ERR_INVALID_KEY - invalid key argument +. PMI_ERR_INVALID_VAL - invalid val argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +- PMI_FAIL - get failed + +Notes: +This function gets the value of the specified key in the keyval space. + +@*/ +int PMI_KVS_Get( const char kvsname[], const char key[], char value[], int length) +{ + int i, j, rc; + + if (pmi_debug) + fprintf(stderr, "In: PMI_KVS_Get(%s)\n", key); + + if ((kvsname == NULL) || (strlen(kvsname) > PMI_MAX_KVSNAME_LEN)) + return PMI_ERR_INVALID_KVS; + if ((key == NULL) || (strlen(key) >PMI_MAX_KEY_LEN)) + return PMI_ERR_INVALID_KEY; + if (value == NULL) + return PMI_ERR_INVALID_VAL; + + /* find the proper kvs record */ + pthread_mutex_lock(&kvs_mutex); + for (i=0; i (length-1)) + rc = PMI_ERR_INVALID_LENGTH; + else { + strncpy(value, kvs_recs[i].kvs_values[j], + PMI_MAX_VAL_LEN); + rc = PMI_SUCCESS; + } + goto fini; + } + rc = PMI_ERR_INVALID_KEY; + goto fini; + } + rc = PMI_ERR_INVALID_KVS; + +fini: pthread_mutex_unlock(&kvs_mutex); + return rc; +} + +/*@ +PMI_KVS_Iter_first - initialize the iterator and get the first value + +Input Parameters: ++ kvsname - keyval space name +. key_len - length of key character array +- val_len - length of val character array + +Output Parameters: ++ key - key +- value - value + +Return values: ++ PMI_SUCCESS - keyval pair successfully retrieved from the keyval space +. PMI_ERR_INVALID_KVS - invalid kvsname argument +. PMI_ERR_INVALID_KEY - invalid key argument +. PMI_ERR_INVALID_KEY_LENGTH - invalid key length argument +. PMI_ERR_INVALID_VAL - invalid val argument +. PMI_ERR_INVALID_VAL_LENGTH - invalid val length argument +- PMI_FAIL - failed to initialize the iterator and get the first keyval pair + +Notes: +This function initializes the iterator for the specified keyval space and +retrieves the first key/val pair. The end of the keyval space is specified +by returning an empty key string. key and val must be at least as long as +the values returned by 'PMI_KVS_Get_key_length_max()' and +'PMI_KVS_Get_value_length_max()'. + +@*/ +int PMI_KVS_Iter_first(const char kvsname[], char key[], int key_len, char val[], int val_len) +{ + int i, rc; + + if (pmi_debug) + fprintf(stderr, "In: PMI_KVS_Iter_first\n"); + + if ((kvsname == NULL) || (strlen(kvsname) > PMI_MAX_KVSNAME_LEN)) + return PMI_ERR_INVALID_KVS; + if (key == NULL) + return PMI_ERR_INVALID_KEY; + if (val == NULL) + return PMI_ERR_INVALID_VAL; + + /* find the proper kvs record */ + pthread_mutex_lock(&kvs_mutex); + for (i=0; i= kvs_recs[i].kvs_cnt) { + key[0] = '\0'; + val[0] = '\0'; + rc = PMI_SUCCESS; + } else if (strlen(kvs_recs[i].kvs_keys[kvs_recs[i].kvs_inx]) > + (key_len-1)) { + rc = PMI_ERR_INVALID_KEY_LENGTH; + } else if (strlen(kvs_recs[i].kvs_values[kvs_recs[i].kvs_inx]) > + (val_len-1)) { + rc = PMI_ERR_INVALID_VAL_LENGTH; + } else { + strncpy(key, kvs_recs[i].kvs_keys[kvs_recs[i].kvs_inx], + PMI_MAX_KEY_LEN); + strncpy(val, kvs_recs[i].kvs_values[kvs_recs[i].kvs_inx], + PMI_MAX_VAL_LEN); + rc = PMI_SUCCESS; + } + goto fini; + } + rc = PMI_ERR_INVALID_KVS; + +fini: pthread_mutex_unlock(&kvs_mutex); + return rc; +} + +/*@ +PMI_KVS_Iter_next - get the next keyval pair from the keyval space + +Input Parameters: ++ kvsname - keyval space name +. key_len - length of key character array +- val_len - length of val character array + +Output Parameters: ++ key - key +- value - value + +Return values: ++ PMI_SUCCESS - keyval pair successfully retrieved from the keyval space +. PMI_ERR_INVALID_KVS - invalid kvsname argument +. PMI_ERR_INVALID_KEY - invalid key argument +. PMI_ERR_INVALID_KEY_LENGTH - invalid key length argument +. PMI_ERR_INVALID_VAL - invalid val argument +. PMI_ERR_INVALID_VAL_LENGTH - invalid val length argument +- PMI_FAIL - failed to get the next keyval pair + +Notes: +This function retrieves the next keyval pair from the specified keyval space. +'PMI_KVS_Iter_first()' must have been previously called. The end of the keyval +space is specified by returning an empty key string. The output parameters, +key and val, must be at least as long as the values returned by +'PMI_KVS_Get_key_length_max()' and 'PMI_KVS_Get_value_length_max()'. + +@*/ +int PMI_KVS_Iter_next(const char kvsname[], char key[], int key_len, + char val[], int val_len) +{ + int i, rc; + + if (pmi_debug) + fprintf(stderr, "In: PMI_KVS_Iter_next\n"); + + if ((kvsname == NULL) || (strlen(kvsname) > PMI_MAX_KVSNAME_LEN)) + return PMI_ERR_INVALID_KVS; + if (key == NULL) + return PMI_ERR_INVALID_KEY; + if (val == NULL) + return PMI_ERR_INVALID_VAL; + + /* find the proper kvs record */ + pthread_mutex_lock(&kvs_mutex); + for (i=0; i= kvs_recs[i].kvs_cnt) { + key[0] = '\0'; + val[0] = '\0'; + rc = PMI_SUCCESS; + } else if (strlen(kvs_recs[i].kvs_keys[kvs_recs[i].kvs_inx]) > + (key_len-1)) { + rc = PMI_ERR_INVALID_KEY_LENGTH; + } else if (strlen(kvs_recs[i].kvs_values[kvs_recs[i].kvs_inx]) > + (val_len-1)) { + rc = PMI_ERR_INVALID_VAL_LENGTH; + } else { + strncpy(key, kvs_recs[i].kvs_keys[kvs_recs[i].kvs_inx], + PMI_MAX_KEY_LEN); + strncpy(val, kvs_recs[i].kvs_values[kvs_recs[i].kvs_inx], + PMI_MAX_VAL_LEN); + rc = PMI_SUCCESS; + } + goto fini; + } + rc = PMI_ERR_INVALID_KVS; + +fini: pthread_mutex_unlock(&kvs_mutex); + return rc; +} + +/* PMI Process Creation functions */ + +/*@ +PMI_Spawn_multiple - spawn a new set of processes + +Input Parameters: ++ count - count of commands +. cmds - array of command strings +. argvs - array of argv arrays for each command string +. maxprocs - array of maximum processes to spawn for each command string +. info_keyval_sizes - array giving the number of elements in each of the + 'info_keyval_vectors' +. info_keyval_vectors - array of keyval vector arrays +. preput_keyval_size - Number of elements in 'preput_keyval_vector' +- preput_keyval_vector - array of keyvals to be pre-put in the spawned keyval space + +Output Parameter: +. errors - array of errors for each command + +Return values: ++ PMI_SUCCESS - spawn successful +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - spawn failed + +Notes: +This function spawns a set of processes into a new process group. The 'count' +field refers to the size of the array parameters - 'cmd', 'argvs', 'maxprocs', +'info_keyval_sizes' and 'info_keyval_vectors'. The 'preput_keyval_size' refers +to the size of the 'preput_keyval_vector' array. The 'preput_keyval_vector' +contains keyval pairs that will be put in the keyval space of the newly +created process group before the processes are started. The 'maxprocs' array +specifies the desired number of processes to create for each 'cmd' string. +The actual number of processes may be less than the numbers specified in +maxprocs. The acceptable number of processes spawned may be controlled by +``soft'' keyvals in the info arrays. The ``soft'' option is specified by +mpiexec in the MPI-2 standard. Environment variables may be passed to the +spawned processes through PMI implementation specific 'info_keyval' parameters. +@*/ +int PMI_Spawn_multiple(int count, + const char * cmds[], + const char ** argvs[], + const int maxprocs[], + const int info_keyval_sizesp[], + const PMI_keyval_t * info_keyval_vectors[], + int preput_keyval_size, + const PMI_keyval_t preput_keyval_vector[], + int errors[]) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Spawn_multiple - NOT SUPPORTED\n"); + + if (cmds == NULL) + return PMI_ERR_INVALID_ARG; + + /* FIXME */ + return PMI_FAIL; +} + +/*@ +PMI_Parse_option - create keyval structures from a single command line argument + +Input Parameters: ++ num_args - length of args array +- args - array of command line arguments starting with the argument to be parsed + +Output Parameters: ++ num_parsed - number of elements of the argument array parsed +. keyvalp - pointer to an array of keyvals +- size - size of the allocated array + +Return values: ++ PMI_SUCCESS - success +. PMI_ERR_INVALID_NUM_ARGS - invalid number of arguments +. PMI_ERR_INVALID_ARGS - invalid args argument +. PMI_ERR_INVALID_NUM_PARSED - invalid num_parsed length argument +. PMI_ERR_INVALID_KEYVALP - invalid keyvalp argument +. PMI_ERR_INVALID_SIZE - invalid size argument +- PMI_FAIL - fail + +Notes: +This function removes one PMI specific argument from the command line and +creates the corresponding 'PMI_keyval_t' structure for it. It returns +an array and size to the caller. The array must be freed by 'PMI_Free_keyvals()'. +If the first element of the args array is not a PMI specific argument, the +function returns success and sets num_parsed to zero. If there are multiple PMI +specific arguments in the args array, this function may parse more than one +argument as long as the options are contiguous in the args array. + +@*/ +int PMI_Parse_option(int num_args, char *args[], int *num_parsed, PMI_keyval_t **keyvalp, + int *size) +{ +if (pmi_debug) + fprintf(stderr, "In: PMI_Parse_option - NOT SUPPORTED\n"); + + if (num_parsed == NULL) + return PMI_ERR_INVALID_NUM_PARSED; + if (keyvalp == NULL) + return PMI_ERR_INVALID_KEYVALP; + if (size == NULL) + return PMI_ERR_INVALID_SIZE; + + /* FIXME */ + return PMI_FAIL; +} + +/*@ +PMI_Args_to_keyval - create keyval structures from command line arguments + +Input Parameters: ++ argcp - pointer to argc +- argvp - pointer to argv + +Output Parameters: ++ keyvalp - pointer to an array of keyvals +- size - size of the allocated array + +Return values: ++ PMI_SUCCESS - success +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - fail + +Notes: +This function removes PMI specific arguments from the command line and +creates the corresponding 'PMI_keyval_t' structures for them. It returns +an array and size to the caller that can then be passed to 'PMI_Spawn_multiple()'. +The array can be freed by 'PMI_Free_keyvals()'. The routine 'free()' should +not be used to free this array as there is no requirement that the array be +allocated with 'malloc()'. + +@*/ +int PMI_Args_to_keyval(int *argcp, char *((*argvp)[]), PMI_keyval_t **keyvalp, + int *size) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Args_to_keyval - NOT SUPPORTED\n"); + + if ((keyvalp == NULL) || (size == NULL)) + return PMI_ERR_INVALID_ARG; + + /* FIXME */ + return PMI_FAIL; +} + +/*@ +PMI_Free_keyvals - free the keyval structures created by PMI_Args_to_keyval + +Input Parameters: ++ keyvalp - array of keyvals +- size - size of the array + +Return values: ++ PMI_SUCCESS - success +. PMI_ERR_INVALID_ARG - invalid argument +- PMI_FAIL - fail + +Notes: + This function frees the data returned by 'PMI_Args_to_keyval' and 'PMI_Parse_option'. + Using this routine instead of 'free' allows the PMI package to track + allocation of storage or to use interal storage as it sees fit. +@*/ +int PMI_Free_keyvals(PMI_keyval_t keyvalp[], int size) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Free_keyvals - NOT SUPPORTED\n"); + + if ((keyvalp == NULL) && size) + return PMI_ERR_INVALID_ARG; + + /* FIXME */ + return PMI_FAIL; +} + +/*@ +PMI_Get_options - get a string of command line argument descriptions that may be printed + to the user + +Input Parameters: +. length - length of str + +Output Parameters: ++ str - description string +- length - length of string or necessary length if input is not large enough + +Return values: ++ PMI_SUCCESS - success +. PMI_ERR_INVALID_ARG - invalid argument +. PMI_ERR_INVALID_LENGTH - invalid length argument +. PMI_ERR_NOMEM - input length too small +- PMI_FAIL - fail + +Notes: + This function returns the command line options specific to the pmi implementation +@*/ +int PMI_Get_options(char *str, int *length) +{ + if (pmi_debug) + fprintf(stderr, "In: PMI_Get_options - NOT SUPPORTED\n"); + + if ((str == NULL) || (length == NULL)) + return PMI_ERR_INVALID_ARG; + + /* FIXME */ + return PMI_FAIL; +} diff --git a/executable_names/src/api/pmi_server.c b/executable_names/src/api/pmi_server.c new file mode 100644 index 0000000000000000000000000000000000000000..12c797116d0d98f3d7b5586a4c6cdaf44f19ae79 --- /dev/null +++ b/executable_names/src/api/pmi_server.c @@ -0,0 +1,402 @@ +/*****************************************************************************\ + * pmi.c - Global PMI data as maintained within srun + * $Id$ + ***************************************************************************** + * Copyright (C) 2005-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "src/api/slurm_pmi.h" +#include "src/common/macros.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/xsignal.h" +#include "src/common/xstring.h" +#include "src/common/xmalloc.h" + +#define _DEBUG 0 /* non-zero for extra KVS logging */ +#define MSG_TRANSMITS 2 /* transmit KVS messages this number times */ + +/* Global variables */ +pthread_mutex_t kvs_mutex = PTHREAD_MUTEX_INITIALIZER; +int kvs_comm_cnt = 0; +int kvs_updated = 0; +struct kvs_comm **kvs_comm_ptr = NULL; + +struct barrier_resp { + uint16_t port; + char *hostname; +}; /* details for barrier task communcations */ +struct barrier_resp *barrier_ptr = NULL; +uint16_t barrier_resp_cnt = 0; /* tasks having reached barrier */ +uint16_t barrier_cnt = 0; /* tasks needing to reach barrier */ + +pthread_mutex_t agent_mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_cond_t agent_cond = PTHREAD_COND_INITIALIZER; +struct agent_arg { + struct barrier_resp *barrier_xmit_ptr; + int barrier_xmit_cnt; + struct kvs_comm **kvs_xmit_ptr; + int kvs_xmit_cnt; +}; /* details for message agent manager */ +struct msg_arg { + struct barrier_resp *bar_ptr; + struct kvs_comm_set *kvs_ptr; +}; +int agent_cnt = 0; /* number of active message agents */ +int agent_max_cnt = 32; /* maximum number of active agents */ + +static void *_agent(void *x); +static struct kvs_comm *_find_kvs_by_name(char *name); +struct kvs_comm **_kvs_comm_dup(void); +static void _kvs_xmit_tasks(void); +static void _merge_named_kvs(struct kvs_comm *kvs_orig, + struct kvs_comm *kvs_new); +static void _move_kvs(struct kvs_comm *kvs_new); +static void *_msg_thread(void *x); +static void _print_kvs(void); + +/* Transmit the KVS keypairs to all tasks, waiting at a barrier + * This will take some time, so we work with a copy of the KVS keypairs. + * We also work with a private copy of the barrier data and clear the + * global data pointers so any new barrier requests get treated as + * completely independent of this one. */ +static void _kvs_xmit_tasks(void) +{ + struct agent_arg *args; + pthread_attr_t attr; + pthread_t agent_id; + +#if _DEBUG + info("All tasks at barrier, transmit KVS keypairs now"); +#endif + /* reset barrier info */ + args = xmalloc(sizeof(struct agent_arg)); + args->barrier_xmit_ptr = barrier_ptr; + args->barrier_xmit_cnt = barrier_cnt; + barrier_ptr = NULL; + barrier_resp_cnt = 0; + barrier_cnt = 0; + + /* copy the new kvs data */ + if (kvs_updated) { + args->kvs_xmit_ptr = _kvs_comm_dup(); + args->kvs_xmit_cnt = kvs_comm_cnt; + kvs_updated = 0; + } else { /* No new data to transmit */ + args->kvs_xmit_ptr = xmalloc(0); + args->kvs_xmit_cnt = 0; + } + + /* Spawn a pthread to transmit it */ + slurm_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + if (pthread_create(&agent_id, &attr, _agent, (void *) args)) + fatal("pthread_create"); + slurm_attr_destroy(&attr); +} + +static void *_msg_thread(void *x) +{ + struct msg_arg *msg_arg_ptr = (struct msg_arg *) x; + int rc, success = 0, timeout; + slurm_msg_t msg_send; + + slurm_msg_t_init(&msg_send); + + debug2("KVS_Barrier msg to %s:%u", + msg_arg_ptr->bar_ptr->hostname, + msg_arg_ptr->bar_ptr->port); + msg_send.msg_type = PMI_KVS_GET_RESP; + msg_send.data = (void *) msg_arg_ptr->kvs_ptr; + slurm_set_addr(&msg_send.address, + msg_arg_ptr->bar_ptr->port, + msg_arg_ptr->bar_ptr->hostname); + + timeout = slurm_get_msg_timeout() * 8000; + if (slurm_send_recv_rc_msg_only_one(&msg_send, &rc, timeout) < 0) { + error("slurm_send_recv_rc_msg_only_one: %m"); + } else if (rc != SLURM_SUCCESS) { + error("KVS_Barrier confirm from %s, rc=%d", + msg_arg_ptr->bar_ptr->hostname, rc); + } else { + /* successfully transmitted KVS keypairs */ + success = 1; + } + + slurm_mutex_lock(&agent_mutex); + agent_cnt--; + if (success) + msg_arg_ptr->bar_ptr->port = 0; + slurm_mutex_unlock(&agent_mutex); + pthread_cond_signal(&agent_cond); + xfree(x); + return NULL; +} + +static void *_agent(void *x) +{ + struct agent_arg *args = (struct agent_arg *) x; + struct kvs_comm_set kvs_set; + struct msg_arg *msg_args; + int i, j; + pthread_t msg_id; + pthread_attr_t attr; + + /* send the messages */ + slurm_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + kvs_set.kvs_comm_recs = args->kvs_xmit_cnt; + kvs_set.kvs_comm_ptr = args->kvs_xmit_ptr; + for (i=0; ibarrier_xmit_cnt; j++) { + if (args->barrier_xmit_ptr[j].port == 0) + continue; + slurm_mutex_lock(&agent_mutex); + while (agent_cnt >= agent_max_cnt) + pthread_cond_wait(&agent_cond, &agent_mutex); + agent_cnt++; + slurm_mutex_unlock(&agent_mutex); + + msg_args = xmalloc(sizeof(struct msg_arg)); + msg_args->bar_ptr = &args->barrier_xmit_ptr[j]; + msg_args->kvs_ptr = &kvs_set; + if (agent_max_cnt == 1) { + /* TotalView slows down a great deal for + * pthread_create() calls, so just send the + * messages inline when TotalView is in use + * or for some other reason we only want + * one pthread. */ + _msg_thread((void *) msg_args); + } else if (pthread_create(&msg_id, &attr, _msg_thread, + (void *) msg_args)) { + fatal("pthread_create: %m"); + } + } + slurm_mutex_lock(&agent_mutex); + while (agent_cnt > 0) + pthread_cond_wait(&agent_cond, &agent_mutex); + slurm_mutex_unlock(&agent_mutex); + } + slurm_attr_destroy(&attr); + + /* Release allocated memory */ + for (i=0; ibarrier_xmit_cnt; i++) + xfree(args->barrier_xmit_ptr[i].hostname); + xfree(args->barrier_xmit_ptr); + for (i=0; ikvs_xmit_cnt; i++) { + for (j=0; jkvs_xmit_ptr[i]->kvs_cnt; j++) { + xfree(args->kvs_xmit_ptr[i]->kvs_keys[j]); + xfree(args->kvs_xmit_ptr[i]->kvs_values[j]); + } + xfree(args->kvs_xmit_ptr[i]->kvs_keys); + xfree(args->kvs_xmit_ptr[i]->kvs_values); + xfree(args->kvs_xmit_ptr[i]->kvs_name); + xfree(args->kvs_xmit_ptr[i]); + } + xfree(args->kvs_xmit_ptr); + xfree(args); + return NULL; +} + +/* duplicate the current KVS comm structure */ +struct kvs_comm **_kvs_comm_dup(void) +{ + int i, j; + struct kvs_comm **rc_kvs; + + rc_kvs = xmalloc(sizeof(struct kvs_comm *) * kvs_comm_cnt); + for (i=0; ikvs_name = xstrdup(kvs_comm_ptr[i]->kvs_name); + rc_kvs[i]->kvs_cnt = kvs_comm_ptr[i]->kvs_cnt; + rc_kvs[i]->kvs_keys = + xmalloc(sizeof(char *) * rc_kvs[i]->kvs_cnt); + rc_kvs[i]->kvs_values = + xmalloc(sizeof(char *) * rc_kvs[i]->kvs_cnt); + for (j=0; jkvs_cnt; j++) { + rc_kvs[i]->kvs_keys[j] = + xstrdup(kvs_comm_ptr[i]->kvs_keys[j]); + rc_kvs[i]->kvs_values[j] = + xstrdup(kvs_comm_ptr[i]->kvs_values[j]); + } + } + return rc_kvs; +} + +/* return pointer to named kvs element or NULL if not found */ +static struct kvs_comm *_find_kvs_by_name(char *name) +{ + int i; + + for (i=0; ikvs_name, name)) + continue; + return kvs_comm_ptr[i]; + } + return NULL; +} + +static void _merge_named_kvs(struct kvs_comm *kvs_orig, + struct kvs_comm *kvs_new) +{ + int i, j; + + for (i=0; ikvs_cnt; i++) { + for (j=0; jkvs_cnt; j++) { + if (strcmp(kvs_new->kvs_keys[i], kvs_orig->kvs_keys[j])) + continue; + xfree(kvs_orig->kvs_values[j]); + kvs_orig->kvs_values[j] = kvs_new->kvs_values[i]; + kvs_new->kvs_values[i] = NULL; + break; + } + if (j < kvs_orig->kvs_cnt) + continue; /* already recorded, update */ + /* append it */ + kvs_orig->kvs_cnt++; + xrealloc(kvs_orig->kvs_keys, + (sizeof(char *) * kvs_orig->kvs_cnt)); + xrealloc(kvs_orig->kvs_values, + (sizeof(char *) * kvs_orig->kvs_cnt)); + kvs_orig->kvs_keys[kvs_orig->kvs_cnt-1] = kvs_new->kvs_keys[i]; + kvs_orig->kvs_values[kvs_orig->kvs_cnt-1] = + kvs_new->kvs_values[i]; + kvs_new->kvs_keys[i] = NULL; + kvs_new->kvs_values[i] = NULL; + } +} + +static void _move_kvs(struct kvs_comm *kvs_new) +{ + kvs_comm_ptr = xrealloc(kvs_comm_ptr, (sizeof(struct kvs_comm *) * + (kvs_comm_cnt + 1))); + kvs_comm_ptr[kvs_comm_cnt] = kvs_new; + kvs_comm_cnt++; +} + +static void _print_kvs(void) +{ +#if _DEBUG + int i, j; + + info("KVS dump start"); + for (i=0; ikvs_cnt; j++) { + info("KVS: %s:%s:%s", kvs_comm_ptr[i]->kvs_name, + kvs_comm_ptr[i]->kvs_keys[j], + kvs_comm_ptr[i]->kvs_values[j]); + } + } +#endif +} + +extern int pmi_kvs_put(struct kvs_comm_set *kvs_set_ptr) +{ + int i; + struct kvs_comm *kvs_ptr; + + /* Merge new data with old. + * NOTE: We just move pointers rather than copy data where + * possible for improved performance */ + pthread_mutex_lock(&kvs_mutex); + for (i=0; ikvs_comm_recs; i++) { + kvs_ptr = _find_kvs_by_name(kvs_set_ptr-> + kvs_comm_ptr[i]->kvs_name); + if (kvs_ptr) { + _merge_named_kvs(kvs_ptr, + kvs_set_ptr->kvs_comm_ptr[i]); + } else { + _move_kvs(kvs_set_ptr->kvs_comm_ptr[i]); + kvs_set_ptr-> kvs_comm_ptr[i] = NULL; + } + } + slurm_free_kvs_comm_set(kvs_set_ptr); + _print_kvs(); + kvs_updated = 1; + pthread_mutex_unlock(&kvs_mutex); + return SLURM_SUCCESS; +} + +extern int pmi_kvs_get(kvs_get_msg_t *kvs_get_ptr) +{ + int rc = SLURM_SUCCESS; + +#if _DEBUG + info("pmi_kvs_get: rank:%u size:%u port:%u, host:%s", + kvs_get_ptr->task_id, kvs_get_ptr->size, + kvs_get_ptr->port, kvs_get_ptr->hostname); +#endif + if (kvs_get_ptr->size == 0) { + error("PMK_KVS_Barrier reached with size == 0"); + return SLURM_ERROR; + } + + pthread_mutex_lock(&kvs_mutex); + if (barrier_cnt == 0) { + barrier_cnt = kvs_get_ptr->size; + barrier_ptr = xmalloc(sizeof(struct barrier_resp)*barrier_cnt); + } else if (barrier_cnt != kvs_get_ptr->size) { + error("PMK_KVS_Barrier task count inconsistent (%u != %u)", + barrier_cnt, kvs_get_ptr->size); + rc = SLURM_ERROR; + goto fini; + } + if (kvs_get_ptr->task_id >= barrier_cnt) { + error("PMK_KVS_Barrier task count(%u) >= size(%u)", + kvs_get_ptr->task_id, barrier_cnt); + rc = SLURM_ERROR; + goto fini; + } + if (barrier_ptr[kvs_get_ptr->task_id].port == 0) + barrier_resp_cnt++; + else + error("PMK_KVS_Barrier duplicate request from task %u", + kvs_get_ptr->task_id); + barrier_ptr[kvs_get_ptr->task_id].port = kvs_get_ptr->port; + barrier_ptr[kvs_get_ptr->task_id].hostname = kvs_get_ptr->hostname; + kvs_get_ptr->hostname = NULL; /* just moved the pointer */ + if (barrier_resp_cnt == barrier_cnt) + _kvs_xmit_tasks(); +fini: pthread_mutex_unlock(&kvs_mutex); + return rc; +} + +/* + * Set the maximum number of threads to be used by the PMI server code. + * The PMI server code is used interally by the slurm_step_launch() function + * to support MPI libraries that bootstrap themselves using PMI. + */ +extern void pmi_server_max_threads(int max_threads) +{ + if (max_threads <= 0) + error("pmi server max threads must be greater than zero"); + else + agent_max_cnt = max_threads; +} diff --git a/executable_names/src/api/pmi_server.h b/executable_names/src/api/pmi_server.h new file mode 100644 index 0000000000000000000000000000000000000000..e5ec65fb9378354c40890e766e2cf51bf5718775 --- /dev/null +++ b/executable_names/src/api/pmi_server.h @@ -0,0 +1,47 @@ +/*****************************************************************************\ + * pmi.h - Global PMI data as maintained within srun + * $Id$ + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +\*****************************************************************************/ + +#ifndef _PMI_SERVER_H +#define _PMI_SERVER_H + +#include "src/api/slurm_pmi.h" + +/* Put the supplied kvs values into the common store */ +extern int pmi_kvs_put(struct kvs_comm_set *kvs_set_ptr); + +/* Note that a task has reached a barrier, + * transmit the kvs values to the task */ +extern int pmi_kvs_get(kvs_get_msg_t *kvs_get_ptr); + +/* + * Set the maximum number of threads to be used by the PMI server code. + * The PMI server code is used interally by the slurm_step_launch() function + * to support MPI libraries that bootstrap themselves using PMI. + */ +extern void pmi_server_max_threads(int max_threads); + +#endif diff --git a/executable_names/src/api/reconfigure.c b/executable_names/src/api/reconfigure.c new file mode 100644 index 0000000000000000000000000000000000000000..d32775a25efb34862e2e5d9863309cd7bde877d0 --- /dev/null +++ b/executable_names/src/api/reconfigure.c @@ -0,0 +1,167 @@ +/*****************************************************************************\ + * reconfigure.c - request that slurmctld shutdown or re-read the + * configuration files + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#include + +#include "src/common/slurm_protocol_api.h" +#include "src/common/forward.h" +#include "src/common/xmalloc.h" + +static int _send_message_controller ( enum controller_id dest, + slurm_msg_t *request_msg ); + +/* + * slurm_reconfigure - issue RPC to have Slurm controller (slurmctld) + * reload its configuration file + * RET 0 or a slurm error code + */ +int +slurm_reconfigure ( void ) +{ + int rc; + slurm_msg_t req; + + slurm_msg_t_init(&req); + + req.msg_type = REQUEST_RECONFIGURE; + + if (slurm_send_recv_controller_rc_msg(&req, &rc) < 0) + return SLURM_ERROR; + + if (rc) + slurm_seterrno_ret(rc); + + return SLURM_PROTOCOL_SUCCESS; +} + +/* + * slurm_ping - issue RPC to have Slurm controller (slurmctld) + * IN controller - 1==primary controller, 2==secondary controller + * RET 0 or a slurm error code + */ +int +slurm_ping (int primary) +{ + int rc ; + slurm_msg_t request_msg ; + + slurm_msg_t_init(&request_msg); + request_msg.msg_type = REQUEST_PING ; + + if (primary == 1) + rc = _send_message_controller ( PRIMARY_CONTROLLER, + &request_msg ); + else if (primary == 2) + rc = _send_message_controller ( SECONDARY_CONTROLLER, + &request_msg ); + else + rc = SLURM_ERROR; + + return rc; +} + +/* + * slurm_shutdown - issue RPC to have Slurm controller (slurmctld) + * cease operations, both the primary and backup controller + * are shutdown. + * IN core - controller generates a core file if set + * RET 0 or a slurm error code + */ +int +slurm_shutdown (uint16_t core) +{ + slurm_msg_t req_msg; + shutdown_msg_t shutdown_msg; + + slurm_msg_t_init(&req_msg); + shutdown_msg.core = core; + req_msg.msg_type = REQUEST_SHUTDOWN; + req_msg.data = &shutdown_msg; + + /* + * Explicity send the message to both primary + * and backup controllers + */ + (void) _send_message_controller(SECONDARY_CONTROLLER, &req_msg); + return _send_message_controller(PRIMARY_CONTROLLER, &req_msg); +} + +int +_send_message_controller (enum controller_id dest, slurm_msg_t *req) +{ + int rc = SLURM_PROTOCOL_SUCCESS; + slurm_fd fd = -1; + slurm_msg_t *resp_msg = NULL; + + /*always only going to 1 node */ + if ((fd = slurm_open_controller_conn_spec(dest)) < 0) + slurm_seterrno_ret(SLURMCTLD_COMMUNICATIONS_CONNECTION_ERROR); + + if (slurm_send_node_msg(fd, req) < 0) + slurm_seterrno_ret(SLURMCTLD_COMMUNICATIONS_SEND_ERROR); + resp_msg = xmalloc(sizeof(slurm_msg_t)); + slurm_msg_t_init(resp_msg); + + if((rc = slurm_receive_msg(fd, resp_msg, 0)) != 0) { + return SLURMCTLD_COMMUNICATIONS_RECEIVE_ERROR; + } + + if (slurm_shutdown_msg_conn(fd) != SLURM_SUCCESS) + rc = SLURMCTLD_COMMUNICATIONS_SHUTDOWN_ERROR; + else if (resp_msg->msg_type != RESPONSE_SLURM_RC) + rc = SLURM_UNEXPECTED_MSG_ERROR; + else + rc = slurm_get_return_code(resp_msg->msg_type, + resp_msg->data); + slurm_free_msg(resp_msg); + + if (rc) slurm_seterrno_ret(rc); + + return rc; +} + diff --git a/executable_names/src/api/signal.c b/executable_names/src/api/signal.c new file mode 100644 index 0000000000000000000000000000000000000000..4a77c4cb6379b846bc9796908e4077b630f8436f --- /dev/null +++ b/executable_names/src/api/signal.c @@ -0,0 +1,407 @@ +/*****************************************************************************\ + * signal.c - Send a signal to a slurm job or job step + * $Id$ + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Christopher J. Morrone . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#include +#include + +#include "src/common/xmalloc.h" +#include "src/common/hostlist.h" +#include "src/common/read_config.h" +#include "src/common/macros.h" +#include "src/common/slurm_protocol_api.h" + +static int _local_send_recv_rc_msgs(const char *nodelist, + slurm_msg_type_t type, + void *data); +static int _signal_job_step( + const job_step_info_t *step, + const resource_allocation_response_msg_t *allocation, + uint16_t signal); +static int _signal_batch_script_step( + const resource_allocation_response_msg_t *allocation, uint16_t signal); +static int _terminate_job_step(const job_step_info_t *step, + const resource_allocation_response_msg_t *allocation); +static int _terminate_batch_script_step( + const resource_allocation_response_msg_t *allocation); + +/* + * slurm_signal_job - send the specified signal to all steps of an existing job + * IN job_id - the job's id + * IN signal - signal number + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int +slurm_signal_job (uint32_t job_id, uint16_t signal) +{ + int rc = SLURM_SUCCESS; + resource_allocation_response_msg_t *alloc_info = NULL; + signal_job_msg_t rpc; + + if (slurm_allocation_lookup_lite(job_id, &alloc_info)) { + rc = slurm_get_errno(); + goto fail1; + } + + /* same remote procedure call for each node */ + rpc.job_id = job_id; + rpc.signal = (uint32_t)signal; + + rc = _local_send_recv_rc_msgs(alloc_info->node_list, + REQUEST_SIGNAL_JOB, &rpc); + slurm_free_resource_allocation_response_msg(alloc_info); +fail1: + if (rc) { + slurm_seterrno_ret(rc); + } else { + return SLURM_SUCCESS; + } +} + +/* + * slurm_signal_job_step - send the specified signal to an existing job step + * IN job_id - the job's id + * IN step_id - the job step's id - use SLURM_BATCH_SCRIPT as the step_id + * to send a signal to a job's batch script + * IN signal - signal number + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int +slurm_signal_job_step (uint32_t job_id, uint32_t step_id, uint16_t signal) +{ + resource_allocation_response_msg_t *alloc_info = NULL; + job_step_info_response_msg_t *step_info = NULL; + int rc; + int i; + int save_errno = 0; + + if (slurm_allocation_lookup_lite(job_id, &alloc_info)) { + return -1; + } + + /* + * The controller won't give us info about the batch script job step, + * so we need to handle that seperately. + */ + if (step_id == SLURM_BATCH_SCRIPT) { + rc = _signal_batch_script_step(alloc_info, signal); + slurm_free_resource_allocation_response_msg(alloc_info); + errno = rc; + return rc ? -1 : 0; + } + + /* + * Otherwise, look through the list of job step info and find + * the one matching step_id. Signal that step. + */ + rc = slurm_get_job_steps((time_t)0, job_id, step_id, + &step_info, SHOW_ALL); + if (rc != 0) { + save_errno = errno; + goto fail; + } + for (i = 0; i < step_info->job_step_count; i++) { + if (step_info->job_steps[i].job_id == job_id + && step_info->job_steps[i].step_id == step_id) { + rc = _signal_job_step(&step_info->job_steps[i], + alloc_info, signal); + save_errno = errno; + break; + } + } + slurm_free_job_step_info_response_msg(step_info); +fail: + slurm_free_resource_allocation_response_msg(alloc_info); + errno = save_errno; + return rc ? -1 : 0; +} + +static int +_local_send_recv_rc_msgs(const char *nodelist, slurm_msg_type_t type, + void *data) +{ + List ret_list = NULL; + int temp_rc = 0, rc = 0; + ret_data_info_t *ret_data_info = NULL; + slurm_msg_t *msg = xmalloc(sizeof(slurm_msg_t)); + + slurm_msg_t_init(msg); + msg->msg_type = type; + msg->data = data; + + if((ret_list = slurm_send_recv_msgs(nodelist, msg, 10000))) { + while((ret_data_info = list_pop(ret_list))) { + temp_rc = slurm_get_return_code(ret_data_info->type, + ret_data_info->data); + if(temp_rc) + rc = temp_rc; + } + } else { + error("slurm_signal_job: no list was returned"); + rc = SLURM_ERROR; + } + + slurm_free_msg(msg); + return rc; +} + +static int +_signal_job_step(const job_step_info_t *step, + const resource_allocation_response_msg_t *allocation, + uint16_t signal) +{ + kill_tasks_msg_t rpc; + int rc = SLURM_SUCCESS; + + /* same remote procedure call for each node */ + rpc.job_id = step->job_id; + rpc.job_step_id = step->step_id; + rpc.signal = (uint32_t)signal; + rc = _local_send_recv_rc_msgs(allocation->node_list, + REQUEST_SIGNAL_TASKS, &rpc); + return rc; +} + +static int _signal_batch_script_step( + const resource_allocation_response_msg_t *allocation, uint16_t signal) +{ + slurm_msg_t msg; + kill_tasks_msg_t rpc; + int rc = SLURM_SUCCESS; + char *name = nodelist_nth_host(allocation->node_list, 0); + if(!name) { + error("_signal_batch_script_step: " + "can't get the first name out of %s", + allocation->node_list); + return -1; + } + rpc.job_id = allocation->job_id; + rpc.job_step_id = SLURM_BATCH_SCRIPT; + rpc.signal = (uint32_t)signal; + + slurm_msg_t_init(&msg); + msg.msg_type = REQUEST_SIGNAL_TASKS; + msg.data = &rpc; + if(slurm_conf_get_addr(name, &msg.address) == SLURM_ERROR) { + error("_signal_batch_script_step: " + "can't get address for " + "host %s", name); + free(name); + return -1; + } + free(name); + if (slurm_send_recv_rc_msg_only_one(&msg, &rc, 0) < 0) { + error("_signal_batch_script_step: %m"); + rc = -1; + } + return rc; +} + + +/* + * slurm_terminate_job - terminates all steps of an existing job by sending + * a REQUEST_TERMINATE_JOB rpc to all slurmd in the the job allocation, + * and then calls slurm_complete_job(). + * IN job_id - the job's id + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int +slurm_terminate_job (uint32_t job_id) +{ + int rc = SLURM_SUCCESS; + resource_allocation_response_msg_t *alloc_info = NULL; + signal_job_msg_t rpc; + + if (slurm_allocation_lookup_lite(job_id, &alloc_info)) { + rc = slurm_get_errno(); + goto fail1; + } + + /* same remote procedure call for each node */ + rpc.job_id = job_id; + rpc.signal = (uint32_t)-1; /* not used by slurmd */ + rc = _local_send_recv_rc_msgs(alloc_info->node_list, + REQUEST_TERMINATE_JOB, &rpc); + + slurm_free_resource_allocation_response_msg(alloc_info); + + slurm_complete_job(job_id, 0); +fail1: + if (rc) { + slurm_seterrno_ret(rc); + return SLURM_FAILURE; + } else { + return SLURM_SUCCESS; + } +} + +/* + * slurm_terminate_job_step - terminates a job step by sending a + * REQUEST_TERMINATE_TASKS rpc to all slurmd of a job step. + * IN job_id - the job's id + * IN step_id - the job step's id - use SLURM_BATCH_SCRIPT as the step_id + * to terminate a job's batch script + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int +slurm_terminate_job_step (uint32_t job_id, uint32_t step_id) +{ + resource_allocation_response_msg_t *alloc_info = NULL; + job_step_info_response_msg_t *step_info = NULL; + int rc = 0; + int i; + int save_errno = 0; + + if (slurm_allocation_lookup_lite(job_id, &alloc_info)) { + return -1; + } + + /* + * The controller won't give us info about the batch script job step, + * so we need to handle that seperately. + */ + if (step_id == SLURM_BATCH_SCRIPT) { + rc = _terminate_batch_script_step(alloc_info); + slurm_free_resource_allocation_response_msg(alloc_info); + errno = rc; + return rc ? -1 : 0; + } + + /* + * Otherwise, look through the list of job step info and find + * the one matching step_id. Terminate that step. + */ + rc = slurm_get_job_steps((time_t)0, job_id, step_id, + &step_info, SHOW_ALL); + if (rc != 0) { + save_errno = errno; + goto fail; + } + for (i = 0; i < step_info->job_step_count; i++) { + if (step_info->job_steps[i].job_id == job_id + && step_info->job_steps[i].step_id == step_id) { + rc = _terminate_job_step(&step_info->job_steps[i], + alloc_info); + save_errno = errno; + break; + } + } + slurm_free_job_step_info_response_msg(step_info); +fail: + slurm_free_resource_allocation_response_msg(alloc_info); + errno = save_errno; + return rc ? -1 : 0; +} + + +/* + * Send a REQUEST_TERMINATE_TASKS rpc to all nodes in a job step. + * + * RET Upon successful termination of the job step, 0 shall be returned. + * Otherwise, -1 shall be returned and errno set to indicate the error. + */ +static int +_terminate_job_step(const job_step_info_t *step, + const resource_allocation_response_msg_t *allocation) +{ + kill_tasks_msg_t rpc; + int rc = SLURM_SUCCESS; + + /* + * Send REQUEST_TERMINATE_TASKS to all nodes of the step + */ + rpc.job_id = step->job_id; + rpc.job_step_id = step->step_id; + rpc.signal = (uint32_t)-1; /* not used by slurmd */ + rc = _local_send_recv_rc_msgs(allocation->node_list, + REQUEST_TERMINATE_TASKS, &rpc); + + if (rc == -1 && errno == ESLURM_ALREADY_DONE) { + rc = 0; + errno = 0; + } + + return rc; +} + +static int _terminate_batch_script_step( + const resource_allocation_response_msg_t *allocation) +{ + slurm_msg_t msg; + kill_tasks_msg_t rpc; + int rc = SLURM_SUCCESS; + int i; + char *name = nodelist_nth_host(allocation->node_list, 0); + if(!name) { + error("_signal_batch_script_step: " + "can't get the first name out of %s", + allocation->node_list); + return -1; + } + + rpc.job_id = allocation->job_id; + rpc.job_step_id = SLURM_BATCH_SCRIPT; + rpc.signal = (uint32_t)-1; /* not used by slurmd */ + + slurm_msg_t_init(&msg); + msg.msg_type = REQUEST_TERMINATE_TASKS; + msg.data = &rpc; + + if(slurm_conf_get_addr(name, &msg.address) == SLURM_ERROR) { + error("_signal_batch_script_step: " + "can't get address for " + "host %s", name); + free(name); + return -1; + } + free(name); + i = slurm_send_recv_rc_msg_only_one(&msg, &rc, 10000); + if (i != 0) + rc = i; + + return rc; +} + diff --git a/executable_names/src/api/slurm_pmi.c b/executable_names/src/api/slurm_pmi.c new file mode 100644 index 0000000000000000000000000000000000000000..fc72ae17d22c775b2e9b856e95fdf6615693c620 --- /dev/null +++ b/executable_names/src/api/slurm_pmi.c @@ -0,0 +1,243 @@ +/****************************************************************************\ + * slurm_pmi.c - PMI support functions internal to SLURM + ***************************************************************************** + * Copyright (C) 2005-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include + +#include "src/api/slurm_pmi.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/forward.h" +#include "src/common/read_config.h" +#include "src/common/xmalloc.h" +#include "src/common/fd.h" +#include "src/common/slurm_auth.h" + +#define MAX_RETRIES 5 +#define PMI_TIME 1000 /* spacing between RPCs, usec */ + +int pmi_fd = -1; +uint16_t srun_port = 0; +slurm_addr srun_addr; + +static int _get_addr(void) +{ + char *env_host, *env_port; + + if (srun_port) + return SLURM_SUCCESS; + + env_host = getenv("SLURM_SRUN_COMM_HOST"); + env_port = getenv("SLURM_SRUN_COMM_PORT"); + if (!env_host || !env_port) + return SLURM_ERROR; + + srun_port = (uint16_t) atol(env_port); + slurm_set_addr(&srun_addr, srun_port, env_host); + return SLURM_SUCCESS; +} + +/* Transmit PMI Keyval space data */ +int slurm_send_kvs_comm_set(struct kvs_comm_set *kvs_set_ptr, + int pmi_rank, int pmi_size) +{ + slurm_msg_t msg_send; + int rc, retries = 0, timeout = 0; + + if (kvs_set_ptr == NULL) + return EINVAL; + + if ((rc = _get_addr()) != SLURM_SUCCESS) + return rc; + + slurm_msg_t_init(&msg_send); + msg_send.address = srun_addr; + msg_send.msg_type = PMI_KVS_PUT_REQ; + msg_send.data = (void *) kvs_set_ptr; + + /* Send the RPC to the local srun communcation manager. + * Since the srun can be sent thousands of messages at + * the same time and refuse some connections, retry as + * needed. Spread out messages by task's rank. Also + * increase the timeout if many tasks since the srun + * command is very overloaded. */ + usleep(pmi_rank * PMI_TIME); + if (pmi_size > 10) + timeout = slurm_get_msg_timeout() * 8000; + while (slurm_send_recv_rc_msg_only_one(&msg_send, &rc, timeout) < 0) { + if (retries++ > MAX_RETRIES) { + error("slurm_send_kvs_comm_set: %m"); + return SLURM_ERROR; + } + usleep(pmi_rank * PMI_TIME); + } + + return rc; +} + +/* Wait for barrier and get full PMI Keyval space data */ +int slurm_get_kvs_comm_set(struct kvs_comm_set **kvs_set_ptr, + int pmi_rank, int pmi_size) +{ + int rc, srun_fd, retries = 0, timeout = 0; + slurm_msg_t msg_send, msg_rcv; + slurm_addr slurm_addr, srun_reply_addr; + char hostname[64]; + uint16_t port; + kvs_get_msg_t data; + char *env_pmi_ifhn; + + if (kvs_set_ptr == NULL) + return EINVAL; + + if ((rc = _get_addr()) != SLURM_SUCCESS) { + error("_get_addr: %m"); + return rc; + } + if (pmi_fd < 0) { + if ((pmi_fd = slurm_init_msg_engine_port(0)) < 0) { + error("slurm_init_msg_engine_port: %m"); + return SLURM_ERROR; + } + fd_set_blocking(pmi_fd); + } + if (slurm_get_stream_addr(pmi_fd, &slurm_addr) < 0) { + error("slurm_get_stream_addr: %m"); + return SLURM_ERROR; + } + /* hostname is not set here, so slurm_get_addr fails + slurm_get_addr(&slurm_addr, &port, hostname, sizeof(hostname)); */ + port = ntohs(slurm_addr.sin_port); + if ((env_pmi_ifhn = getenv("SLURM_PMI_RESP_IFHN"))) { + strncpy(hostname, env_pmi_ifhn, sizeof(hostname)); + hostname[sizeof(hostname)-1] = 0; + } else + getnodename(hostname, sizeof(hostname)); + + data.task_id = pmi_rank; + data.size = pmi_size; + data.port = port; + data.hostname = hostname; + slurm_msg_t_init(&msg_send); + slurm_msg_t_init(&msg_rcv); + msg_send.address = srun_addr; + msg_send.msg_type = PMI_KVS_GET_REQ; + msg_send.data = &data; + + /* Send the RPC to the local srun communcation manager. + * Since the srun can be sent thousands of messages at + * the same time and refuse some connections, retry as + * needed. Spread out messages by task's rank. Also + * increase the timeout if many tasks since the srun + * command is very overloaded. */ + usleep(pmi_rank * PMI_TIME); + if (pmi_size > 10) + timeout = slurm_get_msg_timeout() * 8000; + while (slurm_send_recv_rc_msg_only_one(&msg_send, &rc, timeout) < 0) { + if (retries++ > MAX_RETRIES) { + error("slurm_get_kvs_comm_set: %m"); + return SLURM_ERROR; + } + usleep(pmi_rank * PMI_TIME); + } + if (rc != SLURM_SUCCESS) { + error("slurm_get_kvs_comm_set error_code=%d", rc); + return rc; + } + + /* get the message after all tasks reach the barrier */ + srun_fd = slurm_accept_msg_conn(pmi_fd, &srun_reply_addr); + if (srun_fd < 0) { + error("slurm_accept_msg_conn: %m"); + return errno; + } + + while ((rc = slurm_receive_msg(srun_fd, &msg_rcv, 0)) != 0) { + if (errno == EINTR) + continue; + error("slurm_receive_msg: %m"); + slurm_close_accepted_conn(srun_fd); + return errno; + } + if(msg_rcv.auth_cred) + (void)g_slurm_auth_destroy(msg_rcv.auth_cred); + + if (msg_rcv.msg_type != PMI_KVS_GET_RESP) { + error("slurm_get_kvs_comm_set msg_type=%d", msg_rcv.msg_type); + slurm_close_accepted_conn(srun_fd); + return SLURM_UNEXPECTED_MSG_ERROR; + } + if (slurm_send_rc_msg(&msg_rcv, SLURM_SUCCESS) < 0) + error("slurm_send_rc_msg: %m"); + + slurm_close_accepted_conn(srun_fd); + *kvs_set_ptr = msg_rcv.data; + return SLURM_SUCCESS; +} + +static void _free_kvs_comm(struct kvs_comm *kvs_comm_ptr) +{ + int i; + + if (kvs_comm_ptr == NULL) + return; + + for (i=0; ikvs_cnt; i++) { + xfree(kvs_comm_ptr->kvs_keys[i]); + xfree(kvs_comm_ptr->kvs_values[i]); + } + xfree(kvs_comm_ptr->kvs_name); + xfree(kvs_comm_ptr->kvs_keys); + xfree(kvs_comm_ptr->kvs_values); + xfree(kvs_comm_ptr); +} + +/* Free kvs_comm_set returned by slurm_get_kvs_comm_set() */ +void slurm_free_kvs_comm_set(struct kvs_comm_set *kvs_set_ptr) +{ + int i; + + if (kvs_set_ptr == NULL) + return; + + for (i=0; ikvs_comm_recs; i++) + _free_kvs_comm(kvs_set_ptr->kvs_comm_ptr[i]); + xfree(kvs_set_ptr->kvs_comm_ptr); + xfree(kvs_set_ptr); +} + diff --git a/executable_names/src/api/slurm_pmi.h b/executable_names/src/api/slurm_pmi.h new file mode 100644 index 0000000000000000000000000000000000000000..f7dc95aaab2623223866897ff6bd978c83989715 --- /dev/null +++ b/executable_names/src/api/slurm_pmi.h @@ -0,0 +1,84 @@ +/****************************************************************************\ + * slurm_pmi.h - definitions PMI support functions internal to SLURM + ***************************************************************************** + * Copyright (C) 2005-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PMI_H +#define _SLURM_PMI_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +#include "src/common/pack.h" + +#define PMI_MAX_ID_LEN 16 /* Maximim size of PMI process group ID */ +#define PMI_MAX_KEY_LEN 256 /* Maximum size of a PMI key */ +#define PMI_MAX_KVSNAME_LEN 256 /* Maximum size of KVS name */ +#define PMI_MAX_VAL_LEN 256 /* Maximum size of a PMI value */ + +struct kvs_comm { + char * kvs_name; + uint16_t kvs_cnt; /* count of key-pairs */ + char ** kvs_keys; + char ** kvs_values; +}; +struct kvs_comm_set { + uint16_t task_id; /* job step's task id */ + uint16_t kvs_comm_recs; /* count of kvs_comm entries */ + struct kvs_comm **kvs_comm_ptr; /* pointers to kvs_comm entries */ +}; + +/* Transmit PMI Keyval space data */ +int slurm_send_kvs_comm_set(struct kvs_comm_set *kvs_set_ptr, + int pmi_rank, int pmi_size); + +/* Wait for barrier and get full PMI Keyval space data */ +int slurm_get_kvs_comm_set(struct kvs_comm_set **kvs_set_ptr, + int pmi_rank, int pmi_size); + +/* Free kvs_comm_set returned by slurm_get_kvs_comm_set() */ +void slurm_free_kvs_comm_set(struct kvs_comm_set *kvs_set_ptr); + +#endif diff --git a/executable_names/src/api/step_ctx.c b/executable_names/src/api/step_ctx.c new file mode 100644 index 0000000000000000000000000000000000000000..201e289b01f9ddab5b273ecbd51ec5da5b9ab596 --- /dev/null +++ b/executable_names/src/api/step_ctx.c @@ -0,0 +1,337 @@ +/*****************************************************************************\ + * step_ctx.c - step_ctx task functions for use by AIX/POE + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "src/common/hostlist.h" +#include "src/common/net.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + +#include "src/api/step_ctx.h" + +static job_step_create_request_msg_t *_copy_step_req( + job_step_create_request_msg_t *step_req); + +/* + * slurm_step_ctx_create - Create a job step and its context. + * IN step_req - description of job step request + * RET the step context or NULL on failure with slurm errno set + * NOTE: Free allocated memory using slurm_step_ctx_destroy. + */ +extern slurm_step_ctx +slurm_step_ctx_create (const job_step_create_request_msg_t *user_step_req) +{ + struct slurm_step_ctx_struct *ctx = NULL; + job_step_create_request_msg_t *step_req = NULL; + job_step_create_response_msg_t *step_resp = NULL; + int sock = -1; + short port = 0; + int errnum = 0; + + /* First copy the user's user_step_req struct in case we + * need to modify anything before contacting the slurmctld + */ + step_req = + _copy_step_req((job_step_create_request_msg_t *)user_step_req); + + /* If step_req->host is NULL, then the user wants us + * to handle messages from the controller on our own. We handle + * the messages in the step_launch.c mesage handler, but we + * need to open the socket right now so we can tell the + * controller which port to use. + */ + if (step_req->host == NULL) { + if (net_stream_listen(&sock, &port) < 0) { + errnum = errno; + error("unable to intialize step context socket: %m"); + slurm_free_job_step_create_request_msg(step_req); + goto fail; + } + step_req->port = port; + step_req->host = xshort_hostname(); + } + + if ((slurm_job_step_create(step_req, &step_resp) < 0) || + (step_resp == NULL)) { + errnum = errno; + slurm_free_job_step_create_request_msg(step_req); + goto fail; + } + + ctx = xmalloc(sizeof(struct slurm_step_ctx_struct)); + ctx->launch_state = NULL; + ctx->magic = STEP_CTX_MAGIC; + ctx->job_id = step_req->job_id; + ctx->user_id = step_req->user_id; + ctx->step_req = step_req; /* is already a copy of user_step_req */ + ctx->step_resp = step_resp; + + ctx->launch_state = step_launch_state_create(ctx); + ctx->launch_state->slurmctld_socket_fd = sock; + +fail: + errno = errnum; + return (slurm_step_ctx)ctx; +} + +/* + * slurm_step_ctx_get - get parameters from a job step context. + * IN ctx - job step context generated by slurm_step_ctx_create + * RET SLURM_SUCCESS or SLURM_ERROR (with slurm_errno set) + */ +extern int +slurm_step_ctx_get (slurm_step_ctx ctx, int ctx_key, ...) +{ + va_list ap; + int rc = SLURM_SUCCESS; + uint32_t node_inx; + uint32_t *uint32_ptr; + uint32_t **uint32_array_pptr = (uint32_t **) NULL; + char **char_array_pptr = (char **) NULL; + job_step_create_response_msg_t ** step_resp_pptr; + slurm_cred_t *cred; /* Slurm job credential */ + switch_jobinfo_t *switch_job; + int *int_ptr; + int **int_array_pptr = (int **) NULL; + + if ((ctx == NULL) || (ctx->magic != STEP_CTX_MAGIC)) { + slurm_seterrno(EINVAL); + return SLURM_ERROR; + } + + va_start(ap, ctx_key); + switch (ctx_key) { + case SLURM_STEP_CTX_JOBID: + uint32_ptr = (uint32_t *) va_arg(ap, void *); + *uint32_ptr = ctx->job_id; + break; + case SLURM_STEP_CTX_STEPID: + uint32_ptr = (uint32_t *) va_arg(ap, void *); + *uint32_ptr = ctx->step_resp->job_step_id; + break; + case SLURM_STEP_CTX_TASKS: + uint32_array_pptr = (uint32_t **) va_arg(ap, void *); + *uint32_array_pptr = ctx->step_resp->step_layout->tasks; + break; + + case SLURM_STEP_CTX_TID: + node_inx = va_arg(ap, uint32_t); + if ((node_inx < 0) + || (node_inx > ctx->step_resp->step_layout->node_cnt)) { + slurm_seterrno(EINVAL); + rc = SLURM_ERROR; + break; + } + uint32_array_pptr = (uint32_t **) va_arg(ap, void *); + *uint32_array_pptr = + ctx->step_resp->step_layout->tids[node_inx]; + break; + + case SLURM_STEP_CTX_RESP: + step_resp_pptr = (job_step_create_response_msg_t **) + va_arg(ap, void *); + *step_resp_pptr = ctx->step_resp; + break; + case SLURM_STEP_CTX_CRED: + cred = (slurm_cred_t *) va_arg(ap, void *); + *cred = ctx->step_resp->cred; + break; + case SLURM_STEP_CTX_SWITCH_JOB: + switch_job = (switch_jobinfo_t *) va_arg(ap, void *); + *switch_job = ctx->step_resp->switch_job; + break; + case SLURM_STEP_CTX_NUM_HOSTS: + uint32_ptr = (uint32_t *) va_arg(ap, void *); + *uint32_ptr = ctx->step_resp->step_layout->node_cnt; + break; + case SLURM_STEP_CTX_HOST: + node_inx = va_arg(ap, uint32_t); + if ((node_inx < 0) + || (node_inx > ctx->step_resp->step_layout->node_cnt)) { + slurm_seterrno(EINVAL); + rc = SLURM_ERROR; + break; + } + char_array_pptr = (char **) va_arg(ap, void *); + *char_array_pptr = nodelist_nth_host( + ctx->step_resp->step_layout->node_list, node_inx); + break; + case SLURM_STEP_CTX_USER_MANAGED_SOCKETS: + int_ptr = va_arg(ap, int *); + int_array_pptr = va_arg(ap, int **); + if (ctx->launch_state == NULL + || ctx->launch_state->user_managed_io == false + || ctx->launch_state->io.user == NULL) { + *int_ptr = 0; + *int_array_pptr = (int *)NULL; + rc = SLURM_ERROR; + break; + } + *int_ptr = ctx->launch_state->tasks_requested; + *int_array_pptr = ctx->launch_state->io.user->sockets; + break; + default: + slurm_seterrno(EINVAL); + rc = SLURM_ERROR; + } + va_end(ap); + + return rc; +} + +/* + * slurm_jobinfo_ctx_get - get parameters from jobinfo context. + * IN jobinfo - job information from context, returned by slurm_step_ctx_get() + * IN data_type - type of data required, specific to the switch type + * OUT data - the requested data type + * RET SLURM_SUCCESS or SLURM_ERROR (with slurm_errno set) + */ +extern int +slurm_jobinfo_ctx_get(switch_jobinfo_t jobinfo, int data_type, void *data) +{ + if (jobinfo == NULL) { + slurm_seterrno(EINVAL); + return SLURM_ERROR; + } + + return switch_g_get_jobinfo(jobinfo, data_type, data); +} + + +/* + * slurm_step_ctx_destroy - free allocated memory for a job step context. + * IN ctx - job step context generated by slurm_step_ctx_create + * RET SLURM_SUCCESS or SLURM_ERROR (with slurm_errno set) + */ +extern int +slurm_step_ctx_destroy (slurm_step_ctx ctx) +{ + if ((ctx == NULL) || (ctx->magic != STEP_CTX_MAGIC)) { + slurm_seterrno(EINVAL); + return SLURM_ERROR; + } + slurm_free_job_step_create_request_msg(ctx->step_req); + slurm_free_job_step_create_response_msg(ctx->step_resp); + step_launch_state_destroy(ctx->launch_state); + xfree(ctx); + return SLURM_SUCCESS; +} + +/* + * slurm_step_ctx_daemon_per_node_hack - Hack the step context + * to run a single process per node, regardless of the settings + * selected at slurm_step_ctx_create time. + * + * This is primarily used on AIX by the slurm_ll_api in support of + * poe. The slurm_ll_api will want to launch a single pmd daemon + * on each node regardless of the number of tasks running on each + * node. + * IN ctx - job step context generated by slurm_step_ctx_create + * RET SLURM_SUCCESS or SLURM_ERROR (with slurm_errno set) + */ +extern int +slurm_step_ctx_daemon_per_node_hack(slurm_step_ctx ctx) +{ + slurm_step_layout_t *new_layout, *old_layout; + int i; + + if ((ctx == NULL) || (ctx->magic != STEP_CTX_MAGIC)) { + slurm_seterrno(EINVAL); + return SLURM_ERROR; + } + + /* hack the context node count */ + ctx->step_req->num_tasks = ctx->step_req->node_count; + + /* hack the context step layout */ + old_layout = ctx->step_resp->step_layout; + new_layout = (slurm_step_layout_t *)xmalloc(sizeof(slurm_step_layout_t)); + new_layout->node_cnt = old_layout->node_cnt; + new_layout->task_cnt = old_layout->node_cnt; + new_layout->node_list = xstrdup(old_layout->node_list); + slurm_step_layout_destroy(old_layout); + new_layout->tasks = + (uint32_t *)xmalloc(sizeof(uint32_t) * new_layout->node_cnt); + new_layout->tids = + (uint32_t **)xmalloc(sizeof(uint32_t *) * new_layout->node_cnt); + for (i = 0; i < new_layout->node_cnt; i++) { + new_layout->tasks[i] = 1; + new_layout->tids[i] = (uint32_t *)xmalloc(sizeof(uint32_t)); + new_layout->tids[i][0] = i; + } + ctx->step_resp->step_layout = new_layout; + + /* recreate the launch state structure now that the settings + have changed */ + step_launch_state_destroy(ctx->launch_state); + ctx->launch_state = step_launch_state_create(ctx); + + return SLURM_SUCCESS; +} + +static job_step_create_request_msg_t *_copy_step_req( + job_step_create_request_msg_t *step_req) +{ + job_step_create_request_msg_t *copy; + + copy = xmalloc(sizeof(job_step_create_request_msg_t)); + if (copy == NULL) + return NULL; + + memcpy(copy, step_req, sizeof(job_step_create_request_msg_t)); + if (step_req->host != NULL) + copy->host = xstrdup(step_req->host); + if (step_req->node_list != NULL) + copy->node_list = xstrdup(step_req->node_list); + if (step_req->network != NULL) + copy->network = xstrdup(step_req->network); + if (step_req->name != NULL) + copy->name = xstrdup(step_req->name); + + return copy; +} + diff --git a/executable_names/src/api/step_ctx.h b/executable_names/src/api/step_ctx.h new file mode 100644 index 0000000000000000000000000000000000000000..c2ea66efc47ccad5a8f6ee58bb97ba698b950e73 --- /dev/null +++ b/executable_names/src/api/step_ctx.h @@ -0,0 +1,59 @@ +/*****************************************************************************\ + * step_ctx.h - step context declarations + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette , + * Christopher J. Morrone + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +\*****************************************************************************/ +#ifndef _STEP_CTX_H +#define _STEP_CTX_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include + +#include "src/api/step_launch.h" + +#define STEP_CTX_MAGIC 0xc7a3 + +struct slurm_step_ctx_struct { + uint16_t magic; /* magic number */ + + uint32_t job_id; /* assigned job id */ + uint32_t user_id; /* user the job runs as */ + + job_step_create_request_msg_t *step_req; + job_step_create_response_msg_t *step_resp; + + /* Used by slurm_step_launch() */ + struct step_launch_state *launch_state; +}; + +#endif /* _STEP_CTX_H */ + diff --git a/executable_names/src/api/step_io.c b/executable_names/src/api/step_io.c new file mode 100644 index 0000000000000000000000000000000000000000..ccecf11b26bed1d0899c0385ec4230533ee41e09 --- /dev/null +++ b/executable_names/src/api/step_io.c @@ -0,0 +1,1329 @@ +/****************************************************************************\ + * step_io.c - process stdin, stdout, and stderr for parallel jobs. + * $Id$ + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/common/fd.h" +#include "src/common/hostlist.h" +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/pack.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/slurm_protocol_pack.h" +#include "src/common/slurm_cred.h" +#include "src/common/xassert.h" +#include "src/common/xmalloc.h" +#include "src/common/xsignal.h" +#include "src/common/eio.h" +#include "src/common/io_hdr.h" +#include "src/common/net.h" + +#include "src/api/step_io.h" + +#define MAX_RETRIES 3 +#define STDIO_MAX_FREE_BUF 1024 + +struct io_buf { + int ref_count; + uint32_t length; + void *data; + io_hdr_t header; +}; + +static struct io_buf *_alloc_io_buf(void); +#if 0 +static void _free_io_buf(struct io_buf *buf); +#endif +static void _init_stdio_eio_objs(slurm_step_io_fds_t fds, + client_io_t *cio); +static void _handle_io_init_msg(int fd, client_io_t *cio); +static int _read_io_init_msg(int fd, client_io_t *cio, char *host); +static int _wid(int n); +static bool _incoming_buf_free(client_io_t *cio); +static bool _outgoing_buf_free(client_io_t *cio); + +/********************************************************************** + * Listening socket declarations + **********************************************************************/ +static bool _listening_socket_readable(eio_obj_t *obj); +static int _listening_socket_read(eio_obj_t *obj, List objs); + +struct io_operations listening_socket_ops = { + readable: &_listening_socket_readable, + handle_read: &_listening_socket_read +}; + +/********************************************************************** + * IO server socket declarations + **********************************************************************/ +static bool _server_readable(eio_obj_t *obj); +static int _server_read(eio_obj_t *obj, List objs); +static bool _server_writable(eio_obj_t *obj); +static int _server_write(eio_obj_t *obj, List objs); + +struct io_operations server_ops = { + readable: &_server_readable, + handle_read: &_server_read, + writable: &_server_writable, + handle_write: &_server_write +}; + +struct server_io_info { + client_io_t *cio; + + /* incoming variables */ + struct slurm_io_header header; + struct io_buf *in_msg; + int32_t in_remaining; + bool in_eof; + int remote_stdout_objs; /* active eio_obj_t's on the remote node */ + int remote_stderr_objs; /* active eio_obj_t's on the remote node */ + + /* outgoing variables */ + List msg_queue; + struct io_buf *out_msg; + int32_t out_remaining; + bool out_eof; +}; + +/********************************************************************** + * File write declarations + **********************************************************************/ +static bool _file_writable(eio_obj_t *obj); +static int _file_write(eio_obj_t *obj, List objs); + +struct io_operations file_write_ops = { + writable: &_file_writable, + handle_write: &_file_write, +}; + +struct file_write_info { + client_io_t *cio; + + /* outgoing variables */ + List msg_queue; + struct io_buf *out_msg; + int32_t out_remaining; + /* If taskid is (uint32_t)-1, output from all tasks is accepted, + otherwise only output from the specified task is accepted. */ + uint32_t taskid; + uint32_t nodeid; + bool eof; +}; + +/********************************************************************** + * File read declarations + **********************************************************************/ +static bool _file_readable(eio_obj_t *obj); +static int _file_read(eio_obj_t *obj, List objs); + +struct io_operations file_read_ops = { + readable: &_file_readable, + handle_read: &_file_read, +}; + +struct file_read_info { + client_io_t *cio; + + /* header contains destination of file input */ + struct slurm_io_header header; + uint32_t nodeid; + + bool eof; + bool was_blocking; +}; + + +/********************************************************************** + * Listening socket functions + **********************************************************************/ +static bool +_listening_socket_readable(eio_obj_t *obj) +{ + debug3("Called _listening_socket_readable"); + if (obj->shutdown == true) { + if (obj->fd != -1) { + close(obj->fd); + obj->fd = -1; + } + debug2(" false, shutdown"); + return false; + } + return true; +} + +static int +_listening_socket_read(eio_obj_t *obj, List objs) +{ + client_io_t *cio = (client_io_t *)obj->arg; + + debug3("Called _listening_socket_read"); + _handle_io_init_msg(obj->fd, cio); + + return (0); +} + +static void +_set_listensocks_nonblocking(client_io_t *cio) +{ + int i; + for (i = 0; i < cio->num_listen; i++) + fd_set_nonblocking(cio->listensock[i]); +} + +/********************************************************************** + * IO server socket functions + **********************************************************************/ +static eio_obj_t * +_create_server_eio_obj(int fd, client_io_t *cio, + int stdout_objs, int stderr_objs) +{ + struct server_io_info *info = NULL; + eio_obj_t *eio = NULL; + + info = (struct server_io_info *)xmalloc(sizeof(struct server_io_info)); + info->cio = cio; + info->in_msg = NULL; + info->in_remaining = 0; + info->in_eof = false; + info->remote_stdout_objs = stdout_objs; + info->remote_stderr_objs = stderr_objs; + info->msg_queue = list_create(NULL); /* FIXME! Add destructor */ + info->out_msg = NULL; + info->out_remaining = 0; + info->out_eof = false; + + eio = eio_obj_create(fd, &server_ops, (void *)info); + + return eio; +} + +static bool +_server_readable(eio_obj_t *obj) +{ + struct server_io_info *s = (struct server_io_info *) obj->arg; + + debug4("Called _server_readable"); + + if (!_outgoing_buf_free(s->cio)) { + debug4(" false, free_io_buf is empty"); + return false; + } + + if (s->in_eof) { + debug4(" false, eof"); + return false; + } + + if (s->remote_stdout_objs > 0 || s->remote_stderr_objs > 0) { + debug4("remote_stdout_objs = %d", s->remote_stdout_objs); + debug4("remote_stderr_objs = %d", s->remote_stderr_objs); + return true; + } + + if (obj->shutdown) { + if (obj->fd != -1) { + close(obj->fd); + obj->fd = -1; + s->in_eof = true; + s->out_eof = true; + } + debug3(" false, shutdown"); + return false; + } + + debug3(" false"); + return false; +} + +static int +_server_read(eio_obj_t *obj, List objs) +{ + struct server_io_info *s = (struct server_io_info *) obj->arg; + void *buf; + int n; + + debug4("Entering _server_read"); + if (s->in_msg == NULL) { + if (_outgoing_buf_free(s->cio)) { + s->in_msg = list_dequeue(s->cio->free_outgoing); + } else { + debug("List free_outgoing is empty!"); + return SLURM_ERROR; + } + + n = io_hdr_read_fd(obj->fd, &s->header); + if (n <= 0) { /* got eof or error on socket read */ + debug3( "got eof or error on _server_read header"); + close(obj->fd); + obj->fd = -1; + s->in_eof = true; + s->out_eof = true; + list_enqueue(s->cio->free_outgoing, s->in_msg); + s->in_msg = NULL; + return SLURM_SUCCESS; + } + if (s->header.length == 0) { /* eof message */ + if (s->header.type == SLURM_IO_STDOUT) + s->remote_stdout_objs--; + else if (s->header.type == SLURM_IO_STDERR) + s->remote_stderr_objs--; + else + error("Unrecognized output message type"); + list_enqueue(s->cio->free_outgoing, s->in_msg); + s->in_msg = NULL; + return SLURM_SUCCESS; + } + s->in_remaining = s->header.length; + s->in_msg->length = s->header.length; + s->in_msg->header = s->header; + } + + /* + * Read the body + */ + if (s->header.length != 0) { + buf = s->in_msg->data + (s->in_msg->length - s->in_remaining); + again: + if ((n = read(obj->fd, buf, s->in_remaining)) < 0) { + if (errno == EINTR) + goto again; + if (errno == EAGAIN || errno == EWOULDBLOCK) + return SLURM_SUCCESS; + debug3("_server_read error: %m"); + } + if (n <= 0) { /* got eof or unhandled error */ + debug3( "got eof on _server_read body"); + close(obj->fd); + obj->fd = -1; + s->in_eof = true; + s->out_eof = true; + list_enqueue(s->cio->free_outgoing, s->in_msg); + s->in_msg = NULL; + return SLURM_SUCCESS; + } + +/* *(char *)(buf + n) = '\0'; */ +/* debug3("\"%s\"", buf); */ + s->in_remaining -= n; + if (s->in_remaining > 0) + return SLURM_SUCCESS; + } + else { + debug3("***** passing on eof message"); + } + + /* + * Route the message to the proper output + */ + { + eio_obj_t *obj; + struct file_write_info *info; + + s->in_msg->ref_count = 1; + if (s->in_msg->header.type == SLURM_IO_STDOUT) + obj = s->cio->stdout_obj; + else + obj = s->cio->stderr_obj; + info = (struct file_write_info *) obj->arg; + if (info->eof) + /* this output is closed, discard message */ + list_enqueue(s->cio->free_outgoing, s->in_msg); + else + list_enqueue(info->msg_queue, s->in_msg); + + s->in_msg = NULL; + } + + return SLURM_SUCCESS; +} + +static bool +_server_writable(eio_obj_t *obj) +{ + struct server_io_info *s = (struct server_io_info *) obj->arg; + + debug4("Called _server_writable"); + + if (s->out_eof) { + debug4(" false, eof"); + return false; + } + if (obj->shutdown == true) { + debug4(" false, shutdown"); + return false; + } + if (s->out_msg != NULL + || !list_is_empty(s->msg_queue)) { + debug4(" true, s->msg_queue length = %d", + list_count(s->msg_queue)); + return true; + } + + debug4(" false"); + return false; +} + +static int +_server_write(eio_obj_t *obj, List objs) +{ + struct server_io_info *s = (struct server_io_info *) obj->arg; + void *buf; + int n; + + debug4("Entering _server_write"); + + /* + * If we aren't already in the middle of sending a message, get the + * next message from the queue. + */ + if (s->out_msg == NULL) { + s->out_msg = list_dequeue(s->msg_queue); + if (s->out_msg == NULL) { + debug3("_server_write: nothing in the queue"); + return SLURM_SUCCESS; + } + debug3(" dequeue successful, s->out_msg->length = %d", + s->out_msg->length); + s->out_remaining = s->out_msg->length; + } + + debug3(" s->out_remaining = %d", s->out_remaining); + + /* + * Write message to socket. + */ + buf = s->out_msg->data + (s->out_msg->length - s->out_remaining); +again: + if ((n = write(obj->fd, buf, s->out_remaining)) < 0) { + if (errno == EINTR) { + goto again; + } else if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { + debug3(" got EAGAIN in _server_write"); + return SLURM_SUCCESS; + } else { + error("_server_write write failed: %m"); + s->out_eof = true; + /* FIXME - perhaps we should free the message here? */ + return SLURM_ERROR; + } + } + debug3("Wrote %d bytes to socket", n); + s->out_remaining -= n; + if (s->out_remaining > 0) + return SLURM_SUCCESS; + + /* + * Free the message and prepare to send the next one. + */ + s->out_msg->ref_count--; + if (s->out_msg->ref_count == 0) + list_enqueue(s->cio->free_incoming, s->out_msg); + else + debug3(" Could not free msg!!"); + s->out_msg = NULL; + + return SLURM_SUCCESS; +} + +/********************************************************************** + * File write functions + **********************************************************************/ +static eio_obj_t * +create_file_write_eio_obj(int fd, uint32_t taskid, uint32_t nodeid, + client_io_t *cio) +{ + struct file_write_info *info = NULL; + eio_obj_t *eio = NULL; + + info = (struct file_write_info *) + xmalloc(sizeof(struct file_write_info)); + info->cio = cio; + info->msg_queue = list_create(NULL); /* FIXME! Add destructor */ + info->out_msg = NULL; + info->out_remaining = 0; + info->eof = false; + info->taskid = taskid; + info->nodeid = nodeid; + + eio = eio_obj_create(fd, &file_write_ops, (void *)info); + + return eio; +} + +static int _write_label(int fd, int taskid, int label_width) +{ + int n; + int left = label_width + 2; + char buf[16]; + void *ptr = buf; + + snprintf(buf, 16, "%0*d: ", label_width, taskid); + while (left > 0) { + again: + if ((n = write(fd, ptr, left)) < 0) { + if (errno == EINTR) + goto again; + if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { + debug3(" got EAGAIN in _write_label"); + goto again; + } + error("In _write_label: %m"); + return SLURM_ERROR; + } + left -= n; + ptr += n; + } + + return SLURM_SUCCESS; +} + +static int _write_newline(int fd) +{ + int n; + + debug2("Called _write_newline"); +again: + if ((n = write(fd, "\n", 1)) < 0) { + if (errno == EINTR + || errno == EAGAIN + || errno == EWOULDBLOCK) { + goto again; + } + error("In _write_newline: %m"); + return SLURM_ERROR; + } + return SLURM_SUCCESS; +} + +/* + * Blocks until write is complete, regardless of the file + * descriptor being in non-blocking mode. + */ +static int _write_line(int fd, void *buf, int len) +{ + int n; + int left = len; + void *ptr = buf; + + debug2("Called _write_line"); + while (left > 0) { + again: + if ((n = write(fd, ptr, left)) < 0) { + if (errno == EINTR) + goto again; + if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { + debug3(" got EAGAIN in _write_line"); + goto again; + } + return -1; + } + left -= n; + ptr += n; + } + + return len; +} + + +/* + * Write as many lines from the message as possible. Return + * the number of bytes from the message that have been written, + * or 0 on eof, or -1 on error. + * + * Prepend a label of the task number if label parameter was + * specified. + * + * If the message ends in a partial line (line does not end + * in a '\n'), then add a newline to the output file, but only + * in label mode. + */ +static int _write_msg(int fd, void *buf, int len, int taskid, + bool label, int label_width) +{ + void *start; + void *end; + int remaining = len; + int written = 0; + int line_len; + int rc = SLURM_SUCCESS; + + while (remaining > 0) { + start = buf + written; + end = memchr(start, '\n', remaining); + if (label) + if (_write_label(fd, taskid, label_width) + != SLURM_SUCCESS) + goto done; + if (end == NULL) { /* no newline found */ + rc = _write_line(fd, start, remaining); + if (rc <= 0) { + goto done; + } else { + remaining -= rc; + written += rc; + } + if (label) + if (_write_newline(fd) != SLURM_SUCCESS) + goto done; + } else { + line_len = (int)(end - start) + 1; + rc = _write_line(fd, start, line_len); + if (rc <= 0) { + goto done; + } else { + remaining -= rc; + written += rc; + } + } + + } +done: + if (written > 0) + return written; + else + return rc; +} + +static bool _file_writable(eio_obj_t *obj) +{ + struct file_write_info *info = (struct file_write_info *) obj->arg; + + debug2("Called _file_writable"); + if (info->out_msg != NULL + || !list_is_empty(info->msg_queue)) + return true; + + debug3(" false"); + debug3(" eof is %s", info->eof ? "true" : "false"); + return false; +} + +static int _file_write(eio_obj_t *obj, List objs) +{ + struct file_write_info *info = (struct file_write_info *) obj->arg; + void *ptr; + int n; + + debug2("Entering _file_write"); + /* + * If we aren't already in the middle of sending a message, get the + * next message from the queue. + */ + if (info->out_msg == NULL) { + info->out_msg = list_dequeue(info->msg_queue); + if (info->out_msg == NULL) { + debug3("_file_write: nothing in the queue"); + return SLURM_SUCCESS; + } + info->out_remaining = info->out_msg->length; + } + + /* + * Write message to file. + */ + if (info->taskid != (uint32_t)-1 + && info->out_msg->header.gtaskid != info->taskid) { + /* we are ignoring messages not from info->taskid */ + } else if (!info->eof) { + ptr = info->out_msg->data + (info->out_msg->length + - info->out_remaining); + if ((n = _write_msg(obj->fd, ptr, + info->out_remaining, + info->out_msg->header.gtaskid, + info->cio->label, + info->cio->label_width)) < 0) { + list_enqueue(info->cio->free_outgoing, info->out_msg); + info->eof = true; + return SLURM_ERROR; + } + debug3(" wrote %d bytes", n); + info->out_remaining -= n; + if (info->out_remaining > 0) + return SLURM_SUCCESS; + } + + /* + * Free the message. + */ + info->out_msg->ref_count--; + if (info->out_msg->ref_count == 0) + list_enqueue(info->cio->free_outgoing, info->out_msg); + info->out_msg = NULL; + debug2("Leaving _file_write"); + + return SLURM_SUCCESS; +} + +/********************************************************************** + * File read functions + **********************************************************************/ +static eio_obj_t * +create_file_read_eio_obj(int fd, uint32_t taskid, uint32_t nodeid, + client_io_t *cio) +{ + struct file_read_info *info = NULL; + eio_obj_t *eio = NULL; + + info = (struct file_read_info *) + xmalloc(sizeof(struct file_read_info)); + info->cio = cio; + if (taskid == (uint32_t)-1) { + info->header.type = SLURM_IO_ALLSTDIN; + info->header.gtaskid = (uint16_t)-1; + } else { + info->header.type = SLURM_IO_STDIN; + info->header.gtaskid = (uint16_t)taskid; + } + info->nodeid = nodeid; + /* FIXME! Need to set ltaskid based on gtaskid */ + info->header.ltaskid = (uint16_t)-1; + info->eof = false; + + if (fd_is_blocking(fd)) { + fd_set_nonblocking(fd); + info->was_blocking = true; + } else { + info->was_blocking = false; + } + eio = eio_obj_create(fd, &file_read_ops, (void *)info); + + return eio; +} + +static bool _file_readable(eio_obj_t *obj) +{ + struct file_read_info *info = (struct file_read_info *) obj->arg; + + debug2("Called _file_readable"); + + if (info->cio->ioservers_ready < info->cio->num_nodes) { + debug3(" false, all ioservers not yet initialized"); + return false; + } + + if (info->eof) { + debug3(" false, eof"); + return false; + } + if (obj->shutdown == true) { + debug3(" false, shutdown"); + /* if the file descriptor was in blocking mode before we set it + * to O_NONBLOCK, then set it back to blocking mode before + * closing */ + if (info->was_blocking) + fd_set_blocking(obj->fd); + close(obj->fd); + obj->fd = -1; + info->eof = true; + return false; + } + if (_incoming_buf_free(info->cio)) + return true; + + debug3(" false"); + return false; +} + +static int _file_read(eio_obj_t *obj, List objs) +{ + struct file_read_info *info = (struct file_read_info *) obj->arg; + struct io_buf *msg; + io_hdr_t header; + void *ptr; + Buf packbuf; + int len; + + debug2("Entering _file_read"); + if (_incoming_buf_free(info->cio)) { + msg = list_dequeue(info->cio->free_incoming); + } else { + debug3(" List free_incoming is empty, no file read"); + return SLURM_SUCCESS; + } + + ptr = msg->data + io_hdr_packed_size(); + +again: + if ((len = read(obj->fd, ptr, MAX_MSG_LEN)) < 0) { + if (errno == EINTR) + goto again; + if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { + debug("_file_read returned %s", + errno==EAGAIN?"EAGAIN":"EWOULDBLOCK"); + list_enqueue(info->cio->free_incoming, msg); + return SLURM_SUCCESS; + } + /* Any other errors, we pretend we got eof */ + debug("Other error on _file_read: %m"); + len = 0; + } + if (len == 0) { /* got eof */ + debug3("got eof on _file_read"); + info->eof = true; + /* send eof message, message with payload length 0 */ + } + + debug3(" read %d bytes from file", len); + /* + * Pack header and build msg + */ + header = info->header; + header.length = len; + packbuf = create_buf(msg->data, io_hdr_packed_size()); + io_hdr_pack(&header, packbuf); + msg->length = io_hdr_packed_size() + header.length; + msg->ref_count = 0; /* make certain it is initialized */ + /* free the Buf packbuf, but not the memory to which it points */ + packbuf->head = NULL; + free_buf(packbuf); + debug3(" msg->length = %d", msg->length); + + /* + * Route the message to the correct IO servers + */ + if (header.type == SLURM_IO_ALLSTDIN) { + int i; + struct server_io_info *server; + for (i = 0; i < info->cio->num_nodes; i++) { + msg->ref_count++; + if (info->cio->ioserver[i] == NULL) + fatal("ioserver stream not yet initialized"); + server = info->cio->ioserver[i]->arg; + list_enqueue(server->msg_queue, msg); + } + } else if (header.type == SLURM_IO_STDIN) { + uint32_t nodeid; + struct server_io_info *server; + debug("SLURM_IO_STDIN"); + msg->ref_count = 1; + nodeid = info->nodeid; + debug3(" taskid %d maps to nodeid %ud", header.gtaskid, nodeid); + if (nodeid == (uint32_t)-1) { + error("A valid node id must be specified" + " for SLURM_IO_STDIN"); + } else { + server = info->cio->ioserver[nodeid]->arg; + list_enqueue(server->msg_queue, msg); + } + } else { + fatal("Unsupported header.type"); + } + msg = NULL; + return SLURM_SUCCESS; +} + + +/********************************************************************** + * General fuctions + **********************************************************************/ + +static void * +_io_thr_internal(void *cio_arg) +{ + client_io_t *cio = (client_io_t *) cio_arg; + sigset_t set; + + xassert(cio != NULL); + + debug3("IO thread pid = %lu", (unsigned long) getpid()); + + /* Block SIGHUP because it is interrupting file stream functions + * (fprintf, fflush, etc.) and causing data loss on stdout. + */ + sigemptyset(&set); + sigaddset(&set, SIGHUP); + pthread_sigmask(SIG_BLOCK, &set, NULL); + + _set_listensocks_nonblocking(cio); + + /* start the eio engine */ + eio_handle_mainloop(cio->eio); + + debug("IO thread exiting"); + + return NULL; +} + +static eio_obj_t * +_create_listensock_eio(int fd, client_io_t *cio) +{ + eio_obj_t *eio = NULL; + + eio = eio_obj_create(fd, &listening_socket_ops, (void *)cio); + + return eio; +} + +static int +_read_io_init_msg(int fd, client_io_t *cio, char *host) +{ + struct slurm_io_init_msg msg; + + if (io_init_msg_read_from_fd(fd, &msg) != SLURM_SUCCESS) { + error("failed reading io init message"); + goto fail; + } + if (io_init_msg_validate(&msg, cio->io_key) < 0) { + goto fail; + } + if (msg.nodeid >= cio->num_nodes) { + error ("Invalid nodeid %d from %s", msg.nodeid, host); + goto fail; + } + debug2("Validated IO connection from %s, node rank %u, sd=%d", + host, msg.nodeid, fd); + + net_set_low_water(fd, 1); + debug3("msg.stdout_objs = %d", msg.stdout_objs); + debug3("msg.stderr_objs = %d", msg.stderr_objs); + /* sanity checks, just print warning */ + if (cio->ioserver[msg.nodeid] != NULL) { + error("IO: Node %d already established stream!", msg.nodeid); + } else if (bit_test(cio->ioservers_ready_bits, msg.nodeid)) { + error("IO: Hey, you told me node %d was down!", msg.nodeid); + } + + cio->ioserver[msg.nodeid] = _create_server_eio_obj(fd, cio, + msg.stdout_objs, + msg.stderr_objs); + pthread_mutex_lock(&cio->ioservers_lock); + bit_set(cio->ioservers_ready_bits, msg.nodeid); + cio->ioservers_ready = bit_set_count(cio->ioservers_ready_bits); + /* Normally using eio_new_initial_obj while the eio mainloop + * is running is not safe, but since this code is running + * inside of the eio mainloop there should be no problem. + */ + eio_new_initial_obj(cio->eio, cio->ioserver[msg.nodeid]); + pthread_mutex_unlock(&cio->ioservers_lock); + + return SLURM_SUCCESS; + + fail: + close(fd); + return SLURM_ERROR; +} + + +static bool +_is_fd_ready(int fd) +{ + struct pollfd pfd[1]; + int rc; + + pfd[0].fd = fd; + pfd[0].events = POLLIN; + + rc = poll(pfd, 1, 10); + + return ((rc == 1) && (pfd[0].revents & POLLIN)); +} + + +static void +_handle_io_init_msg(int fd, client_io_t *cio) +{ + int j; + debug2("Activity on IO listening socket %d", fd); + + for (j = 0; j < 15; j++) { + int sd; + struct sockaddr addr; + struct sockaddr_in *sin; + socklen_t size = sizeof(addr); + char buf[INET_ADDRSTRLEN]; + + /* + * Return early if fd is not now ready + */ + if (!_is_fd_ready(fd)) + return; + + while ((sd = accept(fd, &addr, &size)) < 0) { + if (errno == EINTR) + continue; + if (errno == EAGAIN) /* No more connections */ + return; + if ((errno == ECONNABORTED) || + (errno == EWOULDBLOCK)) { + return; + } + error("Unable to accept new connection: %m\n"); + return; + } + + sin = (struct sockaddr_in *) &addr; + inet_ntop(AF_INET, &sin->sin_addr, buf, INET_ADDRSTRLEN); + + debug3("Accepted IO connection: ip=%s sd=%d", buf, sd); + + /* + * On AIX the new socket [sd] seems to inherit the O_NONBLOCK + * flag from the listening socket [fd], so we need to + * explicitly set it back to blocking mode. + * (XXX: This should eventually be fixed by making + * reads of IO headers nonblocking) + */ + fd_set_blocking(sd); + + /* + * Read IO header and update cio structure appropriately + */ + if (_read_io_init_msg(sd, cio, buf) < 0) + continue; + + fd_set_nonblocking(sd); + } +} + +static int +_wid(int n) +{ + int width = 1; + n--; /* For zero origin */ + while (n /= 10) + width++; + return width; +} + +static struct io_buf * +_alloc_io_buf(void) +{ + struct io_buf *buf; + + buf = (struct io_buf *)xmalloc(sizeof(struct io_buf)); + if (!buf) + return NULL; + buf->ref_count = 0; + buf->length = 0; + /* The following "+ 1" is just temporary so I can stick a \0 at + the end and do a printf of the data pointer */ + buf->data = xmalloc(MAX_MSG_LEN + io_hdr_packed_size() + 1); + if (!buf->data) { + xfree(buf); + return NULL; + } + + return buf; +} + +#if 0 +static void +_free_io_buf(struct io_buf *buf) +{ + if (buf) { + if (buf->data) + xfree(buf->data); + xfree(buf); + } +} +#endif + +static void +_init_stdio_eio_objs(slurm_step_io_fds_t fds, client_io_t *cio) +{ + /* + * build stdin eio_obj_t + */ + if (fds.in.fd > -1) { + fd_set_close_on_exec(fds.in.fd); + cio->stdin_obj = create_file_read_eio_obj( + fds.in.fd, fds.in.taskid, fds.in.nodeid, cio); + eio_new_initial_obj(cio->eio, cio->stdin_obj); + } + + /* + * build stdout eio_obj_t + */ + if (fds.out.fd > -1) { + cio->stdout_obj = create_file_write_eio_obj( + fds.out.fd, fds.out.taskid, fds.out.nodeid, cio); + eio_new_initial_obj(cio->eio, cio->stdout_obj); + } + + /* + * build a seperate stderr eio_obj_t only if stderr is not sharing + * the stdout file descriptor and task filtering option. + */ + if (fds.err.fd == fds.out.fd + && fds.err.taskid == fds.out.taskid + && fds.err.nodeid == fds.out.nodeid) { + debug3("stdout and stderr sharing a file"); + cio->stderr_obj = cio->stdout_obj; + } else { + if (fds.err.fd > -1) { + cio->stderr_obj = create_file_write_eio_obj( + fds.err.fd, fds.err.taskid, fds.err.nodeid, cio); + eio_new_initial_obj(cio->eio, cio->stderr_obj); + } + } +} + +static bool +_incoming_buf_free(client_io_t *cio) +{ + struct io_buf *buf; + + if (list_count(cio->free_incoming) > 0) { + return true; + } else if (cio->incoming_count < STDIO_MAX_FREE_BUF) { + buf = _alloc_io_buf(); + if (buf != NULL) { + list_enqueue(cio->free_incoming, buf); + cio->incoming_count++; + return true; + } + } + + return false; +} + +static bool +_outgoing_buf_free(client_io_t *cio) +{ + struct io_buf *buf; + + if (list_count(cio->free_outgoing) > 0) { + return true; + } else if (cio->outgoing_count < STDIO_MAX_FREE_BUF) { + buf = _alloc_io_buf(); + if (buf != NULL) { + list_enqueue(cio->free_outgoing, buf); + cio->outgoing_count++; + return true; + } + } + + return false; +} + +static inline int +_estimate_nports(int nclients, int cli_per_port) +{ + div_t d; + d = div(nclients, cli_per_port); + return d.rem > 0 ? d.quot + 1 : d.quot; +} + +client_io_t * +client_io_handler_create(slurm_step_io_fds_t fds, + int num_tasks, + int num_nodes, + slurm_cred_t cred, + bool label) +{ + client_io_t *cio; + int len; + int i; + int siglen; + char *sig; + + cio = (client_io_t *)xmalloc(sizeof(client_io_t)); + if (cio == NULL) + return NULL; + + cio->num_tasks = num_tasks; + cio->num_nodes = num_nodes; + + cio->label = label; + if (cio->label) + cio->label_width = _wid(cio->num_tasks); + else + cio->label_width = 0; + + len = sizeof(uint32_t) * num_tasks; + + if (slurm_cred_get_signature(cred, &sig, &siglen) < 0) { + error("client_io_handler_create, invalid credential"); + return NULL; + } + cio->io_key = (char *)xmalloc(siglen); + memcpy(cio->io_key, sig, siglen); + /* no need to free "sig", it is just a pointer into the credential */ + + cio->eio = eio_handle_create(); + + /* Compute number of listening sockets needed to allow + * all of the slurmds to establish IO streams with srun, without + * overstressing the TCP/IP backoff/retry algorithm + */ + cio->num_listen = _estimate_nports(num_nodes, 48); + cio->listensock = (int *)xmalloc(cio->num_listen * sizeof(int)); + cio->listenport = (uint16_t *)xmalloc(cio->num_listen*sizeof(uint16_t)); + + cio->ioserver = (eio_obj_t **)xmalloc(num_nodes*sizeof(eio_obj_t *)); + cio->ioservers_ready_bits = bit_alloc(num_nodes); + cio->ioservers_ready = 0; + pthread_mutex_init(&cio->ioservers_lock, NULL); + + _init_stdio_eio_objs(fds, cio); + + for (i = 0; i < cio->num_listen; i++) { + eio_obj_t *obj; + + if (net_stream_listen(&cio->listensock[i], + (short *)&cio->listenport[i]) < 0) { + fatal("unable to initialize stdio listen socket: %m"); + } + debug("initialized stdio listening socket, port %d\n", + cio->listenport[i]); + /*net_set_low_water(cio->listensock[i], 140);*/ + obj = _create_listensock_eio(cio->listensock[i], cio); + eio_new_initial_obj(cio->eio, obj); + } + + cio->free_incoming = list_create(NULL); /* FIXME! Needs destructor */ + cio->incoming_count = 0; + for (i = 0; i < STDIO_MAX_FREE_BUF; i++) { + list_enqueue(cio->free_incoming, _alloc_io_buf()); + } + cio->free_outgoing = list_create(NULL); /* FIXME! Needs destructor */ + cio->outgoing_count = 0; + for (i = 0; i < STDIO_MAX_FREE_BUF; i++) { + list_enqueue(cio->free_outgoing, _alloc_io_buf()); + } + + return cio; +} + +int +client_io_handler_start(client_io_t *cio) +{ + int retries = 0; + pthread_attr_t attr; + + xsignal(SIGTTIN, SIG_IGN); + + slurm_attr_init(&attr); + while ((errno = pthread_create(&cio->ioid, &attr, + &_io_thr_internal, (void *) cio))) { + if (++retries > MAX_RETRIES) { + error ("pthread_create error %m"); + slurm_attr_destroy(&attr); + return SLURM_ERROR; + } + sleep(1); /* sleep and try again */ + } + slurm_attr_destroy(&attr); + debug("Started IO server thread (%lu)", (unsigned long) cio->ioid); + + return SLURM_SUCCESS; +} + +int +client_io_handler_finish(client_io_t *cio) +{ + eio_signal_shutdown(cio->eio); + if (pthread_join(cio->ioid, NULL) < 0) { + error("Waiting for client io pthread: %m"); + return SLURM_ERROR; + } + + return SLURM_SUCCESS; +} + +void +client_io_handler_destroy(client_io_t *cio) +{ + xassert(cio); + + /* FIXME - need to make certain that IO engine is shutdown + (by calling client_io_handler_finish()) before freeing anything */ + + bit_free(cio->ioservers_ready_bits); + pthread_mutex_destroy(&cio->ioservers_lock); + xfree(cio->io_key); + xfree(cio); +} + +void +client_io_handler_downnodes(client_io_t *cio, + const int* node_ids, int num_node_ids) +{ + int i; + int node_id; + + if (cio == NULL) + return; + pthread_mutex_lock(&cio->ioservers_lock); + for (i = 0; i < num_node_ids; i++) { + node_id = node_ids[i]; + if (node_id >= cio->num_nodes || node_id < 0) + continue; + if (bit_test(cio->ioservers_ready_bits, node_id) + && cio->ioserver[node_id] != NULL) { + cio->ioserver[node_id]->shutdown = true; + } else { + bit_set(cio->ioservers_ready_bits, node_id); + cio->ioservers_ready = + bit_set_count(cio->ioservers_ready_bits); + } + } + pthread_mutex_unlock(&cio->ioservers_lock); + + eio_signal_wakeup(cio->eio); +} + +void +client_io_handler_abort(client_io_t *cio) +{ + struct server_io_info *info; + int i; + + pthread_mutex_lock(&cio->ioservers_lock); + for (i = 0; i < cio->num_nodes; i++) { + if (!bit_test(cio->ioservers_ready_bits, i)) { + bit_set(cio->ioservers_ready_bits, i); + cio->ioservers_ready = + bit_set_count(cio->ioservers_ready_bits); + } else if (cio->ioserver[i] != NULL) { + info = (struct server_io_info *)cio->ioserver[i]->arg; + /* Trick the server eio_obj_t into closing its + * connection. */ + info->remote_stdout_objs = 0; + info->remote_stderr_objs = 0; + cio->ioserver[i]->shutdown = true; + } + } + pthread_mutex_unlock(&cio->ioservers_lock); +} diff --git a/executable_names/src/api/step_io.h b/executable_names/src/api/step_io.h new file mode 100644 index 0000000000000000000000000000000000000000..abed6ebe7db49b99c1d98b50ae917b536e8c975a --- /dev/null +++ b/executable_names/src/api/step_io.h @@ -0,0 +1,128 @@ +/*****************************************************************************\ + * src/api/step_io.h - job-step client-side I/O routines + * $Id$ + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Christopher J. Morrone + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +\*****************************************************************************/ +#ifndef _HAVE_STEP_IO_H +#define _HAVE_STEP_IO_H + +#include +#include + +#include + +#include "src/common/eio.h" +#include "src/common/list.h" +#include "src/common/bitstring.h" +#include "src/common/slurm_step_layout.h" + +struct client_io { + /* input parameters - set (indirectly) by user */ + int num_tasks; + int num_nodes; + bool label; + int label_width; + char *io_key; + + /* internal variables */ + pthread_t ioid; /* stdio thread id */ + int num_listen; /* Number of stdio listen sockets */ + int *listensock; /* Array of stdio listen sockets */ + uint16_t *listenport; /* Array of stdio listen port numbers */ + + eio_handle_t *eio; /* Event IO handle for stdio traffic */ + pthread_mutex_t ioservers_lock; + bitstr_t *ioservers_ready_bits; /* length "num_nodes" */ + int ioservers_ready; /* Number of servers that established contact */ + eio_obj_t **ioserver; /* Array of nhosts pointers to eio_obj_t */ + eio_obj_t *stdin_obj; + eio_obj_t *stdout_obj; + eio_obj_t *stderr_obj; + List free_incoming; /* List of free struct io_buf * for incoming + * traffic. "incoming" means traffic from the + * client to the tasks. + */ + List free_outgoing; /* List of free struct io_buf * for outgoing + * traffic "outgoing" means traffic from the + * tasks to the client. + */ + int incoming_count; /* Count of total incoming message buffers + * including free_incoming buffers and + * buffers in use. + */ + int outgoing_count; /* Count of total incoming message buffers + * including free_incoming buffers and + * buffers in use. + */ +}; + +typedef struct client_io client_io_t; + +/* + * IN cred - cred need not be a real job credential, it may be a "fake" + * credential generated with slurm_cred_faker(). The credential is + * sent to the slurmstepd (via the slurmd) which generates a signature + * string from the credential. The slurmstepd sends the signature back + * back to the client when it establishes the IO connection as a sort + * of validity check. + */ +client_io_t *client_io_handler_create(slurm_step_io_fds_t fds, + int num_tasks, + int num_nodes, + slurm_cred_t cred, + bool label); + +int client_io_handler_start(client_io_t *cio); + +/* + * Tell the client IO handler that a set of remote nodes are now considered + * "down", and no further communication from that node should be expected. + * This will prevent the IO handler from blocking indefinitely while it + * waits for a node to phone home. + * + * IN cio - the client_io_t handle + * IN node_ids - an array of integers representing the ID of a node + * within a job step. + * IN num_node_ids - the length of the node_ids array + */ +void client_io_handler_downnodes(client_io_t *cio, + const int *node_ids, int num_node_ids); + +/* + * Tell the client IO handler that the step has been aborted, and if + * any slurmstepd's have not yet establish IO connections, they should + * not be expected to ever make a connection. + * + * Calling this when an error occurs will prevent client_io_handler_finish() + * from blocking indefinitely. + * + * WARNING: This WILL abandon live IO connections. + */ +void client_io_handler_abort(client_io_t *cio); + +int client_io_handler_finish(client_io_t *cio); + +void client_io_handler_destroy(client_io_t *cio); + +#endif /* !_HAVE_STEP_IO_H */ diff --git a/executable_names/src/api/step_launch.c b/executable_names/src/api/step_launch.c new file mode 100644 index 0000000000000000000000000000000000000000..138aaf000d3704e2f87227ed85a1c6044847c4f1 --- /dev/null +++ b/executable_names/src/api/step_launch.c @@ -0,0 +1,825 @@ +/*****************************************************************************\ + * step_launch.c - launch a parallel job step + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Christopher J. Morrone + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for gethostbyname */ + +#include + +#include "src/common/hostlist.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/eio.h" +#include "src/common/net.h" +#include "src/common/fd.h" +#include "src/common/slurm_auth.h" +#include "src/common/forward.h" +#include "src/common/plugstack.h" +#include "src/common/slurm_cred.h" + +#include "src/api/step_launch.h" +#include "src/api/step_ctx.h" +#include "src/api/pmi_server.h" + +/********************************************************************** + * General declarations for step launch code + **********************************************************************/ +static int _launch_tasks(slurm_step_ctx ctx, + launch_tasks_request_msg_t *launch_msg); +/* static int _get_step_addresses(const slurm_step_ctx ctx, */ +/* slurm_addr **address, int *num_addresses); */ + +/********************************************************************** + * Message handler declarations + **********************************************************************/ +static uid_t slurm_uid; +static int _msg_thr_create(struct step_launch_state *sls, int num_nodes); +static void _handle_msg(struct step_launch_state *sls, slurm_msg_t *msg); +static bool _message_socket_readable(eio_obj_t *obj); +static int _message_socket_accept(eio_obj_t *obj, List objs); + +static struct io_operations message_socket_ops = { + readable: &_message_socket_readable, + handle_read: &_message_socket_accept +}; + + +/********************************************************************** + * API functions + **********************************************************************/ + +/* + * slurm_job_step_launch_t_init - initialize a user-allocated + * slurm_job_step_launch_t structure with default values. + * default values. This function will NOT allocate any new memory. + * IN ptr - pointer to a structure allocated by the use. The structure will + * be intialized. + */ +void slurm_job_step_launch_t_init (slurm_job_step_launch_t *ptr) +{ + static slurm_step_io_fds_t fds = SLURM_STEP_IO_FDS_INITIALIZER; + + memset(ptr, 0, sizeof(slurm_job_step_launch_t)); + ptr->argc = 0; + ptr->argv = NULL; + ptr->envc = 0; + ptr->env = NULL; + ptr->cwd = NULL; + ptr->user_managed_io = false; + ptr->buffered_stdio = true; + ptr->labelio = false; + ptr->remote_output_filename = NULL; + ptr->remote_error_filename = NULL; + ptr->remote_input_filename = NULL; + memcpy(&ptr->local_fds, &fds, sizeof(fds)); + ptr->gid = getgid(); + ptr->multi_prog = false; + ptr->slurmd_debug = 0; + ptr->parallel_debug = false; + ptr->task_prolog = NULL; + ptr->task_epilog = NULL; + ptr->cpu_bind_type = 0; + ptr->cpu_bind = NULL; + ptr->mem_bind_type = 0; + ptr->mem_bind = NULL; +} + +/* + * slurm_step_launch - launch a parallel job step + * IN ctx - job step context generated by slurm_step_ctx_create + * RET SLURM_SUCCESS or SLURM_ERROR (with errno set) + */ +int slurm_step_launch (slurm_step_ctx ctx, + const slurm_job_step_launch_t *params, + const slurm_job_step_launch_callbacks_t *callbacks) +{ + launch_tasks_request_msg_t launch; + int i; + char **env = NULL; + + debug("Entering slurm_step_launch"); + memset(&launch, 0, sizeof(launch)); + + if (ctx == NULL || ctx->magic != STEP_CTX_MAGIC) { + error("Not a valid slurm_step_ctx!"); + + slurm_seterrno(EINVAL); + return SLURM_ERROR; + } + + /* Initialize the callback pointers */ + if (callbacks != NULL) { + /* copy the user specified callback pointers */ + memcpy(&(ctx->launch_state->callback), callbacks, + sizeof(slurm_job_step_launch_callbacks_t)); + } else { + /* set all callbacks to NULL */ + memset(&(ctx->launch_state->callback), 0, + sizeof(slurm_job_step_launch_callbacks_t)); + } + + /* Create message receiving sockets and handler thread */ + _msg_thr_create(ctx->launch_state, ctx->step_req->node_count); + + /* Start tasks on compute nodes */ + launch.job_id = ctx->step_req->job_id; + launch.uid = ctx->step_req->user_id; + launch.gid = params->gid; + launch.argc = params->argc; + launch.argv = params->argv; + launch.cred = ctx->step_resp->cred; + launch.job_step_id = ctx->step_resp->job_step_id; + env_array_merge(&env, (const char **)params->env); + { + /* FIXME - hostname and IP need to be user settable */ + char *launcher_hostname = xshort_hostname(); + struct hostent *ent = gethostbyname(launcher_hostname); + + env_array_for_step(&env, + ctx->step_resp, + launcher_hostname, + ctx->launch_state->resp_port[0], + ent->h_addr_list[0]); + xfree(launcher_hostname); + } + launch.envc = envcount(env); + launch.env = env; + launch.cwd = params->cwd; + launch.nnodes = ctx->step_req->node_count; + launch.nprocs = ctx->step_req->num_tasks; + launch.slurmd_debug = params->slurmd_debug; + launch.switch_job = ctx->step_resp->switch_job; + launch.task_prolog = params->task_prolog; + launch.task_epilog = params->task_epilog; + launch.cpu_bind_type = params->cpu_bind_type; + launch.cpu_bind = params->cpu_bind; + launch.mem_bind_type = params->mem_bind_type; + launch.mem_bind = params->mem_bind; + launch.multi_prog = params->multi_prog ? 1 : 0; + launch.options = job_options_create(); + launch.complete_nodelist = + xstrdup(ctx->step_resp->step_layout->node_list); + spank_set_remote_options (launch.options); + launch.task_flags = 0; + if (params->parallel_debug) + launch.task_flags |= TASK_PARALLEL_DEBUG; + + launch.tasks_to_launch = ctx->step_resp->step_layout->tasks; + launch.cpus_allocated = ctx->step_resp->step_layout->tasks; + launch.global_task_ids = ctx->step_resp->step_layout->tids; + + launch.user_managed_io = params->user_managed_io ? 1 : 0; + ctx->launch_state->user_managed_io = params->user_managed_io; + if (!ctx->launch_state->user_managed_io) { + launch.ofname = params->remote_output_filename; + launch.efname = params->remote_error_filename; + launch.ifname = params->remote_input_filename; + launch.buffered_stdio = params->buffered_stdio ? 1 : 0; + ctx->launch_state->io.normal = + client_io_handler_create(params->local_fds, + ctx->step_req->num_tasks, + ctx->step_req->node_count, + ctx->step_resp->cred, + params->labelio); + if (ctx->launch_state->io.normal == NULL) + return SLURM_ERROR; + if (client_io_handler_start(ctx->launch_state->io.normal) + != SLURM_SUCCESS) + return SLURM_ERROR; + launch.num_io_port = ctx->launch_state->io.normal->num_listen; + launch.io_port = xmalloc(sizeof(uint16_t)*launch.num_io_port); + for (i = 0; i < launch.num_io_port; i++) { + launch.io_port[i] = + ctx->launch_state->io.normal->listenport[i]; + } + } else { /* user_managed_io is true */ + /* initialize user_managed_io_t */ + ctx->launch_state->io.user = + (user_managed_io_t *)xmalloc(sizeof(user_managed_io_t)); + ctx->launch_state->io.user->connected = 0; + ctx->launch_state->io.user->sockets = + (int *)xmalloc(sizeof(int)*ctx->step_req->num_tasks); + } + + launch.num_resp_port = ctx->launch_state->num_resp_port; + launch.resp_port = xmalloc(sizeof(uint16_t) * launch.num_resp_port); + for (i = 0; i < launch.num_resp_port; i++) { + launch.resp_port[i] = ctx->launch_state->resp_port[i]; + } + + _launch_tasks(ctx, &launch); + env_array_free(env); + return SLURM_SUCCESS; +} + +/* + * Block until all tasks have started. + */ +int slurm_step_launch_wait_start(slurm_step_ctx ctx) +{ + struct step_launch_state *sls = ctx->launch_state; + /* Wait for all tasks to start */ + pthread_mutex_lock(&sls->lock); + while (bit_set_count(sls->tasks_started) < sls->tasks_requested) { + if (sls->abort) { + if (!sls->abort_action_taken) { + slurm_kill_job_step(ctx->job_id, + ctx->step_resp->job_step_id, + SIGKILL); + sls->abort_action_taken = true; + } + pthread_mutex_unlock(&sls->lock); + return 0; + } + pthread_cond_wait(&sls->cond, &sls->lock); + } + + if (sls->user_managed_io) { + while(sls->io.user->connected < sls->tasks_requested) { + if (sls->abort) { + if (!sls->abort_action_taken) { + slurm_kill_job_step( + ctx->job_id, + ctx->step_resp->job_step_id, + SIGKILL); + sls->abort_action_taken = true; + } + pthread_mutex_unlock(&sls->lock); + return 0; + } + pthread_cond_wait(&sls->cond, &sls->lock); + } + } + + pthread_mutex_unlock(&sls->lock); + return 1; +} + +/* + * Block until all tasks have finished (or failed to start altogether). + */ +void slurm_step_launch_wait_finish(slurm_step_ctx ctx) +{ + struct step_launch_state *sls = ctx->launch_state; + struct timespec ts = {0, 0}; + bool time_set = false; + int errnum; + + /* Wait for all tasks to complete */ + pthread_mutex_lock(&sls->lock); + while (bit_set_count(sls->tasks_exited) < sls->tasks_requested) { + if (!sls->abort) { + pthread_cond_wait(&sls->cond, &sls->lock); + } else { + if (!sls->abort_action_taken) { + slurm_kill_job_step(ctx->job_id, + ctx->step_resp->job_step_id, + SIGKILL); + sls->abort_action_taken = true; + } + if (!time_set) { + /* Only set the time once, because we only + * want to wait 10 seconds, no matter how many + * times the condition variable is signalled. + */ + ts.tv_sec = time(NULL) + 10; + time_set = true; + /* FIXME - should this be a callback? */ + info("Job step aborted: Waiting up to " + "10 seconds for job step to finish."); + } + + errnum = pthread_cond_timedwait(&sls->cond, + &sls->lock, &ts); + if (errnum == ETIMEDOUT) { + error("Timed out waiting for job step to " + "complete"); + /* + * Send kill again, in case steps were still + * launching the first time. + * FIXME - eventually the slurmd should + * be made smart enough to really ensure + * that a killed step never starts. + */ + slurm_kill_job_step( + ctx->job_id, + ctx->step_resp->job_step_id, + SIGKILL); + if (!sls->user_managed_io) + client_io_handler_abort(sls->io.normal); + break; + } else if (errnum != 0) { + error("Error waiting on condition in" + " slurm_step_launch_wait_finish: %m"); + if (!sls->user_managed_io) + client_io_handler_abort(sls->io.normal); + break; + } + } + } + + /* Then shutdown the message handler thread */ + eio_signal_shutdown(sls->msg_handle); + pthread_join(sls->msg_thread, NULL); + eio_handle_destroy(sls->msg_handle); + + /* Then wait for the IO thread to finish */ + if (!sls->user_managed_io) { + client_io_handler_finish(sls->io.normal); + client_io_handler_destroy(sls->io.normal); + } + + pthread_mutex_unlock(&sls->lock); +} + +/* + * Abort an in-progress launch, or terminate the fully launched job step. + * + * Can be called from a signal handler. + */ +void slurm_step_launch_abort(slurm_step_ctx ctx) +{ + struct step_launch_state *sls = ctx->launch_state; + + sls->abort = true; + pthread_cond_signal(&sls->cond); +} + + +/********************************************************************** + * Functions used by step_ctx code, but not exported throught the API + **********************************************************************/ +/* + * Create a launch state structure for a specified step context, "ctx". + */ +struct step_launch_state *step_launch_state_create(slurm_step_ctx ctx) +{ + struct step_launch_state *sls; + + sls = xmalloc(sizeof(struct step_launch_state)); + if (sls != NULL) { + sls->slurmctld_socket_fd = -1; + sls->tasks_requested = ctx->step_req->num_tasks; + sls->tasks_started = bit_alloc(ctx->step_req->num_tasks); + sls->tasks_exited = bit_alloc(ctx->step_req->num_tasks); + sls->layout = ctx->step_resp->step_layout; + sls->resp_port = NULL; + sls->abort = false; + sls->abort_action_taken = false; + pthread_mutex_init(&sls->lock, NULL); + pthread_cond_init(&sls->cond, NULL); + } + return sls; +} + +/* + * Free the memory associated with the a launch state structure. + */ +void step_launch_state_destroy(struct step_launch_state *sls) +{ + /* First undo anything created in step_launch_state_create() */ + pthread_mutex_destroy(&sls->lock); + pthread_cond_destroy(&sls->cond); + bit_free(sls->tasks_started); + bit_free(sls->tasks_exited); + + /* Now clean up anything created by slurm_step_launch() */ + if (sls->resp_port != NULL) { + xfree(sls->resp_port); + } + /* FIXME - more cleanup needed */ +} + + +/********************************************************************** + * Message handler functions + **********************************************************************/ +static void *_msg_thr_internal(void *arg) +{ + struct step_launch_state *sls = (struct step_launch_state *)arg; + + eio_handle_mainloop(sls->msg_handle); + + return NULL; +} + +static inline int +_estimate_nports(int nclients, int cli_per_port) +{ + div_t d; + d = div(nclients, cli_per_port); + return d.rem > 0 ? d.quot + 1 : d.quot; +} + +static int _msg_thr_create(struct step_launch_state *sls, int num_nodes) +{ + int sock = -1; + short port = -1; + eio_obj_t *obj; + int i; + + debug("Entering _msg_thr_create()"); + slurm_uid = (uid_t) slurm_get_slurm_user_id(); + + sls->msg_handle = eio_handle_create(); + sls->num_resp_port = _estimate_nports(num_nodes, 48); + sls->resp_port = xmalloc(sizeof(uint16_t) * sls->num_resp_port); + for (i = 0; i < sls->num_resp_port; i++) { + if (net_stream_listen(&sock, &port) < 0) { + error("unable to intialize step launch listening socket: %m"); + return SLURM_ERROR; + } + sls->resp_port[i] = port; + obj = eio_obj_create(sock, &message_socket_ops, (void *)sls); + eio_new_initial_obj(sls->msg_handle, obj); + } + /* finally, add the listening port that we told the slurmctld about + eariler in the step context creation phase */ + if (sls->slurmctld_socket_fd > -1) { + obj = eio_obj_create(sls->slurmctld_socket_fd, + &message_socket_ops, (void *)sls); + eio_new_initial_obj(sls->msg_handle, obj); + } + + if (pthread_create(&sls->msg_thread, NULL, + _msg_thr_internal, (void *)sls) != 0) { + error("pthread_create of message thread: %m"); + return SLURM_ERROR; + } + return SLURM_SUCCESS; +} + +static bool _message_socket_readable(eio_obj_t *obj) +{ + debug3("Called _message_socket_readable"); + if (obj->shutdown == true) { + if (obj->fd != -1) { + debug2(" false, shutdown"); + close(obj->fd); + obj->fd = -1; + /*_wait_for_connections();*/ + } else { + debug2(" false"); + } + return false; + } + return true; +} + +static int _message_socket_accept(eio_obj_t *obj, List objs) +{ + struct step_launch_state *sls = (struct step_launch_state *)obj->arg; + + int fd; + unsigned char *uc; + short port; + struct sockaddr_un addr; + slurm_msg_t *msg = NULL; + int len = sizeof(addr); + int timeout = 0; /* slurm default value */ + int rc = 0; + + debug3("Called _msg_socket_accept"); + + while ((fd = accept(obj->fd, (struct sockaddr *)&addr, + (socklen_t *)&len)) < 0) { + if (errno == EINTR) + continue; + if (errno == EAGAIN + || errno == ECONNABORTED + || errno == EWOULDBLOCK) { + return SLURM_SUCCESS; + } + error("Error on msg accept socket: %m"); + obj->shutdown = true; + return SLURM_SUCCESS; + } + + fd_set_close_on_exec(fd); + fd_set_blocking(fd); + + /* Should not call slurm_get_addr() because the IP may not be + in /etc/hosts. */ + uc = (unsigned char *)&((struct sockaddr_in *)&addr)->sin_addr.s_addr; + port = ((struct sockaddr_in *)&addr)->sin_port; + debug2("got message connection from %u.%u.%u.%u:%d", + uc[0], uc[1], uc[2], uc[3], ntohs(port)); + fflush(stdout); + + msg = xmalloc(sizeof(slurm_msg_t)); + slurm_msg_t_init(msg); + + /* multiple jobs (easily induced via no_alloc) and highly + * parallel jobs using PMI sometimes result in slow message + * responses and timeouts. Raise the default timeout for srun. */ + timeout = slurm_get_msg_timeout() * 8000; +again: + if((rc = slurm_receive_msg(fd, msg, timeout)) != 0) { + if (errno == EINTR) { + goto again; + } + error("slurm_receive_msg[%u.%u.%u.%u]: %m", + uc[0],uc[1],uc[2],uc[3]); + goto cleanup; + } + + _handle_msg(sls, msg); /* handle_msg frees msg */ +cleanup: + if ((msg->conn_fd >= 0) && slurm_close_accepted_conn(msg->conn_fd) < 0) + error ("close(%d): %m", msg->conn_fd); + slurm_free_msg(msg); + + return SLURM_SUCCESS; +} + +static void +_launch_handler(struct step_launch_state *sls, slurm_msg_t *resp) +{ + launch_tasks_response_msg_t *msg = resp->data; + int i; + + pthread_mutex_lock(&sls->lock); + + for (i = 0; i < msg->count_of_pids; i++) { + bit_set(sls->tasks_started, msg->task_ids[i]); + } + + if (sls->callback.task_start != NULL) + (sls->callback.task_start)(msg); + + pthread_cond_signal(&sls->cond); + pthread_mutex_unlock(&sls->lock); + +} + +static void +_exit_handler(struct step_launch_state *sls, slurm_msg_t *exit_msg) +{ + task_exit_msg_t *msg = (task_exit_msg_t *) exit_msg->data; + int i; + + pthread_mutex_lock(&sls->lock); + + for (i = 0; i < msg->num_tasks; i++) { + debug("task %d done", msg->task_id_list[i]); + bit_set(sls->tasks_exited, msg->task_id_list[i]); + } + + if (sls->callback.task_finish != NULL) + (sls->callback.task_finish)(msg); + + pthread_cond_signal(&sls->cond); + pthread_mutex_unlock(&sls->lock); +} + +/* + * Take the list of node names of down nodes and convert into an + * array of nodeids for the step. The nodeid array is passed to + * client_io_handler_downnodes to notify the IO handler to expect no + * further IO from that node. + */ +static void +_node_fail_handler(struct step_launch_state *sls, slurm_msg_t *fail_msg) +{ + srun_node_fail_msg_t *nf = fail_msg->data; + hostset_t fail_nodes, all_nodes; + hostlist_iterator_t fail_itr; + char *node; + int num_node_ids; + int *node_ids; + int i, j; + int node_id, num_tasks; + + fail_nodes = hostset_create(nf->nodelist); + fail_itr = hostset_iterator_create(fail_nodes); + num_node_ids = hostset_count(fail_nodes); + node_ids = xmalloc(sizeof(int) * num_node_ids); + + pthread_mutex_lock(&sls->lock); + all_nodes = hostset_create(sls->layout->node_list); + /* find the index number of each down node */ + for (i = 0; i < num_node_ids; i++) { + node = hostlist_next(fail_itr); + node_id = node_ids[i] = hostset_find(all_nodes, node); + free(node); + + /* find all of the task that should run on this node and + * mark them as having started and exited. If they haven't + * started yet, they never will, and likewise for exiting. + */ + num_tasks = sls->layout->tasks[node_id]; + for (j = 0; j < num_tasks; j++) { + debug2("marking task %d done on failed node %d", + sls->layout->tids[node_id][j], node_id); + bit_set(sls->tasks_started, + sls->layout->tids[node_id][j]); + bit_set(sls->tasks_exited, + sls->layout->tids[node_id][j]); + } + } + + if (!sls->user_managed_io) { + client_io_handler_downnodes(sls->io.normal, node_ids, + num_node_ids); + } + pthread_cond_signal(&sls->cond); + pthread_mutex_unlock(&sls->lock); + + xfree(node_ids); + hostlist_iterator_destroy(fail_itr); + hostset_destroy(fail_nodes); + hostset_destroy(all_nodes); +} + +/* + * The TCP connection that was used to send the task_spawn_io_msg_t message + * will be used as the user managed IO stream. The remote end of the TCP stream + * will be connected to the stdin, stdout, and stderr of the task. The + * local end of the stream is stored in the user_managed_io_t structure, and + * is left to the user to manage (the user can retrieve the array of + * socket descriptors using slurm_step_ctx_get()). + * + * To allow the message TCP stream to be reused for spawn IO traffic we + * set the slurm_msg_t's conn_fd to -1 to avoid having the caller close the + * TCP stream. + */ +static void +_task_user_managed_io_handler(struct step_launch_state *sls, + slurm_msg_t *user_io_msg) +{ + task_user_managed_io_msg_t *msg = + (task_user_managed_io_msg_t *) user_io_msg->data; + + pthread_mutex_lock(&sls->lock); + + debug("task %d user managed io stream established", msg->task_id); + /* sanity check */ + if (msg->task_id >= sls->tasks_requested) { + error("_task_user_managed_io_handler:" + " bad task ID %u (of %d tasks)", + msg->task_id, sls->tasks_requested); + } + + sls->io.user->connected++; + fd_set_blocking(user_io_msg->conn_fd); + sls->io.user->sockets[msg->task_id] = user_io_msg->conn_fd; + + /* prevent the caller from closing the user managed IO stream */ + user_io_msg->conn_fd = -1; + + pthread_cond_signal(&sls->cond); + pthread_mutex_unlock(&sls->lock); +} + +/* + * Identify the incoming message and call the appropriate handler function. + */ +static void +_handle_msg(struct step_launch_state *sls, slurm_msg_t *msg) +{ + uid_t req_uid = g_slurm_auth_get_uid(msg->auth_cred); + uid_t uid = getuid(); + int rc; + + if ((req_uid != slurm_uid) && (req_uid != 0) && (req_uid != uid)) { + error ("Security violation, slurm message from uid %u", + (unsigned int) req_uid); + return; + } + + switch (msg->msg_type) { + case RESPONSE_LAUNCH_TASKS: + debug2("received task launch"); + _launch_handler(sls, msg); + slurm_free_launch_tasks_response_msg(msg->data); + break; + case MESSAGE_TASK_EXIT: + debug2("received task exit"); + _exit_handler(sls, msg); + slurm_free_task_exit_msg(msg->data); + break; + case SRUN_NODE_FAIL: + debug2("received srun node fail"); + _node_fail_handler(sls, msg); + slurm_free_srun_node_fail_msg(msg->data); + break; + case SRUN_TIMEOUT: + debug2("received job step timeout message"); + /* FIXME - does nothing yet */ + slurm_free_srun_timeout_msg(msg->data); + break; + case SRUN_JOB_COMPLETE: + debug2("received job step complete message"); + /* FIXME - does nothing yet */ + slurm_free_srun_job_complete_msg(msg->data); + break; + case PMI_KVS_PUT_REQ: + debug2("PMI_KVS_PUT_REQ received"); + rc = pmi_kvs_put((struct kvs_comm_set *) msg->data); + slurm_send_rc_msg(msg, rc); + break; + case PMI_KVS_GET_REQ: + debug2("PMI_KVS_GET_REQ received"); + rc = pmi_kvs_get((kvs_get_msg_t *) msg->data); + slurm_send_rc_msg(msg, rc); + slurm_free_get_kvs_msg((kvs_get_msg_t *) msg->data); + break; + case TASK_USER_MANAGED_IO_STREAM: + debug2("TASK_USER_MANAGED_IO_STREAM"); + _task_user_managed_io_handler(sls, msg); + break; + default: + error("received spurious message type: %d", + msg->msg_type); + break; + } + return; +} + +/********************************************************************** + * Task launch functions + **********************************************************************/ +static int _launch_tasks(slurm_step_ctx ctx, + launch_tasks_request_msg_t *launch_msg) +{ + slurm_msg_t msg; + List ret_list = NULL; + ListIterator ret_itr; + ret_data_info_t *ret_data = NULL; + int rc = SLURM_SUCCESS; + + debug("Entering _launch_tasks"); + slurm_msg_t_init(&msg); + msg.msg_type = REQUEST_LAUNCH_TASKS; + msg.data = launch_msg; + + if(!(ret_list = slurm_send_recv_msgs( + ctx->step_resp->step_layout->node_list, + &msg, 0))) { + error("slurm_send_recv_msgs failed miserably: %m"); + return SLURM_ERROR; + } + ret_itr = list_iterator_create(ret_list); + while ((ret_data = list_next(ret_itr))) { + rc = slurm_get_return_code(ret_data->type, + ret_data->data); + debug("launch returned msg_rc=%d err=%d type=%d", + rc, ret_data->err, ret_data->type); + if (rc != SLURM_SUCCESS) { + errno = ret_data->err; + error("Task launch failed on node %s: %m", + ret_data->node_name); + } else { +#if 0 /* only for debugging, might want to make this a callback */ + errno = ret_data->err; + info("Launch success on node %s", + ret_data->node_name); +#endif + } + } + list_iterator_destroy(ret_itr); + list_destroy(ret_list); + return SLURM_SUCCESS; +} diff --git a/executable_names/src/api/step_launch.h b/executable_names/src/api/step_launch.h new file mode 100644 index 0000000000000000000000000000000000000000..6cd7dfe34528ae6f2fbe82e260e40779692bb7e2 --- /dev/null +++ b/executable_names/src/api/step_launch.h @@ -0,0 +1,92 @@ +/*****************************************************************************\ + * step_launch.h - launch a parallel job step + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Christopher J. Morrone + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +\*****************************************************************************/ +#ifndef _STEP_LAUNCH_H +#define _STEP_LAUNCH_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "src/common/slurm_step_layout.h" +#include "src/common/eio.h" +#include "src/common/bitstring.h" + +#include "src/api/step_io.h" + +typedef struct { + int connected; + int *sockets; /* array of socket file descriptors */ +} user_managed_io_t; + +struct step_launch_state { + pthread_mutex_t lock; + pthread_cond_t cond; + int tasks_requested; + bitstr_t *tasks_started; /* or attempted to start, but failed */ + bitstr_t *tasks_exited; /* or never started correctly */ + bool abort; + bool abort_action_taken; + + /* message thread variables */ + eio_handle_t *msg_handle; + pthread_t msg_thread; + /* set to -1 if slaunch message handler should not attempt to handle */ + int slurmctld_socket_fd; + uint16_t num_resp_port; + uint16_t *resp_port; /* array of message response ports */ + + /* io variables */ + bool user_managed_io; + union { + client_io_t *normal; + user_managed_io_t *user; + } io; + slurm_step_layout_t *layout; /* a pointer into the ctx + step_resp, do not free */ + + /* user registered callbacks */ + slurm_job_step_launch_callbacks_t callback; +}; + +/* + * Create a launch state structure for a specified step context, "ctx". + */ +struct step_launch_state * step_launch_state_create(slurm_step_ctx ctx); + +/* + * Free the memory associated with the a launch state structure. + */ +void step_launch_state_destroy(struct step_launch_state *sls); + +#endif /* _STEP_LAUNCH_H */ diff --git a/executable_names/src/api/submit.c b/executable_names/src/api/submit.c new file mode 100644 index 0000000000000000000000000000000000000000..b3d828799dc933e5013b712bdb27be512661c111 --- /dev/null +++ b/executable_names/src/api/submit.c @@ -0,0 +1,120 @@ +/*****************************************************************************\ + * submit.c - submit a job with supplied contraints + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#ifndef __USE_XOPEN_EXTENDED +extern pid_t getsid(pid_t pid); /* missing from */ +#endif + +#include + +#include "src/common/read_config.h" +#include "src/common/slurm_protocol_api.h" + +/* + * slurm_submit_batch_job - issue RPC to submit a job for later execution + * NOTE: free the response using slurm_free_submit_response_response_msg + * IN job_desc_msg - description of batch job request + * OUT slurm_alloc_msg - response to request + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +int +slurm_submit_batch_job (job_desc_msg_t *req, + submit_response_msg_t **resp ) +{ + int rc; + slurm_msg_t req_msg; + slurm_msg_t resp_msg; + bool host_set = false; + char host[64]; + + slurm_msg_t_init(&req_msg); + slurm_msg_t_init(&resp_msg); + + + /* + * set Node and session id for this request + */ + if (req->alloc_sid == NO_VAL) + req->alloc_sid = getsid(0); + + if ( (req->alloc_node == NULL) + && (getnodename(host, sizeof(host)) == 0) ) { + req->alloc_node = host; + host_set = true; + } + + req_msg.msg_type = REQUEST_SUBMIT_BATCH_JOB ; + req_msg.data = req; + + rc = slurm_send_recv_controller_msg(&req_msg, &resp_msg); + + /* + * Clear this hostname if set internally to this function + * (memory is on the stack) + */ + if (host_set) + req->alloc_node = NULL; + + if (rc == SLURM_SOCKET_ERROR) + return SLURM_ERROR; + + switch (resp_msg.msg_type) { + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *) resp_msg.data)->return_code; + if (rc) + slurm_seterrno_ret(rc); + *resp = NULL; + break; + case RESPONSE_SUBMIT_BATCH_JOB: + *resp = (submit_response_msg_t *) resp_msg.data; + break; + default: + slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); + } + + return SLURM_PROTOCOL_SUCCESS; +} diff --git a/executable_names/src/api/suspend.c b/executable_names/src/api/suspend.c new file mode 100644 index 0000000000000000000000000000000000000000..489d0df060cf944f6ffdb5da78ca63d8b252182c --- /dev/null +++ b/executable_names/src/api/suspend.c @@ -0,0 +1,115 @@ +/*****************************************************************************\ + * suspend.c - job step suspend and resume functions. + * $Id$ + ***************************************************************************** + * Copyright (C) 2005-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include "src/common/slurm_protocol_api.h" + +static int _suspend_op (uint16_t op, uint32_t job_id); +/* + * _suspend_op - perform a suspend/resume operation for some job. + * IN op - operation to perform + * IN job_id - job on which to perform operation + * IN step_id - job step on which to perform operation + * RET 0 or a slurm error code + */ +static int _suspend_op (uint16_t op, uint32_t job_id) +{ + int rc; + suspend_msg_t sus_req; + slurm_msg_t req_msg; + + slurm_msg_t_init(&req_msg); + sus_req.op = op; + sus_req.job_id = job_id; + req_msg.msg_type = REQUEST_SUSPEND; + req_msg.data = &sus_req; + + if (slurm_send_recv_controller_rc_msg(&req_msg, &rc) < 0) + return SLURM_ERROR; + + slurm_seterrno(rc); + return rc; +} + +/* + * slurm_suspend - suspend execution of a job. + * IN job_id - job on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_suspend (uint32_t job_id) +{ + return _suspend_op (SUSPEND_JOB, job_id); +} + +/* + * slurm_resume - resume execution of a previously suspended job. + * IN job_id - job on which to perform operation + * RET 0 or a slurm error code + */ +extern int slurm_resume (uint32_t job_id) +{ + return _suspend_op (RESUME_JOB, job_id); +} + +/* + * slurm_requeue - re-queue a batch job, if already running + * then terminate it first + * RET 0 or a slurm error code + */ +extern int slurm_requeue (uint32_t job_id) +{ + int rc; + job_id_msg_t requeue_req; + slurm_msg_t req_msg; + + slurm_msg_t_init(&req_msg); + requeue_req.job_id = job_id; + req_msg.msg_type = REQUEST_JOB_REQUEUE; + req_msg.data = &requeue_req; + + if (slurm_send_recv_controller_rc_msg(&req_msg, &rc) < 0) + return SLURM_ERROR; + + slurm_seterrno(rc); + return rc; +} + diff --git a/executable_names/src/api/update_config.c b/executable_names/src/api/update_config.c new file mode 100644 index 0000000000000000000000000000000000000000..f4c78c82f6b4db24f05b0665bc342043949049e3 --- /dev/null +++ b/executable_names/src/api/update_config.c @@ -0,0 +1,119 @@ +/****************************************************************************\ + * update_config.c - request that slurmctld update its configuration + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette and Kevin Tew . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "src/common/slurm_protocol_api.h" + +static int _slurm_update (void * data, slurm_msg_type_t msg_type); + +/* + * slurm_update_job - issue RPC to a job's configuration per request, + * only usable by user root or (for some parameters) the job's owner + * IN job_msg - description of job updates + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +int +slurm_update_job ( job_desc_msg_t * job_msg ) +{ + return _slurm_update ((void *) job_msg, REQUEST_UPDATE_JOB); +} + +/* + * slurm_update_node - issue RPC to a node's configuration per request, + * only usable by user root + * IN node_msg - description of node updates + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +int +slurm_update_node ( update_node_msg_t * node_msg ) +{ + return _slurm_update ((void *) node_msg, REQUEST_UPDATE_NODE); +} + +/* + * slurm_update_partition - issue RPC to a partition's configuration per + * request, only usable by user root + * IN part_msg - description of partition updates + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +int +slurm_update_partition ( update_part_msg_t * part_msg ) +{ + return _slurm_update ((void *) part_msg, REQUEST_UPDATE_PARTITION); +} + +/* + * slurm_delete_partition - issue RPC to delete a partition, only usable + * by user root + * IN part_msg - description of partition updates + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +int +slurm_delete_partition ( delete_part_msg_t * part_msg ) +{ + return _slurm_update ((void *) part_msg, REQUEST_DELETE_PARTITION); +} + +/* _slurm_update - issue RPC for all update requests */ +static int +_slurm_update (void *data, slurm_msg_type_t msg_type) +{ + int rc; + slurm_msg_t req_msg; + + slurm_msg_t_init(&req_msg); + req_msg.msg_type = msg_type; + req_msg.data = data; + + if (slurm_send_recv_controller_rc_msg(&req_msg, &rc) < 0) + return SLURM_ERROR; + + if (rc != SLURM_SUCCESS) + slurm_seterrno_ret(rc); + + return SLURM_PROTOCOL_SUCCESS; +} diff --git a/executable_names/src/common/Makefile.am b/executable_names/src/common/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..77ef3470f435f548ae32fd181cbc4db9121c2c1f --- /dev/null +++ b/executable_names/src/common/Makefile.am @@ -0,0 +1,112 @@ +# Makefile for common library + +AUTOMAKE_OPTIONS = foreign + +if HAVE_UNSETENV +build_unsetenv_src = +extra_unsetenv_src = unsetenv.c unsetenv.h +else +build_unsetenv_src = unsetenv.c unsetenv.h +extra_unsetenv_src = +endif + +INCLUDES = -I$(top_srcdir) $(SSL_CPPFLAGS) + +noinst_LTLIBRARIES = \ + libcommon.la \ + libdaemonize.la \ + libeio.la \ + libspank.la + +libcommon_la_SOURCES = \ + xmalloc.c xmalloc.h \ + xassert.c xassert.h \ + xstring.c xstring.h \ + xsignal.c xsignal.h \ + forward.c forward.h \ + global_srun.c \ + global_srun.h \ + strlcpy.c strlcpy.h \ + list.c list.h \ + net.c net.h \ + fd.c fd.h \ + log.c log.h \ + cbuf.c cbuf.h \ + safeopen.c safeopen.h \ + bitstring.c bitstring.h \ + mpi.c mpi.h \ + pack.c pack.h \ + parse_config.c parse_config.h \ + parse_spec.c parse_spec.h \ + plugin.c plugin.h \ + plugrack.c plugrack.h \ + read_config.c read_config.h \ + node_select.c node_select.h \ + env.c env.h \ + slurm_cred.h \ + slurm_cred.c \ + slurm_errno.c \ + slurm_protocol_api.c \ + slurm_protocol_api.h \ + slurm_protocol_pack.c \ + slurm_protocol_pack.h \ + slurm_protocol_util.c \ + slurm_protocol_util.h \ + slurm_protocol_socket_implementation.c \ + slurm_protocol_socket_common.h \ + slurm_protocol_common.h \ + slurm_protocol_interface.h \ + slurm_protocol_defs.c \ + slurm_protocol_defs.h \ + slurm_rlimits_info.h \ + slurm_rlimits_info.c \ + uid.c uid.h \ + util-net.c util-net.h \ + slurm_auth.c slurm_auth.h \ + slurm_jobacct.c slurm_jobacct.h \ + slurm_jobcomp.c slurm_jobcomp.h \ + switch.c switch.h \ + arg_desc.c arg_desc.h \ + macros.h \ + malloc.c malloc.h \ + getopt.h getopt.c getopt1.c \ + $(build_unsetenv_src) \ + slurm_selecttype_info.c \ + slurm_resource_info.c \ + slurm_resource_info.h \ + hostlist.c hostlist.h \ + slurm_step_layout.c slurm_step_layout.h \ + checkpoint.c checkpoint.h \ + parse_time.c parse_time.h \ + job_options.c job_options.h \ + global_defaults.c \ + timers.c timers.h \ + slurm_xlator.h + +EXTRA_libcommon_la_SOURCES = \ + $(extra_unsetenv_src) + +libdaemonize_la_SOURCES = \ + daemonize.c \ + daemonize.h \ + fd.c fd.h + +libeio_la_SOURCES = \ + eio.c eio.h \ + io_hdr.c io_hdr.h + +libspank_la_SOURCES = \ + plugstack.c plugstack.h \ + optz.c optz.h + +libcommon_la_LIBADD = $(SSL_LIBS) -ldl + +libcommon_la_LDFLAGS = $(LIB_LDFLAGS) $(SSL_LDFLAGS) + +global_defaults.c : $(top_builddir)/config.h Makefile + @( echo "/* This file autogenerated by src/common/Makefile */"; \ + echo "char *default_plugin_path = \"$(pkglibdir)\";"; \ + echo \ + "char *default_slurm_config_file = \"$(sysconfdir)/slurm.conf\";"; \ + echo "char *default_plugstack = \"$(sysconfdir)/plugstack.conf\";";\ + ) > global_defaults.c diff --git a/executable_names/src/common/Makefile.in b/executable_names/src/common/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..a747f8ce2cd409f23773d7d959071a71a5426d6e --- /dev/null +++ b/executable_names/src/common/Makefile.in @@ -0,0 +1,740 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for common library + +SOURCES = $(libcommon_la_SOURCES) $(EXTRA_libcommon_la_SOURCES) $(libdaemonize_la_SOURCES) $(libeio_la_SOURCES) $(libspank_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/common +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +am__DEPENDENCIES_1 = +libcommon_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am__libcommon_la_SOURCES_DIST = xmalloc.c xmalloc.h xassert.c \ + xassert.h xstring.c xstring.h xsignal.c xsignal.h forward.c \ + forward.h global_srun.c global_srun.h strlcpy.c strlcpy.h \ + list.c list.h net.c net.h fd.c fd.h log.c log.h cbuf.c cbuf.h \ + safeopen.c safeopen.h bitstring.c bitstring.h mpi.c mpi.h \ + pack.c pack.h parse_config.c parse_config.h parse_spec.c \ + parse_spec.h plugin.c plugin.h plugrack.c plugrack.h \ + read_config.c read_config.h node_select.c node_select.h env.c \ + env.h slurm_cred.h slurm_cred.c slurm_errno.c \ + slurm_protocol_api.c slurm_protocol_api.h \ + slurm_protocol_pack.c slurm_protocol_pack.h \ + slurm_protocol_util.c slurm_protocol_util.h \ + slurm_protocol_socket_implementation.c \ + slurm_protocol_socket_common.h slurm_protocol_common.h \ + slurm_protocol_interface.h slurm_protocol_defs.c \ + slurm_protocol_defs.h slurm_rlimits_info.h \ + slurm_rlimits_info.c uid.c uid.h util-net.c util-net.h \ + slurm_auth.c slurm_auth.h slurm_jobacct.c slurm_jobacct.h \ + slurm_jobcomp.c slurm_jobcomp.h switch.c switch.h arg_desc.c \ + arg_desc.h macros.h malloc.c malloc.h getopt.h getopt.c \ + getopt1.c unsetenv.c unsetenv.h slurm_selecttype_info.c \ + slurm_resource_info.c slurm_resource_info.h hostlist.c \ + hostlist.h slurm_step_layout.c slurm_step_layout.h \ + checkpoint.c checkpoint.h parse_time.c parse_time.h \ + job_options.c job_options.h global_defaults.c timers.c \ + timers.h slurm_xlator.h +@HAVE_UNSETENV_FALSE@am__objects_1 = unsetenv.lo +am_libcommon_la_OBJECTS = xmalloc.lo xassert.lo xstring.lo xsignal.lo \ + forward.lo global_srun.lo strlcpy.lo list.lo net.lo fd.lo \ + log.lo cbuf.lo safeopen.lo bitstring.lo mpi.lo pack.lo \ + parse_config.lo parse_spec.lo plugin.lo plugrack.lo \ + read_config.lo node_select.lo env.lo slurm_cred.lo \ + slurm_errno.lo slurm_protocol_api.lo slurm_protocol_pack.lo \ + slurm_protocol_util.lo slurm_protocol_socket_implementation.lo \ + slurm_protocol_defs.lo slurm_rlimits_info.lo uid.lo \ + util-net.lo slurm_auth.lo slurm_jobacct.lo slurm_jobcomp.lo \ + switch.lo arg_desc.lo malloc.lo getopt.lo getopt1.lo \ + $(am__objects_1) slurm_selecttype_info.lo \ + slurm_resource_info.lo hostlist.lo slurm_step_layout.lo \ + checkpoint.lo parse_time.lo job_options.lo global_defaults.lo \ + timers.lo +am__EXTRA_libcommon_la_SOURCES_DIST = unsetenv.c unsetenv.h +libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS) +libdaemonize_la_LIBADD = +am_libdaemonize_la_OBJECTS = daemonize.lo fd.lo +libdaemonize_la_OBJECTS = $(am_libdaemonize_la_OBJECTS) +libeio_la_LIBADD = +am_libeio_la_OBJECTS = eio.lo io_hdr.lo +libeio_la_OBJECTS = $(am_libeio_la_OBJECTS) +libspank_la_LIBADD = +am_libspank_la_OBJECTS = plugstack.lo optz.lo +libspank_la_OBJECTS = $(am_libspank_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libcommon_la_SOURCES) $(EXTRA_libcommon_la_SOURCES) \ + $(libdaemonize_la_SOURCES) $(libeio_la_SOURCES) \ + $(libspank_la_SOURCES) +DIST_SOURCES = $(am__libcommon_la_SOURCES_DIST) \ + $(am__EXTRA_libcommon_la_SOURCES_DIST) \ + $(libdaemonize_la_SOURCES) $(libeio_la_SOURCES) \ + $(libspank_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +@HAVE_UNSETENV_FALSE@build_unsetenv_src = unsetenv.c unsetenv.h +@HAVE_UNSETENV_TRUE@build_unsetenv_src = +@HAVE_UNSETENV_FALSE@extra_unsetenv_src = +@HAVE_UNSETENV_TRUE@extra_unsetenv_src = unsetenv.c unsetenv.h +INCLUDES = -I$(top_srcdir) $(SSL_CPPFLAGS) +noinst_LTLIBRARIES = \ + libcommon.la \ + libdaemonize.la \ + libeio.la \ + libspank.la + +libcommon_la_SOURCES = \ + xmalloc.c xmalloc.h \ + xassert.c xassert.h \ + xstring.c xstring.h \ + xsignal.c xsignal.h \ + forward.c forward.h \ + global_srun.c \ + global_srun.h \ + strlcpy.c strlcpy.h \ + list.c list.h \ + net.c net.h \ + fd.c fd.h \ + log.c log.h \ + cbuf.c cbuf.h \ + safeopen.c safeopen.h \ + bitstring.c bitstring.h \ + mpi.c mpi.h \ + pack.c pack.h \ + parse_config.c parse_config.h \ + parse_spec.c parse_spec.h \ + plugin.c plugin.h \ + plugrack.c plugrack.h \ + read_config.c read_config.h \ + node_select.c node_select.h \ + env.c env.h \ + slurm_cred.h \ + slurm_cred.c \ + slurm_errno.c \ + slurm_protocol_api.c \ + slurm_protocol_api.h \ + slurm_protocol_pack.c \ + slurm_protocol_pack.h \ + slurm_protocol_util.c \ + slurm_protocol_util.h \ + slurm_protocol_socket_implementation.c \ + slurm_protocol_socket_common.h \ + slurm_protocol_common.h \ + slurm_protocol_interface.h \ + slurm_protocol_defs.c \ + slurm_protocol_defs.h \ + slurm_rlimits_info.h \ + slurm_rlimits_info.c \ + uid.c uid.h \ + util-net.c util-net.h \ + slurm_auth.c slurm_auth.h \ + slurm_jobacct.c slurm_jobacct.h \ + slurm_jobcomp.c slurm_jobcomp.h \ + switch.c switch.h \ + arg_desc.c arg_desc.h \ + macros.h \ + malloc.c malloc.h \ + getopt.h getopt.c getopt1.c \ + $(build_unsetenv_src) \ + slurm_selecttype_info.c \ + slurm_resource_info.c \ + slurm_resource_info.h \ + hostlist.c hostlist.h \ + slurm_step_layout.c slurm_step_layout.h \ + checkpoint.c checkpoint.h \ + parse_time.c parse_time.h \ + job_options.c job_options.h \ + global_defaults.c \ + timers.c timers.h \ + slurm_xlator.h + +EXTRA_libcommon_la_SOURCES = \ + $(extra_unsetenv_src) + +libdaemonize_la_SOURCES = \ + daemonize.c \ + daemonize.h \ + fd.c fd.h + +libeio_la_SOURCES = \ + eio.c eio.h \ + io_hdr.c io_hdr.h + +libspank_la_SOURCES = \ + plugstack.c plugstack.h \ + optz.c optz.h + +libcommon_la_LIBADD = $(SSL_LIBS) -ldl +libcommon_la_LDFLAGS = $(LIB_LDFLAGS) $(SSL_LDFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/common/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/common/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libcommon.la: $(libcommon_la_OBJECTS) $(libcommon_la_DEPENDENCIES) + $(LINK) $(libcommon_la_LDFLAGS) $(libcommon_la_OBJECTS) $(libcommon_la_LIBADD) $(LIBS) +libdaemonize.la: $(libdaemonize_la_OBJECTS) $(libdaemonize_la_DEPENDENCIES) + $(LINK) $(libdaemonize_la_LDFLAGS) $(libdaemonize_la_OBJECTS) $(libdaemonize_la_LIBADD) $(LIBS) +libeio.la: $(libeio_la_OBJECTS) $(libeio_la_DEPENDENCIES) + $(LINK) $(libeio_la_LDFLAGS) $(libeio_la_OBJECTS) $(libeio_la_LIBADD) $(LIBS) +libspank.la: $(libspank_la_OBJECTS) $(libspank_la_DEPENDENCIES) + $(LINK) $(libspank_la_LDFLAGS) $(libspank_la_OBJECTS) $(libspank_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arg_desc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitstring.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cbuf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkpoint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/daemonize.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forward.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global_defaults.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global_srun.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hostlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io_hdr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_options.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node_select.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/optz.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_config.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_spec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_time.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugrack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugstack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read_config.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safeopen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_auth.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_cred.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_errno.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_jobacct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_jobcomp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_protocol_api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_protocol_defs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_protocol_pack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_protocol_socket_implementation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_protocol_util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_resource_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_rlimits_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_selecttype_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurm_step_layout.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlcpy.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/switch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timers.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unsetenv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util-net.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xassert.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsignal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstring.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am + + +global_defaults.c : $(top_builddir)/config.h Makefile + @( echo "/* This file autogenerated by src/common/Makefile */"; \ + echo "char *default_plugin_path = \"$(pkglibdir)\";"; \ + echo \ + "char *default_slurm_config_file = \"$(sysconfdir)/slurm.conf\";"; \ + echo "char *default_plugstack = \"$(sysconfdir)/plugstack.conf\";";\ + ) > global_defaults.c +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/common/arg_desc.c b/executable_names/src/common/arg_desc.c new file mode 100644 index 0000000000000000000000000000000000000000..f97ed799c1b22f66f0a1c9fd708a01fe5ad4cea4 --- /dev/null +++ b/executable_names/src/common/arg_desc.c @@ -0,0 +1,94 @@ +/****************************************************************************\ + * arg_desc.c + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\****************************************************************************/ +#include +#include "src/common/arg_desc.h" +#include "src/common/macros.h" +#include "src/common/xassert.h" + +/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +strong_alias(arg_count, slurm_arg_count); +strong_alias(arg_idx_by_name, slurm_arg_idx_by_name); +strong_alias(arg_name_by_idx, slurm_arg_name_by_idx); + +int +arg_count( const arg_desc_t *desc ) +{ + int i; + + if ( desc == NULL ) return 0; + + i = 0; + while ( desc[ i ].name != NULL ) ++i; + + return i; +} + + +int +arg_idx_by_name( const arg_desc_t *desc, const char *name ) +{ + int i; + + if ( desc == NULL ) return -1; + if ( name == NULL ) return -1; + + for ( i = 0; desc[ i ].name != NULL; ++i ) { + if ( strcmp( desc[ i ].name, name ) == 0 ) { + return i; + } + } + + return -1; +} + + +const char * +arg_name_by_idx( const arg_desc_t *desc, const int idx ) +{ + int i = idx; + + if ( desc == NULL ) return NULL; + + while ( i > 0 ) { + if ( desc[ i ].name != NULL ) --i; + } + + return desc[ i ].name; +} + diff --git a/executable_names/src/common/arg_desc.h b/executable_names/src/common/arg_desc.h new file mode 100644 index 0000000000000000000000000000000000000000..36c5637d35c2bea69f09241ec350b226229de17a --- /dev/null +++ b/executable_names/src/common/arg_desc.h @@ -0,0 +1,106 @@ +/****************************************************************************\ + * arg_desc.h + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\****************************************************************************/ +#ifndef __ARG_DESC_H__ +#define __ARG_DESC_H__ + +/* + * An argument descriptor is a named positional parameter in an + * argv-like vector of arguments. An array of named parameters + * constitutes the descriptor, and the index (zero-based) in the + * array of the named parameter is also its index in the argument + * vector. + * + * The descriptor array must be terminated by an entry whose name + * is the NULL pointer. + * + * arg_desc_t arg_desc[] = { + * { "foo" }, + * { "bar" }, + * { NULL } + * }; + * + * For vectors which are finalized at initialization, the receiving + * functions can call arg_idx_by_name() and cache the value in + * order to accelerate argument processing. + * + * For well-defined APIs containing explicit initialization routines, + * this can be done at initialization, as in + * + * void init( arg_desc_t *desc ) + * { + * static_foo_idx = arg_idx_by_name( desc, "foo" ); + * } + * + * void need_foo( void *argv[] ) + * { + * foo_type foo = (foo_type) argv[ static_foo_idx ]; + * ... + * } + * + * For vectors which may vary for each invocation of the function, + * it is best to pass the argument descriptor array as a first-class + * parameter to the function: + * + * void need_foo_dynamic( arg_desc_t *desc, void *argv[] ) + * { + * int idx = arg_idx_by_name( desc, "foo" ); + * foo_type foo = (foo_type) argv[ idx ]; + * } + */ + +typedef struct _arg_desc { + char *name; +} arg_desc_t; + +/* + * Return the number of argument names in the descriptor. + */ +int arg_count( const arg_desc_t *desc ); + +/* + * Return the index in the descriptor corresponding to the name. + * + * Returns -1 if the name can't be found. + */ +int arg_idx_by_name( const arg_desc_t *desc, const char *name ); + +/* + * Return the name of the argument for the given index, or NULL if + * the index is invalid. + */ +const char *arg_name_by_idx( const arg_desc_t *desc, const int idx ); + +#endif /*__ARG_DESC_H__*/ diff --git a/executable_names/src/common/bitstring.c b/executable_names/src/common/bitstring.c new file mode 100644 index 0000000000000000000000000000000000000000..b4ab43a50047094bd0475788a214b1d3e38fe356 --- /dev/null +++ b/executable_names/src/common/bitstring.c @@ -0,0 +1,1206 @@ +/*****************************************************************************\ + * bitstring.c - bitmap manipulation functions + ***************************************************************************** + * See comments about origin, limitations, and internal structure in + * bitstring.h. + * + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jim Garlick , Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include +#include + +#include "src/common/bitstring.h" +#include "src/common/macros.h" +#include "src/common/xmalloc.h" + +/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +strong_alias(bit_alloc, slurm_bit_alloc); +strong_alias(bit_test, slurm_bit_test); +strong_alias(bit_set, slurm_bit_set); +strong_alias(bit_clear, slurm_bit_clear); +strong_alias(bit_nclear, slurm_bit_nclear); +strong_alias(bit_nset, slurm_bit_nset); +strong_alias(bit_ffc, slurm_bit_ffc); +strong_alias(bit_ffs, slurm_bit_ffs); +strong_alias(bit_free, slurm_bit_free); +strong_alias(bit_realloc, slurm_bit_realloc); +strong_alias(bit_size, slurm_bit_size); +strong_alias(bit_and, slurm_bit_and); +strong_alias(bit_not, slurm_bit_not); +strong_alias(bit_or, slurm_bit_or); +strong_alias(bit_set_count, slurm_bit_set_count); +strong_alias(bit_clear_count, slurm_bit_clear_count); +strong_alias(bit_nset_max_count,slurm_bit_nset_max_count); +strong_alias(bit_and_set_count, slurm_bit_and_set_count); +strong_alias(int_and_set_count, slurm_int_and_set_count); +strong_alias(bit_rotate_copy, slurm_bit_rotate_copy); +strong_alias(bit_rotate, slurm_bit_rotate); +strong_alias(bit_fmt, slurm_bit_fmt); +strong_alias(bit_unfmt, slurm_bit_unfmt); +strong_alias(bitfmt2int, slurm_bitfmt2int); +strong_alias(bit_fmt_hexmask, slurm_bit_fmt_hexmask); +strong_alias(bit_unfmt_hexmask, slurm_bit_unfmt_hexmask); +strong_alias(bit_fmt_binmask, slurm_bit_fmt_binmask); +strong_alias(bit_unfmt_binmask, slurm_bit_unfmt_binmask); +strong_alias(bit_fls, slurm_bit_fls); +strong_alias(bit_fill_gaps, slurm_bit_fill_gaps); +strong_alias(bit_super_set, slurm_bit_super_set); +strong_alias(bit_equal, slurm_bit_equal); +strong_alias(bit_copy, slurm_bit_copy); +strong_alias(bit_pick_cnt, slurm_bit_pick_cnt); +strong_alias(bit_nffc, slurm_bit_nffc); +strong_alias(bit_noc, slurm_bit_noc); +strong_alias(bit_nffs, slurm_bit_nffs); +strong_alias(bit_copybits, slurm_bit_copybits); +strong_alias(bit_get_bit_num, slurm_bit_get_bit_num); +strong_alias(bit_get_pos_num, slurm_bit_get_pos_num); + +/* + * Allocate a bitstring. + * nbits (IN) valid bits in new bitstring, initialized to all clear + * RETURN new bitstring + */ +bitstr_t * +bit_alloc(bitoff_t nbits) +{ + bitstr_t *new; + + new = (bitstr_t *)calloc(_bitstr_words(nbits), sizeof(bitstr_t)); + if (new) { + _bitstr_magic(new) = BITSTR_MAGIC; + _bitstr_bits(new) = nbits; + } + return new; +} + +/* + * Reallocate a bitstring (expand or contract size). + * b (IN) pointer to old bitstring + * nbits (IN) valid bits in new bitstr + * RETURN new bitstring + */ +bitstr_t * +bit_realloc(bitstr_t *b, bitoff_t nbits) +{ + bitoff_t obits; + bitstr_t *new = NULL; + + _assert_bitstr_valid(b); + obits = _bitstr_bits(b); + new = realloc(b, _bitstr_words(nbits) * sizeof(bitstr_t)); + if (new) { + _assert_bitstr_valid(new); + _bitstr_bits(new) = nbits; + if (nbits > obits) + bit_nclear(new, obits, nbits - 1); + } + return new; +} + +/* + * Free a bitstr. + * b (IN/OUT) bitstr to be freed + */ +void +bit_free(bitstr_t *b) +{ + assert(b); + assert(_bitstr_magic(b) == BITSTR_MAGIC); + _bitstr_magic(b) = 0; + free(b); +} + +/* + * Return the number of possible bits in a bitstring. + * b (IN) bitstring to check + * RETURN number of bits allocated + */ +bitoff_t +bit_size(bitstr_t *b) +{ + _assert_bitstr_valid(b); + return _bitstr_bits(b); +} + +/* + * Is bit N of bitstring b set? + * b (IN) bitstring to test + * bit (IN) bit position to test + * RETURN 1 if bit set, 0 if clear + */ +int +bit_test(bitstr_t *b, bitoff_t bit) +{ + _assert_bitstr_valid(b); + _assert_bit_valid(b, bit); + return ((b[_bit_word(bit)] & _bit_mask(bit)) ? 1 : 0); +} + +/* + * Set bit N of bitstring. + * b (IN) target bitstring + * bit (IN) bit position to set + */ +void +bit_set(bitstr_t *b, bitoff_t bit) +{ + _assert_bitstr_valid(b); + _assert_bit_valid(b, bit); + b[_bit_word(bit)] |= _bit_mask(bit); +} + +/* + * Clear bit N of bitstring + * b (IN) target bitstring + * bit (IN) bit position to clear + */ +void +bit_clear(bitstr_t *b, bitoff_t bit) +{ + _assert_bitstr_valid(b); + _assert_bit_valid(b, bit); + b[_bit_word(bit)] &= ~_bit_mask(bit); +} + +/* + * Set bits start ... stop in bitstring + * b (IN) target bitstring + * start (IN) starting (low numbered) bit position + * stop (IN) ending (higher numbered) bit position + */ +void +bit_nset(bitstr_t *b, bitoff_t start, bitoff_t stop) +{ + _assert_bitstr_valid(b); + _assert_bit_valid(b, start); + _assert_bit_valid(b, stop); + + while (start <= stop && start % 8 > 0) /* partial first byte? */ + bit_set(b, start++); + while (stop >= start && (stop+1) % 8 > 0) /* partial last byte? */ + bit_set(b, stop--); + if (stop > start) { /* now do whole bytes */ + assert((stop-start+1) % 8 == 0); + memset(_bit_byteaddr(b, start), 0xff, (stop-start+1) / 8); + } +} + +/* + * Clear bits start ... stop in bitstring + * b (IN) target bitstring + * start (IN) starting (low numbered) bit position + * stop (IN) ending (higher numbered) bit position + */ +void +bit_nclear(bitstr_t *b, bitoff_t start, bitoff_t stop) +{ + _assert_bitstr_valid(b); + _assert_bit_valid(b, start); + _assert_bit_valid(b, stop); + + while (start <= stop && start % 8 > 0) /* partial first byte? */ + bit_clear(b, start++); + while (stop >= start && (stop+1) % 8 > 0)/* partial last byte? */ + bit_clear(b, stop--); + if (stop > start) { /* now do whole bytes */ + assert((stop-start+1) % 8 == 0); + memset(_bit_byteaddr(b, start), 0, (stop-start+1) / 8); + } +} + +/* + * Find first bit clear in bitstring. + * b (IN) bitstring to search + * nbits (IN) number of bits to search + * RETURN resulting bit position (-1 if none found) + */ +bitoff_t +bit_ffc(bitstr_t *b) +{ + bitoff_t bit = 0, value = -1; + + _assert_bitstr_valid(b); + + while (bit < _bitstr_bits(b) && value == -1) { + int word = _bit_word(bit); + + if (b[word] == BITSTR_MAXPOS) { + bit += sizeof(bitstr_t)*8; + continue; + } + while (bit < _bitstr_bits(b) && _bit_word(bit) == word) { + if (!bit_test(b, bit)) { + value = bit; + break; + } + bit++; + } + } + return value; +} + +/* Find the first n contiguous bits clear in b. + * b (IN) bitstring to search + * n (IN) number of bits needed + * RETURN position of first bit in range (-1 if none found) + */ +bitoff_t +bit_nffc(bitstr_t *b, int n) +{ + bitoff_t value = -1; + bitoff_t bit; + int cnt = 0; + + _assert_bitstr_valid(b); + assert(n > 0 && n < _bitstr_bits(b)); + + for (bit = 0; bit < _bitstr_bits(b); bit++) { + if (bit_test(b, bit)) { /* fail */ + cnt = 0; + } else { + cnt++; + if (cnt >= n) { + value = bit - (cnt - 1); + break; + } + } + } + + return value; +} + +/* Find n contiguous bits clear in b starting at some offset. + * b (IN) bitstring to search + * n (IN) number of bits needed + * seed (IN) position at which to begin search + * RETURN position of first bit in range (-1 if none found) + */ +bitoff_t +bit_noc(bitstr_t *b, int n, int seed) +{ + bitoff_t value = -1; + bitoff_t bit; + int cnt = 0; + + _assert_bitstr_valid(b); + assert(n > 0 && n <= _bitstr_bits(b)); + + if ((seed + n) >= _bitstr_bits(b)) + seed = _bitstr_bits(b); /* skip offset test, too small */ + + for (bit = seed; bit < _bitstr_bits(b); bit++) { /* start at offset */ + if (bit_test(b, bit)) { /* fail */ + cnt = 0; + } else { + cnt++; + if (cnt >= n) { + value = bit - (cnt - 1); + return value; + } + } + } + + cnt = 0; /* start at beginning */ + for (bit = 0; bit < _bitstr_bits(b); bit++) { + if (bit_test(b, bit)) { /* fail */ + if (bit >= seed) + break; + cnt = 0; + } else { + cnt++; + if (cnt >= n) { + value = bit - (cnt - 1); + return value; + } + } + } + + return -1; +} + +/* Find the first n contiguous bits set in b. + * b (IN) bitstring to search + * n (IN) number of bits needed + * RETURN position of first bit in range (-1 if none found) + */ +bitoff_t +bit_nffs(bitstr_t *b, int n) +{ + bitoff_t value = -1; + bitoff_t bit; + int cnt = 0; + + _assert_bitstr_valid(b); + assert(n > 0 && n <= _bitstr_bits(b)); + + for (bit = 0; bit <= _bitstr_bits(b) - n; bit++) { + if (!bit_test(b, bit)) { /* fail */ + cnt = 0; + } else { + cnt++; + if (cnt >= n) { + value = bit - (cnt - 1); + break; + } + } + } + + return value; +} + +/* + * Find first bit set in b. + * b (IN) bitstring to search + * RETURN resulting bit position (-1 if none found) + */ +bitoff_t +bit_ffs(bitstr_t *b) +{ + bitoff_t bit = 0, value = -1; + + _assert_bitstr_valid(b); + + while (bit < _bitstr_bits(b) && value == -1) { + int word = _bit_word(bit); + + if (b[word] == 0) { + bit += sizeof(bitstr_t)*8; + continue; + } + while (bit < _bitstr_bits(b) && _bit_word(bit) == word) { + if (bit_test(b, bit)) { + value = bit; + break; + } + bit++; + } + } + return value; +} + +/* + * Find last bit set in b. + * b (IN) bitstring to search + * RETURN resulting bit position (-1 if none found) + */ +bitoff_t +bit_fls(bitstr_t *b) +{ + bitoff_t bit, value = -1; + int word; + + _assert_bitstr_valid(b); + + if (_bitstr_bits(b) == 0) /* empty bitstring */ + return -1; + + bit = _bitstr_bits(b) - 1; /* zero origin */ + + while (bit >= 0 && /* test partitial words */ + (_bit_word(bit) == _bit_word(bit + 1))) { + if (bit_test(b, bit)) { + value = bit; + break; + } + bit--; + } + while (bit >= 0 && value == -1) { /* test whole words */ + word = _bit_word(bit); + if (b[word] == 0) { + bit -= sizeof(bitstr_t) * 8; + continue; + } + while (bit >= 0) { + if (bit_test(b, bit)) { + value = bit; + break; + } + bit--; + } + } + return value; +} + +/* + * set all bits between the first and last bits set (i.e. fill in the gaps + * to make set bits contiguous) + */ +void +bit_fill_gaps(bitstr_t *b) { + bitoff_t first, last; + + _assert_bitstr_valid(b); + + first = bit_ffs(b); + if (first == -1) + return; + + last = bit_fls(b); + bit_nset(b, first, last); + + return; +} + +/* + * return 1 if all bits set in b1 are also set in b2, 0 0therwise + */ +int +bit_super_set(bitstr_t *b1, bitstr_t *b2) { + bitoff_t bit; + + _assert_bitstr_valid(b1); + _assert_bitstr_valid(b2); + assert(_bitstr_bits(b1) == _bitstr_bits(b2)); + + for (bit = 0; bit < _bitstr_bits(b1); bit += sizeof(bitstr_t)*8) { + if (b1[_bit_word(bit)] != (b1[_bit_word(bit)] & + b2[_bit_word(bit)])) + return 0; + } + + return 1; +} + +/* + * return 1 if b1 and b2 are identical, 0 otherwise + */ +extern int +bit_equal(bitstr_t *b1, bitstr_t *b2) +{ + bitoff_t bit; + + _assert_bitstr_valid(b1); + _assert_bitstr_valid(b2); + + if (_bitstr_bits(b1) != _bitstr_bits(b2)) + return 0; + + for (bit = 0; bit < _bitstr_bits(b1); bit += sizeof(bitstr_t)*8) { + if (b1[_bit_word(bit)] != b2[_bit_word(bit)]) + return 0; + } + + return 1; +} + + + +/* + * b1 &= b2 + * b1 (IN/OUT) first string + * b2 (IN) second bitstring + */ +void +bit_and(bitstr_t *b1, bitstr_t *b2) { + bitoff_t bit; + + _assert_bitstr_valid(b1); + _assert_bitstr_valid(b2); + assert(_bitstr_bits(b1) == _bitstr_bits(b2)); + + for (bit = 0; bit < _bitstr_bits(b1); bit += sizeof(bitstr_t)*8) + b1[_bit_word(bit)] &= b2[_bit_word(bit)]; +} + +/* + * b1 = ~b1 one's complement + * b1 (IN/OUT) first bitmap + */ +void +bit_not(bitstr_t *b) { + bitoff_t bit; + + _assert_bitstr_valid(b); + + for (bit = 0; bit < _bitstr_bits(b); bit += sizeof(bitstr_t)*8) + b[_bit_word(bit)] = ~b[_bit_word(bit)]; +} + +/* + * b1 |= b2 + * b1 (IN/OUT) first bitmap + * b2 (IN) second bitmap + */ +void +bit_or(bitstr_t *b1, bitstr_t *b2) { + bitoff_t bit; + + _assert_bitstr_valid(b1); + _assert_bitstr_valid(b2); + assert(_bitstr_bits(b1) == _bitstr_bits(b2)); + + for (bit = 0; bit < _bitstr_bits(b1); bit += sizeof(bitstr_t)*8) + b1[_bit_word(bit)] |= b2[_bit_word(bit)]; +} + + + +/* + * return a copy of the supplied bitmap + */ +bitstr_t * +bit_copy(bitstr_t *b) +{ + bitstr_t *new; + int newsize_bits; + size_t len = 0; /* Number of bytes to memcpy() */ + + _assert_bitstr_valid(b); + + newsize_bits = bit_size(b); + len = (_bitstr_words(newsize_bits) - BITSTR_OVERHEAD)*sizeof(bitstr_t); + new = bit_alloc(newsize_bits); + if (new) + memcpy(&new[BITSTR_OVERHEAD], &b[BITSTR_OVERHEAD], len); + + return new; +} + +void +bit_copybits(bitstr_t *dest, bitstr_t *src) +{ + int len; + + _assert_bitstr_valid(dest); + _assert_bitstr_valid(src); + assert(bit_size(src) == bit_size(dest)); + + len = (_bitstr_words(bit_size(src)) - BITSTR_OVERHEAD)*sizeof(bitstr_t); + memcpy(&dest[BITSTR_OVERHEAD], &src[BITSTR_OVERHEAD], len); +} + +#if !defined(USE_64BIT_BITSTR) +/* + * Returns the hamming weight (i.e. the number of bits set) in a word. + * NOTE: This routine borrowed from Linux 2.4.9 . + */ +static uint32_t +hweight(uint32_t w) +{ + uint32_t res; + + res = (w & 0x55555555) + ((w >> 1) & 0x55555555); + res = (res & 0x33333333) + ((res >> 2) & 0x33333333); + res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F); + res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF); + res = (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF); + + return res; +} +#else +/* + * A 64 bit version crafted from 32-bit one borrowed above. + */ +static uint64_t +hweight(uint64_t w) +{ + uint64_t res; + + res = (w & 0x5555555555555555) + ((w >> 1) & 0x5555555555555555); + res = (res & 0x3333333333333333) + ((res >> 2) & 0x3333333333333333); + res = (res & 0x0F0F0F0F0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F0F0F0F0F); + res = (res & 0x00FF00FF00FF00FF) + ((res >> 8) & 0x00FF00FF00FF00FF); + res = (res & 0x0000FFFF0000FFFF) + ((res >> 16) & 0x0000FFFF0000FFFF); + res = (res & 0x00000000FFFFFFFF) + ((res >> 32) & 0x00000000FFFFFFFF); + + return res; +} +#endif /* !USE_64BIT_BITSTR */ + +/* + * Count the number of bits set in bitstring. + * b (IN) bitstring to check + * RETURN count of set bits + */ +int +bit_set_count(bitstr_t *b) +{ + int count = 0; + bitoff_t bit; + + _assert_bitstr_valid(b); + + for (bit = 0; bit < _bitstr_bits(b); bit += sizeof(bitstr_t)*8) + count += hweight(b[_bit_word(bit)]); + + return count; +} + +/* + * Count the number of bits clear in bitstring. + * b (IN) bitstring to check + * RETURN count of clear bits + */ +int +bit_clear_count(bitstr_t *b) +{ + _assert_bitstr_valid(b); + return (_bitstr_bits(b) - bit_set_count(b)); +} + +/* Return the count of the largest number of contiguous bits set in b. + * b (IN) bitstring to search + * RETURN the largest number of contiguous bits set in b + */ +int +bit_nset_max_count(bitstr_t *b) +{ + bitoff_t bit; + int cnt = 0; + int maxcnt = 0; + uint32_t bitsize; + + _assert_bitstr_valid(b); + bitsize = _bitstr_bits(b); + + for (bit = 0; bit < bitsize; bit++) { + if (!bit_test(b, bit)) { /* no longer continuous */ + cnt = 0; + } else { + cnt++; + if (cnt > maxcnt) { + maxcnt = cnt; + } + } + if (cnt == 0 && ((bitsize - bit) < maxcnt)) { + break; /* already found max */ + } + } + + return maxcnt; +} + +/* + * And two bitstrings and count the number of set bits: SUM(b1 & b2) + * b1 (IN) first bitstring + * b2 (IN) second bitstring + */ +int +bit_and_set_count(bitstr_t *b1, bitstr_t *b2) { + bitoff_t bit; + bitstr_t word; + int sum; + + _assert_bitstr_valid(b1); + _assert_bitstr_valid(b2); + assert(_bitstr_bits(b1) == _bitstr_bits(b2)); + + sum = 0; + for (bit = 0; bit < _bitstr_bits(b1); bit += sizeof(bitstr_t)*8) { + word = b1[_bit_word(bit)] & b2[_bit_word(bit)]; + sum += hweight(word); + } + return(sum); +} + +/* + * And an integer vector and a bitstring and sum the elements corresponding + * to set entries in b2: SUM(i1 & b2) + * Note: if b2 is longer than i1, then elements are wrapped into i1 + * i1 (IN) integer vector + * b2 (IN) bitstring + */ +int +int_and_set_count(int *i1, int ilen, bitstr_t *b2) { + bitoff_t bit; + int sum; + + _assert_bitstr_valid(b2); + + sum = 0; + for (bit = 0; bit < _bitstr_bits(b2); bit++) { + if (bit_test(b2, bit)) + sum += i1[bit % ilen]; + } + return(sum); +} + +/* + * rotate b1 by n bits returning a rotated copy + * b1 (IN) bitmap to rotate + * n (IN) rotation distance (+ = rotate left, - = rotate right) + * nbits (IN) size of the new copy (in which the rotation occurs) + * note: nbits must be >= bit_size(b1) + * RETURN new rotated bitmap + */ +bitstr_t * +bit_rotate_copy(bitstr_t *b1, int n, bitoff_t nbits) { + bitoff_t bit, dst; + bitstr_t *new; + bitoff_t bitsize; + bitoff_t deltasize, wrapbits; + + _assert_bitstr_valid(b1); + bitsize = bit_size(b1); + assert(nbits >= bitsize); + deltasize = nbits - bitsize; + + /* normalize n to a single positive rotation */ + n = n % nbits; + if (n < 0) { + n += nbits; + } + + wrapbits = 0; /* number of bits that will wrap around */ + if (n > deltasize) { + wrapbits = n - deltasize; + } + + new = bit_alloc(nbits); + bit_nclear(new,0,nbits-1); + + /* bits shifting up */ + for (bit = 0; bit < (bitsize-wrapbits); bit++) { + if (bit_test(b1, bit)) + bit_set(new, bit+n); + } + /* continue bit into wrap-around bits, if any */ + for (dst = 0; bit < bitsize; bit++, dst++) { + if (bit_test(b1, bit)) + bit_set(new, dst); + } + return(new); +} + +/* + * rotate b1 by n bits + * b1 (IN/OUT) bitmap to rotate + * n (IN) rotation distance (+ = rotate left, - = rotate right) + */ +void +bit_rotate(bitstr_t *b1, int n) { + uint32_t bitsize; + bitstr_t *new; + + if (n == 0) + return; + + _assert_bitstr_valid(b1); + bitsize = bit_size(b1); + + new = bit_rotate_copy(b1, n, bitsize); + bit_copybits(b1, new); + bit_free(new); +} + +/* + * build a bitmap containing the first nbits of b which are set + */ +bitstr_t * +bit_pick_cnt(bitstr_t *b, bitoff_t nbits) { + bitoff_t bit = 0, new_bits, count = 0; + bitstr_t *new; + + _assert_bitstr_valid(b); + + if (_bitstr_bits(b) < nbits) + return NULL; + + new = bit_alloc(bit_size(b)); + if (new == NULL) + return NULL; + + while ((bit < _bitstr_bits(b)) && (count < nbits)) { + int word = _bit_word(bit); + + if (b[word] == 0) { + bit += sizeof(bitstr_t)*8; + continue; + } + + new_bits = hweight(b[word]); + if ((count + new_bits) <= nbits) { + new[word] = b[word]; + count += new_bits; + bit += sizeof(bitstr_t)*8; + continue; + } + while ((bit < _bitstr_bits(b)) && (count < nbits)) { + if (bit_test(b, bit)) { + bit_set(new, bit); + count++; + } + bit++; + } + } + if (count < nbits) { + bit_free (new); + new = NULL; + } + + return new; +} + +/* + * XXX the relationship between stdint types and "unsigned [long] long" + * types is architecture/compiler dependent, so this may have to be tweaked. + */ +#ifdef USE_64BIT_BITSTR +#define BITSTR_RANGE_FMT "%llu-%llu," +#define BITSTR_SINGLE_FMT "%llu," +#else +#define BITSTR_RANGE_FMT "%u-%u," +#define BITSTR_SINGLE_FMT "%u," +#endif + +/* + * Convert to range string format, e.g. 0-5,42 + */ +char * +bit_fmt(char *str, int len, bitstr_t *b) +{ + int count = 0, ret, word; + bitoff_t start, bit; + + _assert_bitstr_valid(b); + assert(len > 0); + *str = '\0'; + for (bit = 0; bit < _bitstr_bits(b); ) { + word = _bit_word(bit); + if (b[word] == 0) { + bit += sizeof(bitstr_t)*8; + continue; + } + + if (bit_test(b, bit)) { + count++; + start = bit; + while (bit+1 < _bitstr_bits(b) && bit_test(b, bit+1)) + bit++; + if (bit == start) /* add single bit position */ + ret = snprintf(str+strlen(str), + len-strlen(str), + BITSTR_SINGLE_FMT, start); + else /* add bit position range */ + ret = snprintf(str+strlen(str), + len-strlen(str), + BITSTR_RANGE_FMT, start, bit); + assert(ret != -1); + } + bit++; + } + if (count > 0) + str[strlen(str) - 1] = '\0'; /* zap trailing comma */ + if (count > 1) { /* add braces */ + assert(strlen(str) + 3 < len); + memmove(str + 1, str, strlen(str)); + str[0] = '['; + strcat(str, "]"); + } + return str; +} + +int +bit_unfmt(bitstr_t *b, char *str) +{ + int *intvec, *p, rc = 0; + + _assert_bitstr_valid(b); + intvec = bitfmt2int(str); + if (intvec == NULL) + return -1; + + bit_nclear(b, 0, _bitstr_bits(b) - 1); + for (p = intvec; *p != -1; p += 2) { + if ((*p < 0) || (*p >= _bitstr_bits(b)) + || (*(p + 1) < 0) || (*(p + 1) >= _bitstr_bits(b))) { + rc = -1; + break; + } + bit_nset(b, *p, *(p + 1)); + } + + xfree(intvec); + return rc; +} + +/* + * bitfmt2int - convert a string describing bitmap (output from bit_fmt, + * e.g. "0-30,45,50-60") into an array of integer (start/end) pairs + * terminated by -1 (e.g. "0, 30, 45, 45, 50, 60, -1") + * input: bitmap string as produced by bitstring.c : bitfmt + * output: an array of integers + * NOTE: the caller must xfree the returned memory + */ +int * +bitfmt2int (char *bit_str_ptr) +{ + int *bit_int_ptr, i, bit_inx, size, sum, start_val; + + if (bit_str_ptr == NULL) + return NULL; + size = strlen (bit_str_ptr) + 1; + bit_int_ptr = xmalloc ( sizeof (int *) * + (size * 2 + 1)); /* more than enough space */ + if (bit_int_ptr == NULL) + return NULL; + + bit_inx = sum = 0; + start_val = -1; + for (i = 0; i < size; i++) { + if (bit_str_ptr[i] >= '0' && + bit_str_ptr[i] <= '9'){ + sum = (sum * 10) + (bit_str_ptr[i] - '0'); + } + + else if (bit_str_ptr[i] == '-') { + start_val = sum; + sum = 0; + } + + else if (bit_str_ptr[i] == ',' || + bit_str_ptr[i] == (char) NULL) { + if (i == 0) + break; + if (start_val == -1) + start_val = sum; + bit_int_ptr[bit_inx++] = start_val; + bit_int_ptr[bit_inx++] = sum; + start_val = -1; + sum = 0; + } + } + assert(bit_inx < (size*2+1)); + bit_int_ptr[bit_inx] = -1; + return bit_int_ptr; +} + +/* bit_fmt_hexmask + * + * Given a bitstr_t, allocate and return a string in the form of: + * "0x0123ABC\0" + * ^ ^ + * | | + * MSB LSB + * bitmap (IN) bitmap to format + * RETURN formatted string + */ +char * bit_fmt_hexmask(bitstr_t * bitmap) +{ + char *retstr, *ptr; + char current; + bitoff_t i; + bitoff_t bitsize = bit_size(bitmap); + + /* 4 bits per ASCII '0'-'F' */ + bitoff_t charsize = (bitsize + 3) / 4; + + retstr = xmalloc(charsize + 3); + + retstr[0] = '0'; + retstr[1] = 'x'; + retstr[charsize + 2] = '\0'; + ptr = &retstr[charsize + 1]; + for (i=0; i < bitsize;) { + current = 0; + if ( bit_test(bitmap,i++)) current |= 0x1; + if ((i < bitsize) && bit_test(bitmap,i++)) current |= 0x2; + if ((i < bitsize) && bit_test(bitmap,i++)) current |= 0x4; + if ((i < bitsize) && bit_test(bitmap,i++)) current |= 0x8; + current += '0'; + if (current > '9') current += ('A' - '9'); + *ptr-- = current; + } + + return retstr; +} + +/* bit_unfmt_hexmask + * + * Given a hex mask string "0x0123ABC\0", convert to a bitstr_t * + * ^ ^ + * | | + * MSB LSB + * bitmap (OUT) bitmap to update + * str (IN) hex mask string to unformat + */ +int bit_unfmt_hexmask(bitstr_t * bitmap, const char* str) +{ + int bit_index = 0, len = strlen(str); + const char *curpos = str + len - 1; + char current; + bitoff_t bitsize = bit_size(bitmap); + + if (strncmp(str, "0x", 2) == 0) { /* Bypass 0x */ + str += 2; + len -= 2; + } + + while(curpos >= str) { + current = (int) *curpos; + if (current <= '9') current -= '0'; + if (current > '9') current -= ('A' - '9'); + if ((current & 1) && (bit_index < bitsize)) + bit_set(bitmap, bit_index); + if ((current & 2) && (bit_index+1 < bitsize)) + bit_set(bitmap, bit_index+1); + if ((current & 4) && (bit_index+2 < bitsize)) + bit_set(bitmap, bit_index+2); + if ((current & 8) && (bit_index+3 < bitsize)) + bit_set(bitmap, bit_index+3); + len--; + curpos--; + bit_index+=4; + } + return 0; +} + +/* bit_fmt_binmask + * + * Given a bitstr_t, allocate and return a binary string in the form of: + * "0001010\0" + * ^ ^ + * | | + * MSB LSB + * bitmap (IN) bitmap to format + * RETURN formatted string + */ +char * bit_fmt_binmask(bitstr_t * bitmap) +{ + char *retstr, *ptr; + char current; + bitoff_t i; + bitoff_t bitsize = bit_size(bitmap); + + /* 1 bits per ASCII '0'-'1' */ + bitoff_t charsize = bitsize; + + retstr = xmalloc(charsize + 1); + + retstr[charsize] = '\0'; + ptr = &retstr[charsize - 1]; + for (i=0; i < bitsize;) { + current = 0; + if (bit_test(bitmap,i++)) current |= 0x1; + current += '0'; + *ptr-- = current; + } + + return retstr; +} + +/* bit_unfmt_binmask + * + * Given a binary mask string "0001010\0", convert to a bitstr_t * + * ^ ^ + * | | + * MSB LSB + * bitmap (OUT) bitmap to update + * str (IN) hex mask string to unformat + */ +int bit_unfmt_binmask(bitstr_t * bitmap, const char* str) +{ + int bit_index = 0, len = strlen(str); + const char *curpos = str + len - 1; + char current; + bitoff_t bitsize = bit_size(bitmap); + + while(curpos >= str) { + current = (int) *curpos; + current -= '0'; + if ((current & 1) && (bit_index < bitsize)) + bit_set(bitmap, bit_index); + len--; + curpos--; + bit_index++; + } + return 0; +} + +/* Find the bit set at pos (0 - bitstr_bits) in bitstr b. + * b (IN) bitstring to search + * pos (IN) bit to search for + * RETURN number bit is set in bitstring (-1 on error) + */ + +bitoff_t +bit_get_bit_num(bitstr_t *b, int pos) +{ + bitoff_t bit; + int cnt = 0; + bitoff_t bit_cnt; + + _assert_bitstr_valid(b); + bit_cnt = _bitstr_bits(b); + assert(pos <= bit_cnt); + + for (bit = 0; bit < bit_cnt; bit++) { + if (bit_test(b, bit)) { /* we got one */ + if(cnt == pos) + break; + cnt++; + } + } + + if(bit >= bit_cnt) + bit = -1; + + return bit; +} + +/* Find want nth the bit pos is set in bitstr b. + * b (IN) bitstring to search + * pos (IN) bit to search to + * RETURN number bit is set in bitstring (-1 on error) + */ + +int +bit_get_pos_num(bitstr_t *b, bitoff_t pos) +{ + bitoff_t bit; + int cnt = -1; + bitoff_t bit_cnt; + + _assert_bitstr_valid(b); + bit_cnt = _bitstr_bits(b); + assert(pos <= bit_cnt); + + if (!bit_test(b, pos)) { + error("bit %d not set", pos); + return cnt; + } + for (bit = 0; bit <= pos; bit++) { + if (bit_test(b, bit)) { /* we got one */ + cnt++; + } + } + + return cnt; +} diff --git a/executable_names/src/common/bitstring.h b/executable_names/src/common/bitstring.h new file mode 100644 index 0000000000000000000000000000000000000000..c24e32800d35f9e2180d0bcdedf112f867e7edda --- /dev/null +++ b/executable_names/src/common/bitstring.h @@ -0,0 +1,192 @@ +/*****************************************************************************\ + * bitstring.h - definitions for bitstring.c, bitmap manipulation functions + ***************************************************************************** + * Reimplementation of the functionality of Paul Vixie's bitstring.h macros + * from his cron package and later contributed to 4.4BSD. Little remains, + * though interface semantics are preserved in functions noted below. + * + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jim Garlick , Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +/* + * A bitstr_t is an array of configurable size words. The first two words + * are for internal use. Word 0 is a magic cookie used to validate that the + * bitstr_t is properly initialized. Word 1 is the number of valid bits in + * the bitstr_t This limts the capacity of a bitstr_t to 4 gigabits if using + * 32 bit words. + * + * bitstrings are zero origin + * + * bitstrings are always stored in a little-endian fashion. In other words, + * bit "1" is always in the byte of a word at the lowest memory address, + * regardless of the native architecture endianness. + */ + +#ifndef _BITSTRING_H_ +#define _BITSTRING_H_ + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +#define BITSTR_SHIFT_WORD8 3 +#define BITSTR_SHIFT_WORD32 5 +#define BITSTR_SHIFT_WORD64 6 + +#ifdef USE_64BIT_BITSTR +typedef uint64_t bitstr_t; +#define BITSTR_SHIFT BITSTR_SHIFT_WORD64 +#else +typedef uint32_t bitstr_t; +#define BITSTR_SHIFT BITSTR_SHIFT_WORD32 +#endif + +typedef bitstr_t bitoff_t; + +/* + * internal macros / defs + */ + +/* 2 words used for magic cookie and size */ +#define BITSTR_OVERHEAD 2 + +/* bitstr_t signature in first word */ +#define BITSTR_MAGIC 0x42434445 +#define BITSTR_MAGIC_STACK 0x42434446 /* signature if on stack */ + +/* max bit position in word */ +#define BITSTR_MAXPOS (sizeof(bitstr_t)*8 - 1) + +/* word of the bitstring bit is in */ +#define _bit_word(bit) (((bit) >> BITSTR_SHIFT) + BITSTR_OVERHEAD) + +/* address of the byte containing bit */ +#define _bit_byteaddr(name, bit) \ + ((char *)((name) + BITSTR_OVERHEAD) + ((bit) >> BITSTR_SHIFT_WORD8)) + +/* mask for the bit within its word */ +#ifdef SLURM_BIGENDIAN +#define _bit_mask(bit) ((bitstr_t)1 << (BITSTR_MAXPOS - ((bit)&BITSTR_MAXPOS))) +#else +#define _bit_mask(bit) ((bitstr_t)1 << ((bit)&BITSTR_MAXPOS)) +#endif + +/* number of bits actually allocated to a bitstr */ +#define _bitstr_bits(name) ((name)[1]) + +/* magic cookie stored here */ +#define _bitstr_magic(name) ((name)[0]) + +/* words in a bitstring of nbits bits */ +#define _bitstr_words(nbits) \ + ((((nbits) + BITSTR_MAXPOS) >> BITSTR_SHIFT) + BITSTR_OVERHEAD) + +/* check signature */ +#define _assert_bitstr_valid(name) do { \ + assert((name) != NULL); \ + assert(_bitstr_magic(name) == BITSTR_MAGIC \ + || _bitstr_magic(name) == BITSTR_MAGIC_STACK); \ +} while (0) + +/* check bit position */ +#define _assert_bit_valid(name,bit) do { \ + assert((bit) >= 0); \ + assert((bit) < _bitstr_bits(name)); \ +} while (0) + +/* + * external macros + */ + +/* allocate a bitstring on the stack */ +/* XXX bit_decl does not check if nbits overflows word 1 */ +#define bit_decl(name, nbits) \ + (name)[_bitstr_words(nbits)] = { BITSTR_MAGIC_STACK, (nbits) } + +/* compat with Vixie macros */ +bitstr_t *bit_alloc(bitoff_t nbits); +int bit_test(bitstr_t *b, bitoff_t bit); +void bit_set(bitstr_t *b, bitoff_t bit); +void bit_clear(bitstr_t *b, bitoff_t bit); +void bit_nclear(bitstr_t *b, bitoff_t start, bitoff_t stop); +void bit_nset(bitstr_t *b, bitoff_t start, bitoff_t stop); + +/* changed interface from Vixie macros */ +bitoff_t bit_ffc(bitstr_t *b); +bitoff_t bit_ffs(bitstr_t *b); + +/* new */ +bitoff_t bit_nffs(bitstr_t *b, int n); +bitoff_t bit_nffc(bitstr_t *b, int n); +bitoff_t bit_noc(bitstr_t *b, int n, int seed); +void bit_free(bitstr_t *b); +bitstr_t *bit_realloc(bitstr_t *b, bitoff_t nbits); +bitoff_t bit_size(bitstr_t *b); +void bit_and(bitstr_t *b1, bitstr_t *b2); +void bit_not(bitstr_t *b); +void bit_or(bitstr_t *b1, bitstr_t *b2); +int bit_set_count(bitstr_t *b); +int bit_clear_count(bitstr_t *b); +int bit_nset_max_count(bitstr_t *b); +int bit_and_set_count(bitstr_t *b1, bitstr_t *b2); +int int_and_set_count(int *i1, int ilen, bitstr_t *b2); +bitstr_t *bit_rotate_copy(bitstr_t *b1, int n, bitoff_t nbits); +void bit_rotate(bitstr_t *b1, int n); +char *bit_fmt(char *str, int len, bitstr_t *b); +int bit_unfmt(bitstr_t *b, char *str); +int *bitfmt2int (char *bit_str_ptr); +char *bit_fmt_hexmask(bitstr_t *b); +int bit_unfmt_hexmask(bitstr_t *b, const char *str); +char *bit_fmt_binmask(bitstr_t *b); +int bit_unfmt_binmask(bitstr_t *b, const char *str); +bitoff_t bit_fls(bitstr_t *b); +void bit_fill_gaps(bitstr_t *b); +int bit_super_set(bitstr_t *b1, bitstr_t *b2); +int bit_equal(bitstr_t *b1, bitstr_t *b2); +void bit_copybits(bitstr_t *dest, bitstr_t *src); +bitstr_t *bit_copy(bitstr_t *b); +bitstr_t *bit_pick_cnt(bitstr_t *b, bitoff_t nbits); +bitoff_t bit_get_bit_num(bitstr_t *b, int pos); +int bit_get_pos_num(bitstr_t *b, bitoff_t pos); + +#endif /* !_BITSTRING_H_ */ diff --git a/executable_names/src/common/cbuf.c b/executable_names/src/common/cbuf.c new file mode 100644 index 0000000000000000000000000000000000000000..1f2744c1049e9cb6fb4fbdc92dfc8b02973c4178 --- /dev/null +++ b/executable_names/src/common/cbuf.c @@ -0,0 +1,1832 @@ +/***************************************************************************** + * $Id$ + ***************************************************************************** + * $LSDId: cbuf.c,v 1.35 2005/01/13 00:41:17 dun Exp $ + ***************************************************************************** + * Copyright (C) 2002-2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Chris Dunlap . + * + * This file is from LSD-Tools, the LLNL Software Development Toolbox. + * + * LSD-Tools 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * LSD-Tools 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 LSD-Tools; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + ***************************************************************************** + * Refer to "cbuf.h" for documentation on public functions. + *****************************************************************************/ + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + +#ifdef WITH_PTHREADS +# include +#endif /* WITH_PTHREADS */ + +#include +#include +#include +#include +#include +#include "cbuf.h" + + +/********************* + * lsd_fatal_error * + *********************/ + +#ifdef WITH_LSD_FATAL_ERROR_FUNC +# undef lsd_fatal_error + extern void lsd_fatal_error(char *file, int line, char *mesg); +#else /* !WITH_LSD_FATAL_ERROR_FUNC */ +# ifndef lsd_fatal_error +# include +# include +# include +# define lsd_fatal_error(file, line, mesg) \ + do { \ + fprintf(stderr, "ERROR: [%s:%d] %s: %s\n", \ + file, line, mesg, strerror(errno)); \ + } while (0) +# endif /* !lsd_fatal_error */ +#endif /* !WITH_LSD_FATAL_ERROR_FUNC */ + + +/********************* + * lsd_nomem_error * + *********************/ + +#ifdef WITH_LSD_NOMEM_ERROR_FUNC +# undef lsd_nomem_error + extern void * lsd_nomem_error(char *file, int line, char *mesg); +#else /* !WITH_LSD_NOMEM_ERROR_FUNC */ +# ifndef lsd_nomem_error +# define lsd_nomem_error(file, line, mesg) (NULL) +# endif /* !lsd_nomem_error */ +#endif /* !WITH_LSD_NOMEM_ERROR_FUNC */ + + +/*************** + * Constants * + ***************/ + +#define CBUF_CHUNK 1000 +#define CBUF_MAGIC 0xDEADBEEF +#define CBUF_MAGIC_LEN (sizeof(unsigned long)) + + +/**************** + * Data Types * + ****************/ + +struct cbuf { + +#ifndef NDEBUG + unsigned long magic; /* cookie for asserting validity */ +#endif /* !NDEBUG */ + +#ifdef WITH_PTHREADS + pthread_mutex_t mutex; /* mutex to protect access to cbuf */ +#endif /* WITH_PTHREADS */ + + int alloc; /* num bytes malloc'd/realloc'd */ + int minsize; /* min bytes of data to allocate */ + int maxsize; /* max bytes of data to allocate */ + int size; /* num bytes of data allocated */ + int used; /* num bytes of unread data */ + cbuf_overwrite_t overwrite; /* overwrite option behavior */ + int got_wrap; /* true if data has wrapped */ + int i_in; /* index to where data is written in */ + int i_out; /* index to where data is read out */ + int i_rep; /* index to where data is replayable */ + unsigned char *data; /* ptr to circular buffer of data */ +}; + +typedef int (*cbuf_iof) (void *cbuf_data, void *arg, int len); + + +/**************** + * Prototypes * + ****************/ + +static int cbuf_find_replay_line (cbuf_t cb, int chars, int *nlines, int *nl); +static int cbuf_find_unread_line (cbuf_t cb, int chars, int *nlines); + +static int cbuf_get_fd (void *dstbuf, int *psrcfd, int len); +static int cbuf_get_mem (void *dstbuf, unsigned char **psrcbuf, int len); +static int cbuf_put_fd (void *srcbuf, int *pdstfd, int len); +static int cbuf_put_mem (void *srcbuf, unsigned char **pdstbuf, int len); + +static int cbuf_copier (cbuf_t src, cbuf_t dst, int len, int *ndropped); +static int cbuf_dropper (cbuf_t cb, int len); +static int cbuf_reader (cbuf_t src, int len, cbuf_iof putf, void *dst); +static int cbuf_replayer (cbuf_t src, int len, cbuf_iof putf, void *dst); +static int cbuf_writer (cbuf_t dst, int len, cbuf_iof getf, void *src, + int *ndropped); + +static int cbuf_grow (cbuf_t cb, int n); +static int cbuf_shrink (cbuf_t cb); + +#ifndef NDEBUG +static int cbuf_is_valid (cbuf_t cb); +#endif /* !NDEBUG */ + + +/************ + * Macros * + ************/ + +#ifndef MAX +# define MAX(x,y) (((x) >= (y)) ? (x) : (y)) +#endif /* !MAX */ + +#ifndef MIN +# define MIN(x,y) (((x) <= (y)) ? (x) : (y)) +#endif /* !MIN */ + +#ifdef WITH_PTHREADS + +# define cbuf_mutex_init(cb) \ + do { \ + int e = pthread_mutex_init(&cb->mutex, NULL); \ + if (e) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "cbuf mutex init"); \ + abort(); \ + } \ + } while (0) + +# define cbuf_mutex_lock(cb) \ + do { \ + int e = pthread_mutex_lock(&cb->mutex); \ + if (e) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "cbuf mutex lock"); \ + abort(); \ + } \ + } while (0) + +# define cbuf_mutex_unlock(cb) \ + do { \ + int e = pthread_mutex_unlock(&cb->mutex); \ + if (e) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "cbuf mutex unlock"); \ + abort(); \ + } \ + } while (0) + +# define cbuf_mutex_destroy(cb) \ + do { \ + int e = pthread_mutex_destroy(&cb->mutex); \ + if (e) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "cbuf mutex destroy"); \ + abort(); \ + } \ + } while (0) + +# ifndef NDEBUG + static int cbuf_mutex_is_locked (cbuf_t cb); +# endif /* !NDEBUG */ + +#else /* !WITH_PTHREADS */ + +# define cbuf_mutex_init(cb) +# define cbuf_mutex_lock(cb) +# define cbuf_mutex_unlock(cb) +# define cbuf_mutex_destroy(cb) +# define cbuf_mutex_is_locked(cb) (1) + +#endif /* !WITH_PTHREADS */ + + +/*************** + * Functions * + ***************/ + +cbuf_t +cbuf_create (int minsize, int maxsize) +{ + cbuf_t cb; + + if (minsize <= 0) { + errno = EINVAL; + return(NULL); + } + if (!(cb = malloc(sizeof(struct cbuf)))) { + errno = ENOMEM; + return(lsd_nomem_error(__FILE__, __LINE__, "cbuf struct")); + } + /* Circular buffer is empty when (i_in == i_out), + * so reserve 1 byte for this sentinel. + */ + cb->alloc = minsize + 1; +#ifndef NDEBUG + /* Reserve space for the magic cookies used to protect the + * cbuf data[] array from underflow and overflow. + */ + cb->alloc += 2 * CBUF_MAGIC_LEN; +#endif /* !NDEBUG */ + + if (!(cb->data = malloc(cb->alloc))) { + free(cb); + errno = ENOMEM; + return(lsd_nomem_error(__FILE__, __LINE__, "cbuf data")); + } + cbuf_mutex_init(cb); + cb->minsize = minsize; + cb->maxsize = (maxsize > minsize) ? maxsize : minsize; + cb->size = minsize; + cb->used = 0; + cb->overwrite = CBUF_WRAP_MANY; + cb->got_wrap = 0; + cb->i_in = cb->i_out = cb->i_rep = 0; + +#ifndef NDEBUG + /* C is for cookie, that's good enough for me, yeah! + * The magic cookies are only defined during DEBUG code. + * The first "magic" cookie is at the top of the structure. + * Magic cookies are also placed at the top & bottom of the + * cbuf data[] array to catch buffer underflow & overflow errors. + */ + cb->data += CBUF_MAGIC_LEN; /* jump forward past underflow magic */ + cb->magic = CBUF_MAGIC; + /* + * Must use memcpy since overflow cookie may not be word-aligned. + */ + memcpy(cb->data - CBUF_MAGIC_LEN, (void *) &cb->magic, CBUF_MAGIC_LEN); + memcpy(cb->data + cb->size + 1, (void *) &cb->magic, CBUF_MAGIC_LEN); + + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + cbuf_mutex_unlock(cb); +#endif /* !NDEBUG */ + + return(cb); +} + + +void +cbuf_destroy (cbuf_t cb) +{ + assert(cb != NULL); + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + +#ifndef NDEBUG + /* The moon sometimes looks like a C, but you can't eat that. + * Munch the magic cookies before freeing memory. + */ + cb->magic = ~CBUF_MAGIC; /* the anti-cookie! */ + memcpy(cb->data - CBUF_MAGIC_LEN, (void *) &cb->magic, CBUF_MAGIC_LEN); + memcpy(cb->data + cb->size + 1, (void *) &cb->magic, CBUF_MAGIC_LEN); + cb->data -= CBUF_MAGIC_LEN; /* jump back to what malloc returned */ +#endif /* !NDEBUG */ + + free(cb->data); + cbuf_mutex_unlock(cb); + cbuf_mutex_destroy(cb); + free(cb); + return; +} + + +void +cbuf_flush (cbuf_t cb) +{ + assert(cb != NULL); + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + /* + * FIXME: Shrink buffer back to minimum size. + */ + cb->used = 0; + cb->got_wrap = 0; + cb->i_in = cb->i_out = cb->i_rep = 0; + assert(cbuf_is_valid(cb)); + cbuf_mutex_unlock(cb); + return; +} + + +int +cbuf_size (cbuf_t cb) +{ + int size; + + assert(cb != NULL); + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + size = cb->maxsize; + cbuf_mutex_unlock(cb); + return(size); +} + + +int +cbuf_free (cbuf_t cb) +{ + int nfree; + + assert(cb != NULL); + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + nfree = cb->maxsize - cb->used; + cbuf_mutex_unlock(cb); + return(nfree); +} + + +int +cbuf_used (cbuf_t cb) +{ + int used; + + assert(cb != NULL); + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + used = cb->used; + cbuf_mutex_unlock(cb); + return(used); +} + + +int +cbuf_lines_used (cbuf_t cb) +{ + int lines = -1; + + assert(cb != NULL); + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + cbuf_find_unread_line(cb, cb->size, &lines); + cbuf_mutex_unlock(cb); + return(lines); +} + + +int +cbuf_reused (cbuf_t cb) +{ +/* If (O > R) + * n = O - R + * else + * n = (O - 0) + ((S+1) - R). + * (S+1) is used since data[] contains 'size' bytes + a 1-byte sentinel. + */ + int reused; + + assert(cb != NULL); + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + reused = (cb->i_out - cb->i_rep + (cb->size + 1)) % (cb->size + 1); + cbuf_mutex_unlock(cb); + return(reused); +} + + +int +cbuf_lines_reused (cbuf_t cb) +{ + int lines = -1; + + assert(cb != NULL); + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + cbuf_find_replay_line(cb, cb->size, &lines, NULL); + cbuf_mutex_unlock(cb); + return(lines); +} + + +int +cbuf_is_empty (cbuf_t cb) +{ + int used; + + assert(cb != NULL); + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + used = cb->used; + cbuf_mutex_unlock(cb); + return(used == 0); +} + + +int +cbuf_opt_get (cbuf_t cb, cbuf_opt_t name, int *value) +{ + int rc = 0; + + assert(cb != NULL); + + if (value == NULL) { + errno = EINVAL; + return(-1); + } + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + if (name == CBUF_OPT_OVERWRITE) { + *value = cb->overwrite; + } + else { + errno = EINVAL; + rc = -1; + } + cbuf_mutex_unlock(cb); + return(rc); +} + + +int +cbuf_opt_set (cbuf_t cb, cbuf_opt_t name, int value) +{ + int rc = 0; + + assert(cb != NULL); + + cbuf_mutex_lock(cb); + assert(cbuf_is_valid(cb)); + if (name == CBUF_OPT_OVERWRITE) { + if ( (value == CBUF_NO_DROP) + || (value == CBUF_WRAP_ONCE) + || (value == CBUF_WRAP_MANY) ) { + cb->overwrite = value; + } + else { + errno = EINVAL; + rc = -1; + } + } + else { + errno = EINVAL; + rc = -1; + } + assert(cbuf_is_valid(cb)); + cbuf_mutex_unlock(cb); + return(rc); +} + + +int +cbuf_drop (cbuf_t src, int len) +{ + assert(src != NULL); + + if (len < -1) { + errno = EINVAL; + return(-1); + } + if (len == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + + if (len == -1) { + len = src->used; + } + else { + len = MIN(len, src->used); + } + if (len > 0) { + cbuf_dropper(src, len); + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(len); +} + + +int +cbuf_peek (cbuf_t src, void *dstbuf, int len) +{ + int n; + + assert(src != NULL); + + if ((dstbuf == NULL) || (len < 0)) { + errno = EINVAL; + return(-1); + } + if (len == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + n = cbuf_reader(src, len, (cbuf_iof) cbuf_put_mem, &dstbuf); + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_read (cbuf_t src, void *dstbuf, int len) +{ + int n; + + assert(src != NULL); + + if ((dstbuf == NULL) || (len < 0)) { + errno = EINVAL; + return(-1); + } + if (len == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + n = cbuf_reader(src, len, (cbuf_iof) cbuf_put_mem, &dstbuf); + if (n > 0) { + cbuf_dropper(src, n); + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_replay (cbuf_t src, void *dstbuf, int len) +{ + int n; + + assert(src != NULL); + + if ((dstbuf == NULL) || (len < 0)) { + errno = EINVAL; + return(-1); + } + if (len == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + n = cbuf_replayer(src, len, (cbuf_iof) cbuf_put_mem, &dstbuf); + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_rewind (cbuf_t src, int len) +{ + int reused; + + assert(src != NULL); + + if (len < -1) { + errno = EINVAL; + return(-1); + } + if (len == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + + reused = (src->i_out - src->i_rep + (src->size + 1)) % (src->size + 1); + if (len == -1) { + len = reused; + } + else { + len = MIN(len, reused); + } + if (len > 0) { + src->used += len; + src->i_out = (src->i_out - len + (src->size + 1)) % (src->size + 1); + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(len); +} + + +int +cbuf_write (cbuf_t dst, void *srcbuf, int len, int *ndropped) +{ + int n; + + assert(dst != NULL); + + if (ndropped) { + *ndropped = 0; + } + if ((srcbuf == NULL) || (len < 0)) { + errno = EINVAL; + return(-1); + } + if (len == 0) { + return(0); + } + cbuf_mutex_lock(dst); + assert(cbuf_is_valid(dst)); + n = cbuf_writer(dst, len, (cbuf_iof) cbuf_get_mem, &srcbuf, ndropped); + assert(cbuf_is_valid(dst)); + cbuf_mutex_unlock(dst); + return(n); +} + + +int +cbuf_drop_line (cbuf_t src, int len, int lines) +{ + int n; + + assert(src != NULL); + + if ((len < 0) || (lines < -1)) { + errno = EINVAL; + return(-1); + } + if (lines == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + + n = cbuf_find_unread_line(src, len, &lines); + if (n > 0) { + cbuf_dropper(src, n); + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_peek_line (cbuf_t src, char *dstbuf, int len, int lines) +{ + int n, m, l; + char *pdst; + + assert(src != NULL); + + if ((dstbuf == NULL) || (len < 0) || (lines < -1)) { + errno = EINVAL; + return(-1); + } + if (lines == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + n = cbuf_find_unread_line(src, len - 1, &lines); + if (n > 0) { + if (len > 0) { + m = MIN(n, len - 1); + if (m > 0) { + pdst = dstbuf; + l = cbuf_reader(src, m, (cbuf_iof) cbuf_put_mem, &pdst); + assert(l == m); + } + assert(m < len); + dstbuf[m] = '\0'; + } + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_read_line (cbuf_t src, char *dstbuf, int len, int lines) +{ + int n, m, l; + char *pdst; + + assert(src != NULL); + + if ((dstbuf == NULL) || (len < 0) || (lines < -1)) { + errno = EINVAL; + return(-1); + } + if (lines == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + n = cbuf_find_unread_line(src, len - 1, &lines); + if (n > 0) { + if (len > 0) { + m = MIN(n, len - 1); + if (m > 0) { + pdst = dstbuf; + l = cbuf_reader(src, m, (cbuf_iof) cbuf_put_mem, &pdst); + assert(l == m); + } + assert(m < len); + dstbuf[m] = '\0'; + } + cbuf_dropper(src, n); + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_replay_line (cbuf_t src, char *dstbuf, int len, int lines) +{ + int n, m, l; + int nl; + char *pdst; + + assert(src != NULL); + + if ((dstbuf == NULL) || (len < 0) || (lines < -1)) { + errno = EINVAL; + return(-1); + } + if (lines == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + n = cbuf_find_replay_line(src, len - 1, &lines, &nl); + if (n > 0) { + if (len > 0) { + assert((nl == 0) || (nl == 1)); + m = MIN(n, len - 1 - nl); + m = MAX(m, 0); + if (m > 0) { + pdst = dstbuf; + l = cbuf_replayer(src, m, (cbuf_iof) cbuf_put_mem, &pdst); + assert(l == m); + } + /* Append newline if needed and space allows. + */ + if ((nl) && (len > 1)) { + dstbuf[m++] = '\n'; + } + assert(m < len); + dstbuf[m] = '\0'; + n += nl; + } + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_rewind_line (cbuf_t src, int len, int lines) +{ + int n; + + assert(src != NULL); + + if ((len < 0) || (lines < -1)) { + errno = EINVAL; + return(-1); + } + if (lines == 0) { + return(0); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + + n = cbuf_find_replay_line(src, len, &lines, NULL); + if (n > 0) { + src->used += n; + src->i_out = (src->i_out - n + (src->size + 1)) % (src->size + 1); + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_write_line (cbuf_t dst, char *srcbuf, int *ndropped) +{ + int len; + int nfree, ncopy, n; + int ndrop = 0, d; + char *psrc = srcbuf; + char *newline = "\n"; + + assert(dst != NULL); + + if (ndropped) { + *ndropped = 0; + } + if (srcbuf == NULL) { + errno = EINVAL; + return(-1); + } + /* Compute number of bytes to effectively copy to dst cbuf. + * Reserve space for the trailing newline if needed. + */ + len = ncopy = strlen(srcbuf); + if ((len == 0) || (srcbuf[len - 1] != '\n')) { + len++; + } + cbuf_mutex_lock(dst); + assert(cbuf_is_valid(dst)); + /* + * Attempt to grow dst cbuf if necessary. + */ + nfree = dst->size - dst->used; + if ((len > nfree) && (dst->size < dst->maxsize)) { + nfree += cbuf_grow(dst, len - nfree); + } + /* Determine if src will fit (or be made to fit) in dst cbuf. + */ + if (dst->overwrite == CBUF_NO_DROP) { + if (len > dst->size - dst->used) { + errno = ENOSPC; + len = -1; /* cannot return while mutex locked */ + } + } + else if (dst->overwrite == CBUF_WRAP_ONCE) { + if (len > dst->size) { + errno = ENOSPC; + len = -1; /* cannot return while mutex locked */ + } + } + if (len > 0) { + /* + * Discard data that won't fit in dst cbuf. + */ + if (len > dst->size) { + ndrop += len - dst->size; + ncopy -= ndrop; + psrc += ndrop; + } + /* Copy data from src string to dst cbuf. + */ + if (ncopy > 0) { + n = cbuf_writer(dst, ncopy, (cbuf_iof) cbuf_get_mem, &psrc, &d); + assert(n == ncopy); + ndrop += d; + } + /* Append newline if needed. + */ + if (srcbuf[len - 1] != '\n') { + n = cbuf_writer(dst, 1, (cbuf_iof) cbuf_get_mem, &newline, &d); + assert(n == 1); + ndrop += d; + } + } + assert(cbuf_is_valid(dst)); + cbuf_mutex_unlock(dst); + if (ndropped) { + *ndropped = ndrop; + } + return(len); +} + + +int +cbuf_peek_to_fd (cbuf_t src, int dstfd, int len) +{ + int n = 0; + + assert(src != NULL); + + if ((dstfd < 0) || (len < -1)) { + errno = EINVAL; + return(-1); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + if (len == -1) { + len = src->used; + } + if (len > 0) { + n = cbuf_reader(src, len, (cbuf_iof) cbuf_put_fd, &dstfd); + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_read_to_fd (cbuf_t src, int dstfd, int len) +{ + int n = 0; + + assert(src != NULL); + + if ((dstfd < 0) || (len < -1)) { + errno = EINVAL; + return(-1); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + if (len == -1) { + len = src->used; + } + if (len > 0) { + n = cbuf_reader(src, len, (cbuf_iof) cbuf_put_fd, &dstfd); + if (n > 0) { + cbuf_dropper(src, n); + } + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_replay_to_fd (cbuf_t src, int dstfd, int len) +{ + int n = 0; + + assert(src != NULL); + + if ((dstfd < 0) || (len < -1)) { + errno = EINVAL; + return(-1); + } + cbuf_mutex_lock(src); + assert(cbuf_is_valid(src)); + if (len == -1) { + len = src->size - src->used; + } + if (len > 0) { + n = cbuf_replayer(src, len, (cbuf_iof) cbuf_put_fd, &dstfd); + } + assert(cbuf_is_valid(src)); + cbuf_mutex_unlock(src); + return(n); +} + + +int +cbuf_write_from_fd (cbuf_t dst, int srcfd, int len, int *ndropped) +{ + int n = 0; + + assert(dst != NULL); + + if (ndropped) { + *ndropped = 0; + } + if ((srcfd < 0) || (len < -1)) { + errno = EINVAL; + return(-1); + } + cbuf_mutex_lock(dst); + assert(cbuf_is_valid(dst)); + if (len == -1) { + /* + * Try to use all of the free buffer space available for writing. + * If it is all in use, try to grab another chunk. + */ + len = dst->size - dst->used; + if (len == 0) { + len = CBUF_CHUNK; + } + } + if (len > 0) { + n = cbuf_writer(dst, len, (cbuf_iof) cbuf_get_fd, &srcfd, ndropped); + } + assert(cbuf_is_valid(dst)); + cbuf_mutex_unlock(dst); + return(n); +} + + +int +cbuf_copy (cbuf_t src, cbuf_t dst, int len, int *ndropped) +{ + int n = 0; + + assert(src != NULL); + assert(dst != NULL); + + if (ndropped) { + *ndropped = 0; + } + if (src == dst) { + errno = EINVAL; + return(-1); + } + if (len < -1) { + errno = EINVAL; + return(-1); + } + if (len == 0) { + return(0); + } + /* Lock cbufs in order of lowest memory address to prevent deadlock. + */ + if (src < dst) { + cbuf_mutex_lock(src); + cbuf_mutex_lock(dst); + } + else { + cbuf_mutex_lock(dst); + cbuf_mutex_lock(src); + } + assert(cbuf_is_valid(src)); + assert(cbuf_is_valid(dst)); + + if (len == -1) { + len = src->used; + } + if (len > 0) { + n = cbuf_copier(src, dst, len, ndropped); + } + assert(cbuf_is_valid(src)); + assert(cbuf_is_valid(dst)); + cbuf_mutex_unlock(src); + cbuf_mutex_unlock(dst); + return(n); +} + + +int +cbuf_move (cbuf_t src, cbuf_t dst, int len, int *ndropped) +{ + int n = 0; + + assert(src != NULL); + assert(dst != NULL); + + if (ndropped) { + *ndropped = 0; + } + if (src == dst) { + errno = EINVAL; + return(-1); + } + if (len < -1) { + errno = EINVAL; + return(-1); + } + if (len == 0) { + return(0); + } + /* Lock cbufs in order of lowest memory address to prevent deadlock. + */ + if (src < dst) { + cbuf_mutex_lock(src); + cbuf_mutex_lock(dst); + } + else { + cbuf_mutex_lock(dst); + cbuf_mutex_lock(src); + } + assert(cbuf_is_valid(src)); + assert(cbuf_is_valid(dst)); + + if (len == -1) { + len = src->used; + } + if (len > 0) { + n = cbuf_copier(src, dst, len, ndropped); + if (n > 0) { + cbuf_dropper(src, n); + } + } + assert(cbuf_is_valid(src)); + assert(cbuf_is_valid(dst)); + cbuf_mutex_unlock(src); + cbuf_mutex_unlock(dst); + return(n); +} + + +static int +cbuf_find_replay_line (cbuf_t cb, int chars, int *nlines, int *nl) +{ +/* Finds the specified number of lines from the replay region of the buffer. + * If ([nlines] > 0), returns the number of bytes comprising the line count, + * or 0 if this number of lines is not available (ie, all or none). + * If ([nlines] == -1), returns the number of bytes comprising the maximum + * line count bounded by the number of characters specified by [chars]. + * Only complete lines (ie, those terminated by a newline) are counted, + * with once exception: the most recent line of replay data is treated + * as a complete line regardless of the presence of a terminating newline. + * Sets the value-result parameter [nlines] to the number of lines found. + * Sets [nl] to '1' if a newline is required to terminate the replay data. + */ + int i, n, m, l; + int lines; + + assert(cb != NULL); + assert(nlines != NULL); + assert(*nlines >= -1); + assert(cbuf_mutex_is_locked(cb)); + + n = m = l = 0; + lines = *nlines; + *nlines = 0; + + if (nl) { + *nl = 0; /* init in case of early return */ + } + if ((lines == 0) || ((lines <= -1) && (chars <= 0))) { + return(0); + } + if (cb->i_out == cb->i_rep) { + return(0); /* no replay data available */ + } + if (lines > 0) { + chars = -1; /* chars parm not used if lines > 0 */ + } + else { + ++chars; /* incr to allow for preceding '\n' */ + } + /* Since the most recent line of replay data is considered implicitly + * terminated, decrement the char count to account for the newline + * if one is not present, or increment the line count if one is. + * Note: cb->data[(O - 1 + (S+1)) % (S+1)] is the last replayable char. + */ + if (cb->data[(cb->i_out + cb->size) % (cb->size + 1)] != '\n') { + if (nl) { + *nl = 1; + } + --chars; + } + else { + if (lines > 0) { + ++lines; + } + --l; + } + i = cb->i_out; + while (i != cb->i_rep) { + i = (i + cb->size) % (cb->size + 1); /* (i - 1 + (S+1)) % (S+1) */ + ++n; + if (chars > 0) { + --chars; + } + /* Complete lines are identified by a preceding newline. + */ + if (cb->data[i] == '\n') { + if (lines > 0) { + --lines; + } + m = n - 1; /* do not include preceding '\n' */ + ++l; + } + if ((chars == 0) || (lines == 0)) { + break; + } + } + /* But the first line written in does not need a preceding newline. + */ + if ((!cb->got_wrap) && ((chars > 0) || (lines > 0))) { + if (lines > 0) { + --lines; + } + m = n; + ++l; + } + if (lines > 0) { + return(0); /* all or none, and not enough found */ + } + *nlines = l; + return(m); +} + + +static int +cbuf_find_unread_line (cbuf_t cb, int chars, int *nlines) +{ +/* Finds the specified number of lines from the unread region of the buffer. + * If ([nlines] > 0), returns the number of bytes comprising the line count, + * or 0 if this number of lines is not available (ie, all or none). + * If ([nlines] == -1), returns the number of bytes comprising the maximum + * line count bounded by the number of characters specified by [chars]. + * Only complete lines (ie, those terminated by a newline) are counted. + * Sets the value-result parameter [nlines] to the number of lines found. + */ + int i, n, m, l; + int lines; + + assert(cb != NULL); + assert(nlines != NULL); + assert(*nlines >= -1); + assert(cbuf_mutex_is_locked(cb)); + + n = m = l = 0; + lines = *nlines; + *nlines = 0; + + if ((lines == 0) || ((lines <= -1) && (chars <= 0))) { + return(0); + } + if (cb->used == 0) { + return(0); /* no unread data available */ + } + if (lines > 0) { + chars = -1; /* chars parm not used if lines > 0 */ + } + i = cb->i_out; + while (i != cb->i_in) { + ++n; + if (chars > 0) { + --chars; + } + if (cb->data[i] == '\n') { + if (lines > 0) { + --lines; + } + m = n; + ++l; + } + if ((chars == 0) || (lines == 0)) { + break; + } + i = (i + 1) % (cb->size + 1); + } + if (lines > 0) { + return(0); /* all or none, and not enough found */ + } + *nlines = l; + return(m); +} + + +static int +cbuf_get_fd (void *dstbuf, int *psrcfd, int len) +{ +/* Copies data from the file referenced by the file descriptor + * pointed at by [psrcfd] into cbuf's [dstbuf]. + * Returns the number of bytes read from the fd, 0 on EOF, or -1 on error. + */ + int n; + + assert(dstbuf != NULL); + assert(psrcfd != NULL); + assert(*psrcfd >= 0); + assert(len > 0); + + do { + n = read(*psrcfd, dstbuf, len); + } while ((n < 0) && (errno == EINTR)); + return(n); +} + + +static int +cbuf_get_mem (void *dstbuf, unsigned char **psrcbuf, int len) +{ +/* Copies data from the buffer pointed at by [psrcbuf] into cbuf's [dstbuf]. + * Returns the number of bytes copied. + */ + assert(dstbuf != NULL); + assert(psrcbuf != NULL); + assert(*psrcbuf != NULL); + assert(len > 0); + + memcpy(dstbuf, *psrcbuf, len); + *psrcbuf += len; + return(len); +} + + +static int +cbuf_put_fd (void *srcbuf, int *pdstfd, int len) +{ +/* Copies data from cbuf's [srcbuf] into the file referenced + * by the file descriptor pointed at by [pdstfd]. + * Returns the number of bytes written to the fd, or -1 on error. + */ + int n; + + assert(srcbuf != NULL); + assert(pdstfd != NULL); + assert(*pdstfd >= 0); + assert(len > 0); + + do { + n = write(*pdstfd, srcbuf, len); + } while ((n < 0) && (errno == EINTR)); + return(n); +} + + +static int +cbuf_put_mem (void *srcbuf, unsigned char **pdstbuf, int len) +{ +/* Copies data from cbuf's [srcbuf] into the buffer pointed at by [pdstbuf]. + * Returns the number of bytes copied. + */ + assert(srcbuf != NULL); + assert(pdstbuf != NULL); + assert(*pdstbuf != NULL); + assert(len > 0); + + memcpy(*pdstbuf, srcbuf, len); + *pdstbuf += len; + return(len); +} + + +static int +cbuf_copier (cbuf_t src, cbuf_t dst, int len, int *ndropped) +{ +/* Copies up to [len] bytes from the [src] cbuf into the [dst] cbuf. + * Returns the number of bytes copied, or -1 on error (with errno set). + * Sets [ndropped] (if not NULL) to the number of [dst] bytes overwritten. + */ + int ncopy, nfree, nleft, nrepl, n; + int i_src, i_dst; + + assert(src != NULL); + assert(dst != NULL); + assert(len > 0); + assert(cbuf_mutex_is_locked(src)); + assert(cbuf_mutex_is_locked(dst)); + + /* Bound len by the number of bytes available. + */ + len = MIN(len, src->used); + if (len == 0) { + return(0); + } + /* Attempt to grow dst cbuf if necessary. + */ + nfree = dst->size - dst->used; + if ((len > nfree) && (dst->size < dst->maxsize)) { + nfree += cbuf_grow(dst, len - nfree); + } + /* Compute number of bytes to effectively copy to dst cbuf. + */ + if (dst->overwrite == CBUF_NO_DROP) { + len = MIN(len, dst->size - dst->used); + if (len == 0) { + errno = ENOSPC; + return(-1); + } + } + else if (dst->overwrite == CBUF_WRAP_ONCE) { + len = MIN(len, dst->size); + } + /* Compute number of bytes that will be overwritten in dst cbuf. + */ + if (ndropped) { + *ndropped = MAX(0, len - dst->size + dst->used); + } + /* Compute number of bytes to physically copy to dst cbuf. This prevents + * copying data that will overwritten if the cbuf wraps multiple times. + */ + ncopy = len; + i_src = src->i_out; + i_dst = dst->i_in; + if (ncopy > dst->size) { + n = ncopy - dst->size; + i_src = (i_src + n) % (src->size + 1); + ncopy -= n; + } + /* Copy data from src cbuf to dst cbuf. + */ + nleft = ncopy; + while (nleft > 0) { + n = MIN(((src->size + 1) - i_src), ((dst->size + 1) - i_dst)); + n = MIN(n, nleft); + memcpy(&dst->data[i_dst], &src->data[i_src], n); + i_src = (i_src + n) % (src->size + 1); + i_dst = (i_dst + n) % (dst->size + 1); + nleft -= n; + } + /* Update dst cbuf metadata. + */ + if (ncopy > 0) { + nrepl = (dst->i_out - dst->i_rep + (dst->size + 1)) % (dst->size + 1); + dst->used = MIN(dst->used + ncopy, dst->size); + assert(i_dst == (dst->i_in + ncopy) % (dst->size + 1)); + dst->i_in = i_dst; + if (ncopy > nfree - nrepl) { + dst->got_wrap = 1; + dst->i_rep = (dst->i_in + 1) % (dst->size + 1); + } + if (ncopy > nfree) { + dst->i_out = dst->i_rep; + } + } + return(len); +} + + +static int +cbuf_dropper (cbuf_t cb, int len) +{ +/* Discards exactly [len] bytes of unread data from [cb]. + * Returns the number of bytes dropped. + */ + assert(cb != NULL); + assert(len > 0); + assert(len <= cb->used); + assert(cbuf_mutex_is_locked(cb)); + + cb->used -= len; + cb->i_out = (cb->i_out + len) % (cb->size + 1); + + /* Attempt to shrink cbuf if possible. + */ + if ((cb->size - cb->used > CBUF_CHUNK) && (cb->size > cb->minsize)) { + cbuf_shrink(cb); + } + /* Don't call me clumsy, don't call me a fool. + * When things fall down on me, I'm following the rule. + */ + return(len); +} + + +static int +cbuf_reader (cbuf_t src, int len, cbuf_iof putf, void *dst) +{ +/* Reads up to [len] bytes from [src] into the object pointed at by [dst]. + * The I/O function [putf] specifies how data is written into [dst]. + * Returns the number of bytes read, or -1 on error (with errno set). + * Note that [dst] is a value-result parameter and will be "moved forward" + * by the number of bytes written into it. + */ + int nleft, n, m; + int i_src; + + assert(src != NULL); + assert(len > 0); + assert(putf != NULL); + assert(dst != NULL); + assert(cbuf_mutex_is_locked(src)); + + /* Bound len by the number of bytes available. + */ + len = MIN(len, src->used); + if (len == 0) { + return(0); + } + /* Copy data from src cbuf to dst obj. Do the cbuf hokey-pokey and + * wrap-around the buffer at most once. Break out if putf() returns + * either an ERR or a short count. + */ + i_src = src->i_out; + nleft = len; + m = 0; + while (nleft > 0) { + n = MIN(nleft, (src->size + 1) - i_src); + m = putf(&src->data[i_src], dst, n); + if (m > 0) { + nleft -= m; + i_src = (i_src + m) % (src->size + 1); + } + if (n != m) { + break; /* got ERR or "short" putf() */ + } + } + /* Compute number of bytes written to dst obj. + */ + n = len - nleft; + assert((n >= 0) && (n <= len)); + /* + * If no data has been written, return the ERR reported by putf(). + */ + if (n == 0) { + return(m); + } + return(n); +} + + +static int +cbuf_replayer (cbuf_t src, int len, cbuf_iof putf, void *dst) +{ +/* Replays up to [len] bytes from [src] into the object pointed at by [dst]. + * The I/O function [putf] specifies how data is written into [dst]. + * Returns the number of bytes replayed, or -1 on error (with errno set). + * Note that [dst] is a value-result parameter and will be "moved forward" + * by the number of bytes written into it. + */ + int nleft, n, m; + int i_src; + + assert(src != NULL); + assert(len > 0); + assert(putf != NULL); + assert(dst != NULL); + assert(cbuf_mutex_is_locked(src)); + + /* Bound len by the number of bytes available. + */ + n = (src->i_out - src->i_rep + (src->size + 1)) % (src->size + 1); + len = MIN(len, n); + if (len == 0) { + return(0); + } + /* Copy data from src cbuf to dst obj. Do the cbuf hokey-pokey and + * wrap-around the buffer at most once. Break out if putf() returns + * either an ERR or a short count. + */ + i_src = (src->i_out - len + (src->size + 1)) % (src->size + 1); + nleft = len; + m = 0; + while (nleft > 0) { + n = MIN(nleft, (src->size + 1) - i_src); + m = putf(&src->data[i_src], dst, n); + if (m > 0) { + nleft -= m; + i_src = (i_src + m) % (src->size + 1); + } + if (n != m) { + break; /* got ERR or "short" putf() */ + } + } + /* Compute number of bytes written to dst obj. + */ + n = len - nleft; + assert((n >= 0) && (n <= len)); + /* + * If no data has been written, return the ERR reported by putf(). + */ + if (n == 0) { + return(m); + } + return(n); +} + + +static int +cbuf_writer (cbuf_t dst, int len, cbuf_iof getf, void *src, int *ndropped) +{ +/* Writes up to [len] bytes from the object pointed at by [src] into [dst]. + * The I/O function [getf] specifies how data is read from [src]. + * Returns the number of bytes written, or -1 on error (with errno set). + * Sets [ndropped] (if not NULL) to the number of [dst] bytes overwritten. + * Note that [src] is a value-result parameter and will be "moved forward" + * by the number of bytes read from it. + */ + int nfree, nleft, nrepl, n, m; + int i_dst; + + assert(dst != NULL); + assert(len > 0); + assert(getf != NULL); + assert(src != NULL); + assert(cbuf_mutex_is_locked(dst)); + + /* Attempt to grow dst cbuf if necessary. + */ + nfree = dst->size - dst->used; + if ((len > nfree) && (dst->size < dst->maxsize)) { + nfree += cbuf_grow(dst, len - nfree); + } + /* Compute number of bytes to write to dst cbuf. + */ + if (dst->overwrite == CBUF_NO_DROP) { + len = MIN(len, dst->size - dst->used); + if (len == 0) { + errno = ENOSPC; + return(-1); + } + } + else if (dst->overwrite == CBUF_WRAP_ONCE) { + len = MIN(len, dst->size); + } + /* Copy data from src obj to dst cbuf. Do the cbuf hokey-pokey and + * wrap-around the buffer as needed. Break out if getf() returns + * either an EOF/ERR or a short count. + */ + i_dst = dst->i_in; + nleft = len; + m = 0; + while (nleft > 0) { + n = MIN(nleft, (dst->size + 1) - i_dst); + m = getf(&dst->data[i_dst], src, n); + if (m > 0) { + nleft -= m; + i_dst = (i_dst + m) % (dst->size + 1); + } + if (n != m) { + break; /* got EOF/ERR or "short" getf() */ + } + } + /* Compute number of bytes written to dst cbuf. + */ + n = len - nleft; + assert((n >= 0) && (n <= len)); + /* + * If no data has been written, return the EOF/ERR reported by getf(). + */ + if (n == 0) { + return(m); + } + /* Update dst cbuf metadata. + */ + if (n > 0) { + nrepl = (dst->i_out - dst->i_rep + (dst->size + 1)) % (dst->size + 1); + dst->used = MIN(dst->used + n, dst->size); + assert(i_dst == (dst->i_in + n) % (dst->size + 1)); + dst->i_in = i_dst; + if (n > nfree - nrepl) { + dst->got_wrap = 1; + dst->i_rep = (dst->i_in + 1) % (dst->size + 1); + } + if (n > nfree) { + dst->i_out = dst->i_rep; + } + } + if (ndropped) { + *ndropped = MAX(0, n - nfree); + } + return(n); +} + + +static int +cbuf_grow (cbuf_t cb, int n) +{ +/* Attempts to grow the circular buffer [cb] by at least [n] bytes. + * Returns the number of bytes by which the buffer has grown (which may be + * less-than, equal-to, or greater-than the number of bytes requested). + */ + unsigned char *data; + int size_old, size_meta; + int m; + + assert(cb != NULL); + assert(n > 0); + assert(cbuf_mutex_is_locked(cb)); + + if (cb->size == cb->maxsize) { + return(0); + } + size_old = cb->size; + size_meta = cb->alloc - cb->size; /* size of sentinel & magic cookies */ + assert(size_meta > 0); + + /* Attempt to grow data buffer by multiples of the chunk-size. + */ + m = cb->alloc + n; + m = m + (CBUF_CHUNK - (m % CBUF_CHUNK)); + m = MIN(m, (cb->maxsize + size_meta)); + assert(m > cb->alloc); + + data = cb->data; +#ifndef NDEBUG + data -= CBUF_MAGIC_LEN; /* jump back to what malloc returned */ +#endif /* !NDEBUG */ + + if (!(data = realloc(data, m))) { + /* + * XXX: Set flag or somesuch to prevent regrowing when out of memory? + */ + return(0); /* unable to grow data buffer */ + } + cb->data = data; + cb->alloc = m; + cb->size = m - size_meta; + +#ifndef NDEBUG + /* A round cookie with one bite out of it looks like a C. + * The underflow cookie will have been copied by realloc() if needed. + * But the overflow cookie must be rebaked. + * Must use memcpy since overflow cookie may not be word-aligned. + */ + cb->data += CBUF_MAGIC_LEN; /* jump forward past underflow magic */ + memcpy(cb->data + cb->size + 1, (void *) &cb->magic, CBUF_MAGIC_LEN); +#endif /* !NDEBUG */ + + /* The memory containing replay and unread data must be contiguous modulo + * the buffer size. Additional memory must be inserted between where + * new data is written in (i_in) and where replay data starts (i_rep). + * If replay data wraps-around the old buffer, move it to the new end + * of the buffer so it wraps-around in the same manner. + */ + if (cb->i_rep > cb->i_in) { + n = (size_old + 1) - cb->i_rep; + m = (cb->size + 1) - n; + memmove(cb->data + m, cb->data + cb->i_rep, n); + + if (cb->i_out >= cb->i_rep) { + cb->i_out += m - cb->i_rep; + } + cb->i_rep = m; + } + assert(cbuf_is_valid(cb)); + return(cb->size - size_old); +} + + +static int +cbuf_shrink (cbuf_t cb) +{ +/* XXX: DOCUMENT ME. + */ + assert(cb != NULL); + assert(cbuf_mutex_is_locked(cb)); + assert(cbuf_is_valid(cb)); + + if (cb->size == cb->minsize) { + return(0); + } + if (cb->size - cb->used <= CBUF_CHUNK) { + return(0); + } + /* FIXME: NOT IMPLEMENTED. + */ + assert(cbuf_is_valid(cb)); + return(0); +} + + +#ifndef NDEBUG +#ifdef WITH_PTHREADS +static int +cbuf_mutex_is_locked (cbuf_t cb) +{ +/* Returns true if the mutex is locked; o/w, returns false. + */ + int rc; + + assert(cb != NULL); + rc = pthread_mutex_trylock(&cb->mutex); + return(rc == EBUSY ? 1 : 0); +} +#endif /* WITH_PTHREADS */ +#endif /* !NDEBUG */ + + +#ifndef NDEBUG +static int +cbuf_is_valid (cbuf_t cb) +{ +/* Validates the data structure. All invariants should be tested here. + * Returns true if everything is valid; o/w, aborts due to assertion failure. + */ + int nfree; + + assert(cb != NULL); + assert(cbuf_mutex_is_locked(cb)); + assert(cb->data != NULL); + assert(cb->magic == CBUF_MAGIC); + /* + * Must use memcmp since overflow cookie may not be word-aligned. + */ + assert(memcmp(cb->data - CBUF_MAGIC_LEN, + (void *) &cb->magic, CBUF_MAGIC_LEN) == 0); + assert(memcmp(cb->data + cb->size + 1, + (void *) &cb->magic, CBUF_MAGIC_LEN) == 0); + + assert(cb->alloc > 0); + assert(cb->alloc > cb->size); + assert(cb->size > 0); + assert(cb->size >= cb->minsize); + assert(cb->size <= cb->maxsize); + assert(cb->minsize > 0); + assert(cb->maxsize > 0); + assert(cb->used >= 0); + assert(cb->used <= cb->size); + assert(cb->overwrite == CBUF_NO_DROP + || cb->overwrite == CBUF_WRAP_ONCE + || cb->overwrite == CBUF_WRAP_MANY); + assert(cb->got_wrap || !cb->i_rep); /* i_rep = 0 if data has not wrapped */ + assert(cb->i_in >= 0); + assert(cb->i_in <= cb->size); + assert(cb->i_out >= 0); + assert(cb->i_out <= cb->size); + assert(cb->i_rep >= 0); + assert(cb->i_rep <= cb->size); + + if (cb->i_in >= cb->i_out) { + assert((cb->i_rep > cb->i_in) || (cb->i_rep <= cb->i_out)); + } + else /* if (cb->in < cb->i_out) */ { + assert((cb->i_rep > cb->i_in) && (cb->i_rep <= cb->i_out)); + } + nfree = (cb->i_out - cb->i_in - 1 + (cb->size + 1)) % (cb->size + 1); + assert(cb->size - cb->used == nfree); + + return(1); +} +#endif /* !NDEBUG */ diff --git a/executable_names/src/common/cbuf.h b/executable_names/src/common/cbuf.h new file mode 100644 index 0000000000000000000000000000000000000000..bd7cd1843d222b10144a5bfc15a640e2ff66d56b --- /dev/null +++ b/executable_names/src/common/cbuf.h @@ -0,0 +1,332 @@ +/***************************************************************************** + * $Id$ + ***************************************************************************** + * $LSDId: cbuf.h,v 1.22 2005/01/19 22:35:57 dun Exp $ + ***************************************************************************** + * Copyright (C) 2002-2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Chris Dunlap . + * + * This file is from LSD-Tools, the LLNL Software Development Toolbox. + * + * LSD-Tools 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * LSD-Tools 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 LSD-Tools; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *****************************************************************************/ + + +#ifndef LSD_CBUF_H +#define LSD_CBUF_H + + +/*********** + * Notes * + ***********/ +/* + * Cbuf is a circular-buffer capable of dynamically resizing itself. + * Unread data in the buffer will be overwritten once the cbuf has + * reached its maximum size or is unable to allocate additional memory. + * + * The CBUF_OPT_OVERWRITE option specifies how unread cbuf data will + * be overwritten. If set to CBUF_NO_DROP, unread data will never be + * overwritten; writes into the cbuf will return -1 with ENOSPC. If set + * to CBUF_WRAP_ONCE, a single write operation will wrap-around the buffer + * at most once, and up to cbuf_used() bytes of data may be overwritten. + * If set to CBUF_WRAP_MANY, a single write operation will wrap-around the + * buffer as many times as needed in order to write all of the data. + * + * If NDEBUG is not defined, internal debug code will be enabled. This is + * intended for development use only and production code should define NDEBUG. + * + * If WITH_LSD_FATAL_ERROR_FUNC is defined, the linker will expect to + * find an external lsd_fatal_error(file,line,mesg) function. By default, + * lsd_fatal_error(file,line,mesg) is a macro definition that outputs an + * error message to stderr. This macro may be redefined to invoke another + * routine instead. + * + * If WITH_LSD_NOMEM_ERROR_FUNC is defined, the linker will expect to + * find an external lsd_nomem_error(file,line,mesg) function. By default, + * lsd_nomem_error(file,line,mesg) is a macro definition that returns NULL. + * This macro may be redefined to invoke another routine instead. + * + * If WITH_PTHREADS is defined, these routines will be thread-safe. + */ + + +/**************** + * Data Types * + ****************/ + +typedef struct cbuf * cbuf_t; /* circular-buffer opaque data type */ + +typedef enum { /* cbuf option names */ + CBUF_OPT_OVERWRITE +} cbuf_opt_t; + +typedef enum { /* CBUF_OPT_OVERWRITE values: */ + CBUF_NO_DROP, /* -never drop data, ENOSPC if full */ + CBUF_WRAP_ONCE, /* -drop data, wrapping at most once */ + CBUF_WRAP_MANY /* -drop data, wrapping as needed */ +} cbuf_overwrite_t; + + +/*************** + * Functions * + ***************/ + +cbuf_t cbuf_create (int minsize, int maxsize); +/* + * Creates and returns a new circular buffer, or lsd_nomem_error() on failure. + * The buffer is initially allocated to hold [minsize] bytes of data, + * but can attempt to grow up to [maxsize] bytes before overwriting data. + * Set minsize = maxsize to prevent cbuf from dynamically resizing itself. + * The default overwrite option behavior is CBUF_WRAP_MANY. + * Abandoning a cbuf without calling cbuf_destroy() will cause a memory leak. + */ + +void cbuf_destroy (cbuf_t cb); +/* + * Destroys the circular buffer [cb]. + */ + +void cbuf_flush (cbuf_t cb); +/* + * Flushes all data (including replay data) in [cb]. + */ + +int cbuf_size (cbuf_t cb); +/* + * Returns the maximum size of the buffer allocated to [cb] + * (ie, the number of bytes it can currently hold). + */ + +int cbuf_free (cbuf_t cb); +/* + * Returns the number of bytes in [cb] available for writing before unread + * data is overwritten (assuming the cbuf can resize itself if needed). + */ + +int cbuf_used (cbuf_t cb); +/* + * Returns the number of bytes in [cb] available for reading. + */ + +int cbuf_lines_used (cbuf_t cb); +/* + * Returns the number of lines in [cb] available for reading. + */ + +int cbuf_reused (cbuf_t cb); +/* + * Returns the number of bytes in [cb] available for replaying/rewinding. + */ + +int cbuf_lines_reused (cbuf_t cb); +/* + * Returns the number of lines in [cb] available for replaying/rewinding. + */ + +int cbuf_is_empty (cbuf_t cb); +/* + * Returns non-zero if [cb] is empty; o/w, returns zero. + */ + +int cbuf_opt_get (cbuf_t cb, cbuf_opt_t name, int *value); +/* + * Gets the [name] option for [cb] and sets [value] to the result. + * Returns 0 on success, or -1 on error (with errno set). + */ + +int cbuf_opt_set (cbuf_t cb, cbuf_opt_t name, int value); +/* + * Sets the [name] option for [cb] to [value]. + * Returns 0 on success, or -1 on error (with errno set). + */ + +int cbuf_drop (cbuf_t src, int len); +/* + * Discards up to [len] bytes of unread data from [src]; + * if [len] is -1, all unread data will be dropped. + * Dropped data is still available via the replay buffer. + * Returns the number of bytes dropped, or -1 on error (with errno set). + */ + +int cbuf_peek (cbuf_t src, void *dstbuf, int len); +/* + * Reads up to [len] bytes of data from the [src] cbuf into [dstbuf], + * but does not consume the data read from the cbuf. + * The "peek" can be committed to the cbuf via a call to cbuf_drop(), + * but the peek+drop combination is not atomic. + * Returns the number of bytes read, or -1 on error (with errno set). + */ + +int cbuf_read (cbuf_t src, void *dstbuf, int len); +/* + * Reads up to [len] bytes of data from the [src] cbuf into [dstbuf]. + * Returns the number of bytes read, or -1 on error (with errno set). + */ + +int cbuf_replay (cbuf_t src, void *dstbuf, int len); +/* + * Replays up to [len] bytes of previously read data from the [src] cbuf + * into [dstbuf]. + * Returns the number of bytes replayed, or -1 on error (with errno set). + */ + +int cbuf_rewind (cbuf_t src, int len); +/* + * Rewinds [src] by up to [len] bytes, placing previously read data back in + * the unread data buffer; if [len] is -1, all replay data will be rewound. + * Returns the number of bytes rewound, or -1 on error (with errno set). + */ + +int cbuf_write (cbuf_t dst, void *srcbuf, int len, int *ndropped); +/* + * Writes up to [len] bytes of data from [srcbuf] into the [dst] cbuf + * according to dst's CBUF_OPT_OVERWRITE behavior. + * Returns the number of bytes written, or -1 on error (with errno set). + * Sets [ndropped] (if not NULL) to the number of bytes overwritten. + */ + +int cbuf_drop_line (cbuf_t src, int len, int lines); +/* + * Discards the specified [lines] of data from [src]. If [lines] is -1, + * discards the maximum number of lines comprised of up to [len] characters. + * Dropped data is still available via the replay buffer. + * Returns the number of bytes dropped, or -1 on error (with errno set). + * Returns 0 if the number of lines is not available (ie, all or none). + */ + +int cbuf_peek_line (cbuf_t src, char *dstbuf, int len, int lines); +/* + * Reads the specified [lines] of data from the [src] cbuf into [dstbuf], + * but does not consume the data read from the cbuf. If [lines] is -1, + * reads the maximum number of lines that [dstbuf] can hold. The buffer + * will be NUL-terminated and contain at most ([len] - 1) characters. + * The "peek" can be committed to the cbuf via a call to cbuf_drop(), + * but the peek+drop combination is not atomic. + * Returns strlen of the line(s) on success; truncation occurred if >= [len]. + * Returns 0 if the number of lines is not available (ie, all or none). + * Returns -1 on error (with errno set). + */ + +int cbuf_read_line (cbuf_t src, char *dstbuf, int len, int lines); +/* + * Reads the specified [lines] of data from the [src] cbuf into [dstbuf]. + * If [lines] is -1, reads the maximum number of lines that [dstbuf] + * can hold. The buffer will be NUL-terminated and contain at most + * ([len] - 1) characters. + * Returns strlen of the line(s) on success; truncation occurred if >= [len], + * in which case excess line data is discarded. Returns 0 if the number + * of lines is not available (ie, all or none), in which case no data is + * consumed. Returns -1 on error (with errno set). + */ + +int cbuf_replay_line (cbuf_t src, char *dstbuf, int len, int lines); +/* + * Replays the specified [lines] of data from the [src] cbuf into [dstbuf]. + * If [lines] is -1, replays the maximum number of lines that [dstbuf] + * can hold. A newline will be appended to [dstbuf] if the last (ie, most + * recently read) line does not contain a trailing newline. The buffer + * will be NUL-terminated and contain at most ([len] - 1) characters. + * Returns strlen of the line(s) on success; truncation occurred if >= [len]. + * Returns 0 if the number of lines is not available (ie, all or none). + * Returns -1 on error (with errno set). + */ + +int cbuf_rewind_line (cbuf_t src, int len, int lines); +/* + * Rewinds [src] by the specified [lines] of data, placing previously read + * data back in the unread data buffer. If [lines] is -1, rewinds the + * maximum number of lines comprised of up to [len] characters. + * Returns the number of bytes rewound, or -1 on error (with errno set). + * Returns 0 if the number of lines is not available (ie, all or none). + */ + +int cbuf_write_line (cbuf_t dst, char *srcbuf, int *ndropped); +/* + * Writes the entire NUL-terminated [srcbuf] string into the [dst] cbuf + * according to dst's CBUF_OPT_OVERWRITE behavior. A newline will be + * appended to the cbuf if [srcbuf] does not contain a trailing newline. + * Returns the number of bytes written, or -1 or error (with errno set). + * Sets [ndropped] (if not NULL) to the number of bytes overwritten. + */ + +int cbuf_peek_to_fd (cbuf_t src, int dstfd, int len); +/* + * Reads up to [len] bytes of data from the [src] cbuf into the file + * referenced by the [dstfd] file descriptor, but does not consume the + * data read from the cbuf. If [len] is -1, it will be set to the number + * of [src] bytes available for reading. + * The "peek" can be committed to the cbuf via a call to cbuf_drop(), + * but the peek+drop combination is not atomic. + * Returns the number of bytes read, or -1 on error (with errno set). + */ + +int cbuf_read_to_fd (cbuf_t src, int dstfd, int len); +/* + * Reads up to [len] bytes of data from the [src] cbuf into the file + * referenced by the [dstfd] file descriptor. If [len] is -1, it will + * be set to the number of [src] bytes available for reading. + * Returns the number of bytes read, or -1 on error (with errno set). + */ + +int cbuf_replay_to_fd (cbuf_t src, int dstfd, int len); +/* + * Replays up to [len] bytes of previously read data from the [src] cbuf into + * the file referenced by the [dstfd] file descriptor. If [len] is -1, it + * will be set to the maximum number of [src] bytes available for replay. + * Returns the number of bytes replayed, or -1 on error (with errno set). + */ + +int cbuf_write_from_fd (cbuf_t dst, int srcfd, int len, int *ndropped); +/* + * Writes up to [len] bytes of data from the file referenced by the + * [srcfd] file descriptor into the [dst] cbuf according to dst's + * CBUF_OPT_OVERWRITE behavior. If [len] is -1, it will be set to + * an appropriate chunk size. + * Returns the number of bytes written, 0 on EOF, or -1 on error (with errno). + * Sets [ndropped] (if not NULL) to the number of bytes overwritten. + */ + +int cbuf_copy (cbuf_t src, cbuf_t dst, int len, int *ndropped); +/* + * Copies up to [len] bytes of data from the [src] cbuf into the [dst] cbuf + * according to dst's CBUF_OPT_OVERWRITE behavior. If [len] is -1, + * it will be set to the number of [src] bytes available for reading. + * Returns the number of bytes copied, or -1 on error (with errno set). + * Sets [ndropped] (if not NULL) to the number of [dst] bytes overwritten. + */ + +int cbuf_move (cbuf_t src, cbuf_t dst, int len, int *ndropped); +/* + * Moves up to [len] bytes of data from the [src] cbuf into the [dst] cbuf + * according to dst's CBUF_OPT_OVERWRITE behavior. If [len] is -1, + * it will be set to the number of [src] bytes available for reading. + * Returns the number of bytes moved, or -1 on error (with errno set). + * Sets [ndropped] (if not NULL) to the number of [dst] bytes overwritten. + */ + + +#endif /* !LSD_CBUF_H */ diff --git a/executable_names/src/common/checkpoint.c b/executable_names/src/common/checkpoint.c new file mode 100644 index 0000000000000000000000000000000000000000..87a75447c43491d233181999f13ac1e1917357ee --- /dev/null +++ b/executable_names/src/common/checkpoint.c @@ -0,0 +1,345 @@ +/*****************************************************************************\ + * checkpoint.c - implementation-independent checkpoint functions + * $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include + +#include "src/common/macros.h" +#include "src/common/plugin.h" +#include "src/common/plugrack.h" +#include "src/common/checkpoint.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/xmalloc.h" +#include "src/common/xassert.h" +#include "src/common/xstring.h" +#include "src/slurmctld/slurmctld.h" + +/* + * WARNING: Do not change the order of these fields or add additional + * fields at the beginning of the structure. If you do, job completion + * logging plugins will stop working. If you need to add fields, add them + * at the end of the structure. + */ +typedef struct slurm_checkpoint_ops { + int (*ckpt_op) (uint16_t op, uint16_t data, + struct step_record * step_ptr, time_t * event_time, + uint32_t *error_code, char **error_msg); + int (*ckpt_comp) (struct step_record * step_ptr, time_t event_time, + uint32_t error_code, char *error_msg); + + int (*ckpt_alloc_jobinfo) (check_jobinfo_t *jobinfo); + int (*ckpt_free_jobinfo) (check_jobinfo_t jobinfo); + int (*ckpt_pack_jobinfo) (check_jobinfo_t jobinfo, Buf buffer); + int (*ckpt_unpack_jobinfo) (check_jobinfo_t jobinfo, Buf buffer); +} slurm_checkpoint_ops_t; + +/* + * A global job completion context. "Global" in the sense that there's + * only one, with static bindings. We don't export it. + */ + +struct slurm_checkpoint_context { + char * checkpoint_type; + plugrack_t plugin_list; + plugin_handle_t cur_plugin; + int checkpoint_errno; + slurm_checkpoint_ops_t ops; +}; + +static slurm_checkpoint_context_t g_context = NULL; +static pthread_mutex_t context_lock = PTHREAD_MUTEX_INITIALIZER; + +static slurm_checkpoint_context_t +_slurm_checkpoint_context_create( const char *checkpoint_type ) +{ + slurm_checkpoint_context_t c; + + if ( checkpoint_type == NULL ) { + debug3( "_slurm_checkpoint_context_create: no checkpoint type"); + return NULL; + } + + c = xmalloc( sizeof( struct slurm_checkpoint_context ) ); + + c->checkpoint_errno = SLURM_SUCCESS; + + /* Copy the job completion job completion type. */ + c->checkpoint_type = xstrdup( checkpoint_type ); + if ( c->checkpoint_type == NULL ) { + debug3( "can't make local copy of checkpoint type" ); + xfree( c ); + return NULL; + } + + /* Plugin rack is demand-loaded on first reference. */ + c->plugin_list = NULL; + c->cur_plugin = PLUGIN_INVALID_HANDLE; + + return c; +} + +static int +_slurm_checkpoint_context_destroy( slurm_checkpoint_context_t c ) +{ + /* + * Must check return code here because plugins might still + * be loaded and active. + */ + if ( c->plugin_list ) { + if ( plugrack_destroy( c->plugin_list ) != SLURM_SUCCESS ) { + return SLURM_ERROR; + } + } + + xfree( c->checkpoint_type ); + xfree( c ); + + return SLURM_SUCCESS; +} + +/* + * Resolve the operations from the plugin. + */ +static slurm_checkpoint_ops_t * +_slurm_checkpoint_get_ops( slurm_checkpoint_context_t c ) +{ + /* + * These strings must be kept in the same order as the fields + * declared for slurm_checkpoint_ops_t. + */ + static const char *syms[] = { + "slurm_ckpt_op", + "slurm_ckpt_comp", + "slurm_ckpt_alloc_job", + "slurm_ckpt_free_job", + "slurm_ckpt_pack_job", + "slurm_ckpt_unpack_job" + }; + int n_syms = sizeof( syms ) / sizeof( char * ); + + /* Get the plugin list, if needed. */ + if ( c->plugin_list == NULL ) { + char *plugin_dir; + c->plugin_list = plugrack_create(); + if ( c->plugin_list == NULL ) { + error( "Unable to create a plugin manager" ); + return NULL; + } + + plugrack_set_major_type( c->plugin_list, "checkpoint" ); + plugrack_set_paranoia( c->plugin_list, + PLUGRACK_PARANOIA_NONE, + 0 ); + plugin_dir = slurm_get_plugin_dir(); + plugrack_read_dir( c->plugin_list, plugin_dir ); + xfree(plugin_dir); + } + + /* Find the correct plugin. */ + c->cur_plugin = + plugrack_use_by_type( c->plugin_list, c->checkpoint_type ); + if ( c->cur_plugin == PLUGIN_INVALID_HANDLE ) { + error( "can't find a plugin for type %s", c->checkpoint_type ); + return NULL; + } + + /* Dereference the API. */ + if ( plugin_get_syms( c->cur_plugin, + n_syms, + syms, + (void **) &c->ops ) < n_syms ) { + error( "incomplete checkpoint plugin detected" ); + return NULL; + } + + return &c->ops; +} + +/* initialize checkpoint plugin */ +extern int +checkpoint_init(char *checkpoint_type) +{ + int retval = SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + + if ( g_context ) + _slurm_checkpoint_context_destroy(g_context); + g_context = _slurm_checkpoint_context_create( checkpoint_type ); + if ( g_context == NULL ) { + error( "cannot create a context for %s", checkpoint_type ); + xfree(checkpoint_type); + retval = SLURM_ERROR; + goto done; + } + + if ( _slurm_checkpoint_get_ops( g_context ) == NULL ) { + error( "cannot resolve checkpoint plugin operations" ); + _slurm_checkpoint_context_destroy( g_context ); + g_context = NULL; + retval = SLURM_ERROR; + } + verbose("Checkpoint plugin loaded: %s", checkpoint_type); + + done: + slurm_mutex_unlock( &context_lock ); + return retval; +} + +/* shutdown checkpoint plugin */ +extern int +checkpoint_fini(void) +{ + int rc; + + if ( !g_context ) + return SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + rc =_slurm_checkpoint_context_destroy(g_context); + slurm_mutex_unlock( &context_lock ); + return rc; +} + + +/* perform some checkpoint operation */ +extern int +checkpoint_op(uint16_t op, uint16_t data, void * step_ptr, + time_t * event_time, uint32_t *error_code, char **error_msg) +{ + int retval = SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + if ( g_context ) + retval = (*(g_context->ops.ckpt_op))(op, data, + (struct step_record *) step_ptr, event_time, + error_code, error_msg); + else { + error ("slurm_checkpoint plugin context not initialized"); + retval = ENOENT; + } + slurm_mutex_unlock( &context_lock ); + return retval; +} + +extern int +checkpoint_comp(void * step_ptr, time_t event_time, uint32_t error_code, + char *error_msg) +{ + int retval = SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + if ( g_context ) + retval = (*(g_context->ops.ckpt_comp))( + (struct step_record *) step_ptr, + event_time, error_code, error_msg); + else { + error ("slurm_checkpoint plugin context not initialized"); + retval = ENOENT; + } + slurm_mutex_unlock( &context_lock ); + return retval; +} + +/* allocate and initialize a job step's checkpoint context */ +extern int checkpoint_alloc_jobinfo(check_jobinfo_t *jobinfo) +{ + int retval = SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + if ( g_context ) + retval = (*(g_context->ops.ckpt_alloc_jobinfo))( + jobinfo); + else { + error ("slurm_checkpoint plugin context not initialized"); + retval = ENOENT; + } + slurm_mutex_unlock( &context_lock ); + return retval; +} + +/* free storage for a job step's checkpoint context */ +extern int checkpoint_free_jobinfo(check_jobinfo_t jobinfo) +{ + int retval = SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + if ( g_context ) + retval = (*(g_context->ops.ckpt_free_jobinfo))( + jobinfo); + else { + error ("slurm_checkpoint plugin context not initialized"); + retval = ENOENT; + } + slurm_mutex_unlock( &context_lock ); + return retval; +} + +/* un/pack a job step's checkpoint context */ +extern int checkpoint_pack_jobinfo (check_jobinfo_t jobinfo, Buf buffer) +{ + int retval = SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + if ( g_context ) + retval = (*(g_context->ops.ckpt_pack_jobinfo))( + jobinfo, buffer); + else { + error ("slurm_checkpoint plugin context not initialized"); + retval = ENOENT; + } + slurm_mutex_unlock( &context_lock ); + return retval; +} + +extern int checkpoint_unpack_jobinfo (check_jobinfo_t jobinfo, Buf buffer) +{ + int retval = SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + if ( g_context ) + retval = (*(g_context->ops.ckpt_unpack_jobinfo))( + jobinfo, buffer); + else { + error ("slurm_checkpoint plugin context not initialized"); + retval = ENOENT; + } + slurm_mutex_unlock( &context_lock ); + return retval; +} diff --git a/executable_names/src/common/checkpoint.h b/executable_names/src/common/checkpoint.h new file mode 100644 index 0000000000000000000000000000000000000000..7439ee76bfb796aed332d2f02c7819feca1523b3 --- /dev/null +++ b/executable_names/src/common/checkpoint.h @@ -0,0 +1,96 @@ +/*****************************************************************************\ + * checkpoint.h - implementation-independent checkpoint API definitions. + * $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef __CHECKPOINT_H__ +#define __CHECKPOINT_H__ + +#include "slurm/slurm.h" +#include "src/common/macros.h" +#include "src/common/pack.h" +#include "src/common/slurm_protocol_defs.h" + +/* Define checkpoint options */ +enum check_opts { + CHECK_ABLE, /* able to checkpoint now */ + CHECK_DISABLE, /* disable checkpointing */ + CHECK_ENABLE, /* enable checkpointing */ + CHECK_CREATE, /* create a checkpoint for this job, + * job continues execution afterwards */ + CHECK_VACATE, /* create a checkpoint for this job, + * job terminates afterwards */ + CHECK_RESTART, /* restart a previously checkpointed job */ + CHECK_ERROR /* get error info */ +}; + +/* opaque data structures - no peeking! */ +#ifndef __check_jobinfo_t_defined +# define __check_jobinfo_t_defined + typedef struct check_jobinfo *check_jobinfo_t; +#endif +typedef struct slurm_checkpoint_context * slurm_checkpoint_context_t; + +/* initialize checkpoint plugin */ +extern int checkpoint_init(char *checkpoint_type); + +/* shutdown checkpoint plugin */ +extern int checkpoint_fini(void); + +/* perform many checkpoint operation */ +extern int checkpoint_op(uint16_t op, uint16_t data, void * step_ptr, + time_t * event_time, uint32_t *error_code, char **error_msg); + +/* note checkpoint completion */ +extern int checkpoint_comp(void * step_ptr, time_t event_time, uint32_t error_code, + char *error_msg); + +/* gather checkpoint error info */ +extern int checkpoint_error(void * step_ptr, + uint16_t *ckpt_errno, char **ckpt_strerror); + +/* allocate and initialize a job step's checkpoint context */ +extern int checkpoint_alloc_jobinfo(check_jobinfo_t *jobinfo); + +/* free storage for a job step's checkpoint context */ +extern int checkpoint_free_jobinfo(check_jobinfo_t jobinfo); + +/* un/pack a job step's checkpoint context */ +extern int checkpoint_pack_jobinfo (check_jobinfo_t jobinfo, Buf buffer); +extern int checkpoint_unpack_jobinfo (check_jobinfo_t jobinfo, Buf buffer); + +#endif /*__CHECKPOINT_H__*/ + diff --git a/executable_names/src/common/daemonize.c b/executable_names/src/common/daemonize.c new file mode 100644 index 0000000000000000000000000000000000000000..a17f1985690a750659313c050ee852f57da75df2 --- /dev/null +++ b/executable_names/src/common/daemonize.c @@ -0,0 +1,202 @@ +/*****************************************************************************\ + * daemonize.c - daemonization routine + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark A. Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "src/common/daemonize.h" +#include "src/common/fd.h" +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/xassert.h" + +/* closeall FDs >= a specified value */ +static void +closeall(int fd) +{ + int fdlimit = sysconf(_SC_OPEN_MAX); + + while (fd < fdlimit) + close(fd++); +} + +/* detach and go into background. + * caller is responsible for umasks + * + * if nochdir == 0, will do a chdir to / + * if noclose == 0, will close all FDs + */ +int +daemon(int nochdir, int noclose) +{ + switch (fork()) { + case 0 : break; /* child */ + case -1 : return -1; + default : _exit(0); /* exit parent */ + } + + if (setsid() < 0) + return -1; + + switch (fork()) { + case 0 : break; /* child */ + case -1: return -1; + default: _exit(0); /* exit parent */ + } + + if(!nochdir && chdir("/") < 0) { + error("chdir(/): %m"); + return -1; + } + + /* Close all file descriptors if requested + */ + if (!noclose) { + closeall(0); + if (open("/dev/null", O_RDWR) != 0) + error("Unable to open /dev/null on stdin: %m"); + dup2(0, STDOUT_FILENO); + dup2(0, STDERR_FILENO); + } else { + /* + * Otherwise, dup stdin, stdout, and stderr onto /dev/null + */ + int devnull = open("/dev/null", O_RDWR); + if (devnull < 0) + error("Unable to open /dev/null: %m"); + if (dup2(devnull, STDIN_FILENO) < 0) + error("Unable to dup /dev/null onto stdin: %m"); + if (dup2(devnull, STDOUT_FILENO) < 0) + error("Unable to dup /dev/null onto stdout: %m"); + if (dup2(devnull, STDERR_FILENO) < 0) + error("Unable to dup /dev/null onto stderr: %m"); + if (close(devnull) < 0) + error("Unable to close /dev/null: %m"); + } + + return 0; + +} + +/* + * Read and return pid stored in pidfile. + * Returns 0 if file doesn't exist or pid cannot be read. + * If pidfd != NULL, the file will be kept open and the fd + * returned. + */ +pid_t +read_pidfile(const char *pidfile, int *pidfd) +{ + int fd; + FILE *fp = NULL; + unsigned long pid; + pid_t lpid; + + if ((fd = open(pidfile, O_RDONLY)) < 0) + return ((pid_t) 0); + + if (!(fp = fdopen(fd, "r")) && (errno != ENOENT)) + error ("Unable to access old pidfile at `%s': %m", pidfile); + + if (fscanf(fp, "%lu", &pid) < 1) { + error ("Possible corrupt pidfile `%s'", pidfile); + return ((pid_t) 0); + } + + if ((lpid = fd_is_read_lock_blocked(fd)) == (pid_t) 0) { + verbose ("pidfile not locked, assuming no running daemon"); + return (lpid); + } + + if (lpid != (pid_t) pid) + fatal ("pidfile locked by %lu but contains pid=%lu", + (unsigned long) lpid, (unsigned long) pid); + + if (pidfd != NULL) + *pidfd = fd; + else + (void) close(fd); /* Ignore errors */ + + return (lpid); +} + + + +int +create_pidfile(const char *pidfile) +{ + FILE *fp; + + xassert(pidfile != NULL); + xassert(pidfile[0] == '/'); + + if (!(fp = fopen(pidfile, "w"))) { + error("Unable to open pidfile `%s': %m", pidfile); + return -1; + } + + if (fd_get_write_lock(fileno(fp)) < 0) { + error ("Unable to lock pidfile `%s': %m", pidfile); + goto error; + } + + if (fprintf(fp, "%lu\n", (unsigned long) getpid()) == EOF) { + error("Unable to write to pidfile `%s': %m", pidfile); + goto error; + } + + fflush(fp); + + /* + * if (fclose(fp) == EOF) { + * error("Unable to close pidfile `%s': %m", pidfile); + * goto error; + *} + */ + return (fileno(fp)); + + error: + if (unlink(pidfile) < 0) + error("Unable to remove pidfile `%s': %m", pidfile); + return -1; +} + diff --git a/executable_names/src/common/daemonize.h b/executable_names/src/common/daemonize.h new file mode 100644 index 0000000000000000000000000000000000000000..5c4aa6f0358615c94f5a33fdcedb0f17cb7a2de4 --- /dev/null +++ b/executable_names/src/common/daemonize.h @@ -0,0 +1,63 @@ +/*****************************************************************************\ + * src/slurmd/daemonize.h - function definition for making a daemon + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + + +#ifndef _HAVE_DAEMONIZE_H +#define _HAVE_DAEMONIZE_H + +/* fork process into background and inherit new session + * if nochdir is 0, performs a chdir("/") + * if noclose is 0, closes all fds and dups stdout/err of daemon onto /dev/null + * + * returns -1 on error. + */ +extern int daemon(int nochdir, int noclose); + +/* Write pid into file pidfile + */ +extern int create_pidfile(const char *pidfilename); + +/* + * Attempt to read an old pid from the configured pidfile + * Returns 0 if no pidfile exists (No running process) + * If pidfilefd is not NULL, returns open file descriptor for + * pidfile (when pid != 0). + */ +extern pid_t read_pidfile(const char *pidfilename, int *pidfilefd); + +#endif /* !_HAVE_DAEMONIZE_H */ diff --git a/executable_names/src/common/eio.c b/executable_names/src/common/eio.c new file mode 100644 index 0000000000000000000000000000000000000000..aecaf72a33693c2a1a2b43f0f66ecd74b887ea7d --- /dev/null +++ b/executable_names/src/common/eio.c @@ -0,0 +1,426 @@ +/*****************************************************************************\ + * src/common/eio.c - Event-based I/O for slurm + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "src/common/xmalloc.h" +#include "src/common/xassert.h" +#include "src/common/log.h" +#include "src/common/list.h" +#include "src/common/fd.h" +#include "src/common/eio.h" + +/* + * outside threads can stick new objects on the new_objs List and + * the eio thread will move them to the main obj_list the next time + * it wakes up. + */ +struct eio_handle_components { +#ifndef NDEBUG +# define EIO_MAGIC 0xe1e10 + int magic; +#endif + int fds[2]; + List obj_list; + List new_objs; +}; + + +/* Function prototypes + */ + +static int _poll_internal(struct pollfd *pfds, unsigned int nfds); +static unsigned int _poll_setup_pollfds(struct pollfd *, eio_obj_t **, List); +static void _poll_dispatch(struct pollfd *, unsigned int, eio_obj_t **, + List objList); +static void _poll_handle_event(short revents, eio_obj_t *obj, + List objList); + +eio_handle_t *eio_handle_create(void) +{ + eio_handle_t *eio = xmalloc(sizeof(*eio)); + + if (pipe(eio->fds) < 0) { + error ("eio_create: pipe: %m"); + eio_handle_destroy(eio); + return (NULL); + } + + fd_set_nonblocking(eio->fds[0]); + fd_set_close_on_exec(eio->fds[0]); + fd_set_close_on_exec(eio->fds[1]); + + xassert(eio->magic = EIO_MAGIC); + + eio->obj_list = list_create(NULL); /* FIXME! Needs destructor */ + eio->new_objs = list_create(NULL); + + return eio; +} + +void eio_handle_destroy(eio_handle_t *eio) +{ + xassert(eio != NULL); + xassert(eio->magic == EIO_MAGIC); + close(eio->fds[0]); + close(eio->fds[1]); + /* FIXME - Destroy obj_list and new_objs */ + xassert(eio->magic = ~EIO_MAGIC); + xfree(eio); +} + +int eio_signal_shutdown(eio_handle_t *eio) +{ + char c = 1; + if (write(eio->fds[1], &c, sizeof(char)) != 1) + return error("eio_handle_signal_shutdown: write; %m"); + return 0; +} + +int eio_signal_wakeup(eio_handle_t *eio) +{ + char c = 0; + if (write(eio->fds[1], &c, sizeof(char)) != 1) + return error("eio_handle_signal_wake: write; %m"); + return 0; +} + +static void _mark_shutdown_true(List obj_list) +{ + ListIterator objs; + eio_obj_t *obj; + + objs = list_iterator_create(obj_list); + while ((obj = list_next(objs))) { + obj->shutdown = true; + } + list_iterator_destroy(objs); +} + +static int _eio_wakeup_handler(eio_handle_t *eio) +{ + char c = 0; + int rc = 0; + eio_obj_t *obj; + + while ((rc = (read(eio->fds[0], &c, 1)) > 0)) { + if (c == 1) + _mark_shutdown_true(eio->obj_list); + } + + /* move new eio objects from the new_objs to the obj_list */ + while ((obj = list_dequeue(eio->new_objs))) { + list_enqueue(eio->obj_list, obj); + } + + if (rc < 0) return error("eio_clear: read: %m"); + + return 0; +} + +int eio_handle_mainloop(eio_handle_t *eio) +{ + int retval = 0; + struct pollfd *pollfds = NULL; + eio_obj_t **map = NULL; + unsigned int maxnfds = 0, nfds = 0; + unsigned int n = 0; + + xassert (eio != NULL); + xassert (eio->magic == EIO_MAGIC); + + for (;;) { + + /* Alloc memory for pfds and map if needed */ + n = list_count(eio->obj_list); + if (maxnfds < n) { + maxnfds = n; + xrealloc(pollfds, (maxnfds+1) * sizeof(struct pollfd)); + xrealloc(map, maxnfds * sizeof(eio_obj_t * )); + /* + * Note: xrealloc() also handles initial malloc + */ + } + + debug4("eio: handling events for %d objects", + list_count(eio->obj_list)); + nfds = _poll_setup_pollfds(pollfds, map, eio->obj_list); + if (nfds <= 0) + goto done; + + /* + * Setup eio handle signalling fd + */ + pollfds[nfds].fd = eio->fds[0]; + pollfds[nfds].events = POLLIN; + nfds++; + + xassert(nfds <= maxnfds + 1); + + if (_poll_internal(pollfds, nfds) < 0) + goto error; + + if (pollfds[nfds-1].revents & POLLIN) + _eio_wakeup_handler(eio); + + _poll_dispatch(pollfds, nfds-1, map, eio->obj_list); + } + error: + retval = -1; + done: + xfree(pollfds); + xfree(map); + return retval; +} + +static int +_poll_internal(struct pollfd *pfds, unsigned int nfds) +{ + int n; + while ((n = poll(pfds, nfds, -1)) < 0) { + switch (errno) { + case EINTR : return 0; + case EAGAIN: continue; + default: + error("poll: %m"); + return -1; + } + } + return n; +} + +static bool +_is_writable(eio_obj_t *obj) +{ + return (obj->ops->writable && (*obj->ops->writable)(obj)); +} + +static bool +_is_readable(eio_obj_t *obj) +{ + return (obj->ops->readable && (*obj->ops->readable)(obj)); +} + +static unsigned int +_poll_setup_pollfds(struct pollfd *pfds, eio_obj_t *map[], List l) +{ + ListIterator i = list_iterator_create(l); + eio_obj_t *obj = NULL; + unsigned int nfds = 0; + bool readable, writable; + + while ((obj = list_next(i))) { + writable = _is_writable(obj); + readable = _is_readable(obj); + if (writable && readable) { + pfds[nfds].fd = obj->fd; + pfds[nfds].events = POLLOUT | POLLIN; + map[nfds] = obj; + nfds++; + } else if (readable) { + pfds[nfds].fd = obj->fd; + pfds[nfds].events = POLLIN; + map[nfds] = obj; + nfds++; + } else if (writable) { + pfds[nfds].fd = obj->fd; + pfds[nfds].events = POLLOUT; + map[nfds] = obj; + nfds++; + } + } + list_iterator_destroy(i); + return nfds; +} + +static void +_poll_dispatch(struct pollfd *pfds, unsigned int nfds, eio_obj_t *map[], + List objList) +{ + int i; + ListIterator iter; + eio_obj_t *obj; + + for (i = 0; i < nfds; i++) { + if (pfds[i].revents > 0) + _poll_handle_event(pfds[i].revents, map[i], objList); + } + + iter = list_iterator_create(objList); + while ((obj = list_next(iter))) { + if (_is_writable(obj) && obj->ops->handle_write) + (*obj->ops->handle_write) (obj, objList); + } + list_iterator_destroy(iter); +} + +static void +_poll_handle_event(short revents, eio_obj_t *obj, List objList) +{ + bool read_called = false; + bool write_called = false; + + if (revents & POLLNVAL) { + debug("POLLNVAL on fd %d, shutting down eio object", obj->fd); + obj->shutdown = true; + return; + } + + if (revents & POLLERR) { + if (obj->ops->handle_error) { + (*obj->ops->handle_error) (obj, objList); + } else if (obj->ops->handle_read) { + (*obj->ops->handle_read) (obj, objList); + read_called = true; + } else if (obj->ops->handle_write) { + (*obj->ops->handle_write) (obj, objList); + write_called = true; + } else { + debug("No handler for POLLERR"); + obj->shutdown = true; + } + return; + } + + if (revents & POLLHUP) { + if (obj->ops->handle_close) { + (*obj->ops->handle_close) (obj, objList); + } else if (obj->ops->handle_read) { + if (!read_called) { + (*obj->ops->handle_read) (obj, objList); + read_called = true; + } + } else if (obj->ops->handle_write) { + if (!write_called) { + (*obj->ops->handle_write) (obj, objList); + write_called = true; + } + } else { + debug("No handler for POLLHUP"); + obj->shutdown = true; + } + } + + if (revents & POLLIN) { + if (obj->ops->handle_read) { + if (!read_called) { + (*obj->ops->handle_read ) (obj, objList); + read_called = true; + } + } else { + debug("No handler for POLLIN"); + obj->shutdown = true; + } + } + + if (revents & POLLOUT) { + if (obj->ops->handle_write) { + if (!write_called) { + (*obj->ops->handle_write) (obj, objList); + write_called = true; + } + } else { + debug("No handler for POLLOUT"); + obj->shutdown = true; + } + } +} + +static struct io_operations * +_ops_copy(struct io_operations *ops) +{ + struct io_operations *ret = xmalloc(sizeof(*ops)); + + /* Copy initial client_ops */ + *ret = *ops; + return ret; +} + +eio_obj_t * +eio_obj_create(int fd, struct io_operations *ops, void *arg) +{ + eio_obj_t *obj = xmalloc(sizeof(*obj)); + obj->fd = fd; + obj->arg = arg; + obj->ops = _ops_copy(ops); + obj->shutdown = false; + return obj; +} + +void eio_obj_destroy(eio_obj_t *obj) +{ + if (obj) { + if (obj->ops) { + xfree(obj->ops); + } + xfree(obj); + } +} + + +/* + * Add an eio_obj_t "obj" to an eio_handle_t "eio"'s internal object list. + * + * This function can only be used to intialize "eio"'s list before + * calling eio_handle_mainloop. If it is used after the eio engine's + * mainloop has started, segfaults are likely. + */ +void eio_new_initial_obj(eio_handle_t *eio, eio_obj_t *obj) +{ + xassert(eio != NULL); + xassert(eio->magic == EIO_MAGIC); + + list_enqueue(eio->obj_list, obj); +} + +/* + * Queue an eio_obj_t "obj" for inclusion in an already running + * eio_handle_t "eio"'s internal object list. + */ +void eio_new_obj(eio_handle_t *eio, eio_obj_t *obj) +{ + xassert(eio != NULL); + xassert(eio->magic == EIO_MAGIC); + + list_enqueue(eio->new_objs, obj); + eio_signal_wakeup(eio); +} diff --git a/executable_names/src/common/eio.h b/executable_names/src/common/eio.h new file mode 100644 index 0000000000000000000000000000000000000000..95f31acf4d74b250e7692ea0832fee042f171ebd --- /dev/null +++ b/executable_names/src/common/eio.h @@ -0,0 +1,94 @@ +/*****************************************************************************\ + * src/common/eio.h Event-based I/O for slurm + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _EIO_H +#define _EIO_H 1 + +#include "src/common/list.h" +#include "src/common/macros.h" + +typedef struct eio_obj eio_obj_t; + +typedef struct eio_handle_components eio_handle_t; + +/* Possible I/O operations on an I/O object + * Each takes the io_obj being operated on as an argument + * + * handle_*() functions also pass the List of io_obj's from the event loop + * + */ +struct io_operations { + bool (*readable )(eio_obj_t *); + bool (*writable )(eio_obj_t *); + int (*handle_read )(eio_obj_t *, List); + int (*handle_write)(eio_obj_t *, List); + int (*handle_error)(eio_obj_t *, List); + int (*handle_close)(eio_obj_t *, List); +}; + +struct eio_obj { + int fd; /* fd to operate on */ + void *arg; /* application-specific data */ + struct io_operations *ops; /* pointer to ops struct for obj */ + bool shutdown; +}; + +eio_handle_t *eio_handle_create(void); +void eio_handle_destroy(eio_handle_t *eio); + +/* + * Add an eio_obj_t "obj" to an eio_handle_t "eio"'s internal object list. + * + * This function can only be used to intialize "eio"'s list before + * calling eio_handle_mainloop. If it is used after the eio engine's + * mainloop has started, segfaults are likely. + */ +void eio_new_initial_obj(eio_handle_t *eio, eio_obj_t *obj); + +/* + * Queue an eio_obj_t "obj" for inclusion in an already running + * eio_handle_t "eio"'s internal object list. + */ +void eio_new_obj(eio_handle_t *eio, eio_obj_t *obj); + + +/* This routine will watch for activtiy on the fd's as long + * as obj->readable() or obj->writable() returns >0 + * + * routine returns 0 when either list is empty or no objects in list are + * readable() or writable(). + * + * returns -1 on error. + */ +int eio_handle_mainloop(eio_handle_t *eio); + +int eio_signal_wakeup(eio_handle_t *eio); +int eio_signal_shutdown(eio_handle_t *eio); + +eio_obj_t *eio_obj_create(int fd, struct io_operations *ops, void *arg); +void eio_obj_destroy(eio_obj_t *obj); + +#endif /* !_EIO_H */ diff --git a/executable_names/src/common/env.c b/executable_names/src/common/env.c new file mode 100644 index 0000000000000000000000000000000000000000..e7a7d32e79e9c3232812bc1acafcab4fea826d2a --- /dev/null +++ b/executable_names/src/common/env.c @@ -0,0 +1,1136 @@ +/*****************************************************************************\ + * src/common/env.c - add an environment variable to environment vector + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona , Danny Auble . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#include "slurm/slurm.h" +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/env.h" +#include "src/common/xassert.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/node_select.h" +#include "src/common/slurm_protocol_api.h" + +/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +strong_alias(setenvf, slurm_setenvpf); +strong_alias(unsetenvp, slurm_unsetenvp); +strong_alias(getenvp, slurm_getenvp); + +/* + * Return pointer to `name' entry in environment if found, or + * pointer to the last entry (i.e. NULL) if `name' is not + * currently set in `env' + * + */ +static char ** +_find_name_in_env(char **env, const char *name) +{ + char **ep; + + ep = env; + while (*ep != NULL) { + size_t cnt = 0; + + while ( ((*ep)[cnt] == name[cnt]) + && ( name[cnt] != '\0') + && ((*ep)[cnt] != '\0') ) + ++cnt; + + if (name[cnt] == '\0' && (*ep)[cnt] == '=') { + break; + } else + ++ep; + } + + return (ep); +} + +/* + * Extend memory allocation for env by 1 entry. Make last entry == NULL. + * return pointer to last env entry; + */ +static char ** +_extend_env(char ***envp) +{ + char **ep; + size_t newcnt = (xsize (*envp) / sizeof (char *)) + 1; + + *envp = xrealloc (*envp, newcnt * sizeof (char *)); + + (*envp)[newcnt - 1] = NULL; + ep = &((*envp)[newcnt - 2]); + + /* + * Find last non-NULL entry + */ + while (*ep == NULL) + --ep; + + return (++ep); +} + +/* + * Return the number of elements in the environment `env' + */ +int +envcount (char **env) +{ + int envc = 0; + while (env[envc] != NULL) + envc++; + return (envc); +} + +/* + * _setenvfs() (stolen from pdsh) + * + * Set a variable in the callers environment. Args are printf style. + * XXX Space is allocated on the heap and will never be reclaimed. + * Example: setenvfs("RMS_RANK=%d", rank); + */ +int +setenvfs(const char *fmt, ...) +{ + va_list ap; + char buf[BUFSIZ]; + char *bufcpy; + int rc; + + va_start(ap, fmt); + vsnprintf(buf, BUFSIZ, fmt, ap); + va_end(ap); + + bufcpy = xstrdup(buf); + rc = putenv(bufcpy); + return rc; +} + +int +setenvf(char ***envp, const char *name, const char *fmt, ...) +{ + char buf[BUFSIZ]; + char **ep = NULL; + char *str = NULL; + va_list ap; + int rc; + char *bufcpy; + + va_start(ap, fmt); + vsnprintf (buf, BUFSIZ, fmt, ap); + va_end(ap); + bufcpy = xstrdup(buf); + + xstrfmtcat (str, "%s=%s", name, bufcpy); + xfree(bufcpy); + if(envp && *envp) { + ep = _find_name_in_env (*envp, name); + + if (*ep != NULL) + xfree (*ep); + else + ep = _extend_env (envp); + + *ep = str; + + return (0); + } else { + rc = putenv(str); + return rc; + } +} + +/* + * Remove environment variable `name' from "environment" + * contained in `env' + * + * [ This was taken almost verbatim from glibc's + * unsetenv() code. ] + */ +void unsetenvp(char **env, const char *name) +{ + char **ep; + + if (env == NULL) + return; + + ep = env; + while ((ep = _find_name_in_env (ep, name)) && (*ep != NULL)) { + char **dp = ep; + xfree (*ep); + do + dp[0] = dp[1]; + while (*dp++); + + /* Continue loop in case `name' appears again. */ + ++ep; + } + return; +} + +char *getenvp(char **env, const char *name) +{ + size_t len = strlen(name); + char **ep; + + if ((env == NULL) || (env[0] == '\0')) + return (NULL); + + ep = _find_name_in_env (env, name); + + if (*ep != NULL) + return (&(*ep)[len+1]); + + return NULL; +} + +int setup_env(env_t *env) +{ + int rc = SLURM_SUCCESS; + char *dist = NULL; + char *lllp_dist = NULL; + char *bgl_part_id = NULL; + char addrbuf[INET_ADDRSTRLEN]; + + if (env == NULL) + return SLURM_ERROR; + + if (env->task_pid + && setenvf(&env->env, "SLURM_TASK_PID", "%d", (int)env->task_pid)) { + error("Unable to set SLURM_TASK_PID environment variable"); + rc = SLURM_FAILURE; + } + + if (env->nprocs + && setenvf(&env->env, "SLURM_NPROCS", "%d", env->nprocs)) { + error("Unable to set SLURM_NPROCS environment variable"); + rc = SLURM_FAILURE; + } + + if (env->cpus_per_task + && setenvf(&env->env, "SLURM_CPUS_PER_TASK", "%d", + env->cpus_per_task) ) { + error("Unable to set SLURM_CPUS_PER_TASK"); + rc = SLURM_FAILURE; + } + + if (env->ntasks_per_node + && setenvf(&env->env, "SLURM_NTASKS_PER_NODE", "%d", + env->ntasks_per_node) ) { + error("Unable to set SLURM_NTASKS_PER_NODE"); + rc = SLURM_FAILURE; + } + + if (env->ntasks_per_socket + && setenvf(&env->env, "SLURM_NTASKS_PER_SOCKET", "%d", + env->ntasks_per_socket) ) { + error("Unable to set SLURM_NTASKS_PER_SOCKET"); + rc = SLURM_FAILURE; + } + + if (env->ntasks_per_core + && setenvf(&env->env, "SLURM_NTASKS_PER_CORE", "%d", + env->ntasks_per_core) ) { + error("Unable to set SLURM_NTASKS_PER_CORE"); + rc = SLURM_FAILURE; + } + + if (env->cpus_on_node + && setenvf(&env->env, "SLURM_CPUS_ON_NODE", "%d", + env->cpus_on_node) ) { + error("Unable to set SLURM_CPUS_PER_TASK"); + rc = SLURM_FAILURE; + } + + if (((int)env->distribution >= 0) + && (env->distribution != SLURM_DIST_UNKNOWN)) { + switch(env->distribution) { + case SLURM_DIST_CYCLIC: + dist = "cyclic"; + lllp_dist = ""; + break; + case SLURM_DIST_BLOCK: + dist = "block"; + lllp_dist = ""; + break; + case SLURM_DIST_PLANE: + dist = "plane"; + lllp_dist = "plane"; + break; + case SLURM_DIST_ARBITRARY: + dist = "arbitrary"; + lllp_dist = ""; + break; + case SLURM_DIST_CYCLIC_CYCLIC: + dist = "cyclic"; + lllp_dist = "cyclic"; + break; + case SLURM_DIST_CYCLIC_BLOCK: + dist = "cyclic"; + lllp_dist = "block"; + break; + case SLURM_DIST_BLOCK_CYCLIC: + dist = "block"; + lllp_dist = "cyclic"; + break; + case SLURM_DIST_BLOCK_BLOCK: + dist = "block"; + lllp_dist = "block"; + break; + default: + error("unknown dist, type %d", env->distribution); + dist = "unknown"; + lllp_dist = "unknown"; + break; + } + + if (setenvf(&env->env, "SLURM_DISTRIBUTION", "%s", dist)) { + error("Can't set SLURM_DISTRIBUTION env variable"); + rc = SLURM_FAILURE; + } + + if (setenvf(&env->env, "SLURM_DIST_PLANESIZE", "%d", + env->plane_size)) { + error("Can't set SLURM_DIST_PLANESIZE env variable"); + rc = SLURM_FAILURE; + } + + if (setenvf(&env->env, "SLURM_DIST_LLLP", "%s", lllp_dist)) { + error("Can't set SLURM_DIST_LLLP env variable"); + rc = SLURM_FAILURE; + } + } + + if (env->cpu_bind_type) { + char *str_verbose, *str_bind_type, *str_bind_list; + char *str_bind; + int len; + + unsetenvp(env->env, "SLURM_CPU_BIND_VERBOSE"); + unsetenvp(env->env, "SLURM_CPU_BIND_TYPE"); + unsetenvp(env->env, "SLURM_CPU_BIND_LIST"); + unsetenvp(env->env, "SLURM_CPU_BIND"); + + str_verbose = xstrdup (""); + if (env->cpu_bind_type & CPU_BIND_VERBOSE) { + xstrcat(str_verbose, "verbose"); + } else { + xstrcat(str_verbose, "quiet"); + } + if (setenvf(&env->env, "SLURM_CPU_BIND_VERBOSE", str_verbose)) { + error("Unable to set SLURM_CPU_BIND_VERBOSE"); + rc = SLURM_FAILURE; + } + + str_bind_type = xstrdup (""); + if (env->cpu_bind_type & CPU_BIND_TO_THREADS) { + xstrcat(str_bind_type, "threads,"); + } else if (env->cpu_bind_type & CPU_BIND_TO_CORES) { + xstrcat(str_bind_type, "cores,"); + } else if (env->cpu_bind_type & CPU_BIND_TO_SOCKETS) { + xstrcat(str_bind_type, "sockets,"); + } + if (env->cpu_bind_type & CPU_BIND_NONE) { + xstrcat(str_bind_type, "none"); + } else if (env->cpu_bind_type & CPU_BIND_RANK) { + xstrcat(str_bind_type, "rank"); + } else if (env->cpu_bind_type & CPU_BIND_MAP) { + xstrcat(str_bind_type, "map_cpu:"); + } else if (env->cpu_bind_type & CPU_BIND_MASK) { + xstrcat(str_bind_type, "mask_cpu:"); + } + len = strlen(str_bind_type); + if (len) { /* remove a possible trailing ',' */ + if (str_bind_type[len-1] == ',') { + str_bind_type[len-1] = '\0'; + } + } + if (setenvf(&env->env, "SLURM_CPU_BIND_TYPE", str_bind_type)) { + error("Unable to set SLURM_CPU_BIND_TYPE"); + rc = SLURM_FAILURE; + } + + str_bind_list = xstrdup (""); + if (env->cpu_bind) { + xstrcat(str_bind_list, env->cpu_bind); + } + if (setenvf(&env->env, "SLURM_CPU_BIND_LIST", str_bind_list)) { + error("Unable to set SLURM_CPU_BIND_LIST"); + rc = SLURM_FAILURE; + } + + str_bind = xstrdup (""); + xstrcat(str_bind, str_verbose); + if (str_bind[0]) { /* add ',' if str_verbose */ + xstrcatchar(str_bind, ','); + } + xstrcat(str_bind, str_bind_type); + xstrcat(str_bind, str_bind_list); + + if (setenvf(&env->env, "SLURM_CPU_BIND", str_bind)) { + error("Unable to set SLURM_CPU_BIND"); + rc = SLURM_FAILURE; + } + } + + if (env->mem_bind_type) { + char *str_verbose, *str_bind_type, *str_bind_list; + char *str_bind; + + unsetenvp(env->env, "SLURM_MEM_BIND_VERBOSE"); + unsetenvp(env->env, "SLURM_MEM_BIND_TYPE"); + unsetenvp(env->env, "SLURM_MEM_BIND_LIST"); + unsetenvp(env->env, "SLURM_MEM_BIND"); + + str_verbose = xstrdup (""); + if (env->mem_bind_type & MEM_BIND_VERBOSE) { + xstrcat(str_verbose, "verbose"); + } else { + xstrcat(str_verbose, "quiet"); + } + if (setenvf(&env->env, "SLURM_MEM_BIND_VERBOSE", str_verbose)) { + error("Unable to set SLURM_MEM_BIND_VERBOSE"); + rc = SLURM_FAILURE; + } + + str_bind_type = xstrdup (""); + if (env->mem_bind_type & MEM_BIND_NONE) { + xstrcat(str_bind_type, "none"); + } else if (env->mem_bind_type & MEM_BIND_RANK) { + xstrcat(str_bind_type, "rank"); + } else if (env->mem_bind_type & MEM_BIND_MAP) { + xstrcat(str_bind_type, "map_mem:"); + } else if (env->mem_bind_type & MEM_BIND_MASK) { + xstrcat(str_bind_type, "mask_mem:"); + } else if (env->mem_bind_type & MEM_BIND_LOCAL) { + xstrcat(str_bind_type, "local"); + } + if (setenvf(&env->env, "SLURM_MEM_BIND_TYPE", str_bind_type)) { + error("Unable to set SLURM_MEM_BIND_TYPE"); + rc = SLURM_FAILURE; + } + + str_bind_list = xstrdup (""); + if (env->mem_bind) { + xstrcat(str_bind_list, env->mem_bind); + } + if (setenvf(&env->env, "SLURM_MEM_BIND_LIST", str_bind_list)) { + error("Unable to set SLURM_MEM_BIND_LIST"); + rc = SLURM_FAILURE; + } + + str_bind = xstrdup (""); + xstrcat(str_bind, str_verbose); + if (str_bind[0]) { /* add ',' if str_verbose */ + xstrcatchar(str_bind, ','); + } + xstrcat(str_bind, str_bind_type); + xstrcat(str_bind, str_bind_list); + + if (setenvf(&env->env, "SLURM_MEM_BIND", str_bind)) { + error("Unable to set SLURM_MEM_BIND"); + rc = SLURM_FAILURE; + } + } + + if (env->overcommit + && (setenvf(&env->env, "SLURM_OVERCOMMIT", "1"))) { + error("Unable to set SLURM_OVERCOMMIT environment variable"); + rc = SLURM_FAILURE; + } + + if (env->slurmd_debug + && setenvf(&env->env, "SLURMD_DEBUG", "%d", env->slurmd_debug)) { + error("Can't set SLURMD_DEBUG environment variable"); + rc = SLURM_FAILURE; + } + + if (env->labelio + && setenvf(&env->env, "SLURM_LABELIO", "1")) { + error("Unable to set SLURM_LABELIO environment variable"); + rc = SLURM_FAILURE; + } + + if(env->select_jobinfo) { + select_g_get_jobinfo(env->select_jobinfo, + SELECT_DATA_BLOCK_ID, &bgl_part_id); + if (bgl_part_id) { + if(setenvf(&env->env, + "MPIRUN_PARTITION", "%s", bgl_part_id)) + rc = SLURM_FAILURE; + + if(setenvf(&env->env, "MPIRUN_NOFREE", "%d", 1)) + rc = SLURM_FAILURE; + if(setenvf(&env->env, "MPIRUN_NOALLOCATE", "%d", 1)) + rc = SLURM_FAILURE; + } else + rc = SLURM_FAILURE; + + if(rc == SLURM_FAILURE) + error("Can't set MPIRUN_PARTITION " + "environment variable"); + xfree(bgl_part_id); + } + + if (env->jobid >= 0 + && setenvf(&env->env, "SLURM_JOBID", "%d", env->jobid)) { + error("Unable to set SLURM_JOBID environment"); + rc = SLURM_FAILURE; + } + + if (env->nodeid >= 0 + && setenvf(&env->env, "SLURM_NODEID", "%d", env->nodeid)) { + error("Unable to set SLURM_NODEID environment"); + rc = SLURM_FAILURE; + } + + if (env->procid >= 0 + && setenvf(&env->env, "SLURM_PROCID", "%d", env->procid)) { + error("Unable to set SLURM_PROCID environment"); + rc = SLURM_FAILURE; + } + + if (env->localid >= 0 + && setenvf(&env->env, "SLURM_LOCALID", "%d", env->localid)) { + error("Unable to set SLURM_LOCALID environment"); + rc = SLURM_FAILURE; + } + + if (env->stepid >= 0 + && setenvf(&env->env, "SLURM_STEPID", "%d", env->stepid)) { + error("Unable to set SLURM_STEPID environment"); + rc = SLURM_FAILURE; + } + + if (env->nhosts + && setenvf(&env->env, "SLURM_NNODES", "%d", env->nhosts)) { + error("Unable to set SLURM_NNODES environment var"); + rc = SLURM_FAILURE; + } + + if (env->nodelist + && setenvf(&env->env, "SLURM_NODELIST", "%s", env->nodelist)) { + error("Unable to set SLURM_NODELIST environment var."); + rc = SLURM_FAILURE; + } + + if (env->task_count + && setenvf (&env->env, + "SLURM_TASKS_PER_NODE", "%s", env->task_count)) { + error ("Can't set SLURM_TASKS_PER_NODE env variable"); + rc = SLURM_FAILURE; + } + + if (env->comm_port + && setenvf (&env->env, "SLURM_SRUN_COMM_PORT", "%u", env->comm_port)) { + error ("Can't set SLURM_SRUN_COMM_PORT env variable"); + rc = SLURM_FAILURE; + } + if (env->comm_hostname + && setenvf (&env->env, "SLURM_SRUN_COMM_HOST", "%s", env->comm_hostname)) { + error ("Can't set SLURM_SRUN_COMM_HOST env variable"); + rc = SLURM_FAILURE; + } + + if (env->cli) { + + slurm_print_slurm_addr (env->cli, addrbuf, INET_ADDRSTRLEN); + + /* + * XXX: Eventually, need a function for slurm_addrs that + * returns just the IP address (not addr:port) + */ + + if ((dist = strchr (addrbuf, ':')) != NULL) + *dist = '\0'; + setenvf (&env->env, "SLURM_LAUNCH_NODE_IPADDR", "%s", addrbuf); + } + +#ifdef HAVE_AIX + { + char res_env[128]; + char *debug_env = (char *)getenv("SLURM_LL_API_DEBUG"); + int debug_num = 0; + + /* MP_POERESTART_ENV causes a warning message for "poe", but + * is needed for "poerestart". Presently we have no means to + * determine what command a user will execute. We could + * possibly add a "srestart" command which would set + * MP_POERESTART_ENV, but that presently seems unnecessary. */ + if (debug_env) + debug_num = atoi(debug_env); + snprintf(res_env, sizeof(res_env), "SLURM_LL_API_DEBUG=%d", + debug_num); + + setenvf(&env->env, "MP_POERESTART_ENV", res_env); + + /* Required for AIX/POE systems indicating pre-allocation */ + setenvf(&env->env, "LOADLBATCH", "yes"); + setenvf(&env->env, "LOADL_ACTIVE", "3.2.0"); + } +#endif + + return SLURM_SUCCESS; +} + +/********************************************************************** + * From here on are the new environment variable management functions, + * used by the "new" commands: salloc, sbatch, an slaunch. + **********************************************************************/ + +/* + * Return a string representation of an array of uint32_t elements. + * Each value in the array is printed in decimal notation and elements + * are seperated by a comma. If sequential elements in the array + * contain the same value, the value is written out just once followed + * by "(xN)", where "N" is the number of times the value is repeated. + * + * Example: + * The array "1, 2, 1, 1, 1, 3, 2" becomes the string "1,2,1(x3),3,2" + * + * Returns an xmalloc'ed string. Free with xfree(). + */ +static char *_uint32_array_to_str(int array_len, const uint32_t *array) +{ + int i; + int previous = 0; + char *sep = ","; /* seperator */ + char *str = xstrdup(""); + + if(array == NULL) + return str; + + for (i = 0; i < array_len; i++) { + if ((i+1 < array_len) + && (array[i] == array[i+1])) { + previous++; + continue; + } + + if (i == array_len-1) /* last time through loop */ + sep = ""; + if (previous > 0) { + xstrfmtcat(str, "%u(x%u)%s", + array[i], previous+1, sep); + } else { + xstrfmtcat(str, "%u%s", array[i], sep); + } + previous = 0; + } + + return str; +} + + +/* + * The cpus-per-node representation in SLURM (and perhaps tasks-per-node + * in the future) is stored in a compressed format comprised of two + * equal-length arrays of uint32_t, and an integer holding the array length. + * In one array an element represents a count (number of cpus, number of tasks, + * etc.), and the corresponding element in the other array contains the + * number of times the count is repeated sequentially in the uncompressed + * something-per-node array. + * + * This function returns the string representation of the compressed + * array. Free with xfree(). + */ +static char *_uint32_compressed_to_str(uint32_t array_len, + const uint32_t *array, + const uint32_t *array_reps) +{ + int i; + char *sep = ","; /* seperator */ + char *str = xstrdup(""); + + for (i = 0; i < array_len; i++) { + if (i == array_len-1) /* last time through loop */ + sep = ""; + if (array_reps[i] > 1) { + xstrfmtcat(str, "%u(x%u)%s", + array[i], array_reps[i], sep); + } else { + xstrfmtcat(str, "%u%s", array[i], sep); + } + } + + return str; +} + +/* + * Set in "dest" the environment variables relevant to a SLURM job + * allocation, overwriting any environment variables of the same name. + * If the address pointed to by "dest" is NULL, memory will automatically be + * xmalloc'ed. The array is terminated by a NULL pointer, and thus is + * suitable for use by execle() and other env_array_* functions. + * + * Sets the variables: + * SLURM_JOB_ID + * SLURM_JOB_NUM_NODES + * SLURM_JOB_NODELIST + * SLURM_JOB_CPUS_PER_NODE + * + * Sets OBSOLETE variables: + * SLURM_JOBID + * SLURM_NNODES + * SLURM_NODELIST + * SLURM_TASKS_PER_NODE <- poorly named, really CPUs per node + * ? probably only needed for users... + */ +void +env_array_for_job(char ***dest, const resource_allocation_response_msg_t *alloc) +{ + char *tmp; + + env_array_overwrite_fmt(dest, "SLURM_JOB_ID", "%u", alloc->job_id); + env_array_overwrite_fmt(dest, "SLURM_JOB_NUM_NODES", "%u", + alloc->node_cnt); + env_array_overwrite_fmt(dest, "SLURM_JOB_NODELIST", "%s", + alloc->node_list); + + tmp = _uint32_compressed_to_str((uint32_t)alloc->num_cpu_groups, + alloc->cpus_per_node, + alloc->cpu_count_reps); + env_array_overwrite_fmt(dest, "SLURM_JOB_CPUS_PER_NODE", "%s", tmp); + + /* obsolete */ + env_array_overwrite_fmt(dest, "SLURM_JOBID", "%u", alloc->job_id); + env_array_overwrite_fmt(dest, "SLURM_NNODES", "%u", alloc->node_cnt); + env_array_overwrite_fmt(dest, "SLURM_NODELIST", "%s", alloc->node_list); + env_array_overwrite_fmt(dest, "SLURM_TASKS_PER_NODE", "%s", tmp); + + xfree(tmp); +} + +/* + * Set in "dest" the environment variables strings relevant to a SLURM batch + * job allocation, overwriting any environment variables of the same name. + * If the address pointed to by "dest" is NULL, memory will automatically be + * xmalloc'ed. The array is terminated by a NULL pointer, and thus is + * suitable for use by execle() and other env_array_* functions. + * + * Sets the variables: + * SLURM_JOB_ID + * SLURM_JOB_NUM_NODES + * SLURM_JOB_NODELIST + * SLURM_JOB_CPUS_PER_NODE + * ENVIRONMENT=BATCH + * + * Sets OBSOLETE variables: + * SLURM_JOBID + * SLURM_NNODES + * SLURM_NODELIST + * SLURM_TASKS_PER_NODE <- poorly named, really CPUs per node + * ? probably only needed for users... + */ +void +env_array_for_batch_job(char ***dest, const batch_job_launch_msg_t *batch) +{ + char *tmp; + uint32_t num_nodes = 0; + int i; + + /* there is no explicit node count in the batch structure, + so we need to calculate the node count */ + for (i = 0; i < batch->num_cpu_groups; i++) { + num_nodes += batch->cpu_count_reps[i]; + } + + env_array_overwrite_fmt(dest, "SLURM_JOB_ID", "%u", batch->job_id); + env_array_overwrite_fmt(dest, "SLURM_JOB_NUM_NODES", "%u", num_nodes); + env_array_overwrite_fmt(dest, "SLURM_JOB_NODELIST", "%s", batch->nodes); + tmp = _uint32_compressed_to_str((uint32_t)batch->num_cpu_groups, + batch->cpus_per_node, + batch->cpu_count_reps); + env_array_overwrite_fmt(dest, "SLURM_JOB_CPUS_PER_NODE", "%s", tmp); + env_array_overwrite_fmt(dest, "ENVIRONMENT", "BATCH"); + + /* OBSOLETE */ + env_array_overwrite_fmt(dest, "SLURM_JOBID", "%u", batch->job_id); + env_array_overwrite_fmt(dest, "SLURM_NNODES", "%u", num_nodes); + env_array_overwrite_fmt(dest, "SLURM_NODELIST", "%s", batch->nodes); + env_array_overwrite_fmt(dest, "SLURM_TASKS_PER_NODE", "%s", tmp); + + xfree(tmp); +} + +/* + * Set in "dest the environment variables relevant to a SLURM job step, + * overwriting any environment variables of the same name. If the address + * pointed to by "dest" is NULL, memory will automatically be xmalloc'ed. + * The array is terminated by a NULL pointer, and thus is suitable for + * use by execle() and other env_array_* functions. + * + * Sets variables: + * SLURM_STEP_ID + * SLURM_STEP_NUM_NODES + * SLURM_STEP_NUM_TASKS + * SLURM_STEP_TASKS_PER_NODE + * SLURM_STEP_LAUNCHER_HOSTNAME + * SLURM_STEP_LAUNCHER_PORT + * SLURM_STEP_LAUNCHER_IPADDR + * + * Sets OBSOLETE variables: + * SLURM_STEPID + * SLURM_NNODES + * SLURM_NPROCS + * SLURM_NODELIST + * SLURM_TASKS_PER_NODE + * SLURM_SRUN_COMM_HOST + * SLURM_SRUN_COMM_PORT + * SLURM_LAUNCH_NODE_IPADDR + * + */ +void +env_array_for_step(char ***dest, + const job_step_create_response_msg_t *step, + const char *launcher_hostname, + uint16_t launcher_port, + const char *ip_addr_str) +{ + char *tmp; + + tmp = _uint32_array_to_str(step->step_layout->node_cnt, + step->step_layout->tasks); + env_array_overwrite_fmt(dest, "SLURM_STEP_ID", "%u", step->job_step_id); + env_array_overwrite_fmt(dest, "SLURM_STEP_NODELIST", + "%s", step->step_layout->node_list); + env_array_overwrite_fmt(dest, "SLURM_STEP_NUM_NODES", + "%hu", step->step_layout->node_cnt); + env_array_overwrite_fmt(dest, "SLURM_STEP_NUM_TASKS", + "%u", step->step_layout->task_cnt); + env_array_overwrite_fmt(dest, "SLURM_STEP_TASKS_PER_NODE", "%s", tmp); + env_array_overwrite_fmt(dest, "SLURM_STEP_LAUNCHER_HOSTNAME", + "%s", launcher_hostname); + env_array_overwrite_fmt(dest, "SLURM_STEP_LAUNCHER_PORT", + "%hu", launcher_port); +/* env_array_overwrite_fmt(dest, "SLURM_STEP_LAUNCHER_IPADDR", */ +/* "%s", ip_addr_str); */ + + /* OBSOLETE */ + env_array_overwrite_fmt(dest, "SLURM_STEPID", "%u", step->job_step_id); + env_array_overwrite_fmt(dest, "SLURM_NNODES", + "%hu", step->step_layout->node_cnt); + env_array_overwrite_fmt(dest, "SLURM_NPROCS", + "%u", step->step_layout->task_cnt); + env_array_overwrite_fmt(dest, "SLURM_TASKS_PER_NODE", "%s", tmp); + env_array_overwrite_fmt(dest, "SLURM_SRUN_COMM_HOST", + "%s", launcher_hostname); + env_array_overwrite_fmt(dest, "SLURM_SRUN_COMM_PORT", + "%hu", launcher_port); +/* env_array_overwrite_fmt(dest, "SLURM_LAUNCH_NODE_IPADDR", */ +/* "%s", ip_addr_str); */ + + xfree(tmp); +} + +/* + * Enviroment variables set elsewhere + * ---------------------------------- + * + * Set by slurmstepd: + * SLURM_STEP_NODEID + * SLURM_STEP_PROCID + * SLURM_STEP_LOCALID + * + * OBSOLETE set by slurmstepd: + * SLURM_NODEID + * SLURM_PROCID + * SLURM_LOCALID + */ + +/*********************************************************************** + * Environment variable array support functions + ***********************************************************************/ + +/* + * Return an empty environment variable array (contains a single + * pointer to NULL). + */ +char **env_array_create(void) +{ + char **env_array; + + env_array = (char **)xmalloc(sizeof(char **)); + env_array[0] = NULL; + + return env_array; +} + +/* + * Append a single environment variable to an environment variable array, + * if and only if a variable by that name does not already exist in the + * array. + * + * Return 1 on success, and 0 on error. + */ +int env_array_append(char ***array_ptr, const char *name, + const char *value_fmt, ...) +{ + char buf[BUFSIZ]; + char **ep = NULL; + char *str = NULL; + va_list ap; + + buf[0] = '\0'; + if (array_ptr == NULL) { + return 0; + } + + if (*array_ptr == NULL) { + *array_ptr = env_array_create(); + } + + va_start(ap, value_fmt); + vsnprintf (buf, BUFSIZ, value_fmt, ap); + va_end(ap); + + ep = _find_name_in_env(*array_ptr, name); + if (*ep != NULL) { + return 0; + } + + xstrfmtcat (str, "%s=%s", name, buf); + ep = _extend_env(array_ptr); + *ep = str; + + return 1; +} + +/* + * Append a single environment variable to an environment variable array + * if a variable by that name does not already exist. If a variable + * by the same name is found in the array, it is overwritten with the + * new value. + * + * Return 1 on success, and 0 on error. + */ +int env_array_overwrite_fmt(char ***array_ptr, const char *name, + const char *value_fmt, ...) +{ + char buf[BUFSIZ]; + char **ep = NULL; + char *str = NULL; + va_list ap; + + buf[0] = '\0'; + if (array_ptr == NULL) { + return 0; + } + + if (*array_ptr == NULL) { + *array_ptr = env_array_create(); + } + + va_start(ap, value_fmt); + vsnprintf (buf, BUFSIZ, value_fmt, ap); + va_end(ap); + + xstrfmtcat (str, "%s=%s", name, buf); + ep = _find_name_in_env(*array_ptr, name); + if (*ep != NULL) { + xfree (*ep); + } else { + ep = _extend_env(array_ptr); + } + + *ep = str; + + return 1; +} + +/* + * Append a single environment variable to an environment variable array + * if a variable by that name does not already exist. If a variable + * by the same name is found in the array, it is overwritten with the + * new value. + * + * Return 1 on success, and 0 on error. + */ +int env_array_overwrite(char ***array_ptr, const char *name, + const char *value) +{ + char **ep = NULL; + char *str = NULL; + + if (array_ptr == NULL) { + return 0; + } + + if (*array_ptr == NULL) { + *array_ptr = env_array_create(); + } + + xstrfmtcat (str, "%s=%s", name, value); + ep = _find_name_in_env(*array_ptr, name); + if (*ep != NULL) { + xfree (*ep); + } else { + ep = _extend_env(array_ptr); + } + + *ep = str; + + return 1; +} + +/* + * Copy env_array must be freed by env_array_free + */ +char **env_array_copy(const char **array) +{ + char **ptr = NULL; + + env_array_merge(&ptr, array); + + return ptr; +} + +/* + * Free the memory used by an environment variable array. + */ +void env_array_free(char **env_array) +{ + char **ptr; + + if (env_array == NULL) + return; + + for (ptr = env_array; *ptr != NULL; ptr++) { + xfree(*ptr); + } + xfree(env_array); +} + +/* + * Given an environment variable "name=value" string, + * copy the name portion into the "name" buffer, and the + * value portion into the "value" buffer. + * + * Return 1 on success, 0 on failure. + */ +static int _env_array_entry_splitter(const char *entry, + char *name, int name_len, + char *value, int value_len) +{ + char *ptr; + int len; + + ptr = index(entry, '='); + len = ptr - entry; + if (len > name_len-1) + return 0; + strncpy(name, entry, len); + name[len] = '\0'; + + ptr = ptr + 1; + len = strlen(ptr); + if (len > value_len-1) + return 0; + strncpy(value, ptr, len); + value[len] = '\0'; + + return 1; +} + +/* + * Work similarly to putenv() (from C stdlib), but uses setenv() + * under the covers. This avoids having pointers from the global + * array "environ" into "string". + * + * Return 1 on success, 0 on failure. + */ +static int _env_array_putenv(const char *string) +{ + char name[BUFSIZ]; + char value[BUFSIZ]; + + if (!_env_array_entry_splitter(string, name, BUFSIZ, value, BUFSIZ)) + return 0; + if (setenv(name, value, 1) == -1) + return 0; + + return 1; +} + +/* + * Set all of the environment variables in a supplied environment + * variable array. + */ +void env_array_set_environment(char **env_array) +{ + char **ptr; + + if (env_array == NULL) + return; + + for (ptr = env_array; *ptr != NULL; ptr++) { + _env_array_putenv(*ptr); + } +} + +/* + * Merge all of the environment variables in src_array into the + * array dest_array. Any variables already found in dest_array + * will be overwritten with the value from src_array. + */ +void env_array_merge(char ***dest_array, const char **src_array) +{ + char **ptr; + char name[BUFSIZ]; + char value[BUFSIZ]; + + if (src_array == NULL) + return; + + for (ptr = (char **)src_array; *ptr != NULL; ptr++) { + _env_array_entry_splitter(*ptr, name, BUFSIZ, value, BUFSIZ); + env_array_overwrite(dest_array, name, value); + } +} + diff --git a/executable_names/src/common/env.h b/executable_names/src/common/env.h new file mode 100644 index 0000000000000000000000000000000000000000..42ba0969d1505cbb1f3116921d03766ee33399a7 --- /dev/null +++ b/executable_names/src/common/env.h @@ -0,0 +1,221 @@ +/*****************************************************************************\ + * src/common/env.h - environment vector manipulation + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#ifndef _ENV_H +#define _ENV_H + +#include +#include +#include +#include + +#include "src/common/macros.h" +#include "src/common/slurm_protocol_api.h" + +typedef struct env_options { + int nprocs; /* --nprocs=n, -n n */ + char *task_count; + bool nprocs_set; /* true if nprocs explicitly set */ + bool cpus_set; /* true if cpus_per_task explicitly set */ + task_dist_states_t distribution; /* --distribution=, -m dist */ + int plane_size; /* plane_size for SLURM_DIST_PLANE */ + cpu_bind_type_t + cpu_bind_type; /* --cpu_bind= */ + char *cpu_bind; /* binding map for map/mask_cpu */ + mem_bind_type_t + mem_bind_type; /* --mem_bind= */ + char *mem_bind; /* binding map for tasks to memory */ + bool overcommit; /* --overcommit, -O */ + int slurmd_debug; /* --slurmd-debug, -D */ + bool labelio; /* --label-output, -l */ + select_jobinfo_t select_jobinfo; + int nhosts; + char *nodelist; /* nodelist in string form */ + char **env; /* job environment */ + uint16_t comm_port; /* srun's communication port */ + char *comm_hostname; /* srun's hostname */ + slurm_addr *cli; /* launch node address */ + slurm_addr *self; + int jobid; /* assigned job id */ + int stepid; /* assigned step id */ + int procid; /* global task id (across nodes) */ + int localid; /* local task id (within node) */ + int nodeid; + int cpus_per_task; /* --cpus-per-task=n, -c n */ + int ntasks_per_node; /* --ntasks-per-node=n */ + int ntasks_per_socket; /* --ntasks-per-socket=n */ + int ntasks_per_core; /* --ntasks-per-core=n */ + int cpus_on_node; + pid_t task_pid; +} env_t; + + +int envcount (char **env); +int setenvfs(const char *fmt, ...); +int setenvf(char ***envp, const char *name, const char *fmt, ...); +void unsetenvp(char **env, const char *name); +char * getenvp(char **env, const char *name); +int setup_env(env_t *env); + +/********************************************************************** + * Newer environment variable handling scheme + **********************************************************************/ +/* + * Set in "dest" the environment variables relevant to a SLURM job + * allocation, overwriting any environment variables of the same name. + * If the address pointed to by "dest" is NULL, memory will automatically be + * xmalloc'ed. The array is terminated by a NULL pointer, and thus is + * suitable for use by execle() and other env_array_* functions. + * + * Sets the variables: + * SLURM_JOB_ID + * SLURM_JOB_NUM_NODES + * SLURM_JOB_NODELIST + * SLURM_JOB_CPUS_PER_NODE + * + * Sets OBSOLETE variables: + * ? probably only needed for users... + */ +void env_array_for_job(char ***dest, + const resource_allocation_response_msg_t *alloc); + +/* + * Set in "dest" the environment variables relevant to a SLURM batch + * job allocation, overwriting any environment variables of the same name. + * If the address pointed to by "dest" is NULL, memory will automatically be + * xmalloc'ed. The array is terminated by a NULL pointer, and thus is + * suitable for use by execle() and other env_array_* functions. + * + * Sets the variables: + * SLURM_JOB_ID + * SLURM_JOB_NUM_NODES + * SLURM_JOB_NODELIST + * SLURM_JOB_CPUS_PER_NODE + * + * Sets OBSOLETE variables: + * SLURM_JOBID + * SLURM_NNODES + * SLURM_NODELIST + * SLURM_TASKS_PER_NODE <- poorly named, really CPUs per node + * ? probably only needed for users... + */ +void env_array_for_batch_job(char ***dest, const batch_job_launch_msg_t *batch); + +/* + * Set in "dest the environment variables relevant to a SLURM job step, + * overwriting any environment variables of the same name. If the address + * pointed to by "dest" is NULL, memory will automatically be xmalloc'ed. + * The array is terminated by a NULL pointer, and thus is suitable for + * use by execle() and other env_array_* functions. + * + * Sets variables: + * SLURM_STEP_ID + * SLURM_STEP_NUM_NODES + * SLURM_STEP_NUM_TASKS + * SLURM_STEP_TASKS_PER_NODE + * SLURM_STEP_LAUNCHER_HOSTNAME + * SLURM_STEP_LAUNCHER_PORT + * SLURM_STEP_LAUNCHER_IPADDR + * + * Sets OBSOLETE variables: + * SLURM_STEPID + * SLURM_NNODES + * SLURM_NPROCS + * SLURM_NODELIST + * SLURM_TASKS_PER_NODE + * SLURM_SRUN_COMM_HOST + * SLURM_SRUN_COMM_PORT + * SLURM_LAUNCH_NODE_IPADDR + * + */ +void +env_array_for_step(char ***dest, + const job_step_create_response_msg_t *step, + const char *launcher_hostname, + uint16_t launcher_port, + const char *ip_addr_str); + +/* + * Return an empty environment variable array (contains a single + * pointer to NULL). + */ +char **env_array_create(void); + +/* + * Merge all of the environment variables in src_array into the + * array dest_array. Any variables already found in dest_array + * will be overwritten with the value from src_array. + */ +void env_array_merge(char ***dest_array, const char **src_array); + +/* + * Copy env_array must be freed by env_array_free + */ +char **env_array_copy(const char **array); + +/* + * Free the memory used by an environment variable array. + */ +void env_array_free(char **env_array); + +/* + * Append a single environment variable to an environment variable array, + * if and only if a variable by that name does not already exist in the + * array. + * + * Return 1 on success, and 0 on error. + */ +int env_array_append(char ***array_ptr, const char *name, + const char *value_fmt, ...); + +/* + * Append a single environment variable to an environment variable array + * if a variable by that name does not already exist. If a variable + * by the same name is found in the array, it is overwritten with the + * new value. + * + * Return 1 on success, and 0 on error. + */ +int env_array_overwrite(char ***array_ptr, const char *name, + const char *value); + +/* + * Append a single environment variable to an environment variable array + * if a variable by that name does not already exist. If a variable + * by the same name is found in the array, it is overwritten with the + * new value. The "value_fmt" string may contain printf-style options. + * + * Return 1 on success, and 0 on error. + */ +int env_array_overwrite_fmt(char ***array_ptr, const char *name, + const char *value_fmt, ...); + +/* + * Set all of the environment variables in a supplied environment + * variable array. + */ +void env_array_set_environment(char **env_array); + +#endif diff --git a/executable_names/src/common/fd.c b/executable_names/src/common/fd.c new file mode 100644 index 0000000000000000000000000000000000000000..78d91841540f3098b04f97a04870c8d40226fcb8 --- /dev/null +++ b/executable_names/src/common/fd.c @@ -0,0 +1,267 @@ +/*****************************************************************************\ + * $Id$ + ***************************************************************************** + * Copyright (C) 2001-2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Chris Dunlap . + * UCRL-CODE-2002-009. + * + * This file is part of ConMan, a remote console management program. + * For details, see . + * + * ConMan 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * ConMan 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 ConMan; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + ***************************************************************************** + * Refer to "fd.h" for documentation on public functions. +\*****************************************************************************/ + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include +#include +#include +#include + +#include "src/common/fd.h" +#include "src/common/log.h" + +static int fd_get_lock(int fd, int cmd, int type); +static pid_t fd_test_lock(int fd, int type); + + +void fd_set_close_on_exec(int fd) +{ + assert(fd >= 0); + + if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) + error("fcntl(F_SETFD) failed: %m"); + return; +} + +void fd_set_noclose_on_exec(int fd) +{ + assert(fd >= 0); + + if (fcntl(fd, F_SETFD, 0) < 0) + error("fcntl(F_SETFD) failed: %m"); + return; +} + +int fd_is_blocking(int fd) +{ + int val = 0; + + assert(fd >= 0); + + if ((val = fcntl(fd, F_GETFL, 0)) < 0) + error("fnctl(F_GET_FL) failed: %m"); + return (val & O_NONBLOCK) ? 0 : 1; +} + +void fd_set_nonblocking(int fd) +{ + int fval; + + assert(fd >= 0); + + if ((fval = fcntl(fd, F_GETFL, 0)) < 0) + error("fcntl(F_GETFL) failed: %m"); + if (fcntl(fd, F_SETFL, fval | O_NONBLOCK) < 0) + error("fcntl(F_SETFL) failed: %m"); + return; +} + +void fd_set_blocking(int fd) +{ + int fval; + + assert(fd >= 0); + + if ((fval = fcntl(fd, F_GETFL, 0)) < 0) + error("fcntl(F_GETFL) failed: %m"); + if (fcntl(fd, F_SETFL, fval & ~O_NONBLOCK) < 0) + error("fcntl(F_SETFL) failed: %m"); + return; +} + + +int fd_get_read_lock(int fd) +{ + return(fd_get_lock(fd, F_SETLK, F_RDLCK)); +} + + +int fd_get_readw_lock(int fd) +{ + return(fd_get_lock(fd, F_SETLKW, F_RDLCK)); +} + + +int fd_get_write_lock(int fd) +{ + return(fd_get_lock(fd, F_SETLK, F_WRLCK)); +} + + +int fd_get_writew_lock(int fd) +{ + return(fd_get_lock(fd, F_SETLKW, F_WRLCK)); +} + + +int fd_release_lock(int fd) +{ + return(fd_get_lock(fd, F_SETLK, F_UNLCK)); +} + + +pid_t fd_is_read_lock_blocked(int fd) +{ + return(fd_test_lock(fd, F_RDLCK)); +} + + +pid_t fd_is_write_lock_blocked(int fd) +{ + return(fd_test_lock(fd, F_WRLCK)); +} + + +static int fd_get_lock(int fd, int cmd, int type) +{ + struct flock lock; + + assert(fd >= 0); + + lock.l_type = type; + lock.l_start = 0; + lock.l_whence = SEEK_SET; + lock.l_len = 0; + + return(fcntl(fd, cmd, &lock)); +} + + +static pid_t fd_test_lock(int fd, int type) +{ + struct flock lock; + + assert(fd >= 0); + + lock.l_type = type; + lock.l_start = 0; + lock.l_whence = SEEK_SET; + lock.l_len = 0; + lock.l_pid = 0; /* avoid valgrind error */ + + if (fcntl(fd, F_GETLK, &lock) < 0) + error("Unable to test for file lock: %m"); + if (lock.l_type == F_UNLCK) + return(0); + return(lock.l_pid); +} + + +ssize_t fd_read_n(int fd, void *buf, size_t n) +{ + size_t nleft; + ssize_t nread; + unsigned char *p; + + p = buf; + nleft = n; + while (nleft > 0) { + if ((nread = read(fd, p, nleft)) < 0) { + if (errno == EINTR) + continue; + else + return(-1); + } + else if (nread == 0) { /* EOF */ + break; + } + nleft -= nread; + p += nread; + } + return(n - nleft); +} + + +ssize_t fd_write_n(int fd, void *buf, size_t n) +{ + size_t nleft; + ssize_t nwritten; + unsigned char *p; + + p = buf; + nleft = n; + while (nleft > 0) { + if ((nwritten = write(fd, p, nleft)) < 0) { + if (errno == EINTR) + continue; + else + return(-1); + } + nleft -= nwritten; + p += nwritten; + } + return(n); +} + + +ssize_t fd_read_line(int fd, void *buf, size_t maxlen) +{ + ssize_t n, rc; + unsigned char c, *p; + + n = 0; + p = buf; + while (n < maxlen - 1) { /* reserve space for NUL-termination */ + + if ((rc = read(fd, &c, 1)) == 1) { + n++; + *p++ = c; + if (c == '\n') + break; /* store newline, like fgets() */ + } + else if (rc == 0) { + if (n == 0) /* EOF, no data read */ + return(0); + else /* EOF, some data read */ + break; + } + else { + if (errno == EINTR) + continue; + return(-1); + } + } + + *p = '\0'; /* NUL-terminate, like fgets() */ + return(n); +} diff --git a/executable_names/src/common/fd.h b/executable_names/src/common/fd.h new file mode 100644 index 0000000000000000000000000000000000000000..cd450b3f65581cf104ae7b3438f99b45a3d690a1 --- /dev/null +++ b/executable_names/src/common/fd.h @@ -0,0 +1,143 @@ +/*****************************************************************************\ + * $Id$ + ***************************************************************************** + * Copyright (C) 2001-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Chris Dunlap . + * UCRL-CODE-2002-009. + * + * This file is part of ConMan, a remote console management program. + * For details, see . + * + * ConMan 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * ConMan 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 ConMan; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + + +#ifndef _FD_H +#define _FD_H + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include +#include + + +void fd_set_close_on_exec(int fd); +/* + * Sets the file descriptor (fd) to be closed on exec(). + */ + +void fd_set_noclose_on_exec(int fd); +/* + * Sets the file descriptor (fd) to NOT be closed on exec(). + */ + +void fd_set_nonblocking(int fd); +/* + * Sets the file descriptor (fd) for non-blocking I/O. + */ + +void fd_set_blocking(int fd); +/* + * Sets the file descriptor (fd) for blocking I/O. + */ + +int fd_get_read_lock(int fd); +/* + * Obtain a read lock on the file specified by (fd). + * Returns 0 on success, or -1 if prevented from obtaining the lock. + */ + +int fd_get_readw_lock(int fd); +/* + * Obtain a read lock on the file specified by (fd), + * blocking until one becomes available. + * Returns 0 on success, or -1 on error. + */ + +int fd_get_write_lock(int fd); +/* + * Obtain a write lock on the file specified by (fd). + * Returns 0 on success, or -1 if prevented from obtaining the lock. + */ + +int fd_get_writew_lock(int fd); +/* + * Obtain a write lock on the file specified by (fd), + * blocking until one becomes available. + * Returns 0 on success, or -1 on error. + */ + +int fd_release_lock(int fd); +/* + * Release a lock held on the file specified by (fd). + * Returns 0 on success, or -1 on error. + */ + +pid_t fd_is_read_lock_blocked(int fd); +/* + * If a lock exists the would block a request for a read-lock + * (ie, if a write-lock is already being held on the file), + * returns the pid of the process holding the lock; o/w, returns 0. + */ + +pid_t fd_is_write_lock_blocked(int fd); +/* + * If a lock exists the would block a request for a write-lock + * (ie, if any lock is already being held on the file), + * returns the pid of a process holding the lock; o/w, returns 0. + */ + +ssize_t fd_read_n(int fd, void *buf, size_t n); +/* + * Reads up to (n) bytes from (fd) into (buf). + * Returns the number of bytes read, 0 on EOF, or -1 on error. + */ + +ssize_t fd_write_n(int fd, void *buf, size_t n); +/* + * Writes (n) bytes from (buf) to (fd). + * Returns the number of bytes written, or -1 on error. + */ + +ssize_t fd_read_line(int fd, void *buf, size_t maxlen); +/* + * Reads at most (maxlen-1) bytes up to a newline from (fd) into (buf). + * The (buf) is guaranteed to be NUL-terminated and will contain the + * newline if it is encountered within (maxlen-1) bytes. + * Returns the number of bytes read, 0 on EOF, or -1 on error. + */ + +int fd_is_blocking(int fd); +/* + * Return 1 if the file specified by the file descriptor is blocking. + * Return 0 otherwise. + */ + +#endif /* !_FD_H */ diff --git a/executable_names/src/common/forward.c b/executable_names/src/common/forward.c new file mode 100644 index 0000000000000000000000000000000000000000..428ff91494561d7e961e6069826d6bc746832e16 --- /dev/null +++ b/executable_names/src/common/forward.c @@ -0,0 +1,419 @@ +/*****************************************************************************\ + * forward.c - forward RPCs through hierarchical slurmd communications + * $Id$ + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Danny Auble . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include + +#include "src/common/forward.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/slurm_auth.h" +#include "src/common/read_config.h" +#include "src/common/slurm_protocol_interface.h" + +#ifdef WITH_PTHREADS +# include +#endif /* WITH_PTHREADS */ + +#define MAX_RETRIES 3 + +void *_forward_thread(void *arg) +{ + forward_msg_t *fwd_msg = (forward_msg_t *)arg; + Buf buffer = init_buf(0); + int i=0; + List ret_list = NULL; + slurm_fd fd = -1; + ret_data_info_t *ret_data_info = NULL; + char *name = NULL; + hostlist_t hl = hostlist_create(fwd_msg->header.forward.nodelist); + slurm_addr addr; + char buf[8196]; + int steps = 0; + int start_timeout = fwd_msg->timeout; + + /* repeat until we are sure the message was sent */ + while((name = hostlist_shift(hl))) { + if(slurm_conf_get_addr(name, &addr) == SLURM_ERROR) { + error("forward_thread: can't get addr for host %s", + name); + slurm_mutex_lock(fwd_msg->forward_mutex); + mark_as_failed_forward(&fwd_msg->ret_list, name, + SLURM_SOCKET_ERROR); + slurm_mutex_unlock(fwd_msg->forward_mutex); + + free(name); + continue; + } + if ((fd = slurm_open_msg_conn(&addr)) < 0) { + error("forward_thread to %s: %m", name); + + slurm_mutex_lock(fwd_msg->forward_mutex); + mark_as_failed_forward(&fwd_msg->ret_list, name, + SLURM_SOCKET_ERROR); + slurm_mutex_unlock(fwd_msg->forward_mutex); + + free(name); + continue; + } + hostlist_ranged_string(hl, sizeof(buf), buf); + + debug3("forward: send to %s ", name); + + xfree(fwd_msg->header.forward.nodelist); + fwd_msg->header.forward.nodelist = xstrdup(buf); + fwd_msg->header.forward.cnt = hostlist_count(hl); + + debug3("forward: along with %s", + fwd_msg->header.forward.nodelist); + + pack_header(&fwd_msg->header, buffer); + + /* add forward data to buffer */ + if (remaining_buf(buffer) < fwd_msg->buf_len) { + buffer->size += (fwd_msg->buf_len + BUF_SIZE); + xrealloc(buffer->head, buffer->size); + } + if (fwd_msg->buf_len) { + memcpy(&buffer->head[buffer->processed], + fwd_msg->buf, fwd_msg->buf_len); + buffer->processed += fwd_msg->buf_len; + } + + /* + * forward message + */ + if(_slurm_msg_sendto(fd, + get_buf_data(buffer), + get_buf_offset(buffer), + SLURM_PROTOCOL_NO_SEND_RECV_FLAGS ) < 0) { + error("forward_thread: slurm_msg_sendto: %m"); + + slurm_mutex_lock(fwd_msg->forward_mutex); + mark_as_failed_forward(&fwd_msg->ret_list, name, + errno); + slurm_mutex_unlock(fwd_msg->forward_mutex); + + free_buf(buffer); + free(name); + buffer = init_buf(0); + continue; + } + + if ((fwd_msg->header.msg_type == REQUEST_SHUTDOWN) || + (fwd_msg->header.msg_type == REQUEST_RECONFIGURE)) { + slurm_mutex_lock(fwd_msg->forward_mutex); + ret_data_info = xmalloc(sizeof(ret_data_info_t)); + list_push(fwd_msg->ret_list, ret_data_info); + ret_data_info->node_name = xstrdup(name); + free(name); + i=0; + while((name = hostlist_shift(hl))) { + ret_data_info = + xmalloc(sizeof(ret_data_info_t)); + list_push(fwd_msg->ret_list, ret_data_info); + ret_data_info->node_name = xstrdup(name); + free(name); + } + goto cleanup; + } + + if(fwd_msg->header.forward.cnt>0) { + steps = (fwd_msg->header.forward.cnt+1) / + slurm_get_tree_width(); + fwd_msg->timeout = (1000*steps); + steps++; + fwd_msg->timeout += (start_timeout*steps); + } + + ret_list = slurm_receive_msgs(fd, steps, fwd_msg->timeout); + + if(!ret_list || (fwd_msg->header.forward.cnt != 0 + && list_count(ret_list) == 0)) { + slurm_mutex_lock(fwd_msg->forward_mutex); + mark_as_failed_forward(&fwd_msg->ret_list, name, + errno); + slurm_mutex_unlock(fwd_msg->forward_mutex); + + free_buf(buffer); + free(name); + buffer = init_buf(0); + continue; + } + break; + } + + slurm_mutex_lock(fwd_msg->forward_mutex); + if(ret_list) { + while((ret_data_info = list_pop(ret_list)) != NULL) { + if(!ret_data_info->node_name) { + ret_data_info->node_name = xstrdup(name); + } + list_push(fwd_msg->ret_list, ret_data_info); + debug3("got response from %s", + ret_data_info->node_name); + } + list_destroy(ret_list); + } + free(name); +cleanup: + if ((fd >= 0) && slurm_close_accepted_conn(fd) < 0) + error ("close(%d): %m", fd); + hostlist_destroy(hl); + destroy_forward(&fwd_msg->header.forward); + free_buf(buffer); + pthread_cond_signal(fwd_msg->notify); + slurm_mutex_unlock(fwd_msg->forward_mutex); + + return (NULL); +} + +/* + * forward_init - initilize forward structure + * IN: forward - forward_t * - struct to store forward info + * IN: from - forward_t * - (OPTIONAL) can be NULL, can be used to + * init the forward to this state + * RET: VOID + */ +extern void forward_init(forward_t *forward, forward_t *from) +{ + if(from && from->init == FORWARD_INIT) { + forward->cnt = from->cnt; + forward->timeout = from->timeout; + forward->nodelist = from->nodelist; + forward->init = from->init; + } else { + forward->cnt = 0; + forward->timeout = 0; + forward->nodelist = NULL; + forward->init = FORWARD_INIT; + } +} + +/* + * forward_msg - logic to forward a message which has been received and + * accumulate the return codes from processes getting the + * the forwarded message + * + * IN: forward_struct - forward_struct_t * - holds information about message + * that needs to be forwarded to + * childern processes + * IN: header - header_t - header from message that came in + * needing to be forwarded. + * RET: SLURM_SUCCESS - int + */ +extern int forward_msg(forward_struct_t *forward_struct, + header_t *header) +{ + int i = 0, j = 0; + int retries = 0; + forward_msg_t *forward_msg = NULL; + int thr_count = 0; + int *span = set_span(header->forward.cnt, 0); + hostlist_t hl = NULL; + hostlist_t forward_hl = NULL; + char *name = NULL; + + if(!forward_struct->ret_list) { + error("didn't get a ret_list from forward_struct"); + xfree(span); + return SLURM_ERROR; + } + hl = hostlist_create(header->forward.nodelist); + slurm_mutex_init(&forward_struct->forward_mutex); + pthread_cond_init(&forward_struct->notify, NULL); + + forward_struct->forward_msg = + xmalloc(sizeof(forward_msg_t) * header->forward.cnt); + i = 0; + + while((name = hostlist_shift(hl))) { + pthread_attr_t attr_agent; + pthread_t thread_agent; + char buf[8192]; + + slurm_attr_init(&attr_agent); + if (pthread_attr_setdetachstate + (&attr_agent, PTHREAD_CREATE_DETACHED)) + error("pthread_attr_setdetachstate error %m"); + + forward_msg = &forward_struct->forward_msg[thr_count]; + forward_msg->ret_list = forward_struct->ret_list; + + forward_msg->timeout = forward_struct->timeout; + forward_msg->notify = &forward_struct->notify; + forward_msg->forward_mutex = &forward_struct->forward_mutex; + forward_msg->buf_len = forward_struct->buf_len; + forward_msg->buf = forward_struct->buf; + + memcpy(&forward_msg->header.orig_addr, + &header->orig_addr, + sizeof(slurm_addr)); + + forward_msg->header.version = header->version; + forward_msg->header.flags = header->flags; + forward_msg->header.msg_type = header->msg_type; + forward_msg->header.body_length = header->body_length; + forward_msg->header.ret_list = NULL; + forward_msg->header.ret_cnt = 0; + + forward_hl = hostlist_create(name); + i++; + free(name); + for(j = 0; j < span[thr_count]; j++) { + name = hostlist_shift(hl); + if(!name) + break; + hostlist_push(forward_hl, name); + free(name); + i++; + } + hostlist_uniq(forward_hl); + hostlist_ranged_string(forward_hl, sizeof(buf), buf); + hostlist_destroy(forward_hl); + forward_msg->header.forward.nodelist = xstrdup(buf); + while(pthread_create(&thread_agent, &attr_agent, + _forward_thread, + (void *)forward_msg)) { + error("pthread_create error %m"); + if (++retries > MAX_RETRIES) + fatal("Can't create pthread"); + sleep(1); /* sleep and try again */ + } + thr_count++; + } + hostlist_destroy(hl); + xfree(span); + return SLURM_SUCCESS; +} + + +/* + * mark_as_failed_forward- mark a node as failed and add it to "ret_list" + * + * IN: ret_list - List * - ret_list to put ret_data_info + * IN: node_name - char * - node name that failed + * IN: err - int - error message from attempt + * + */ +extern void mark_as_failed_forward(List *ret_list, char *node_name, int err) +{ + ret_data_info_t *ret_data_info = NULL; + + debug3("problems with %s", node_name); + if(!*ret_list) + *ret_list = list_create(destroy_data_info); + + ret_data_info = xmalloc(sizeof(ret_data_info_t)); + ret_data_info->node_name = xstrdup(node_name); + ret_data_info->type = RESPONSE_FORWARD_FAILED; + ret_data_info->err = err; + list_push(*ret_list, ret_data_info); + + return; +} + +extern void forward_wait(slurm_msg_t * msg) +{ + int count = 0; + + /* wait for all the other messages on the tree under us */ + if(msg->forward_struct) { + debug2("looking for %d", msg->forward_struct->fwd_cnt); + slurm_mutex_lock(&msg->forward_struct->forward_mutex); + count = 0; + if (msg->ret_list != NULL) { + count += list_count(msg->ret_list); + } + debug2("Got back %d", count); + while((count < msg->forward_struct->fwd_cnt)) { + pthread_cond_wait(&msg->forward_struct->notify, + &msg->forward_struct->forward_mutex); + count = 0; + if (msg->ret_list != NULL) { + count += list_count(msg->ret_list); + } + debug2("Got back %d", count); + + } + debug2("Got them all"); + slurm_mutex_unlock(&msg->forward_struct->forward_mutex); + destroy_forward_struct(msg->forward_struct); + } + return; +} + +void destroy_data_info(void *object) +{ + ret_data_info_t *ret_data_info = (ret_data_info_t *)object; + if(ret_data_info) { + slurm_free_msg_data(ret_data_info->type, + ret_data_info->data); + xfree(ret_data_info->node_name); + xfree(ret_data_info); + } +} + +void destroy_forward(forward_t *forward) +{ + if(forward->init == FORWARD_INIT) { + xfree(forward->nodelist); + forward->init = 0; + } +} + +void destroy_forward_struct(forward_struct_t *forward_struct) +{ + if(forward_struct) { + xfree(forward_struct->buf); + xfree(forward_struct->forward_msg); + slurm_mutex_destroy(&forward_struct->forward_mutex); + pthread_cond_destroy(&forward_struct->notify); + xfree(forward_struct); + } +} + diff --git a/executable_names/src/common/forward.h b/executable_names/src/common/forward.h new file mode 100644 index 0000000000000000000000000000000000000000..6864976a55bc13c46ead32617348abcf5cd2c419 --- /dev/null +++ b/executable_names/src/common/forward.h @@ -0,0 +1,133 @@ +/*****************************************************************************\ + * forward.h - get/print the job state information of slurm + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Danny Auble + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _FORWARD_H +#define _FORWARD_H + +#include +#include "src/common/slurm_protocol_api.h" + +/* + * forward_init - initilize forward structure + * IN: forward - forward_t * - struct to store forward info + * IN: from - forward_t * - (OPTIONAL) can be NULL, can be used to + * init the forward to this state + * RET: VOID + */ +extern void forward_init(forward_t *forward, forward_t *from); + +/* + * forward_msg - logic to forward a message which has been received and + * accumulate the return codes from processes getting the + * the forwarded message + * + * IN: forward_struct - forward_struct_t * - holds information about message + * that needs to be forwarded to + * childern processes + * IN: header - header_t - header from message that came in + * needing to be forwarded. + * RET: SLURM_SUCCESS - int + */ +/********************************************************************* +// Code taken from common/slurm_protocol_api.c +// Set up the forward_struct using the remainder of the buffer being received, +// right after header has been removed form the original buffer + +forward_struct = xmalloc(sizeof(forward_struct_t)); +forward_struct->buf_len = remaining_buf(buffer); +forward_struct->buf = xmalloc(sizeof(char) * forward_struct->buf_len); +memcpy(forward_struct->buf, &buffer->head[buffer->processed], + forward_struct->buf_len); +forward_struct->ret_list = ret_list; + +forward_struct->timeout = timeout - header.forward.timeout; + +// Send the structure created off the buffer and the header from the message +if (forward_msg(forward_struct, &header) == SLURM_ERROR) { + error("problem with forward msg"); +} + +*********************************************************************/ +extern int forward_msg(forward_struct_t *forward_struct, + header_t *header); + +/* + * mark_as_failed_forward- mark a node as failed and add it to "ret_list" + * + * IN: ret_list - List * - ret_list to put ret_data_info + * IN: node_name - char * - node name that failed + * IN: err - int - error message from attempt + * + */ +extern void mark_as_failed_forward(List *ret_list, char *node_name, int err); + +extern void forward_wait(slurm_msg_t *msg); + +/* + * no_resp_forward - Used to respond for nodes not able to respond since + * the parent had failed in some way + * IN: forward - forward_t * - + * IN: ret_list - List * - + * IN: err - int - type of error from parent + * RET: SLURM_SUCCESS - int + */ +/********************************************************************* +Code taken from common/slurm_protocol_api.c +//This function should only be used after a message is recieved. + +// a call to slurm_receive_msg will fill in a ret_list + ret_list = slurm_receive_msg(fd, resp, timeout); +} + +// if ret_list is null or list_count is 0 means there may have been an error +// this fuction will check to make sure if there were supposed to be forwards +// we handle the return code for the messages +if(!ret_list || list_count(ret_list) == 0) { + no_resp_forwards(&req->forward, &ret_list, errno); +} +**********************************************************************/ +/* extern int no_resp_forwards(forward_t *forward, List *ret_list, int err); */ + +/* destroyers */ +extern void destroy_data_info(void *object); +extern void destroy_forward(forward_t *forward); +extern void destroy_forward_struct(forward_struct_t *forward_struct); +extern void destroy_ret_types(void *object); + +#endif diff --git a/executable_names/src/common/getopt.c b/executable_names/src/common/getopt.c new file mode 100644 index 0000000000000000000000000000000000000000..8a2f95b77aafef4dc77e1e53d614eceee8018e53 --- /dev/null +++ b/executable_names/src/common/getopt.c @@ -0,0 +1,1055 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. */ +# if defined HAVE_LIBINTL_H || defined _LIBC +# include +# ifndef _ +# define _(msgid) gettext (msgid) +# endif +# else +# define _(msgid) (msgid) +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include +# define my_index strchr +#else + +# if HAVE_STRING_H +# include +# else +# include +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Stored original parameters. + XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; +# endif + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (posixly_correct == NULL + && argc == __libc_argc && argv == __libc_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + int print_errors = opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (print_errors) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/executable_names/src/common/getopt.h b/executable_names/src/common/getopt.h new file mode 100644 index 0000000000000000000000000000000000000000..d0694bd3ee50bd98bb7cb2cc940c8db962e58c4c --- /dev/null +++ b/executable_names/src/common/getopt.h @@ -0,0 +1,180 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +# if (defined __STDC__ && __STDC__) || defined __cplusplus + const char *name; +# else + char *name; +# endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if (defined __STDC__ && __STDC__) || defined __cplusplus +# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int __argc, char *const *__argv, const char *__shortopts); +# else /* not __GNU_LIBRARY__ */ +extern int getopt (); +# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/executable_names/src/common/getopt1.c b/executable_names/src/common/getopt1.c new file mode 100644 index 0000000000000000000000000000000000000000..53aabec5948047db427406a20027ee61b7944477 --- /dev/null +++ b/executable_names/src/common/getopt1.c @@ -0,0 +1,188 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "getopt.h" + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/executable_names/src/common/global_srun.c b/executable_names/src/common/global_srun.c new file mode 100644 index 0000000000000000000000000000000000000000..8270e30953eb6ce9129b5e0531431268ac529a1e --- /dev/null +++ b/executable_names/src/common/global_srun.c @@ -0,0 +1,188 @@ +/*****************************************************************************\ + * src/common/global_srun.c - functions needed by more than just srun + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona , and + * Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_PTHREAD +#include +#endif + +#include +#include + +#include +#include + +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/xsignal.h" +#include "src/common/forward.h" +#include "src/common/global_srun.h" + +typedef enum {DSH_NEW, DSH_ACTIVE, DSH_DONE, DSH_FAILED} state_t; + +typedef struct thd { + pthread_t thread; /* thread ID */ + pthread_attr_t attr; /* thread attributes */ + state_t state; /* thread state */ +} thd_t; + +int message_thread = 0; + +void +fwd_signal(srun_job_t *job, int signo, int max_threads) +{ + int i; + slurm_msg_t req; + kill_tasks_msg_t msg; + static pthread_mutex_t sig_mutex = PTHREAD_MUTEX_INITIALIZER; + pipe_enum_t pipe_enum = PIPE_SIGNALED; + hostlist_t hl; + char *name = NULL; + char buf[8192]; + List ret_list = NULL; + ListIterator itr; + ret_data_info_t *ret_data_info = NULL; + int rc = SLURM_SUCCESS; + + slurm_mutex_lock(&sig_mutex); + + if (signo == SIGKILL || signo == SIGINT || signo == SIGTERM) { + slurm_mutex_lock(&job->state_mutex); + job->signaled = true; + slurm_mutex_unlock(&job->state_mutex); + if(message_thread) { + write(job->forked_msg->par_msg->msg_pipe[1], + &pipe_enum,sizeof(int)); + write(job->forked_msg->par_msg->msg_pipe[1], + &job->signaled,sizeof(int)); + } + } + + debug2("forward signal %d to job", signo); + + /* common to all tasks */ + msg.job_id = job->jobid; + msg.job_step_id = job->stepid; + msg.signal = (uint32_t) signo; + + hl = hostlist_create(""); + for (i = 0; i < job->nhosts; i++) { + if (job->host_state[i] != SRUN_HOST_REPLIED) { + name = nodelist_nth_host( + job->step_layout->node_list, i); + debug2("%s has not yet replied\n", name); + free(name); + continue; + } + if (job_active_tasks_on_host(job, i) == 0) + continue; + name = nodelist_nth_host(job->step_layout->node_list, i); + hostlist_push(hl, name); + free(name); + } + if(!hostlist_count(hl)) { + hostlist_destroy(hl); + goto nothing_left; + } + hostlist_ranged_string(hl, sizeof(buf), buf); + hostlist_destroy(hl); + name = xstrdup(buf); + + slurm_msg_t_init(&req); + req.msg_type = REQUEST_SIGNAL_TASKS; + req.data = &msg; + + debug3("sending signal to host %s", name); + + if (!(ret_list = slurm_send_recv_msgs(name, &req, 0))) { + error("fwd_signal: slurm_send_recv_msgs really failed bad"); + xfree(name); + slurm_mutex_unlock(&sig_mutex); + return; + } + xfree(name); + itr = list_iterator_create(ret_list); + while((ret_data_info = list_next(itr))) { + rc = slurm_get_return_code(ret_data_info->type, + ret_data_info->data); + /* + * Report error unless it is "Invalid job id" which + * probably just means the tasks exited in the meanwhile. + */ + if ((rc != 0) && (rc != ESLURM_INVALID_JOB_ID) + && (rc != ESLURMD_JOB_NOTRUNNING) && (rc != ESRCH)) { + error("%s: signal: %s", + ret_data_info->node_name, + slurm_strerror(rc)); + destroy_data_info(ret_data_info); + } + } + list_iterator_destroy(itr); + list_destroy(ret_list); +nothing_left: + debug2("All tasks have been signalled"); + + slurm_mutex_unlock(&sig_mutex); +} + +int +job_active_tasks_on_host(srun_job_t *job, int hostid) +{ + int i; + int retval = 0; + + slurm_mutex_lock(&job->task_mutex); + for (i = 0; i < job->step_layout->tasks[hostid]; i++) { + uint32_t *tids = job->step_layout->tids[hostid]; + xassert(tids != NULL); + debug("Task %d state: %d", tids[i], job->task_state[tids[i]]); + if (job->task_state[tids[i]] == SRUN_TASK_RUNNING) + retval++; + } + slurm_mutex_unlock(&job->task_mutex); + return retval; +} + + diff --git a/executable_names/src/common/global_srun.h b/executable_names/src/common/global_srun.h new file mode 100644 index 0000000000000000000000000000000000000000..bc6eba242c3c56e26b265a9da636fa3e8cb41b05 --- /dev/null +++ b/executable_names/src/common/global_srun.h @@ -0,0 +1,160 @@ +/*****************************************************************************\ + * src/common/global_srun.c - functions needed by more than just srun + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grodnona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _GLOBAL_SRUN_H +#define _GLOBAL_SRUN_H + +#include +#include "src/common/slurm_protocol_common.h" +#include "src/api/step_io.h" + +typedef enum { + SRUN_JOB_INIT = 0, /* Job's initial state */ + SRUN_JOB_LAUNCHING, /* Launch thread is running */ + SRUN_JOB_STARTING, /* Launch thread is complete */ + SRUN_JOB_RUNNING, /* Launch thread complete */ + SRUN_JOB_TERMINATING, /* Once first task terminates */ + SRUN_JOB_TERMINATED, /* All tasks terminated (may have IO) */ + SRUN_JOB_WAITING_ON_IO, /* All tasks terminated; waiting for IO */ + SRUN_JOB_DONE, /* tasks and IO complete */ + SRUN_JOB_DETACHED, /* Detached IO from job (Not used now) */ + SRUN_JOB_FAILED, /* Job failed for some reason */ + SRUN_JOB_CANCELLED, /* CTRL-C cancelled */ + SRUN_JOB_FORCETERM /* Forced termination of IO thread */ +} srun_job_state_t; + +typedef enum { + SRUN_HOST_INIT = 0, + SRUN_HOST_CONTACTED, + SRUN_HOST_UNREACHABLE, + SRUN_HOST_REPLIED +} srun_host_state_t; + +typedef enum { + SRUN_TASK_INIT = 0, + SRUN_TASK_RUNNING, + SRUN_TASK_FAILED, + SRUN_TASK_IO_WAIT, /* this state deprecated with new eio stdio engine */ + SRUN_TASK_EXITED, + SRUN_TASK_ABNORMAL_EXIT +} srun_task_state_t; + +typedef enum { + PIPE_NONE = 0, + PIPE_JOB_STATE, + PIPE_TASK_STATE, + PIPE_TASK_EXITCODE, + PIPE_HOST_STATE, + PIPE_SIGNALED, + PIPE_MPIR_DEBUG_STATE, + PIPE_UPDATE_MPIR_PROCTABLE, + PIPE_UPDATE_STEP_LAYOUT, + PIPE_NODE_FAIL +} pipe_enum_t; + +/* For Message thread */ +typedef struct forked_msg_pipe { + int msg_pipe[2]; + int pid; +} forked_msg_pipe_t; + +typedef struct forked_message { + forked_msg_pipe_t * par_msg; + forked_msg_pipe_t * msg_par; + enum job_states * job_state; +} forked_msg_t; + +typedef struct io_filename io_filename_t; + +typedef struct srun_job { + slurm_step_layout_t *step_layout; /* holds info about how the task is + laid out */ + uint32_t jobid; /* assigned job id */ + uint32_t stepid; /* assigned step id */ + bool old_job; /* run job step under previous allocation */ + bool removed; /* job has been removed from SLURM */ + + uint32_t nhosts; /* node count */ + uint32_t ntasks; /* task count */ + srun_job_state_t state; /* job state */ + pthread_mutex_t state_mutex; + pthread_cond_t state_cond; + + bool signaled; /* True if user generated signal to job */ + int rc; /* srun return code */ + + slurm_cred_t cred; /* Slurm job credential */ + char *nodelist; /* nodelist in string form */ + + pthread_t sigid; /* signals thread tid */ + + pthread_t jtid; /* job control thread id */ + slurm_fd *jfd; /* job control info fd */ + + pthread_t lid; /* launch thread id */ + + client_io_t *client_io; + time_t ltimeout; /* Time by which all tasks must be running */ + time_t etimeout; /* exit timeout (see opt.max_wait */ + + srun_host_state_t *host_state; /* nhost host states */ + + int *tstatus; /* ntask exit statii */ + srun_task_state_t *task_state; /* ntask task states */ + + switch_jobinfo_t switch_job; + io_filename_t *ifname; + io_filename_t *ofname; + io_filename_t *efname; + forked_msg_t *forked_msg; + char *task_epilog; /* task-epilog */ + char *task_prolog; /* task-prolog */ + pthread_mutex_t task_mutex; + int njfds; /* number of job control info fds */ + slurm_addr *jaddr; /* job control info ports */ + int thr_count; /* count of threads in job launch */ + + /* Output streams and stdin fileno */ + select_jobinfo_t select_jobinfo; + +} srun_job_t; + + +void fwd_signal(srun_job_t *job, int signal, int max_threads); +int job_active_tasks_on_host(srun_job_t *job, int hostid); + +#endif /* !_GLOBAL_SRUN_H */ diff --git a/executable_names/src/common/hostlist.c b/executable_names/src/common/hostlist.c new file mode 100644 index 0000000000000000000000000000000000000000..f2817ca9eb49c5f13b4b8627050fac90f3660b98 --- /dev/null +++ b/executable_names/src/common/hostlist.c @@ -0,0 +1,3005 @@ +/*****************************************************************************\ + * $Id$ + ***************************************************************************** + * $LSDId: hostlist.c,v 1.14 2003/10/14 20:11:54 grondo Exp $ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +# if HAVE_STRING_H +# include +# endif +# if HAVE_PTHREAD_H +# include +# endif +#else /* !HAVE_CONFIG_H */ +# include +# include +#endif /* HAVE_CONFIG_H */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/common/hostlist.h" +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/xmalloc.h" + +/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +strong_alias(hostlist_create, slurm_hostlist_create); +strong_alias(hostlist_copy, slurm_hostlist_copy); +strong_alias(hostlist_count, slurm_hostlist_count); +strong_alias(hostlist_delete, slurm_hostlist_delete); +strong_alias(hostlist_delete_host, slurm_hostlist_delete_host); +strong_alias(hostlist_delete_nth, slurm_hostlist_delete_nth); +strong_alias(hostlist_deranged_string, slurm_hostlist_deranged_string); +strong_alias(hostlist_destroy, slurm_hostlist_destroy); +strong_alias(hostlist_find, slurm_hostlist_find); +strong_alias(hostlist_iterator_create, slurm_hostlist_iterator_create); +strong_alias(hostlist_iterator_destroy, slurm_hostlist_iterator_destroy); +strong_alias(hostlist_iterator_reset, slurm_hostlist_iterator_reset); +strong_alias(hostlist_next, slurm_hostlist_next); +strong_alias(hostlist_next_range, slurm_hostlist_next_range); +strong_alias(hostlist_nth, slurm_hostlist_nth); +strong_alias(hostlist_pop, slurm_hostlist_pop); +strong_alias(hostlist_pop_range, slurm_hostlist_pop_range); +strong_alias(hostlist_push, slurm_hostlist_push); +strong_alias(hostlist_push_host, slurm_hostlist_push_host); +strong_alias(hostlist_push_list, slurm_hostlist_push_list); +strong_alias(hostlist_ranged_string, slurm_hostlist_ranged_string); +strong_alias(hostlist_remove, slurm_hostlist_remove); +strong_alias(hostlist_shift, slurm_hostlist_shift); +strong_alias(hostlist_shift_range, slurm_hostlist_shift_range); +strong_alias(hostlist_sort, slurm_hostlist_soft); +strong_alias(hostlist_uniq, slurm_hostlist_uniq); +strong_alias(hostset_copy, slurm_hostset_copy); +strong_alias(hostset_count, slurm_hostset_count); +strong_alias(hostset_create, slurm_hostset_create); +strong_alias(hostset_delete, slurm_hostset_delete); +strong_alias(hostset_destroy, slurm_hostset_destroy); +strong_alias(hostset_find, slurm_hostset_find); +strong_alias(hostset_insert, slurm_hostset_insert); +strong_alias(hostset_shift, slurm_hostset_shift); +strong_alias(hostset_shift_range, slurm_hostset_shift_range); +strong_alias(hostset_within, slurm_hostset_within); +strong_alias(hostset_nth, slurm_hostset_nth); + +/* + * lsd_fatal_error : fatal error macro + */ +#ifdef WITH_LSD_FATAL_ERROR_FUNC +# undef lsd_fatal_error + extern void lsd_fatal_error(char *file, int line, char *mesg); +#else /* !WITH_LSD_FATAL_ERROR_FUNC */ +# ifndef lsd_fatal_error +# define lsd_fatal_error(file, line, mesg) \ + do { \ + fprintf(stderr, "ERROR: [%s:%d] %s: %s\n", \ + file, line, mesg, strerror(errno)); \ + } while (0) +# endif /* !lsd_fatal_error */ +#endif /* !WITH_LSD_FATAL_ERROR_FUNC */ + +/* + * lsd_nonmem_error + */ +#ifdef WITH_LSD_NOMEM_ERROR_FUNC +# undef lsd_nomem_error + extern void * lsd_nomem_error(char *file, int line, char *mesg); +#else /* !WITH_LSD_NOMEM_ERROR_FUNC */ +# ifndef lsd_nomem_error +# define lsd_nomem_error(file, line, mesg) (NULL) +# endif /* !lsd_nomem_error */ +#endif /* !WITH_LSD_NOMEM_ERROR_FUNC */ + +/* + * OOM helper function + * Automatically call lsd_nomem_error with appropriate args + * and set errno to ENOMEM + */ +#define out_of_memory(mesg) \ + do { \ + fatal("malloc failure"); \ + errno = ENOMEM; \ + return(lsd_nomem_error(__FILE__, __LINE__, mesg)); \ + } while (0) + +/* + * Some constants and tunables: + */ + +/* number of elements to allocate when extending the hostlist array */ +#define HOSTLIST_CHUNK 16 + +/* max host range: anything larger will be assumed to be an error */ +#define MAX_RANGE 16384 /* 16K Hosts */ + +/* max number of ranges that will be processed between brackets */ +#define MAX_RANGES 12288 /* 12K Ranges */ + +/* size of internal hostname buffer (+ some slop), hostnames will probably + * be truncated if longer than MAXHOSTNAMELEN */ +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 64 +#endif + +/* max size of internal hostrange buffer */ +#define MAXHOSTRANGELEN 1024 + +/* ----[ Internal Data Structures ]---- */ + + +#ifdef HAVE_BG +/* logic for block node description */ +/* We allocate space for three digits, + * each with values 0 to 9 even if they are not all used */ +bool axis[10][10][10]; +int axis_min_x, axis_min_y, axis_min_z; +int axis_max_x, axis_max_y, axis_max_z; + +static int _get_boxes(char *buf, int max_len); +static void _clear_grid(void); +static void _set_grid(unsigned long start, unsigned long end); +static bool _test_box(void); +#endif + +/* hostname type: A convenience structure used in parsing single hostnames */ +struct hostname_components { + char *hostname; /* cache of initialized hostname */ + char *prefix; /* hostname prefix */ + unsigned long num; /* numeric suffix */ + + /* string representation of numeric suffix + * points into `hostname' */ + char *suffix; +}; + +typedef struct hostname_components *hostname_t; + +/* hostrange type: A single prefix with `hi' and `lo' numeric suffix values */ +struct hostrange_components { + char *prefix; /* alphanumeric prefix: */ + + /* beginning (lo) and end (hi) of suffix range */ + unsigned long lo, hi; + + /* width of numeric output format + * (pad with zeros up to this width) */ + int width; + + /* If singlehost is 1, `lo' and `hi' are invalid */ + unsigned singlehost:1; +}; + +typedef struct hostrange_components *hostrange_t; + +/* The hostlist type: An array based list of hostrange_t's */ +struct hostlist { +#ifndef NDEBUG +#define HOSTLIST_MAGIC 57005 + int magic; +#endif +#if WITH_PTHREADS + pthread_mutex_t mutex; +#endif /* WITH_PTHREADS */ + + /* current number of elements available in array */ + int size; + + /* current number of ranges stored in array */ + int nranges; + + /* current number of hosts stored in hostlist */ + int nhosts; + + /* pointer to hostrange array */ + hostrange_t *hr; + + /* list of iterators */ + struct hostlist_iterator *ilist; + +}; + + +/* a hostset is a wrapper around a hostlist */ +struct hostset { + hostlist_t hl; +}; + +struct hostlist_iterator { +#ifndef NDEBUG + int magic; +#endif + /* hostlist we are traversing */ + hostlist_t hl; + + /* current index of iterator in hl->hr[] */ + int idx; + + /* current hostrange object in list hl, i.e. hl->hr[idx] */ + hostrange_t hr; + + /* current depth we've traversed into range hr */ + int depth; + + /* next ptr for lists of iterators */ + struct hostlist_iterator *next; +}; + + +/* ---- ---- */ + +/* ------[ static function prototypes ]------ */ + +static void _error(char *file, int line, char *mesg, ...); +static char * _next_tok(char *, char **); +static int _zero_padded(unsigned long, int); +static int _width_equiv(unsigned long, int *, unsigned long, int *); + +static size_t host_prefix_end(const char *); +static hostname_t hostname_create(const char *); +static void hostname_destroy(hostname_t); +static int hostname_suffix_is_valid(hostname_t); +static int hostname_suffix_width(hostname_t); + +static hostrange_t hostrange_new(void); +static hostrange_t hostrange_create_single(const char *); +static hostrange_t hostrange_create(char *, unsigned long, unsigned long, + int); +static unsigned long hostrange_count(hostrange_t); +static hostrange_t hostrange_copy(hostrange_t); +static void hostrange_destroy(hostrange_t); +static hostrange_t hostrange_delete_host(hostrange_t, unsigned long); +static int hostrange_cmp(hostrange_t, hostrange_t); +static int hostrange_prefix_cmp(hostrange_t, hostrange_t); +static int hostrange_within_range(hostrange_t, hostrange_t); +static int hostrange_width_combine(hostrange_t, hostrange_t); +static int hostrange_empty(hostrange_t); +static char * hostrange_pop(hostrange_t); +static char * hostrange_shift(hostrange_t); +static int hostrange_join(hostrange_t, hostrange_t); +static hostrange_t hostrange_intersect(hostrange_t, hostrange_t); +static int hostrange_hn_within(hostrange_t, hostname_t); +static size_t hostrange_to_string(hostrange_t hr, size_t, char *, + char *); +static size_t hostrange_numstr(hostrange_t, size_t, char *); + +static hostlist_t hostlist_new(void); +static hostlist_t _hostlist_create_bracketed(const char *, char *, char *); +static int hostlist_resize(hostlist_t, size_t); +static int hostlist_expand(hostlist_t); +static int hostlist_push_range(hostlist_t, hostrange_t); +static int hostlist_push_hr(hostlist_t, char *, unsigned long, + unsigned long, int); +static int hostlist_insert_range(hostlist_t, hostrange_t, int); +static void hostlist_delete_range(hostlist_t, int n); +static void hostlist_coalesce(hostlist_t hl); +static void hostlist_collapse(hostlist_t hl); +static hostlist_t _hostlist_create(const char *, char *, char *); +static void hostlist_shift_iterators(hostlist_t, int, int, int); +static int _attempt_range_join(hostlist_t, int); +static int _is_bracket_needed(hostlist_t, int); + +static hostlist_iterator_t hostlist_iterator_new(void); +static void _iterator_advance(hostlist_iterator_t); +static void _iterator_advance_range(hostlist_iterator_t); + +static int hostset_find_host(hostset_t, const char *); + +/* ------[ macros ]------ */ + +#ifdef WITH_PTHREADS +# define mutex_init(mutex) \ + do { \ + int e = pthread_mutex_init(mutex, NULL); \ + if (e) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "hostlist mutex init:"); \ + abort(); \ + } \ + } while (0) + +# define mutex_lock(mutex) \ + do { \ + int e = pthread_mutex_lock(mutex); \ + if (e) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "hostlist mutex lock:"); \ + abort(); \ + } \ + } while (0) + +# define mutex_unlock(mutex) \ + do { \ + int e = pthread_mutex_unlock(mutex); \ + if (e) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "hostlist mutex unlock:"); \ + abort(); \ + } \ + } while (0) + +# define mutex_destroy(mutex) \ + do { \ + int e = pthread_mutex_destroy(mutex); \ + if (e) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "hostlist mutex destroy:"); \ + abort(); \ + } \ + } while (0) + +#else /* !WITH_PTHREADS */ + +# define mutex_init(mutex) +# define mutex_lock(mutex) +# define mutex_unlock(mutex) +# define mutex_destroy(mutex) + +#endif /* WITH_PTHREADS */ + +#define LOCK_HOSTLIST(_hl) \ + do { \ + assert(_hl != NULL); \ + mutex_lock(&(_hl)->mutex); \ + assert((_hl)->magic == HOSTLIST_MAGIC); \ + } while (0) + +#define UNLOCK_HOSTLIST(_hl) \ + do { \ + mutex_unlock(&(_hl)->mutex); \ + } while (0) + +#define seterrno_ret(_errno, _rc) \ + do { \ + errno = _errno; \ + return _rc; \ + } while (0) + +/* ------[ Function Definitions ]------ */ + +/* ----[ general utility functions ]---- */ + + +/* + * Varargs capable error reporting via lsd_fatal_error() + */ +static void _error(char *file, int line, char *msg, ...) +{ + va_list ap; + char buf[1024]; + int len = 0; + va_start(ap, msg); + + len = vsnprintf(buf, 1024, msg, ap); + if ((len < 0) || (len > 1024)) + buf[1023] = '\0'; + + lsd_fatal_error(file, line, buf); + + va_end(ap); + return; +} + +/* + * Helper function for host list string parsing routines + * Returns a pointer to the next token; additionally advance *str + * to the next separator. + * + * next_tok was taken directly from pdsh courtesy of Jim Garlick. + * (with modifications to support bracketed hostlists, i.e.: + * xxx[xx,xx,xx] is a single token) + * + */ +static char * _next_tok(char *sep, char **str) +{ + char *tok; + + /* push str past any leading separators */ + while (**str != '\0' && strchr(sep, **str) != '\0') + (*str)++; + + if (**str == '\0') + return NULL; + + /* assign token ptr */ + tok = *str; + + /* push str past token and leave pointing to first separator */ + while (**str != '\0' && strchr(sep, **str) == '\0') + (*str)++; + + /* if _single_ opening bracket exists b/w tok and str, push str + * past first closing bracket */ + if ( memchr(tok, '[', *str - tok) != NULL + && memchr(tok, ']', *str - tok) == NULL ) { + char *q = strchr(*str, ']'); + if (q && memchr(*str, '[', q - *str) == NULL) + *str = q + 1; + } + + /* nullify consecutive separators and push str beyond them */ + while (**str != '\0' && strchr(sep, **str) != '\0') + *(*str)++ = '\0'; + + return tok; +} + + +/* return the number of zeros needed to pad "num" to "width" + */ +static int _zero_padded(unsigned long num, int width) +{ + int n = 1; + while (num /= 10L) + n++; + return width > n ? width - n : 0; +} + +/* test whether two format `width' parameters are "equivalent" + * The width arguments "wn" and "wm" for integers "n" and "m" + * are equivalent if: + * + * o wn == wm OR + * + * o applying the same format width (either wn or wm) to both of + * 'n' and 'm' will not change the zero padding of *either* 'm' nor 'n'. + * + * If this function returns 1 (or true), the appropriate width value + * (either 'wm' or 'wn') will have been adjusted such that both format + * widths are equivalent. + */ +static int _width_equiv(unsigned long n, int *wn, unsigned long m, int *wm) +{ + int npad, nmpad, mpad, mnpad; + + if (wn == wm) + return 1; + + npad = _zero_padded(n, *wn); + nmpad = _zero_padded(n, *wm); + mpad = _zero_padded(m, *wm); + mnpad = _zero_padded(m, *wn); + + if (npad != nmpad && mpad != mnpad) + return 0; + + if (npad != nmpad) { + if (mpad == mnpad) { + *wm = *wn; + return 1; + } else + return 0; + } else { /* mpad != mnpad */ + if (npad == nmpad) { + *wn = *wm; + return 1; + } else + return 0; + } + + /* not reached */ +} + + +/* ----[ hostname_t functions ]---- */ + +/* + * return the location of the last char in the hostname prefix + */ +static size_t host_prefix_end(const char *hostname) +{ + size_t idx; + if (!hostname) + return -1; + idx = strlen(hostname) - 1; + + while (idx >= 0 && isdigit((char) hostname[idx])) + idx--; + return idx; +} + +/* + * create a hostname_t object from a string hostname + */ +static hostname_t hostname_create(const char *hostname) +{ + hostname_t hn = NULL; + char *p = '\0'; + size_t idx = 0; + + assert(hostname != NULL); + + if (!(hn = (hostname_t) malloc(sizeof(*hn)))) + out_of_memory("hostname create"); + + idx = host_prefix_end(hostname); + + if (!(hn->hostname = strdup(hostname))) { + free(hn); + out_of_memory("hostname create"); + } + + hn->num = 0; + hn->prefix = NULL; + hn->suffix = NULL; + + if (idx == strlen(hostname) - 1) { + if ((hn->prefix = strdup(hostname)) == NULL) { + hostname_destroy(hn); + out_of_memory("hostname prefix create"); + } + return hn; + } + + hn->suffix = hn->hostname + idx + 1; + hn->num = strtoul(hn->suffix, &p, 10); + + if (*p == '\0') { + if (!(hn->prefix = malloc((idx + 2) * sizeof(char)))) { + hostname_destroy(hn); + out_of_memory("hostname prefix create"); + } + memcpy(hn->prefix, hostname, idx + 1); + hn->prefix[idx + 1] = '\0'; + } else { + if (!(hn->prefix = strdup(hostname))) { + hostname_destroy(hn); + out_of_memory("hostname prefix create"); + } + hn->suffix = NULL; + } + + return hn; +} + +/* free a hostname object + */ +static void hostname_destroy(hostname_t hn) +{ + if (hn == NULL) + return; + hn->suffix = NULL; + if (hn->hostname) + free(hn->hostname); + if (hn->prefix) + free(hn->prefix); + free(hn); +} + +/* return true if the hostname has a valid numeric suffix + */ +static int hostname_suffix_is_valid(hostname_t hn) +{ + if (!hn) + return false; + return hn->suffix != NULL; +} + +/* return the width (in characters) of the numeric part of the hostname + */ +static int hostname_suffix_width(hostname_t hn) +{ + if (!hn) + return -1; + assert(hn->suffix != NULL); + return (int) strlen(hn->suffix); +} + + +/* ----[ hostrange_t functions ]---- */ + +/* allocate a new hostrange object + */ +static hostrange_t hostrange_new(void) +{ + hostrange_t new = (hostrange_t) malloc(sizeof(*new)); + if (!new) + out_of_memory("hostrange create"); + return new; +} + +/* Create a hostrange_t containing a single host without a valid suffix + * hr->prefix will represent the entire hostname. + */ +static hostrange_t hostrange_create_single(const char *prefix) +{ + hostrange_t new; + + assert(prefix != NULL); + + if ((new = hostrange_new()) == NULL) + goto error1; + + if ((new->prefix = strdup(prefix)) == NULL) + goto error2; + + new->singlehost = 1; + new->lo = 0L; + new->hi = 0L; + new->width = 0; + + return new; + + error2: + free(new); + error1: + out_of_memory("hostrange create single"); +} + + +/* Create a hostrange object with a prefix, hi, lo, and format width + */ +static hostrange_t +hostrange_create(char *prefix, unsigned long lo, unsigned long hi, int width) +{ + hostrange_t new; + + assert(prefix != NULL); + + if ((new = hostrange_new()) == NULL) + goto error1; + + if ((new->prefix = strdup(prefix)) == NULL) + goto error2; + + new->lo = lo; + new->hi = hi; + new->width = width; + + new->singlehost = 0; + + return new; + + error2: + free(new); + error1: + out_of_memory("hostrange create"); +} + + +/* Return the number of hosts stored in the hostrange object + */ +static unsigned long hostrange_count(hostrange_t hr) +{ + assert(hr != NULL); + if (hr->singlehost) + return 1; + else + return hr->hi - hr->lo + 1; +} + +/* Copy a hostrange object + */ +static hostrange_t hostrange_copy(hostrange_t hr) +{ + assert(hr != NULL); + + if (hr->singlehost) + return hostrange_create_single(hr->prefix); + else + return hostrange_create(hr->prefix, hr->lo, hr->hi, + hr->width); +} + + +/* free memory allocated by the hostrange object + */ +static void hostrange_destroy(hostrange_t hr) +{ + if (hr == NULL) + return; + if (hr->prefix) + free(hr->prefix); + free(hr); +} + +/* hostrange_delete_host() deletes a specific host from the range. + * If the range is split into two, the greater range is returned, + * and `hi' of the lesser range is adjusted accordingly. If the + * highest or lowest host is deleted from a range, NULL is returned + * and the hostrange hr is adjusted properly. + */ +static hostrange_t hostrange_delete_host(hostrange_t hr, unsigned long n) +{ + hostrange_t new = NULL; + + assert(hr != NULL); + assert(n >= hr->lo && n <= hr->hi); + + if (n == hr->lo) + hr->lo++; + else if (n == hr->hi) + hr->hi--; + else { + if (!(new = hostrange_copy(hr))) + out_of_memory("hostrange copy"); + hr->hi = n - 1; + new->lo = n + 1; + } + + return new; +} + +/* hostrange_cmp() is used to sort hostrange objects. It will + * sort based on the following (in order): + * o result of strcmp on prefixes + * o if widths are compatible, then: + * sort based on lowest suffix in range + * else + * sort based on width */ +static int hostrange_cmp(hostrange_t h1, hostrange_t h2) +{ + int retval; + + assert(h1 != NULL); + assert(h2 != NULL); + + if ((retval = hostrange_prefix_cmp(h1, h2)) == 0) + retval = hostrange_width_combine(h1, h2) ? + h1->lo - h2->lo : h1->width - h2->width; + + return retval; +} + + +/* compare the prefixes of two hostrange objects. + * returns: + * < 0 if h1 prefix is less than h2 OR h2 == NULL. + * + * 0 if h1's prefix and h2's prefix match, + * UNLESS, either h1 or h2 (NOT both) do not have a valid suffix. + * + * > 0 if h1's prefix is greater than h2's OR h1 == NULL. */ +static int hostrange_prefix_cmp(hostrange_t h1, hostrange_t h2) +{ + int retval; + if (h1 == NULL) + return 1; + if (h2 == NULL) + return -1; + + retval = strcmp(h1->prefix, h2->prefix); + return retval == 0 ? h2->singlehost - h1->singlehost : retval; +} + +/* returns true if h1 and h2 would be included in the same bracketed hostlist. + * h1 and h2 will be in the same bracketed list iff: + * + * 1. h1 and h2 have same prefix + * 2. neither h1 nor h2 are singlet hosts (i.e. invalid suffix) + * + * (XXX: Should incompatible widths be placed in the same bracketed list? + * There's no good reason not to, except maybe aesthetics) + */ +static int hostrange_within_range(hostrange_t h1, hostrange_t h2) +{ + if (hostrange_prefix_cmp(h1, h2) == 0) + return h1->singlehost || h2->singlehost ? 0 : 1; + else + return 0; +} + + +/* compare two hostrange objects to determine if they are width + * compatible, returns: + * 1 if widths can safely be combined + * 0 if widths cannot be safely combined + */ +static int hostrange_width_combine(hostrange_t h0, hostrange_t h1) +{ + assert(h0 != NULL); + assert(h1 != NULL); + + return _width_equiv(h0->lo, &h0->width, h1->lo, &h1->width); +} + + +/* Return true if hostrange hr contains no hosts, i.e. hi < lo + */ +static int hostrange_empty(hostrange_t hr) +{ + assert(hr != NULL); + return ((hr->hi < hr->lo) || (hr->hi == (unsigned long) -1)); +} + +/* return the string representation of the last host in hostrange hr + * and remove that host from the range (i.e. decrement hi if possible) + * + * Returns NULL if malloc fails OR there are no more hosts left + */ +static char *hostrange_pop(hostrange_t hr) +{ + size_t size = 0; + char *host = NULL; + + assert(hr != NULL); + + if (hr->singlehost) { + hr->lo++; /* effectively set count == 0 */ + host = strdup(hr->prefix); + } else if (hostrange_count(hr) > 0) { + size = strlen(hr->prefix) + hr->width + 16; + if (!(host = (char *) malloc(size * sizeof(char)))) + out_of_memory("hostrange pop"); + snprintf(host, size, "%s%0*lu", hr->prefix, + hr->width, hr->hi--); + } + + return host; +} + +/* Same as hostrange_pop(), but remove host from start of range */ +static char *hostrange_shift(hostrange_t hr) +{ + size_t size = 0; + char *host = NULL; + + assert(hr != NULL); + + if (hr->singlehost) { + hr->lo++; + if (!(host = strdup(hr->prefix))) + out_of_memory("hostrange shift"); + } else if (hostrange_count(hr) > 0) { + size = strlen(hr->prefix) + hr->width + 16; + if (!(host = (char *) malloc(size * sizeof(char)))) + out_of_memory("hostrange shift"); + snprintf(host, size, "%s%0*lu", hr->prefix, + hr->width, hr->lo++); + } + + return host; +} + + +/* join two hostrange objects. + * + * returns: + * + * -1 if ranges do not overlap (including incompatible zero padding) + * 0 if ranges join perfectly + * >0 number of hosts that were duplicated in h1 and h2 + * + * h2 will be coalesced into h1 if rc >= 0 + * + * it is assumed that h1->lo <= h2->lo, i.e. hr1 <= hr2 + * + */ +static int hostrange_join(hostrange_t h1, hostrange_t h2) +{ + int duplicated = -1; + + assert(h1 != NULL); + assert(h2 != NULL); + assert(hostrange_cmp(h1, h2) <= 0); + + if (hostrange_prefix_cmp(h1, h2) == 0 && + hostrange_width_combine(h1, h2)) { + + if (h1->singlehost && h2->singlehost) { /* matching singlets */ + duplicated = 1; + } else if (h1->hi == h2->lo - 1) { /* perfect join */ + h1->hi = h2->hi; + duplicated = 0; + } else if (h1->hi >= h2->lo) { /* some duplication */ + if (h1->hi < h2->hi) { + duplicated = h1->hi - h2->lo + 1; + h1->hi = h2->hi; + } else + duplicated = hostrange_count(h2); + } + } + + return duplicated; +} + +/* hostrange intersect returns the intersection (common hosts) + * of hostrange objects h1 and h2. If there is no intersection, + * NULL is returned. + * + * It is assumed that h1 <= h2 (i.e. h1->lo <= h2->lo) + */ +static hostrange_t hostrange_intersect(hostrange_t h1, hostrange_t h2) +{ + hostrange_t new = NULL; + + assert(h1 != NULL); + assert(h2 != NULL); + + if (h1->singlehost || h2->singlehost) + return NULL; + + assert(hostrange_cmp(h1, h2) <= 0); + + if ((hostrange_prefix_cmp(h1, h2) == 0) + && (h1->hi > h2->lo) + && (hostrange_width_combine(h1, h2))) { + + if (!(new = hostrange_copy(h1))) + return NULL; + new->lo = h2->lo; + new->hi = h2->hi < h1->hi ? h2->hi : h1->hi; + } + + return new; +} + +/* return 1 if hostname hn is within the hostrange hr + * 0 if not. + */ +static int hostrange_hn_within(hostrange_t hr, hostname_t hn) +{ + int retval = 0; + + if (strcmp(hr->prefix, hn->prefix) == 0) { + if (!hostname_suffix_is_valid(hn)) { + if (hr->singlehost) + retval = 1; + } else if (hn->num <= hr->hi && hn->num >= hr->lo) { + int width = hostname_suffix_width(hn); + int num = hn->num; + retval = _width_equiv(hr->lo, &hr->width, num, &width); + } + } + return retval; +} + + +/* copy a string representation of the hostrange hr into buffer buf, + * writing at most n chars including NUL termination + */ +static size_t +hostrange_to_string(hostrange_t hr, size_t n, char *buf, char *separator) +{ + unsigned long i; + int truncated = 0; + int len = 0; + char sep = separator == NULL ? ',' : separator[0]; + + if (n == 0) + return 0; + + assert(hr != NULL); + + if (hr->singlehost) + return snprintf(buf, n, "%s", hr->prefix); + + for (i = hr->lo; i <= hr->hi; i++) { + size_t m = (n - len) <= n ? n - len : 0; /* check for < 0 */ + int ret = snprintf(buf + len, m, "%s%0*lu", + hr->prefix, hr->width, i); + if (ret < 0 || ret >= m) { + len = n; + truncated = 1; + break; + } + len+=ret; + buf[len++] = sep; + } + + if (truncated) { + buf[n-1] = '\0'; + return -1; + } else { + /* back up over final separator */ + buf[--len] = '\0'; + return len; + } +} + +/* Place the string representation of the numeric part of hostrange into buf + * writing at most n chars including NUL termination. + */ +static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf) +{ + int len = 0; + + assert(buf != NULL); + assert(hr != NULL); + + if (hr->singlehost || n == 0) + return 0; + + len = snprintf(buf, n, "%0*lu", hr->width, hr->lo); + + if ((len >= 0) && (len < n) && (hr->lo < hr->hi)) { + int len2 = snprintf(buf+len, n-len, "-%0*lu", hr->width, hr->hi); + if (len2 < 0) + len = -1; + else + len += len2; + } + + return len; +} + + +/* ----[ hostlist functions ]---- */ + +/* Create a new hostlist object. + * Returns an empty hostlist, or NULL if memory allocation fails. + */ +static hostlist_t hostlist_new(void) +{ + int i; + hostlist_t new = (hostlist_t) malloc(sizeof(*new)); + if (!new) + goto fail1; + + assert(new->magic = HOSTLIST_MAGIC); + mutex_init(&new->mutex); + + new->hr = (hostrange_t *) malloc(HOSTLIST_CHUNK * sizeof(hostrange_t)); + if (!new->hr) + goto fail2; + + /* set entries in hostrange array to NULL */ + for (i = 0; i < HOSTLIST_CHUNK; i++) + new->hr[i] = NULL; + + new->size = HOSTLIST_CHUNK; + new->nranges = 0; + new->nhosts = 0; + new->ilist = NULL; + return new; + + fail2: + free(new); + fail1: + out_of_memory("hostlist_create"); +} + + +/* Resize the internal array used to store the list of hostrange objects. + * + * returns 1 for a successful resize, + * 0 if call to _realloc fails + * + * It is assumed that the caller has the hostlist hl locked + */ +static int hostlist_resize(hostlist_t hl, size_t newsize) +{ + int i; + size_t oldsize; + assert(hl != NULL); + assert(hl->magic == HOSTLIST_MAGIC); + oldsize = hl->size; + hl->size = newsize; + hl->hr = realloc((void *) hl->hr, hl->size*sizeof(hostrange_t)); + if (!(hl->hr)) + return 0; + + for (i = oldsize; i < newsize; i++) + hl->hr[i] = NULL; + + return 1; +} + +/* Resize hostlist by one HOSTLIST_CHUNK + * Assumes that hostlist hl is locked by caller + */ +static int hostlist_expand(hostlist_t hl) +{ + if (!hostlist_resize(hl, hl->size + HOSTLIST_CHUNK)) + return 0; + else + return 1; +} + +/* Push a hostrange object onto hostlist hl + * Returns the number of hosts successfully pushed onto hl + * or -1 if there was an error allocating memory + */ +static int hostlist_push_range(hostlist_t hl, hostrange_t hr) +{ + hostrange_t tail; + int retval; + + assert(hr != NULL); + LOCK_HOSTLIST(hl); + + tail = (hl->nranges > 0) ? hl->hr[hl->nranges-1] : hl->hr[0]; + + if (hl->size == hl->nranges && !hostlist_expand(hl)) + goto error; + + if (hl->nranges > 0 + && hostrange_prefix_cmp(tail, hr) == 0 + && tail->hi == hr->lo - 1 + && hostrange_width_combine(tail, hr)) { + tail->hi = hr->hi; + } else { + hostrange_t new = hostrange_copy(hr); + if (new == NULL) + goto error; + hl->hr[hl->nranges++] = new; + } + + retval = hl->nhosts += hostrange_count(hr); + + UNLOCK_HOSTLIST(hl); + + return retval; + + error: + UNLOCK_HOSTLIST(hl); + return -1; +} + + + +/* Same as hostlist_push_range() above, but prefix, lo, hi, and width + * are passed as args + */ +static int +hostlist_push_hr(hostlist_t hl, char *prefix, unsigned long lo, + unsigned long hi, int width) +{ + hostrange_t hr = hostrange_create(prefix, lo, hi, width); + int retval = hostlist_push_range(hl, hr); + hostrange_destroy(hr); + return retval; +} + +/* Insert a range object hr into position n of the hostlist hl + * Assumes that hl->mutex is already held by calling process + */ +static int hostlist_insert_range(hostlist_t hl, hostrange_t hr, int n) +{ + int i; + hostrange_t tmp; + hostlist_iterator_t hli; + + assert(hl != NULL); + assert(hl->magic == HOSTLIST_MAGIC); + assert(hr != NULL); + + if (n > hl->nranges) + return 0; + + if (hl->size == hl->nranges && !hostlist_expand(hl)) + return 0; + + /* copy new hostrange into slot "n" in array */ + tmp = hl->hr[n]; + hl->hr[n] = hostrange_copy(hr); + + /* push remaining hostrange entries up */ + for (i = n + 1; i < hl->nranges + 1; i++) { + hostrange_t last = hl->hr[i]; + hl->hr[i] = tmp; + tmp = last; + } + hl->nranges++; + + /* adjust hostlist iterators if needed */ + for (hli = hl->ilist; hli; hli = hli->next) { + if (hli->idx >= n) + hli->hr = hli->hl->hr[++hli->idx]; + } + + return 1; +} + +/* Delete the range at position n in the range array + * Assumes the hostlist lock is already held. + */ +static void hostlist_delete_range(hostlist_t hl, int n) +{ + int i; + hostrange_t old; + + assert(hl != NULL); + assert(hl->magic == HOSTLIST_MAGIC); + assert(n < hl->nranges && n >= 0); + + old = hl->hr[n]; + for (i = n; i < hl->nranges - 1; i++) + hl->hr[i] = hl->hr[i + 1]; + hl->nranges--; + hl->hr[hl->nranges] = NULL; + hostlist_shift_iterators(hl, n, 0, 1); + + /* XXX caller responsible for adjusting nhosts */ + /* hl->nhosts -= hostrange_count(old) */ + + hostrange_destroy(old); +} + +#if WANT_RECKLESS_HOSTRANGE_EXPANSION + +/* The reckless hostrange expansion function. + * See comment in hostlist.h:hostlist_create() for more info on + * the different choices for hostlist notation. + */ +hostlist_t _hostlist_create(const char *hostlist, char *sep, char *r_op) +{ + char *str, *orig; + char *tok, *cur; + int high, low, fmt = 0; + char prefix[256] = ""; + int pos = 0; + int error = 0; + char range_op = r_op[0];/* XXX support > 1 char range ops in future? */ + + hostlist_t new = hostlist_new(); + + if (hostlist == NULL) + return new; + + orig = str = strdup(hostlist); + + /* return an empty list if an empty string was passed in */ + if (str == NULL || strlen(str) == 0) + goto done; + + /* Use hostlist_create_bracketed if we see "[" */ + if (strchr(str, '[') != NULL) + return _hostlist_create_bracketed(hostlist, sep, r_op); + + while ((tok = _next_tok(sep, &str)) != NULL) { + + /* save the current string for error messages */ + cur = tok; + + high = low = 0; + + /* find end of alpha part + * do this by finding last occurence of range_op in str */ + pos = strlen(tok) - 1; + if (strstr(tok, r_op) != '\0') { + while (pos >= 0 && (char) tok[pos] != range_op) + pos--; + } + + /* now back up past any digits */ + while (pos >= 0 && isdigit((char) tok[--pos])) {;} + + /* Check for valid x-y range (x must be a digit) + * Reset pos if the range is not valid */ + if (!isdigit((char) tok[++pos])) + pos = strlen(tok) - 1; + + /* create prefix string + * if prefix will be zero length, but prefix already exists + * use the previous prefix and fmt + */ + if ((pos > 0) || (prefix[0] == '\0')) { + memcpy(prefix, tok, (size_t) pos * sizeof(char)); + prefix[pos] = '\0'; + + /* push pointer past prefix */ + tok += pos; + + /* count number of digits for ouput fmt */ + for (fmt = 0; isdigit(tok[fmt]); ++fmt) {;} + + if (fmt == 0) + error = 1; + + } else + tok += pos; + + /* get lower bound */ + low = strtoul(tok, (char **) &tok, 10); + + if (*tok == range_op) { /* now get range upper bound */ + /* push pointer past range op */ + ++tok; + + /* find length of alpha part */ + for (pos = 0; tok[pos] && !isdigit(tok[pos]); ++pos) {;} + + /* alpha part must match prefix or error + * this could mean we've got something like "rtr1-a2" + * so just record an error + */ + if (pos > 0) { + if (pos != strlen(prefix) || + strncmp(prefix, tok, pos) != 0) + error = 1; + } + + if (*tok != '\0') + tok += pos; + + /* make sure we have digits to the end */ + for (pos = 0; tok[pos] && isdigit((char) tok[pos]); ++pos) {;} + + if (pos > 0) { /* we have digits to process */ + high = strtoul(tok, (char **) &tok, 10); + } else { /* bad boy, no digits */ + error = 1; + } + + if ((low > high) || (high - low > MAX_RANGE)) + error = 1; + + } else { /* single value */ + high = 0; /* special case, ugh. */ + } + + /* error if: + * 1. we are not at end of string + * 2. upper bound equals lower bound + */ + if (*tok != '\0' || high == low) + error = 1; + + if (error) { /* assume this is not a range on any error */ + hostlist_push_host(new, cur); + } else { + if (high < low) + high = low; + hostlist_push_hr(new, prefix, low, high, fmt); + } + + error = 0; + } + + done: + if(orig) + free(orig); + + return new; +} + +#else /* !WANT_RECKLESS_HOSTRANGE_EXPANSION */ + +hostlist_t _hostlist_create(const char *hostlist, char *sep, char *r_op) +{ + return _hostlist_create_bracketed(hostlist, sep, r_op); +} + +#endif /* WANT_RECKLESS_HOSTRANGE_EXPANSION */ + +struct _range { + unsigned long lo, hi; + int width; +}; + +/* Grab a single range from str + * returns 1 if str contained a valid number or range, + * 0 if conversion of str to a range failed. + */ +static int _parse_single_range(const char *str, struct _range *range) +{ + char *p, *q; + char *orig = strdup(str); + if (!orig) + seterrno_ret(ENOMEM, 0); + + if ((p = strchr(str, '-'))) { + *p++ = '\0'; + if (*p == '-') /* do NOT allow negative numbers */ + goto error; + } + range->lo = strtoul(str, &q, 10); + if (q == str) + goto error; + + range->hi = (p && *p) ? strtoul(p, &q, 10) : range->lo; + + if (q == p || *q != '\0') + goto error; + + if (range->lo > range->hi) + goto error; + + if (range->hi - range->lo + 1 > MAX_RANGE ) { + _error(__FILE__, __LINE__, "Too many hosts in range `%s'\n", orig); + free(orig); + seterrno_ret(ERANGE, 0); + } + + free(orig); + range->width = strlen(str); + return 1; + + error: + errno = EINVAL; + _error(__FILE__, __LINE__, "Invalid range: `%s'", orig); + free(orig); + return 0; +} + +/* + * Convert description of a rectangular prism in 3-D node space into a set of + * sequential node ranges. + * str IN - contains "x" in which the two number describe the + * XYZ boundaries of the nodes, each must contain three-digits + * ranges IN/OUT - set of high/low numeric ranges based upon sequential ordering + * len IN - number of entries in ranges structure + * count OUT - location in ranges of first unused entry + * RET 1 if str contained a valid number or range, + * 0 if conversion of str to a range failed. + */ +static int _parse_box_range(char *str, struct _range *ranges, int len, int *count) +{ + int a1, a2, a3, b1, b2, b3, i1, i2; + char new_str[8]; + + a1 = str[0] - '0'; + a2 = str[1] - '0'; + a3 = str[2] - '0'; + b1 = str[4] - '0'; + b2 = str[5] - '0'; + b3 = str[6] - '0'; + if ((a1 < 0) || (a1 > 9) || + (a2 < 0) || (a2 > 9) || + (a3 < 0) || (a3 > 9) || + (str[3] != 'x') || + (b1 < 0) || (b1 > 9) || (b1 < a1) || + (b2 < 0) || (b2 > 9) || (b2 < a2) || + (b3 < 0) || (b3 > 9) || (b3 < a3) || + (str[7] != '\0')) + return 0; + + for (i1=a1; i1 <= b1; i1++) { + for (i2=a2; i2 <=b2; i2++) { + if (*count == len) + return -1; + snprintf(new_str, 8, "%d%d%d-%d%d%d", + i1, i2, a3, i1, i2, b3); + if (!_parse_single_range(new_str,&ranges[*count])) + return -1; + (*count)++; + } + } + return 1; +} + +/* + * Convert 'str' containing comma separated digits and ranges into an array + * of struct _range types (max 'len' elements). + * + * Return number of ranges created, or -1 on error. + */ +static int _parse_range_list(char *str, struct _range *ranges, int len) +{ + char *p; + int count = 0; + + while (str) { + if (count == len) + return -1; + if ((p = strchr(str, ','))) + *p++ = '\0'; + if ((str[3] == 'x') && (strlen(str) == 7)) { + if (!_parse_box_range(str, ranges, len, &count)) + return -1; + } else { + if (!_parse_single_range(str, &ranges[count++])) + return -1; + } + str = p; + } + return count; +} + +static void +_push_range_list(hostlist_t hl, char *pfx, struct _range *rng, + int n) +{ + int i; + + for (i = 0; i < n; i++) { + hostlist_push_hr(hl, pfx, rng->lo, rng->hi, rng->width); + rng++; + } +} + +/* + * Create a hostlist from a string with brackets '[' ']' to aid + * detection of ranges and compressed lists + */ +static hostlist_t +_hostlist_create_bracketed(const char *hostlist, char *sep, char *r_op) +{ + hostlist_t new = hostlist_new(); + struct _range ranges[MAX_RANGES]; + int nr, err; + char *p, *tok, *str, *orig; + char cur_tok[1024]; + + if (hostlist == NULL) + return new; + + if (!(orig = str = strdup(hostlist))) { + hostlist_destroy(new); + return NULL; + } + + while ((tok = _next_tok(sep, &str)) != NULL) { + strncpy(cur_tok, tok, 1024); + + if ((p = strchr(tok, '[')) != NULL) { + char *q, *prefix = tok; + *p++ = '\0'; + + if ((q = strchr(p, ']'))) { + *q = '\0'; + nr = _parse_range_list(p, ranges, MAX_RANGES); + if (nr < 0) + goto error; + _push_range_list(new, prefix, ranges, nr); + + + } else + hostlist_push_host(new, cur_tok); + + } else + hostlist_push_host(new, cur_tok); + } + + free(orig); + return new; + + error: + err = errno; + hostlist_destroy(new); + free(orig); + seterrno_ret(err, NULL); +} + + + +hostlist_t hostlist_create(const char *str) +{ + return _hostlist_create(str, "\t, ", "-"); +} + + +hostlist_t hostlist_copy(const hostlist_t hl) +{ + int i; + hostlist_t new; + + if (!hl) + return NULL; + + LOCK_HOSTLIST(hl); + if (!(new = hostlist_new())) + goto done; + + new->nranges = hl->nranges; + new->nhosts = hl->nhosts; + if (new->nranges > new->size) + hostlist_resize(new, new->nranges); + + for (i = 0; i < hl->nranges; i++) + new->hr[i] = hostrange_copy(hl->hr[i]); + + done: + UNLOCK_HOSTLIST(hl); + return new; +} + + +void hostlist_destroy(hostlist_t hl) +{ + int i; + if (!hl) + return; + LOCK_HOSTLIST(hl); + while (hl->ilist) { + mutex_unlock(&hl->mutex); + hostlist_iterator_destroy(hl->ilist); + mutex_lock(&hl->mutex); + } + for (i = 0; i < hl->nranges; i++) + hostrange_destroy(hl->hr[i]); + free(hl->hr); + assert(hl->magic = 0x1); + UNLOCK_HOSTLIST(hl); + mutex_destroy(&hl->mutex); + free(hl); +} + + +int hostlist_push(hostlist_t hl, const char *hosts) +{ + hostlist_t new; + int retval; + if (!hosts || !hl) + return 0; + new = hostlist_create(hosts); + if (!new) + return 0; + mutex_lock(&new->mutex); + retval = new->nhosts; + mutex_unlock(&new->mutex); + hostlist_push_list(hl, new); + hostlist_destroy(new); + return retval; +} + +int hostlist_push_host(hostlist_t hl, const char *str) +{ + hostrange_t hr; + hostname_t hn; + + if (!str || !hl) + return 0; + + hn = hostname_create(str); + + if (hostname_suffix_is_valid(hn)) { + hr = hostrange_create(hn->prefix, hn->num, hn->num, + hostname_suffix_width(hn)); + } else + hr = hostrange_create_single(str); + + hostlist_push_range(hl, hr); + + hostrange_destroy(hr); + hostname_destroy(hn); + + return 1; +} + +int hostlist_push_list(hostlist_t h1, hostlist_t h2) +{ + int i, n = 0; + + if (!h2 || !h1) + return 0; + + LOCK_HOSTLIST(h2); + + for (i = 0; i < h2->nranges; i++) + n += hostlist_push_range(h1, h2->hr[i]); + + UNLOCK_HOSTLIST(h2); + + return n; +} + + +char *hostlist_pop(hostlist_t hl) +{ + char *host = NULL; + if(!hl) { + error("hostlist_pop: no hoslist given"); + return NULL; + } + + LOCK_HOSTLIST(hl); + if (hl->nhosts > 0) { + hostrange_t hr = hl->hr[hl->nranges - 1]; + host = hostrange_pop(hr); + hl->nhosts--; + if (hostrange_empty(hr)) { + hostrange_destroy(hl->hr[--hl->nranges]); + hl->hr[hl->nranges] = NULL; + } + } + UNLOCK_HOSTLIST(hl); + return host; +} + +/* find all iterators affected by a shift (or deletion) at + * hl->hr[idx], depth, with the deletion of n ranges */ +static void +hostlist_shift_iterators(hostlist_t hl, int idx, int depth, int n) +{ + hostlist_iterator_t i; + if(!hl) { + error("hostlist_shift_iterators: no hoslist given"); + return; + } + for (i = hl->ilist; i; i = i->next) { + if (n == 0) { + if (i->idx == idx && i->depth >= depth) + i->depth = i->depth > -1 ? i->depth - 1 : -1; + } else { + if (i->idx >= idx) { + if ((i->idx -= n) >= 0) + i->hr = i->hl->hr[i->idx]; + else + hostlist_iterator_reset(i); + } + } + } +} + +char *hostlist_shift(hostlist_t hl) +{ + char *host = NULL; + + if(!hl){ + error("hostlist_shift: no hoslist given"); + return NULL; + } + LOCK_HOSTLIST(hl); + + if (hl->nhosts > 0) { + hostrange_t hr = hl->hr[0]; + + host = hostrange_shift(hr); + hl->nhosts--; + + if (hostrange_empty(hr)) { + hostlist_delete_range(hl, 0); + /* hl->nranges--; */ + } else + hostlist_shift_iterators(hl, 0, 0, 0); + } + + UNLOCK_HOSTLIST(hl); + + return host; +} + + +char *hostlist_pop_range(hostlist_t hl) +{ + int i; + char buf[MAXHOSTRANGELEN + 1]; + hostlist_t hltmp; + hostrange_t tail; + + if(!hl) + return NULL; + LOCK_HOSTLIST(hl); + if (hl->nranges < 1 || !(hltmp = hostlist_new())) { + UNLOCK_HOSTLIST(hl); + return NULL; + } + + i = hl->nranges - 2; + tail = hl->hr[hl->nranges - 1]; + while (i >= 0 && hostrange_within_range(tail, hl->hr[i])) + i--; + + for (i++; i < hl->nranges; i++) { + hostlist_push_range(hltmp, hl->hr[i]); + hostrange_destroy(hl->hr[i]); + hl->hr[i] = NULL; + } + hl->nhosts -= hltmp->nhosts; + hl->nranges -= hltmp->nranges; + + UNLOCK_HOSTLIST(hl); + hostlist_ranged_string(hltmp, MAXHOSTRANGELEN, buf); + hostlist_destroy(hltmp); + return strdup(buf); +} + + +char *hostlist_shift_range(hostlist_t hl) +{ + int i; + char buf[1024]; + hostlist_t hltmp = hostlist_new(); + if (!hltmp || !hl) + return NULL; + + LOCK_HOSTLIST(hl); + + if (hl->nranges == 0) { + hostlist_destroy(hltmp); + UNLOCK_HOSTLIST(hl); + return NULL; + } + + i = 0; + do { + hostlist_push_range(hltmp, hl->hr[i]); + hostrange_destroy(hl->hr[i]); + } while ( (++i < hl->nranges) + && hostrange_within_range(hltmp->hr[0], hl->hr[i]) ); + + hostlist_shift_iterators(hl, i, 0, hltmp->nranges); + + /* shift rest of ranges back in hl */ + for (; i < hl->nranges; i++) { + hl->hr[i - hltmp->nranges] = hl->hr[i]; + hl->hr[i] = NULL; + } + hl->nhosts -= hltmp->nhosts; + hl->nranges -= hltmp->nranges; + + UNLOCK_HOSTLIST(hl); + + hostlist_ranged_string(hltmp, 1024, buf); + hostlist_destroy(hltmp); + + return strdup(buf); +} + +/* XXX: Note: efficiency improvements needed */ +int hostlist_delete(hostlist_t hl, const char *hosts) +{ + int n = 0; + char *hostname = NULL; + hostlist_t hltmp; + if(!hl) + return -1; + + if (!(hltmp = hostlist_create(hosts))) + seterrno_ret(EINVAL, 0); + + while ((hostname = hostlist_pop(hltmp)) != NULL) { + n += hostlist_delete_host(hl, hostname); + free(hostname); + } + hostlist_destroy(hltmp); + + return n; +} + + +/* XXX watch out! poor implementation follows! (fix it at some point) */ +int hostlist_delete_host(hostlist_t hl, const char *hostname) +{ + int n; + + if(!hl) + return -1; + n = hostlist_find(hl, hostname); + + if (n >= 0) + hostlist_delete_nth(hl, n); + return n >= 0 ? 1 : 0; +} + + +static char * +_hostrange_string(hostrange_t hr, int depth) +{ + char buf[MAXHOSTNAMELEN + 16]; + int len = snprintf(buf, MAXHOSTNAMELEN + 15, "%s", hr->prefix); + + if (!hr->singlehost) + snprintf(buf+len, MAXHOSTNAMELEN+15 - len, "%0*lu", + hr->width, hr->lo + depth); + return strdup(buf); +} + +char * hostlist_nth(hostlist_t hl, int n) +{ + char *host = NULL; + int i, count; + + if(!hl) + return NULL; + LOCK_HOSTLIST(hl); + count = 0; + for (i = 0; i < hl->nranges; i++) { + int num_in_range = hostrange_count(hl->hr[i]); + + if (n <= (num_in_range - 1 + count)) { + host = _hostrange_string(hl->hr[i], n - count); + break; + } else + count += num_in_range; + } + + UNLOCK_HOSTLIST(hl); + + return host; +} + + +int hostlist_delete_nth(hostlist_t hl, int n) +{ + int i, count; + + if(!hl) + return -1; + LOCK_HOSTLIST(hl); + assert(n >= 0 && n <= hl->nhosts); + + count = 0; + + for (i = 0; i < hl->nranges; i++) { + int num_in_range = hostrange_count(hl->hr[i]); + hostrange_t hr = hl->hr[i]; + + if (n <= (num_in_range - 1 + count)) { + unsigned long num = hr->lo + n - count; + hostrange_t new; + + if (hr->singlehost) { /* this wasn't a range */ + hostlist_delete_range(hl, i); + } else if ((new = hostrange_delete_host(hr, num))) { + hostlist_insert_range(hl, new, i + 1); + hostrange_destroy(new); + } else if (hostrange_empty(hr)) + hostlist_delete_range(hl, i); + + goto done; + } else + count += num_in_range; + + } + + done: + UNLOCK_HOSTLIST(hl); + hl->nhosts--; + return 1; +} + +int hostlist_count(hostlist_t hl) +{ + int retval; + if(!hl) + return -1; + + LOCK_HOSTLIST(hl); + retval = hl->nhosts; + UNLOCK_HOSTLIST(hl); + return retval; +} + +int hostlist_find(hostlist_t hl, const char *hostname) +{ + int i, count, ret = -1; + hostname_t hn; + + if (!hostname || !hl) + return -1; + + hn = hostname_create(hostname); + + LOCK_HOSTLIST(hl); + + for (i = 0, count = 0; i < hl->nranges; i++) { + if (hostrange_hn_within(hl->hr[i], hn)) { + if (hostname_suffix_is_valid(hn)) + ret = count + hn->num - hl->hr[i]->lo; + else + ret = count; + goto done; + } else + count += hostrange_count(hl->hr[i]); + } + + done: + UNLOCK_HOSTLIST(hl); + hostname_destroy(hn); + return ret; +} + +/* hostrange compare with void * arguments to allow use with + * libc qsort() + */ +int _cmp(const void *hr1, const void *hr2) +{ + hostrange_t *h1 = (hostrange_t *) hr1; + hostrange_t *h2 = (hostrange_t *) hr2; + return hostrange_cmp((hostrange_t) * h1, (hostrange_t) * h2); +} + + +void hostlist_sort(hostlist_t hl) +{ + hostlist_iterator_t i; + LOCK_HOSTLIST(hl); + + if (hl->nranges <= 1) { + UNLOCK_HOSTLIST(hl); + return; + } + + qsort(hl->hr, hl->nranges, sizeof(hostrange_t), &_cmp); + + /* reset all iterators */ + for (i = hl->ilist; i; i = i->next) + hostlist_iterator_reset(i); + + UNLOCK_HOSTLIST(hl); + + hostlist_coalesce(hl); + +} + + +/* search through hostlist for ranges that can be collapsed + * does =not= delete any hosts + */ +static void hostlist_collapse(hostlist_t hl) +{ + int i; + + LOCK_HOSTLIST(hl); + for (i = hl->nranges - 1; i > 0; i--) { + hostrange_t hprev = hl->hr[i - 1]; + hostrange_t hnext = hl->hr[i]; + + if (hostrange_prefix_cmp(hprev, hnext) == 0 && + hprev->hi == hnext->lo - 1 && + hostrange_width_combine(hprev, hnext)) { + hprev->hi = hnext->hi; + hostlist_delete_range(hl, i); + } + } + UNLOCK_HOSTLIST(hl); +} + +/* search through hostlist (hl) for intersecting ranges + * split up duplicates and coalesce ranges where possible + */ +static void hostlist_coalesce(hostlist_t hl) +{ + int i, j; + hostrange_t new; + + LOCK_HOSTLIST(hl); + + for (i = hl->nranges - 1; i > 0; i--) { + + new = hostrange_intersect(hl->hr[i - 1], hl->hr[i]); + + if (new) { + hostrange_t hprev = hl->hr[i - 1]; + hostrange_t hnext = hl->hr[i]; + j = i; + + if (new->hi < hprev->hi) + hnext->hi = hprev->hi; + + hprev->hi = new->lo; + hnext->lo = new->hi; + + if (hostrange_empty(hprev)) + hostlist_delete_range(hl, i); + + while (new->lo <= new->hi) { + hostrange_t hr = hostrange_create( new->prefix, + new->lo, new->lo, + new->width ); + + if (new->lo > hprev->hi) + hostlist_insert_range(hl, hr, j++); + + if (new->lo < hnext->lo) + hostlist_insert_range(hl, hr, j++); + + hostrange_destroy(hr); + + new->lo++; + } + i = hl->nranges; + hostrange_destroy(new); + } + } + UNLOCK_HOSTLIST(hl); + + hostlist_collapse(hl); + +} + +/* attempt to join ranges at loc and loc-1 in a hostlist */ +/* delete duplicates, return the number of hosts deleted */ +/* assumes that the hostlist hl has been locked by caller */ +static int _attempt_range_join(hostlist_t hl, int loc) +{ + int ndup; + assert(hl != NULL); + assert(hl->magic == HOSTLIST_MAGIC); + assert(loc > 0); + assert(loc < hl->nranges); + ndup = hostrange_join(hl->hr[loc - 1], hl->hr[loc]); + if (ndup >= 0) { + hostlist_delete_range(hl, loc); + hl->nhosts -= ndup; + } + return ndup; +} + +void hostlist_uniq(hostlist_t hl) +{ + int i = 1; + hostlist_iterator_t hli; + LOCK_HOSTLIST(hl); + if (hl->nranges <= 1) { + UNLOCK_HOSTLIST(hl); + return; + } + qsort(hl->hr, hl->nranges, sizeof(hostrange_t), &_cmp); + + while (i < hl->nranges) { + if (_attempt_range_join(hl, i) < 0) /* No range join occurred */ + i++; + } + + /* reset all iterators */ + for (hli = hl->ilist; hli; hli = hli->next) + hostlist_iterator_reset(hli); + + UNLOCK_HOSTLIST(hl); +} + + +size_t hostlist_deranged_string(hostlist_t hl, size_t n, char *buf) +{ + int i; + int len = 0; + int truncated = 0; + + LOCK_HOSTLIST(hl); + for (i = 0; i < hl->nranges; i++) { + size_t m = (n - len) <= n ? n - len : 0; + int ret = hostrange_to_string(hl->hr[i], m, buf + len, ","); + if (ret < 0 || ret > m) { + len = n; + truncated = 1; + break; + } + len+=ret; + buf[len++] = ','; + } + UNLOCK_HOSTLIST(hl); + + buf[len > 0 ? --len : 0] = '\0'; + if (len == n) + truncated = 1; + + return truncated ? -1 : len; +} + +/* return true if a bracket is needed for the range at i in hostlist hl */ +static int _is_bracket_needed(hostlist_t hl, int i) +{ + hostrange_t h1 = hl->hr[i]; + hostrange_t h2 = i < hl->nranges - 1 ? hl->hr[i + 1] : NULL; + return hostrange_count(h1) > 1 || hostrange_within_range(h1, h2); +} + +/* write the next bracketed hostlist, i.e. prefix[n-m,k,...] + * into buf, writing at most n chars including the terminating '\0' + * + * leaves start pointing to one past last range object in bracketed list, + * and returns the number of bytes written into buf. + * + * Assumes hostlist is locked. + */ +static int +_get_bracketed_list(hostlist_t hl, int *start, const size_t n, char *buf) +{ + hostrange_t *hr = hl->hr; + int i = *start; + int m, len = 0; + int bracket_needed = _is_bracket_needed(hl, i); + + len = snprintf(buf, n, "%s", hr[i]->prefix); + + if ((len < 0) || (len > n)) + return n; /* truncated, buffer filled */ + + if (bracket_needed && len < n && len >= 0) + buf[len++] = '['; + + do { + m = (n - len) <= n ? n - len : 0; + len += hostrange_numstr(hr[i], m, buf + len); + if (len >= n) + break; + if (bracket_needed) /* Only need commas inside brackets */ + buf[len++] = ','; + } while (++i < hl->nranges && hostrange_within_range(hr[i], hr[i-1])); + + if (bracket_needed && len < n && len > 0) { + + /* Add trailing bracket (change trailing "," from above to "]" */ + buf[len - 1] = ']'; + + /* NUL terminate for safety, but do not add terminator to len */ + buf[len] = '\0'; + + } else if (len >= n) { + if (n > 0) + buf[n-1] = '\0'; + + } else { + /* If len is > 0, NUL terminate (but do not add to len) */ + buf[len > 0 ? len : 0] = '\0'; + } + + *start = i; + return len; +} + +#ifdef HAVE_BG + +/* logic for block node description */ +/* write the next bracketed hostlist, i.e. prefix[n-m,k,...] + * into buf, writing at most n chars including the terminating '\0' + * + * leaves start pointing to one past last range object in bracketed list, + * and returns the number of bytes written into buf. + * + * Assumes hostlist is locked. + */ +static int +_get_boxes(char *buf, int max_len) +{ + int i, j, k, len = 0; + int is_box, start_box=-1, end_box=-1; + + /* scan each X-plane for a box then match across X values */ + for (i=axis_min_x; i<=axis_max_x; i++) { + is_box = 1; + for (j=axis_min_y; j<=axis_max_y; j++) { + for (k=axis_min_z; k<=axis_max_z; k++) { + if (!axis[i][j][k]) { + is_box = 0; + break; + } + } + } + if (is_box) { + if (start_box == -1) + start_box = i; + end_box = i; + } + if (((len+8) < max_len) && (start_box != -1) + && ((is_box == 0) || (i == axis_max_x))) { + sprintf(buf+len,"%d%d%dx%d%d%d,", + start_box, axis_min_y, axis_min_z, + end_box, axis_max_y, axis_max_z); + len += 8; + start_box = -1; + end_box = -1; + } + if (is_box == 0) { + for (j=axis_min_y; j<=axis_max_y; j++) { + for (k=axis_min_z; k<=axis_max_z; k++) { + if (!axis[i][j][k]) + continue; + if ((len+4) >= max_len) + break; + sprintf(buf+len,"%d%d%d,", + i, j, k); + len += 4; + } + } + } + } + + buf[len - 1] = ']'; + + /* NUL terminate for safety, but do not add terminator to len */ + buf[len] = '\0'; + + return len; +} + +static void +_clear_grid(void) +{ + bzero(axis, sizeof(axis)); + + axis_min_x = 10; + axis_min_y = 10; + axis_min_z = 10; + + axis_max_x = -1; + axis_max_y = -1; + axis_max_z = -1; +} + +static void +_set_grid(unsigned long start, unsigned long end) +{ + int pt1 = (int) start; + int pt2 = (int) end; + int x1, y1, z1, x2, y2, z2; + int temp, temp1, temp2; + + x1 = (pt1 / 100) % 10; + y1 = (pt1 / 10) % 10; + z1 = pt1 % 10; + + x2 = (pt2 / 100) % 10; + y2 = (pt2 / 10) % 10; + z2 = pt2 % 10; + + axis_min_x = MIN(axis_min_x, x1); + axis_min_y = MIN(axis_min_y, y1); + axis_min_z = MIN(axis_min_z, z1); + + axis_max_x = MAX(axis_max_x, x2); + axis_max_y = MAX(axis_max_y, y2); + axis_max_z = MAX(axis_max_z, z2); + for (temp=x1; temp<=x2; temp++) { + for (temp1=y1; temp1<=y2; temp1++) { + for (temp2=z1; temp2<=z2; temp2++) { + axis[temp][temp1][temp2] = true; + } + } + } +} + +static bool +_test_box(void) +{ + int temp, temp1, temp2; + + if ((axis_min_x > axis_max_x) + || (axis_min_y > axis_max_y) + || (axis_min_z > axis_max_z)) + return false; + + if ((axis_min_x == axis_max_x) + && (axis_min_y == axis_max_y) + && (axis_min_z == axis_max_z)) + return false; /* single node */ + + for (temp = axis_min_x; temp<=axis_max_x; temp++) { + for (temp1 = axis_min_y; temp1<=axis_max_y; temp1++) { + for (temp2 = axis_min_z; temp2<=axis_max_z; temp2++) { + if (!axis[temp][temp1][temp2]) + return false; /* gap in box */ + } + } + } + + return true; +} +#endif + +size_t hostlist_ranged_string(hostlist_t hl, size_t n, char *buf) +{ + int i = 0; + int len = 0; + int truncated = 0; + bool box = false; + + LOCK_HOSTLIST(hl); + +#ifdef HAVE_BG /* logic for block node description */ + if (hl->nranges < 1) + goto notbox; /* no data */ + if (hl->hr[0]->width != 3) + goto notbox; /* not Blue Gene format */ + _clear_grid(); + for (i=0;inranges;i++) + _set_grid(hl->hr[i]->lo, hl->hr[i]->hi); + if ((axis_min_x == axis_max_x) && (axis_min_y == axis_max_y) + && (axis_min_z == axis_max_z)) { + len += snprintf(buf, n, "%s%d%d%d", + hl->hr[0]->prefix, + axis_min_x, axis_min_y, axis_min_z); + if ((len < 0) || (len > n)) + len = n; /* truncated */ + } else if (!_test_box()) { + sprintf(buf, "%s[", hl->hr[0]->prefix); + len = strlen(hl->hr[0]->prefix) + 1; + len += _get_boxes(buf + len, (n-len)); + } else { + len += snprintf(buf, n, "%s[%d%d%dx%d%d%d]", + hl->hr[0]->prefix, + axis_min_x, axis_min_y, axis_min_z, + axis_max_x, axis_max_y, axis_max_z); + if ((len < 0) || (len > n)) + len = n; /* truncated */ + } + box = true; + +notbox: +#endif + if (!box) { + i=0; + while (i < hl->nranges && len < n) { + len += _get_bracketed_list(hl, &i, n - len, buf + len); + if ((len > 0) && (len < n) && (i < hl->nranges)) + buf[len++] = ','; + } + } + + UNLOCK_HOSTLIST(hl); + + /* NUL terminate */ + if (len >= n) { + truncated = 1; + if (n > 0) + buf[n-1] = '\0'; + } else + buf[len > 0 ? len : 0] = '\0'; + + return truncated ? -1 : len; +} +/* ----[ hostlist iterator functions ]---- */ + +static hostlist_iterator_t hostlist_iterator_new(void) +{ + hostlist_iterator_t i = (hostlist_iterator_t) malloc(sizeof(*i)); + if (!i) + return NULL; + i->hl = NULL; + i->hr = NULL; + i->idx = 0; + i->depth = -1; + i->next = i; + assert(i->magic = HOSTLIST_MAGIC); + return i; +} + +hostlist_iterator_t hostlist_iterator_create(hostlist_t hl) +{ + hostlist_iterator_t i; + + if (!(i = hostlist_iterator_new())) + out_of_memory("hostlist_iterator_create"); + + LOCK_HOSTLIST(hl); + i->hl = hl; + i->hr = hl->hr[0]; + i->next = hl->ilist; + hl->ilist = i; + UNLOCK_HOSTLIST(hl); + return i; +} + +hostlist_iterator_t hostset_iterator_create(hostset_t set) +{ + return hostlist_iterator_create(set->hl); +} + +void hostlist_iterator_reset(hostlist_iterator_t i) +{ + assert(i != NULL); + assert(i->magic == HOSTLIST_MAGIC); + i->idx = 0; + i->hr = i->hl->hr[0]; + i->depth = -1; + return; +} + +void hostlist_iterator_destroy(hostlist_iterator_t i) +{ + hostlist_iterator_t *pi; + if (i == NULL) + return; + assert(i != NULL); + assert(i->magic == HOSTLIST_MAGIC); + LOCK_HOSTLIST(i->hl); + for (pi = &i->hl->ilist; *pi; pi = &(*pi)->next) { + assert((*pi)->magic == HOSTLIST_MAGIC); + if (*pi == i) { + *pi = (*pi)->next; + break; + } + } + UNLOCK_HOSTLIST(i->hl); + assert(i->magic = 0x1); + free(i); +} + +static void _iterator_advance(hostlist_iterator_t i) +{ + assert(i != NULL); + assert(i->magic == HOSTLIST_MAGIC); + + if (i->idx > i->hl->nranges - 1) + return; + + if (++(i->depth) > (i->hr->hi - i->hr->lo)) { + i->depth = 0; + i->hr = i->hl->hr[++i->idx]; + } +} + +/* advance iterator to end of current range (meaning within "[" "]") + * i.e. advance iterator past all range objects that could be represented + * in on bracketed hostlist. + */ +static void _iterator_advance_range(hostlist_iterator_t i) +{ + int nr, j; + hostrange_t *hr; + assert(i != NULL); + assert(i->magic == HOSTLIST_MAGIC); + + nr = i->hl->nranges; + hr = i->hl->hr; + j = i->idx; + if (++i->depth > 0) { + while (++j < nr && hostrange_within_range(i->hr, hr[j])) {;} + i->idx = j; + i->hr = i->hl->hr[i->idx]; + i->depth = 0; + } +} + +char *hostlist_next(hostlist_iterator_t i) +{ + char buf[MAXHOSTNAMELEN + 16]; + int len = 0; + assert(i != NULL); + assert(i->magic == HOSTLIST_MAGIC); + LOCK_HOSTLIST(i->hl); + _iterator_advance(i); + + if (i->idx > i->hl->nranges - 1) { + UNLOCK_HOSTLIST(i->hl); + return NULL; + } + + len = snprintf(buf, MAXHOSTNAMELEN + 15, "%s", i->hr->prefix); + if (!i->hr->singlehost) + snprintf(buf + len, MAXHOSTNAMELEN + 15 - len, "%0*lu", + i->hr->width, i->hr->lo + i->depth); + UNLOCK_HOSTLIST(i->hl); + return strdup(buf); +} + +char *hostlist_next_range(hostlist_iterator_t i) +{ + char buf[MAXHOSTRANGELEN + 1]; + int j; + + assert(i != NULL); + assert(i->magic == HOSTLIST_MAGIC); + LOCK_HOSTLIST(i->hl); + + _iterator_advance_range(i); + + if (i->idx > i->hl->nranges - 1) { + UNLOCK_HOSTLIST(i->hl); + return NULL; + } + + j = i->idx; + _get_bracketed_list(i->hl, &j, MAXHOSTRANGELEN, buf); + + UNLOCK_HOSTLIST(i->hl); + + return strdup(buf); +} + +int hostlist_remove(hostlist_iterator_t i) +{ + hostrange_t new; + assert(i != NULL); + assert(i->magic == HOSTLIST_MAGIC); + LOCK_HOSTLIST(i->hl); + new = hostrange_delete_host(i->hr, i->hr->lo + i->depth); + if (new) { + hostlist_insert_range(i->hl, new, i->idx + 1); + hostrange_destroy(new); + i->hr = i->hl->hr[++i->idx]; + i->depth = -1; + } else if (hostrange_empty(i->hr)) { + hostlist_delete_range(i->hl, i->idx); + /* i->hr = i->hl->hr[i->idx]; + i->depth = -1; */ + } else + i->depth--; + + i->hl->nhosts--; + UNLOCK_HOSTLIST(i->hl); + + return 1; +} + +/* ----[ hostset functions ]---- */ + +hostset_t hostset_create(const char *hostlist) +{ + hostset_t new; + + if (!(new = (hostset_t) malloc(sizeof(*new)))) + goto error1; + + if (!(new->hl = hostlist_create(hostlist))) + goto error2; + + hostlist_uniq(new->hl); + return new; + + error2: + free(new); + error1: + return NULL; +} + +hostset_t hostset_copy(const hostset_t set) +{ + hostset_t new; + if (!(new = (hostset_t) malloc(sizeof(*new)))) + goto error1; + + if (!(new->hl = hostlist_copy(set->hl))) + goto error2; + + return new; + error2: + free(new); + error1: + return NULL; +} + +void hostset_destroy(hostset_t set) +{ + if (set == NULL) + return; + hostlist_destroy(set->hl); + free(set); +} + +/* inserts a single range object into a hostset + * Assumes that the set->hl lock is already held + */ +static int hostset_insert_range(hostset_t set, hostrange_t hr) +{ + int i, n = 0; + int inserted = 0; + int retval = 0; + hostlist_t hl; + + hl = set->hl; + + if (hl->size == hl->nranges && !hostlist_expand(hl)) + return 0; + + retval = hostrange_count(hr); + + for (i = 0; i < hl->nranges; i++) { + if (hostrange_cmp(hr, hl->hr[i]) <= 0) { + n = hostrange_join(hr, hl->hr[i]); + + if (n >= 0) { + hostlist_delete_range(hl, i); + hl->nhosts -= n; + } + + hostlist_insert_range(hl, hr, i); + + /* now attempt to join hr[i] and hr[i-1] */ + if (i > 0) { + int m = _attempt_range_join(hl, i); + n += m; + } + inserted = 1; + break; + } + } + + if (inserted == 0) { + hl->hr[hl->nranges++] = hostrange_copy(hr); + n = _attempt_range_join(hl, hl->nranges - 1); + } + + return retval - n; +} + +int hostset_insert(hostset_t set, const char *hosts) +{ + int i, n = 0; + hostlist_t hl = hostlist_create(hosts); + if (!hl) + return 0; + + hostlist_uniq(hl); + LOCK_HOSTLIST(set->hl); + for (i = 0; i < hl->nranges; i++) + n += hostset_insert_range(set, hl->hr[i]); + UNLOCK_HOSTLIST(set->hl); + hostlist_destroy(hl); + return n; +} + + +/* linear search through N ranges for hostname "host" + * */ +static int hostset_find_host(hostset_t set, const char *host) +{ + int i; + int retval = 0; + hostname_t hn; + LOCK_HOSTLIST(set->hl); + hn = hostname_create(host); + for (i = 0; i < set->hl->nranges; i++) { + if (hostrange_hn_within(set->hl->hr[i], hn)) { + retval = 1; + goto done; + } + } + done: + UNLOCK_HOSTLIST(set->hl); + hostname_destroy(hn); + return retval; +} + +int hostset_within(hostset_t set, const char *hosts) +{ + int nhosts, nfound; + hostlist_t hl; + char *hostname; + + assert(set->hl->magic == HOSTLIST_MAGIC); + + hl = hostlist_create(hosts); + nhosts = hostlist_count(hl); + nfound = 0; + + while ((hostname = hostlist_pop(hl)) != NULL) { + nfound += hostset_find_host(set, hostname); + free(hostname); + } + + hostlist_destroy(hl); + + return (nhosts == nfound); +} + +int hostset_delete(hostset_t set, const char *hosts) +{ + return hostlist_delete(set->hl, hosts); +} + +int hostset_delete_host(hostset_t set, const char *hostname) +{ + return hostlist_delete_host(set->hl, hostname); +} + +char *hostset_shift(hostset_t set) +{ + return hostlist_shift(set->hl); +} + +char *hostset_pop(hostset_t set) +{ + return hostlist_pop(set->hl); +} + +char *hostset_shift_range(hostset_t set) +{ + return hostlist_shift_range(set->hl); +} + +char *hostset_pop_range(hostset_t set) +{ + return hostlist_pop_range(set->hl); +} + +int hostset_count(hostset_t set) +{ + return hostlist_count(set->hl); +} + +size_t hostset_ranged_string(hostset_t set, size_t n, char *buf) +{ + return hostlist_ranged_string(set->hl, n, buf); +} + +size_t hostset_deranged_string(hostset_t set, size_t n, char *buf) +{ + return hostlist_deranged_string(set->hl, n, buf); +} + +char * hostset_nth(hostset_t set, int n) +{ + return hostlist_nth(set->hl, n); +} + +int hostset_find(hostset_t set, const char *hostname) +{ + return hostlist_find(set->hl, hostname); +} + +#if TEST_MAIN + +int hostlist_nranges(hostlist_t hl) +{ + return hl->nranges; +} + +int hostset_nranges(hostset_t set) +{ + return set->hl->nranges; +} + +/* test iterator functionality on the list of hosts represented + * by list + */ +int iterator_test(char *list) +{ + int j; + char buf[1024]; + hostlist_t hl = hostlist_create(list); + hostset_t set = hostset_create(list); + + hostlist_iterator_t i = hostlist_iterator_create(hl); + hostlist_iterator_t seti = hostset_iterator_create(set); + hostlist_iterator_t i2 = hostlist_iterator_create(hl); + char *host; + + hostlist_ranged_string(hl, 1024, buf); + printf("iterator_test: hl = `%s' passed in `%s'\n", buf, list); + host = hostlist_next(i); + printf("first host in list hl = `%s'\n", host); + free(host); + + /* forge ahead three hosts with i2 */ + for (j = 0; j < 4; j++) { + host = hostlist_next(i2); + free(host); + } + + host = hostlist_shift(hl); + printf("result of shift(hl) = `%s'\n", host); + free(host); + host = hostlist_next(i); + printf("next host in list hl = `%s'\n", host); + free(host); + host = hostlist_next(i2); + printf("next host for i2 = `%s'\n", host); + free(host); + + hostlist_iterator_destroy(i); + + hostlist_destroy(hl); + hostset_destroy(set); + return 1; +} + +int main(int ac, char **av) +{ + char buf[1024000]; + int i; + char *str; + + hostlist_t hl1, hl2, hl3; + hostset_t set, set1; + hostlist_iterator_t iter, iter2; + + if (ac < 2) + printf("Recommended usage: %s [hostlist]\n\n", av[0]); + + if (!(hl1 = hostlist_create(ac > 1 ? av[1] : NULL))) { + perror("hostlist_create"); + exit(1); + } + + /* build a temporary hostlist, remove duplicates, + * use it to make the hostset */ + if (!(hl2 = hostlist_create(ac > 1 ? av[1] : NULL))) { + perror("hostlist_create"); + exit(1); + } + hostlist_uniq(hl2); + hostlist_ranged_string(hl2, 102400, buf); + if (!(set = hostset_create(buf))) { + perror("hostset_create"); + exit(1); + } + hostlist_destroy(hl2); + + hl3 = hostlist_create("f[0-5]"); + hostlist_delete(hl3, "f[1-3]"); + hostlist_ranged_string(hl3, 102400, buf); + printf("after delete = `%s'\n", buf); + hostlist_destroy(hl3); + + hl3 = hostlist_create("bg[012x123]"); + hostlist_ranged_string(hl3, 102400, buf); + printf("bg[012x123] == `%s'\n", buf); + i = hostlist_count(hl3); + assert(i == 8); + hostlist_ranged_string(hl3, 102400, buf); + hostlist_destroy(hl3); + + for (i = 2; i < ac; i++) { + hostlist_push(hl1, av[i]); + hostset_insert(set, av[i]); + } + + hostlist_ranged_string(hl1, 102400, buf); + printf("ranged = `%s'\n", buf); + + iterator_test(buf); + + hostlist_deranged_string(hl1, 10240, buf); + printf("deranged = `%s'\n", buf); + + hostset_ranged_string(set, 1024, buf); + printf("hostset = `%s'\n", buf); + + hostlist_sort(hl1); + hostlist_ranged_string(hl1, 1024, buf); + printf("sorted = `%s'\n", buf); + + hostlist_uniq(hl1); + hostlist_ranged_string(hl1, 1024, buf); + printf("uniqed = `%s'\n", buf); + + hl2 = hostlist_copy(hl1); + printf("pop_range: "); + while ((str = hostlist_pop_range(hl2))) { + printf("`%s' ", str); + free(str); + } + hostlist_destroy(hl2); + printf("\n"); + + hl2 = hostlist_copy(hl1); + printf("shift_range: "); + while ((str = hostlist_shift_range(hl2))) { + printf("`%s' ", str); + free(str); + } + hostlist_destroy(hl2); + printf("\n"); + + iter = hostset_iterator_create(set); + iter2 = hostset_iterator_create(set); + hostlist_iterator_destroy(iter2); + + printf("next: "); + while ((str = hostlist_next(iter))) { + printf("`%s' ", str); + free(str); + } + printf("\n"); + + hostlist_iterator_reset(iter); + printf("next_range: "); + while ((str = hostlist_next_range(iter))) { + printf("`%s' ", str); + free(str); + } + printf("\n"); + + printf("nranges = %d\n", hostset_nranges(set)); + + hostset_ranged_string(set, 1024, buf); + printf("set = %s\n", buf); + + hostset_destroy(set); + hostlist_destroy(hl1); + return 0; +} + +#endif /* TEST_MAIN */ + +/* + * vi: tabstop=4 shiftwidth=4 expandtab + */ diff --git a/executable_names/src/common/hostlist.h b/executable_names/src/common/hostlist.h new file mode 100644 index 0000000000000000000000000000000000000000..f8a427673cc571f12d1d91e24b4602aed1b19ee0 --- /dev/null +++ b/executable_names/src/common/hostlist.h @@ -0,0 +1,457 @@ +/*****************************************************************************\ + * $Id$ + ***************************************************************************** + * $LSDId: hostlist.h,v 1.4 2003/09/19 21:37:34 grondo Exp $ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _HOSTLIST_H +#define _HOSTLIST_H + +/* Notes: + * + * If WITH_LSD_FATAL_ERROR_FUNC is defined, the linker will expect to + * find and external lsd_fatal_error(file,line,mesg) function. By default, + * lsd_fatal_error(file,line,mesg) is a macro definition that outputs an + * error message to stderr. This macro may be redefined to invoke another + * routine instead. e.g.: + * + * #define lsd_fatal_error(file,line,mesg) \ + * error("%s:%s %s\n",file,line,mesg); + * + * If WITH_LSD_NOMEM_ERROR_FUNC is defined, the linker will expect to + * find an external lsd_nomem_error(file,line,mesg) function. By default, + * lsd_nomem_error(file,line,mesg) is a macro definition that returns NULL. + * This macro may be redefined to invoke another routine instead. + * + * If WITH_PTHREADS is defined, these routines will be thread-safe. + * + */ + +/* The hostlist opaque data type + * + * A hostlist is a list of hostnames optimized for a prefixXXXX style + * naming convention, where XXXX is a decimal, numeric suffix. + */ +#ifndef __hostlist_t_defined +# define __hostlist_t_defined + typedef struct hostlist * hostlist_t; +#endif + +/* A hostset is a special case of a hostlist. It: + * + * 1. never contains duplicates + * 2. is always sorted + * (Note: sort occurs first on alphanumeric prefix -- where prefix + * matches, numeric suffixes will be sorted *by value*) + */ +typedef struct hostset * hostset_t; + +/* The hostlist iterator type (may be used with a hostset as well) + * used for non-destructive access to hostlist members. + * + */ +typedef struct hostlist_iterator * hostlist_iterator_t; + +/* ----[ hostlist_t functions: ]---- */ + +/* ----[ hostlist creation and destruction ]---- */ + +//int set_grid(hostlist_t hl, int count); +int set_grid(int start, int end, int count); +/* + * hostlist_create(): + * + * Create a new hostlist from a string representation. + * + * The string representation may contain one or more hostnames or + * bracketed hostlists separated by either `,' or whitespace (e.g. + * "alpha,beta,gamma"). A bracketed hostlist is denoted by a common + * prefix followed by a list of numeric ranges contained within brackets + * (e.g. "tux[0-5,12,20-25]"). Note that the numeric ranges can include + * one or more leading zeros to indicate the numeric portion has a + * fixed number of digits (e.g. "linux[0000-1023]"). + * + * To support the BlueGene system's 3-D topology, a node name prefix + * is followed by three digits identifying the node's position in + * the X, Y and Z positions respectively. For example "bgl123" represents + * the node or midplane with an X position of 1, Y of 2, and Z of 3. + * A rectangular prism may be described using two endpoint locations + * separated by "x" (e.g. "bgl[123x456]" selects all nodes with X + * positions between 1 and 4 inclusive, Y between 2 and 5, and Z between + * 3 and 6 for a total of 4*4*4=64 nodes). Two or more rectangular + * prisms may be specified using comma separators within the brackets + * (e.g. "bgl[000x133,400x533]"). + * + * Note: if this module is compiled with WANT_RECKLESS_HOSTRANGE_EXPANSION + * defined, a much more loose interpretation of host ranges is used. + * Reckless hostrange expansion allows all of the following (in addition to + * bracketed hostlists): + * + * o tux0-5,tux12,tux20-25 + * o tux0-tux5,tux12,tux20-tux25 + * o tux0-5,12,20-25 + * + * If str is NULL, and empty hostlist is created and returned. + * + * If the create fails, hostlist_create() returns NULL. + * + * The returned hostlist must be freed with hostlist_destroy() + * + */ +hostlist_t hostlist_create(const char *hostlist); + +/* hostlist_copy(): + * + * Allocate a copy of a hostlist object. Returned hostlist must be freed + * with hostlist_destroy. + */ +hostlist_t hostlist_copy(const hostlist_t hl); + +/* hostlist_destroy(): + * + * Destroy a hostlist object. Frees all memory allocated to the hostlist. + */ +void hostlist_destroy(hostlist_t hl); + + +/* ----[ hostlist list operations ]---- */ + +/* hostlist_push(): + * + * push a string representation of hostnames onto a hostlist. + * + * The hosts argument may take the same form as in hostlist_create() + * + * Returns the number of hostnames inserted into the list, + * or 0 on failure. + */ +int hostlist_push(hostlist_t hl, const char *hosts); + + +/* hostlist_push_host(): + * + * Push a single host onto the hostlist hl. + * This function is more efficient than hostlist_push() for a single + * hostname, since the argument does not need to be checked for ranges. + * + * return value is 1 for success, 0 for failure. + */ +int hostlist_push_host(hostlist_t hl, const char *host); + + +/* hostlist_push_list(): + * + * Push a hostlist (hl2) onto another list (hl1) + * + * Returns 1 for success, 0 for failure. + * + */ +int hostlist_push_list(hostlist_t hl1, hostlist_t hl2); + + +/* hostlist_pop(): + * + * Returns the string representation of the last host pushed onto the list + * or NULL if hostlist is empty or there was an error allocating memory. + * The host is removed from the hostlist. + * + * Note: Caller is responsible for freeing the returned memory. + */ +char * hostlist_pop(hostlist_t hl); + + +char * hostlist_nth(hostlist_t hl, int n); + +/* hostlist_shift(): + * + * Returns the string representation of the first host in the hostlist + * or NULL if the hostlist is empty or there was an error allocating memory. + * The host is removed from the hostlist. + * + * Note: Caller is responsible for freeing the returned memory. + */ +char * hostlist_shift(hostlist_t hl); + + +/* hostlist_pop_range(): + * + * Pop the last bracketed list of hosts of the hostlist hl. + * Returns the string representation in bracketed list form. + * All hosts associated with the returned list are removed + * from hl. + * + * Caller is responsible for freeing returned memory + */ +char * hostlist_pop_range(hostlist_t hl); + +/* hostlist_shift_range(): + * + * Shift the first bracketed hostlist (improperly: range) off the + * hostlist hl. Returns the string representation in bracketed list + * form. All hosts associated with the list are removed from the + * hostlist. + * + * Caller is responsible for freeing returned memory. + */ +char * hostlist_shift_range(hostlist_t hl); + + +/* hostlist_find(): + * + * Searches hostlist hl for the first host matching hostname + * and returns position in list if found. + * + * Returns -1 if host is not found. + * + */ +int hostlist_find(hostlist_t hl, const char *hostname); + +/* hostlist_delete(): + * + * Deletes all hosts in the list represented by `hosts' + * + * Returns the number of hosts successfully deleted + */ +int hostlist_delete(hostlist_t hl, const char *hosts); + + +/* hostlist_delete_host(): + * + * Deletes the first host that matches `hostname' from the hostlist hl. + * Note: "hostname" argument cannot contain a range of hosts + * (see hostlist_delete() for this functionality.) + * + * Returns 1 if successful, 0 if hostname is not found in list. + */ +int hostlist_delete_host(hostlist_t hl, const char *hostname); + + +/* hostlist_delete_nth(): + * + * Deletes the host from position n in the hostlist. + * + * Returns 1 if successful 0 on error. + * + */ +int hostlist_delete_nth(hostlist_t hl, int n); + + +/* hostlist_count(): + * + * Return the number of hosts in hostlist hl. + */ +int hostlist_count(hostlist_t hl); + +/* hostlist_is_empty(): return true if hostlist is empty. */ +#define hostlist_is_empty(__hl) ( hostlist_count(__hl) == 0 ) + +/* ----[ Other hostlist operations ]---- */ + +/* hostlist_sort(): + * + * Sort the hostlist hl. + * + */ +void hostlist_sort(hostlist_t hl); + +/* hostlist_uniq(): + * + * Sort the hostlist hl and remove duplicate entries. + * + */ +void hostlist_uniq(hostlist_t hl); + + +/* ----[ hostlist print functions ]---- */ + +/* hostlist_ranged_string(): + * + * Write the string representation of the hostlist hl into buf, + * writing at most n chars. Returns the number of bytes written, + * or -1 if truncation occurred. + * + * The result will be NULL terminated. + * + * hostlist_ranged_string() will write a bracketed hostlist representation + * where possible. + */ +size_t hostlist_ranged_string(hostlist_t hl, size_t n, char *buf); + +/* hostlist_deranged_string(): + * + * Writes the string representation of the hostlist hl into buf, + * writing at most n chars. Returns the number of bytes written, + * or -1 if truncation occurred. + * + * hostlist_deranged_string() will not attempt to write a bracketed + * hostlist representation. Every hostname will be explicitly written. + */ +size_t hostlist_deranged_string(hostlist_t hl, size_t n, char *buf); + + +/* ----[ hostlist utility functions ]---- */ + + +/* hostlist_nranges(): + * + * Return the number of ranges currently held in hostlist hl. + */ +int hostlist_nranges(hostlist_t hl); + + +/* ----[ hostlist iterator functions ]---- */ + +/* hostlist_iterator_create(): + * + * Creates and returns a hostlist iterator used for non destructive + * access to a hostlist or hostset. Returns NULL on failure. + */ +hostlist_iterator_t hostlist_iterator_create(hostlist_t hl); + +/* hostset_iterator_create(): + * + * Same as hostlist_iterator_create(), but creates a hostlist_iterator + * from a hostset. + */ +hostlist_iterator_t hostset_iterator_create(hostset_t set); + +/* hostlist_iterator_destroy(): + * + * Destroys a hostlist iterator. + */ +void hostlist_iterator_destroy(hostlist_iterator_t i); + +/* hostlist_iterator_reset(): + * + * Reset an iterator to the beginning of the list. + */ +void hostlist_iterator_reset(hostlist_iterator_t i); + +/* hostlist_next(): + * + * Returns a pointer to the next hostname on the hostlist + * or NULL at the end of the list + * + * The caller is responsible for freeing the returned memory. + */ +char * hostlist_next(hostlist_iterator_t i); + + +/* hostlist_next_range(): + * + * Returns the next bracketed hostlist or NULL if the iterator i is + * at the end of the list. + * + * The caller is responsible for freeing the returned memory. + * + */ +char * hostlist_next_range(hostlist_iterator_t i); + + +/* hostlist_remove(): + * Removes the last host returned by hostlist iterator i + * + * Returns 1 for success, 0 for failure. + */ +int hostlist_remove(hostlist_iterator_t i); + + +/* ----[ hostset operations ]---- */ + +/* hostset_create(): + * + * Create a new hostset object from a string representation of a list of + * hosts. See hostlist_create() for valid hostlist forms. + */ +hostset_t hostset_create(const char *hostlist); + +/* hostset_copy(): + * + * Copy a hostset object. Returned set must be freed with hostset_destroy(). + */ +hostset_t hostset_copy(hostset_t set); + +/* hostset_destroy(): + */ +void hostset_destroy(hostset_t set); + +/* hostset_insert(): + * Add a host or list of hosts into hostset "set." + * + * Returns number of hosts successfully added to "set" + * (insertion of a duplicate is not considered successful) + */ +int hostset_insert(hostset_t set, const char *hosts); + +/* hostset_delete(): + * Delete a host or list of hosts from hostset "set." + * Returns number of hosts deleted from set. + */ +int hostset_delete(hostset_t set, const char *hosts); + +/* hostset_within(): + * Return 1 if all hosts specified by "hosts" are within the hostset "set" + * Retrun 0 if every host in "hosts" is not in the hostset "set" + */ +int hostset_within(hostset_t set, const char *hosts); + +/* hostset_shift(): + * hostset equivalent to hostlist_shift() + */ +char * hostset_shift(hostset_t set); + +/* hostset_shift_range(): + * hostset eqivalent to hostlist_shift_range() + */ +char * hostset_shift_range(hostset_t set); + +/* hostset_count(): + * Count the number of hosts currently in hostset + */ +int hostset_count(hostset_t set); + +/* hostset_find(): + * + * Searches hostset set for a host matching hostname + * and returns position in list if found. + * + * Returns -1 if host is not found. + */ +int hostset_find(hostset_t set, const char *hostname); + +char * hostset_nth(hostset_t set, int n); + +#endif /* !_HOSTLIST_H */ diff --git a/executable_names/src/common/io_hdr.c b/executable_names/src/common/io_hdr.c new file mode 100644 index 0000000000000000000000000000000000000000..54dbc5c0fe46af3680ea774fe30bd74dd099b42b --- /dev/null +++ b/executable_names/src/common/io_hdr.c @@ -0,0 +1,287 @@ +/*****************************************************************************\ + * src/common/io_hdr.c - IO connection header functions + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark A. Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "src/common/io_hdr.h" +#include "src/common/slurm_protocol_defs.h" + +#define IO_PROTOCOL_VERSION 0xb001 + +/* +static void +_print_data(char *data, int datalen) +{ + char buf[1024]; + size_t len = 0; + int i; + + for (i = 0; i < datalen; i += sizeof(char)) + len += sprintf(buf+len, "%02x", data[i]); + + info("data: %s", buf); +} +*/ + +void +io_hdr_pack(io_hdr_t *hdr, Buf buffer) +{ + pack16(hdr->type, buffer); + pack16(hdr->gtaskid, buffer); + pack16(hdr->ltaskid, buffer); + pack32(hdr->length, buffer); +} + +int +io_hdr_unpack(io_hdr_t *hdr, Buf buffer) +{ + safe_unpack16(&hdr->type, buffer); + safe_unpack16(&hdr->gtaskid, buffer); + safe_unpack16(&hdr->ltaskid, buffer); + safe_unpack32(&hdr->length, buffer); + return SLURM_SUCCESS; + + unpack_error: + error("io_hdr_unpack error: %m"); + return SLURM_ERROR; +} + +int +io_hdr_packed_size() +{ + return sizeof(uint32_t) + 3*sizeof(uint16_t); +} + +/* + * Only return when the all of the bytes have been read, or an unignorable + * error has occurred. + */ +static int _full_read(int fd, void *buf, size_t count) +{ + int n; + int left; + void *ptr; + + left = count; + ptr = buf; + while (left > 0) { + again: + if ((n = read(fd, (void *) ptr, left)) < 0) { + if (errno == EINTR + || errno == EAGAIN + || errno == EWOULDBLOCK) + goto again; + debug3("Leaving _full_read on error!"); + return -1; + } else if (n == 0) { /* got eof */ + debug3(" _full_read (_client_read) got eof"); + return 0; + } + left -= n; + ptr += n; + } + + return count; +} + +/* + * Read and unpack an io_hdr_t from a file descriptor (socket). + */ +int io_hdr_read_fd(int fd, io_hdr_t *hdr) +{ + Buf buffer; + int n = 0; + + debug3("Entering io_hdr_read_fd"); + buffer = init_buf(io_hdr_packed_size()); + n = _full_read(fd, buffer->head, io_hdr_packed_size()); + if (n <= 0) + goto fail; + if (io_hdr_unpack(hdr, buffer) == SLURM_ERROR) { + n = -1; + goto fail; + } + +fail: + debug3("Leaving io_hdr_read_fd"); + free_buf(buffer); + return n; +} + + + + +int +io_init_msg_validate(struct slurm_io_init_msg *msg, const char *sig) +{ + debug2("Entering io_init_msg_validate"); + + debug3(" msg->version = %x", msg->version); + debug3(" msg->nodeid = %u", msg->nodeid); + + if (msg->version != IO_PROTOCOL_VERSION) { + error("Invalid IO init header version"); + return SLURM_ERROR; + } + + if (memcmp((void *)sig, (void *)msg->cred_signature, + SLURM_IO_KEY_SIZE)) { + error("Invalid IO init header signature"); + return SLURM_ERROR; + } + + debug2("Leaving io_init_msg_validate"); + return SLURM_SUCCESS; +} + + +static int +io_init_msg_packed_size(void) +{ + int len; + + len = sizeof(uint16_t) /* version */ + + sizeof(uint32_t) /* nodeid */ + + (SLURM_IO_KEY_SIZE + sizeof(uint16_t)) /* signature */ + + sizeof(uint32_t) /* stdout_objs */ + + sizeof(uint32_t); /* stderr_objs */ + return len; +} + +static void +io_init_msg_pack(struct slurm_io_init_msg *hdr, Buf buffer) +{ + pack16(hdr->version, buffer); + pack32(hdr->nodeid, buffer); + pack32(hdr->stdout_objs, buffer); + pack32(hdr->stderr_objs, buffer); + packmem((char *) hdr->cred_signature, + (uint16_t) SLURM_IO_KEY_SIZE, buffer); +} + + +static int +io_init_msg_unpack(struct slurm_io_init_msg *hdr, Buf buffer) +{ + uint16_t val; + + safe_unpack16(&hdr->version, buffer); + safe_unpack32(&hdr->nodeid, buffer); + safe_unpack32(&hdr->stdout_objs, buffer); + safe_unpack32(&hdr->stderr_objs, buffer); + safe_unpackmem((char *) hdr->cred_signature, &val, buffer); + if (val != SLURM_IO_KEY_SIZE) + goto unpack_error; + + return SLURM_SUCCESS; + + unpack_error: + error("unpack error in io_init_msg_unpack"); + return SLURM_ERROR; +} + + +int +io_init_msg_write_to_fd(int fd, struct slurm_io_init_msg *msg) +{ + Buf buf; + void *ptr; + int n; + + xassert(msg); + + debug2("Entering io_init_msg_write_to_fd"); + msg->version = IO_PROTOCOL_VERSION; + buf = init_buf(io_init_msg_packed_size()); + debug2(" msg->nodeid = %d", msg->nodeid); + io_init_msg_pack(msg, buf); + + ptr = get_buf_data(buf); +again: + if ((n = write(fd, ptr, io_init_msg_packed_size())) < 0) { + if (errno == EINTR) + goto again; + free_buf(buf); + return SLURM_ERROR; + } + if (n != io_init_msg_packed_size()) { + error("io init msg write too small"); + free_buf(buf); + return SLURM_ERROR; + } + + free_buf(buf); + debug2("Leaving io_init_msg_write_to_fd"); + return SLURM_SUCCESS; +} + + +int +io_init_msg_read_from_fd(int fd, struct slurm_io_init_msg *msg) +{ + Buf buf; + void *ptr; + int n; + + xassert(msg); + + debug2("Entering io_init_msg_read_from_fd"); + buf = init_buf(io_init_msg_packed_size()); + ptr = get_buf_data(buf); +again: + if ((n = read(fd, ptr, io_init_msg_packed_size())) < 0) { + if (errno == EINTR) + goto again; + free_buf(buf); + return SLURM_ERROR; + } + if (n != io_init_msg_packed_size()) { + error("io init msg read too small"); + free_buf(buf); + return SLURM_ERROR; + } + debug3(" read %d bytes", n); + io_init_msg_unpack(msg, buf); + + free_buf(buf); + + debug2("Leaving io_init_msg_read_from_fd"); + return SLURM_SUCCESS; +} diff --git a/executable_names/src/common/io_hdr.h b/executable_names/src/common/io_hdr.h new file mode 100644 index 0000000000000000000000000000000000000000..e8c386595274088473997afad5bc4c12ff01a573 --- /dev/null +++ b/executable_names/src/common/io_hdr.h @@ -0,0 +1,98 @@ +/*****************************************************************************\ + * src/common/io_hdr.h - IO connection header functions + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark A. Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _HAVE_IO_HDR_H +#define _HAVE_IO_HDR_H + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include "src/common/macros.h" /* Containes SLURM_CRED_SIGLEN */ +#include "src/common/pack.h" +#include "src/common/cbuf.h" +#include "src/common/xmalloc.h" + +#define MAX_MSG_LEN 1024 +#define SLURM_IO_KEY_SIZE 8 + +#define SLURM_IO_STDIN 0 +#define SLURM_IO_STDOUT 1 +#define SLURM_IO_STDERR 2 +#define SLURM_IO_ALLSTDIN 3 + +struct slurm_io_init_msg { + uint16_t version; + unsigned char cred_signature[SLURM_IO_KEY_SIZE]; + uint32_t nodeid; + uint32_t stdout_objs; + uint32_t stderr_objs; +}; + + +typedef struct slurm_io_header { + uint16_t type; + uint16_t gtaskid; + uint16_t ltaskid; + uint32_t length; +} io_hdr_t; + +/* + * Return the packed size of an IO header in bytes; + */ +int io_hdr_packed_size(); +void io_hdr_pack(io_hdr_t *hdr, Buf buffer); +int io_hdr_unpack(io_hdr_t *hdr, Buf buffer); +int io_hdr_read_fd(int fd, io_hdr_t *hdr); + +/* + * Validate io init msg + */ +int io_init_msg_validate(struct slurm_io_init_msg *msg, const char *sig); +int io_init_msg_write_to_fd(int fd, struct slurm_io_init_msg *msg); +int io_init_msg_read_from_fd(int fd, struct slurm_io_init_msg *msg); + +#endif /* !_HAVE_IO_HDR_H */ diff --git a/executable_names/src/common/job_options.c b/executable_names/src/common/job_options.c new file mode 100644 index 0000000000000000000000000000000000000000..6ff046e37a7c08c95ec080e91a623efb36f701f1 --- /dev/null +++ b/executable_names/src/common/job_options.c @@ -0,0 +1,248 @@ +/*****************************************************************************\ + * src/common/job_options.c - Extra job options + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include "src/common/job_options.h" + +#define JOB_OPTIONS_PACK_TAG "job_options" + +struct job_options { +#ifndef NDEBUG +#define JOB_OPTIONS_MAGIC 0xa1a2a3a4 + int magic; +#endif /* !NDEBUG */ + List options; + ListIterator iterator; +}; + + +static struct job_option_info * +job_option_info_create (int type, const char *opt, const char *optarg) +{ + struct job_option_info *ji = xmalloc (sizeof (*ji)); + + ji->type = type; + ji->option = xstrdup (opt); + ji->optarg = optarg ? xstrdup (optarg) : NULL; + + return (ji); +} + +static void job_option_info_destroy (struct job_option_info *ji) +{ + xfree (ji->option); + xfree (ji->optarg); + ji->type = -1; + xfree (ji); + return; +} + +static void job_option_info_pack (struct job_option_info *ji, Buf buf) +{ + pack32 (ji->type, buf); + packstr (ji->option, buf); + packstr (ji->optarg, buf); /* packstr() handles NULL optarg */ + return; +} + +static struct job_option_info * job_option_info_unpack (Buf buf) +{ + struct job_option_info *ji = xmalloc (sizeof (*ji)); + uint32_t type; + uint16_t len; + + if (unpack32 (&type, buf) != SLURM_SUCCESS) + goto error; + if (unpackstr_xmalloc (&ji->option, &len, buf) != SLURM_SUCCESS) + goto error; + if (unpackstr_xmalloc (&ji->optarg, &len, buf) != SLURM_SUCCESS) + goto error; + + ji->type = (int) type; + return (ji); + + error: + job_option_info_destroy (ji); + return (NULL); +} + + +/* + * Create generic job options container. + */ +job_options_t job_options_create (void) +{ + job_options_t j = xmalloc (sizeof (*j)); + + xassert (j->magic = JOB_OPTIONS_MAGIC); + + j->options = list_create ((ListDelF) job_option_info_destroy); + j->iterator = list_iterator_create (j->options); + + return (j); +} + +/* + * Destroy container, freeing all data associated with options. + */ +void job_options_destroy (job_options_t opts) +{ + xassert (opts != NULL); + xassert (opts->magic == JOB_OPTIONS_MAGIC); + + if (opts->options) + list_destroy (opts->options); + + xassert (opts->magic = ~JOB_OPTIONS_MAGIC); + xfree (opts); + return; +} + +/* + * Append option of type `type' and its argument to job options + */ +int job_options_append (job_options_t opts, int type, const char *opt, + const char *optarg) +{ + xassert (opts != NULL); + xassert (opts->magic == JOB_OPTIONS_MAGIC); + xassert (opts->options != NULL); + + list_append (opts->options, job_option_info_create (type, opt, optarg)); + + return (0); +} + +/* + * Pack all accumulated options into Buffer "buf" + */ +int job_options_pack (job_options_t opts, Buf buf) +{ + uint32_t count = 0; + ListIterator i; + struct job_option_info *opt; + + packstr (JOB_OPTIONS_PACK_TAG, buf); + + if (opts == NULL) { + pack32 (0, buf); + return (0); + } + + xassert (opts->magic == JOB_OPTIONS_MAGIC); + xassert (opts->options != NULL); + xassert (opts->iterator != NULL); + + count = list_count (opts->options); + pack32 (count, buf); + + i = list_iterator_create (opts->options); + + while ((opt = list_next (i))) + job_option_info_pack (opt, buf); + list_iterator_destroy (i); + + return (count); +} + +/* + * Unpack options from buffer "buf" into options container opts. + */ +int job_options_unpack (job_options_t opts, Buf buf) +{ + uint32_t count; + uint16_t len; + char * tag; + int i; + + if (unpackstr_xmalloc (&tag, &len, buf) != SLURM_SUCCESS) + return (SLURM_ERROR); + + if (strncmp (tag, JOB_OPTIONS_PACK_TAG, len) != 0) { + xfree(tag); + return (-1); + } + xfree(tag); + unpack32 (&count, buf); + + for (i = 0; i < count; i++) { + struct job_option_info *ji; + if ((ji = job_option_info_unpack (buf)) == NULL) + return (SLURM_ERROR); + list_append (opts->options, ji); + } + + return (0); +} + +/* + * Iterate over all job options + */ +const struct job_option_info * job_options_next (job_options_t opts) +{ + if (opts == NULL) + return NULL; + + xassert (opts->magic == JOB_OPTIONS_MAGIC); + xassert (opts->options != NULL); + xassert (opts->iterator != NULL); + + return (list_next (opts->iterator)); +} + +void job_options_iterator_reset (job_options_t opts) +{ + if (opts == NULL) + return; + + xassert (opts->magic == JOB_OPTIONS_MAGIC); + xassert (opts->options != NULL); + xassert (opts->iterator != NULL); + + list_iterator_reset (opts->iterator); +} diff --git a/executable_names/src/common/job_options.h b/executable_names/src/common/job_options.h new file mode 100644 index 0000000000000000000000000000000000000000..9cdfba3fafc22185850973f574961ff2bb56b5b8 --- /dev/null +++ b/executable_names/src/common/job_options.h @@ -0,0 +1,92 @@ +/*****************************************************************************\ + * src/common/job_options.h - Extra job options + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _JOB_OPTIONS_H +#define _JOB_OPTIONS_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "src/common/pack.h" + +typedef struct job_options * job_options_t; /* opaque data type */ + +struct job_option_info { + int type; + char *option; + char *optarg; +}; + +/* + * Create generic job options container. + */ +job_options_t job_options_create (void); + +/* + * Destroy container, freeing all data associated with options. + */ +void job_options_destroy (job_options_t opts); + +/* + * Append option of type `type' and its argument to job options + */ +int job_options_append (job_options_t opts, int type, const char *opt, + const char *optarg); + +/* + * Pack all accumulated options into Buffer "buf" + */ +int job_options_pack (job_options_t opts, Buf buf); + +/* + * Unpack options from buffer "buf" into options container opts. + */ +int job_options_unpack (job_options_t opts, Buf buf); + +/* + * Reset internal options list iterator + */ +void job_options_iterator_reset (job_options_t opts); + +/* + * Iterate over all job options + */ +const struct job_option_info * job_options_next (job_options_t opts); + +#endif /* !_JOB_OPTIONS_H */ diff --git a/executable_names/src/common/list.c b/executable_names/src/common/list.c new file mode 100644 index 0000000000000000000000000000000000000000..c55c69ce61bc98ad8177d1edf9ccc9b0e0b4e26e --- /dev/null +++ b/executable_names/src/common/list.c @@ -0,0 +1,921 @@ +/***************************************************************************** + * $Id: list.c,v 1.28 2003/05/20 23:53:22 dun Exp $ + ***************************************************************************** + * $LSDId: list.c,v 1.28 2003/05/20 23:53:22 dun Exp $ + ***************************************************************************** + * Copyright (C) 2001-2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Chris Dunlap . + * + * This file is from LSD-Tools, the LLNL Software Development Toolbox. + * + * LSD-Tools 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * LSD-Tools 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 LSD-Tools; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + ***************************************************************************** + * Refer to "list.h" for documentation on public functions. + *****************************************************************************/ + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + +#ifdef WITH_PTHREADS +# include +#endif /* WITH_PTHREADS */ + +#include +#include +#include +#include +#include "list.h" +#include "macros.h" +#include "xmalloc.h" + +/* +** Define slurm-specific aliases for use by plugins, see slurm_xlator.h +** for details. + */ +strong_alias(list_create, slurm_list_create); +strong_alias(list_destroy, slurm_list_destroy); +strong_alias(list_is_empty, slurm_list_is_empty); +strong_alias(list_count, slurm_list_count); +strong_alias(list_append, slurm_list_append); +strong_alias(list_prepend, slurm_list_prepend); +strong_alias(list_find_first, slurm_list_find_first); +strong_alias(list_delete_all, slurm_list_delete_all); +strong_alias(list_for_each, slurm_list_for_each); +strong_alias(list_sort, slurm_list_sort); +strong_alias(list_push, slurm_list_push); +strong_alias(list_pop, slurm_list_pop); +strong_alias(list_peek, slurm_list_peek); +strong_alias(list_enqueue, slurm_list_enqueue); +strong_alias(list_dequeue, slurm_list_dequeue); +strong_alias(list_iterator_create, slurm_list_iterator_create); +strong_alias(list_iterator_reset, slurm_list_iterator_reset); +strong_alias(list_iterator_destroy, slurm_list_iterator_destroy); +strong_alias(list_next, slurm_list_next); +strong_alias(list_insert, slurm_list_insert); +strong_alias(list_find, slurm_list_find); +strong_alias(list_remove, slurm_list_remove); +strong_alias(list_delete, slurm_list_delete); +strong_alias(list_install_fork_handlers, slurm_list_install_fork_handlers); +/********************* + * lsd_fatal_error * + *********************/ + +#include +#ifdef WITH_LSD_FATAL_ERROR_FUNC +# undef lsd_fatal_error + extern void lsd_fatal_error(char *file, int line, char *mesg); +#else /* !WITH_LSD_FATAL_ERROR_FUNC */ +# ifndef lsd_fatal_error +# include +# include +# include +# define lsd_fatal_error(file, line, mesg) \ + do { \ + fprintf(stderr, "ERROR: [%s:%d] %s: %s\n", \ + file, line, mesg, strerror(errno)); \ + } while (0) +# endif /* !lsd_fatal_error */ +#endif /* !WITH_LSD_FATAL_ERROR_FUNC */ + + +/********************* + * lsd_nomem_error * + *********************/ + +#ifdef WITH_LSD_NOMEM_ERROR_FUNC +# undef lsd_nomem_error + extern void * lsd_nomem_error(char *file, int line, char *mesg); +#else /* !WITH_LSD_NOMEM_ERROR_FUNC */ +# ifndef lsd_nomem_error +# define lsd_nomem_error(file, line, mesg) (NULL) +# endif /* !lsd_nomem_error */ +#endif /* !WITH_LSD_NOMEM_ERROR_FUNC */ + + +/*************** + * Constants * + ***************/ + +/**************************************************************************\ + * To test for memory leaks associated with the use of list functions (not + * necessarily within the list module), set MEMORY_LEAK_DEBUG to 1 using + * "configure --enable-memory-leak" then execute + * > valgrind --tool=memcheck --leak-check=yes --num-callers=6 + * --leak-resolution=med [slurmctld | slurmd] -D + * + * Do not leave MEMORY_LEAK_DEBUG set for production use + * + * When MEMORY_LEAK_DEBUG is set to 1, the cache is disabled. Each memory + * request will be satisified with a separate xmalloc request. When the + * memory is no longer required, it is immeditately freed. This means + * valgrind can identify where exactly any leak associated with the use + * of the list functions originates. +\**************************************************************************/ +#ifdef MEMORY_LEAK_DEBUG +# define LIST_ALLOC 1 +#else +# define LIST_ALLOC 128 +#endif +#define LIST_MAGIC 0xDEADBEEF + + +/**************** + * Data Types * + ****************/ + +struct listNode { + void *data; /* node's data */ + struct listNode *next; /* next node in list */ +}; + +struct listIterator { + struct list *list; /* the list being iterated */ + struct listNode *pos; /* the next node to be iterated */ + struct listNode **prev; /* addr of 'next' ptr to prv It node */ + struct listIterator *iNext; /* iterator chain for list_destroy() */ +#ifndef NDEBUG + unsigned int magic; /* sentinel for asserting validity */ +#endif /* !NDEBUG */ +}; + +struct list { + struct listNode *head; /* head of the list */ + struct listNode **tail; /* addr of last node's 'next' ptr */ + struct listIterator *iNext; /* iterator chain for list_destroy() */ + ListDelF fDel; /* function to delete node data */ + int count; /* number of nodes in list */ +#ifdef WITH_PTHREADS + pthread_mutex_t mutex; /* mutex to protect access to list */ +#endif /* WITH_PTHREADS */ +#ifndef NDEBUG + unsigned int magic; /* sentinel for asserting validity */ +#endif /* !NDEBUG */ +}; + +typedef struct listNode * ListNode; + + +/**************** + * Prototypes * + ****************/ + +static void * list_node_create (List l, ListNode *pp, void *x); +static void * list_node_destroy (List l, ListNode *pp); +static List list_alloc (void); +static void list_free (List l); +static ListNode list_node_alloc (void); +static void list_node_free (ListNode p); +static ListIterator list_iterator_alloc (void); +static void list_iterator_free (ListIterator i); +static void * list_alloc_aux (int size, void *pfreelist); +static void list_free_aux (void *x, void *pfreelist); + + +/*************** + * Variables * + ***************/ + +static List list_free_lists = NULL; +static ListNode list_free_nodes = NULL; +static ListIterator list_free_iterators = NULL; + +#ifdef WITH_PTHREADS +static pthread_mutex_t list_free_lock = PTHREAD_MUTEX_INITIALIZER; +#endif /* WITH_PTHREADS */ + + +/************ + * Macros * + ************/ + +#ifdef WITH_PTHREADS + +# define list_mutex_init(mutex) \ + do { \ + int e = pthread_mutex_init(mutex, NULL); \ + if (e != 0) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "list mutex init"); \ + abort(); \ + } \ + } while (0) + +# define list_mutex_lock(mutex) \ + do { \ + int e = pthread_mutex_lock(mutex); \ + if (e != 0) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "list mutex lock"); \ + abort(); \ + } \ + } while (0) + +# define list_mutex_unlock(mutex) \ + do { \ + int e = pthread_mutex_unlock(mutex); \ + if (e != 0) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "list mutex unlock"); \ + abort(); \ + } \ + } while (0) + +# define list_mutex_destroy(mutex) \ + do { \ + int e = pthread_mutex_destroy(mutex); \ + if (e != 0) { \ + errno = e; \ + lsd_fatal_error(__FILE__, __LINE__, "list mutex destroy"); \ + abort(); \ + } \ + } while (0) + +# ifndef NDEBUG + static int list_mutex_is_locked (pthread_mutex_t *mutex); +# endif /* !NDEBUG */ + +#else /* !WITH_PTHREADS */ + +# define list_mutex_init(mutex) +# define list_mutex_lock(mutex) +# define list_mutex_unlock(mutex) +# define list_mutex_destroy(mutex) +# define list_mutex_is_locked(mutex) (1) + +#endif /* !WITH_PTHREADS */ + + +/*************** + * Functions * + ***************/ + +List +list_create (ListDelF f) +{ + List l; + + if (!(l = list_alloc())) + return(lsd_nomem_error(__FILE__, __LINE__, "list create")); + l->head = NULL; + l->tail = &l->head; + l->iNext = NULL; + l->fDel = f; + l->count = 0; + list_mutex_init(&l->mutex); + assert(l->magic = LIST_MAGIC); /* set magic via assert abuse */ + return(l); +} + + +void +list_destroy (List l) +{ + ListIterator i, iTmp; + ListNode p, pTmp; + + assert(l != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + i = l->iNext; + while (i) { + assert(i->magic == LIST_MAGIC); + iTmp = i->iNext; + assert(i->magic = ~LIST_MAGIC); /* clear magic via assert abuse */ + list_iterator_free(i); + i = iTmp; + } + p = l->head; + while (p) { + pTmp = p->next; + if (p->data && l->fDel) + l->fDel(p->data); + list_node_free(p); + p = pTmp; + } + assert(l->magic = ~LIST_MAGIC); /* clear magic via assert abuse */ + list_mutex_unlock(&l->mutex); + list_mutex_destroy(&l->mutex); + list_free(l); + return; +} + + +int +list_is_empty (List l) +{ + int n; + + assert(l != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + n = l->count; + list_mutex_unlock(&l->mutex); + return(n == 0); +} + + +int +list_count (List l) +{ + int n; + + assert(l != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + n = l->count; + list_mutex_unlock(&l->mutex); + return(n); +} + + +void * +list_append (List l, void *x) +{ + void *v; + + assert(l != NULL); + assert(x != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + v = list_node_create(l, l->tail, x); + list_mutex_unlock(&l->mutex); + return(v); +} + + +void * +list_prepend (List l, void *x) +{ + void *v; + + assert(l != NULL); + assert(x != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + v = list_node_create(l, &l->head, x); + list_mutex_unlock(&l->mutex); + return(v); +} + + +void * +list_find_first (List l, ListFindF f, void *key) +{ + ListNode p; + void *v = NULL; + + assert(l != NULL); + assert(f != NULL); + assert(key != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + for (p=l->head; p; p=p->next) { + if (f(p->data, key)) { + v = p->data; + break; + } + } + list_mutex_unlock(&l->mutex); + return(v); +} + + +int +list_delete_all (List l, ListFindF f, void *key) +{ + ListNode *pp; + void *v; + int n = 0; + + assert(l != NULL); + assert(f != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + pp = &l->head; + while (*pp) { + if (f((*pp)->data, key)) { + if ((v = list_node_destroy(l, pp))) { + if (l->fDel) + l->fDel(v); + n++; + } + } + else { + pp = &(*pp)->next; + } + } + list_mutex_unlock(&l->mutex); + return(n); +} + + +int +list_for_each (List l, ListForF f, void *arg) +{ + ListNode p; + int n = 0; + + assert(l != NULL); + assert(f != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + for (p=l->head; p; p=p->next) { + n++; + if (f(p->data, arg) < 0) { + n = -n; + break; + } + } + list_mutex_unlock(&l->mutex); + return(n); +} + + +void +list_sort (List l, ListCmpF f) +{ +/* Note: Time complexity O(n^2). + */ + ListNode *pp, *ppPrev, *ppPos, pTmp; + ListIterator i; + + assert(l != NULL); + assert(f != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + if (l->count > 1) { + ppPrev = &l->head; + pp = &(*ppPrev)->next; + while (*pp) { + if (f((*pp)->data, (*ppPrev)->data) < 0) { + ppPos = &l->head; + while (f((*pp)->data, (*ppPos)->data) >= 0) + ppPos = &(*ppPos)->next; + pTmp = (*pp)->next; + (*pp)->next = *ppPos; + *ppPos = *pp; + *pp = pTmp; + if (ppPrev == ppPos) + ppPrev = &(*ppPrev)->next; + } + else { + ppPrev = pp; + pp = &(*pp)->next; + } + } + l->tail = pp; + + for (i=l->iNext; i; i=i->iNext) { + assert(i->magic == LIST_MAGIC); + i->pos = i->list->head; + i->prev = &i->list->head; + } + } + list_mutex_unlock(&l->mutex); + return; +} + + +void * +list_push (List l, void *x) +{ + void *v; + + assert(l != NULL); + assert(x != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + v = list_node_create(l, &l->head, x); + list_mutex_unlock(&l->mutex); + return(v); +} + + +void * +list_pop (List l) +{ + void *v; + + assert(l != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + v = list_node_destroy(l, &l->head); + list_mutex_unlock(&l->mutex); + return(v); +} + + +void * +list_peek (List l) +{ + void *v; + + assert(l != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + v = (l->head) ? l->head->data : NULL; + list_mutex_unlock(&l->mutex); + return(v); +} + + +void * +list_enqueue (List l, void *x) +{ + void *v; + + assert(l != NULL); + assert(x != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + v = list_node_create(l, l->tail, x); + list_mutex_unlock(&l->mutex); + return(v); +} + + +void * +list_dequeue (List l) +{ + void *v; + + assert(l != NULL); + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + v = list_node_destroy(l, &l->head); + list_mutex_unlock(&l->mutex); + return(v); +} + + +ListIterator +list_iterator_create (List l) +{ + ListIterator i; + + assert(l != NULL); + if (!(i = list_iterator_alloc())) + return(lsd_nomem_error(__FILE__, __LINE__, "list iterator create")); + i->list = l; + list_mutex_lock(&l->mutex); + assert(l->magic == LIST_MAGIC); + i->pos = l->head; + i->prev = &l->head; + i->iNext = l->iNext; + l->iNext = i; + assert(i->magic = LIST_MAGIC); /* set magic via assert abuse */ + list_mutex_unlock(&l->mutex); + return(i); +} + + +void +list_iterator_reset (ListIterator i) +{ + assert(i != NULL); + assert(i->magic == LIST_MAGIC); + list_mutex_lock(&i->list->mutex); + assert(i->list->magic == LIST_MAGIC); + i->pos = i->list->head; + i->prev = &i->list->head; + list_mutex_unlock(&i->list->mutex); + return; +} + + +void +list_iterator_destroy (ListIterator i) +{ + ListIterator *pi; + + assert(i != NULL); + assert(i->magic == LIST_MAGIC); + list_mutex_lock(&i->list->mutex); + assert(i->list->magic == LIST_MAGIC); + for (pi=&i->list->iNext; *pi; pi=&(*pi)->iNext) { + assert((*pi)->magic == LIST_MAGIC); + if (*pi == i) { + *pi = (*pi)->iNext; + break; + } + } + list_mutex_unlock(&i->list->mutex); + assert(i->magic = ~LIST_MAGIC); /* clear magic via assert abuse */ + list_iterator_free(i); + return; +} + + +void * +list_next (ListIterator i) +{ + ListNode p; + + assert(i != NULL); + assert(i->magic == LIST_MAGIC); + list_mutex_lock(&i->list->mutex); + assert(i->list->magic == LIST_MAGIC); + if ((p = i->pos)) + i->pos = p->next; + if (*i->prev != p) + i->prev = &(*i->prev)->next; + list_mutex_unlock(&i->list->mutex); + return(p ? p->data : NULL); +} + + +void * +list_insert (ListIterator i, void *x) +{ + void *v; + + assert(i != NULL); + assert(x != NULL); + assert(i->magic == LIST_MAGIC); + list_mutex_lock(&i->list->mutex); + assert(i->list->magic == LIST_MAGIC); + v = list_node_create(i->list, i->prev, x); + list_mutex_unlock(&i->list->mutex); + return(v); +} + + +void * +list_find (ListIterator i, ListFindF f, void *key) +{ + void *v; + + assert(i != NULL); + assert(f != NULL); + assert(key != NULL); + assert(i->magic == LIST_MAGIC); + while ((v=list_next(i)) && !f(v,key)) {;} + return(v); +} + + +void * +list_remove (ListIterator i) +{ + void *v = NULL; + + assert(i != NULL); + assert(i->magic == LIST_MAGIC); + list_mutex_lock(&i->list->mutex); + assert(i->list->magic == LIST_MAGIC); + if (*i->prev != i->pos) + v = list_node_destroy(i->list, i->prev); + list_mutex_unlock(&i->list->mutex); + return(v); +} + + +int +list_delete (ListIterator i) +{ + void *v; + + assert(i != NULL); + assert(i->magic == LIST_MAGIC); + if ((v = list_remove(i))) { + if (i->list->fDel) + i->list->fDel(v); + return(1); + } + return(0); +} + + +static void * +list_node_create (List l, ListNode *pp, void *x) +{ +/* Inserts data pointed to by [x] into list [l] after [pp], + * the address of the previous node's "next" ptr. + * Returns a ptr to data [x], or NULL if insertion fails. + * This routine assumes the list is already locked upon entry. + */ + ListNode p; + ListIterator i; + + assert(l != NULL); + assert(l->magic == LIST_MAGIC); + assert(list_mutex_is_locked(&l->mutex)); + assert(pp != NULL); + assert(x != NULL); + if (!(p = list_node_alloc())) + return(lsd_nomem_error(__FILE__, __LINE__, "list node create")); + p->data = x; + if (!(p->next = *pp)) + l->tail = &p->next; + *pp = p; + l->count++; + for (i=l->iNext; i; i=i->iNext) { + assert(i->magic == LIST_MAGIC); + if (i->prev == pp) + i->prev = &p->next; + else if (i->pos == p->next) + i->pos = p; + assert((i->pos == *i->prev) || (i->pos == (*i->prev)->next)); + } + return(x); +} + + +static void * +list_node_destroy (List l, ListNode *pp) +{ +/* Removes the node pointed to by [*pp] from from list [l], + * where [pp] is the address of the previous node's "next" ptr. + * Returns the data ptr associated with list item being removed, + * or NULL if [*pp] points to the NULL element. + * This routine assumes the list is already locked upon entry. + */ + void *v; + ListNode p; + ListIterator i; + + assert(l != NULL); + assert(l->magic == LIST_MAGIC); + assert(list_mutex_is_locked(&l->mutex)); + assert(pp != NULL); + if (!(p = *pp)) + return(NULL); + v = p->data; + if (!(*pp = p->next)) + l->tail = pp; + l->count--; + for (i=l->iNext; i; i=i->iNext) { + assert(i->magic == LIST_MAGIC); + if (i->pos == p) + i->pos = p->next, i->prev = pp; + else if (i->prev == &p->next) + i->prev = pp; + assert((i->pos == *i->prev) || (i->pos == (*i->prev)->next)); + } + list_node_free(p); + return(v); +} + + +static List +list_alloc (void) +{ + return(list_alloc_aux(sizeof(struct list), &list_free_lists)); +} + + +static void +list_free (List l) +{ + list_free_aux(l, &list_free_lists); + return; +} + + +static ListNode +list_node_alloc (void) +{ + return(list_alloc_aux(sizeof(struct listNode), &list_free_nodes)); +} + + +static void +list_node_free (ListNode p) +{ + list_free_aux(p, &list_free_nodes); + return; +} + + +static ListIterator +list_iterator_alloc (void) +{ + return(list_alloc_aux(sizeof(struct listIterator), &list_free_iterators)); +} + + +static void +list_iterator_free (ListIterator i) +{ + list_free_aux(i, &list_free_iterators); + return; +} + + +static void * +list_alloc_aux (int size, void *pfreelist) +{ +/* Allocates an object of [size] bytes from the freelist [*pfreelist]. + * Memory is added to the freelist in chunks of size LIST_ALLOC. + * Returns a ptr to the object, or NULL if the memory request fails. + */ + void **px; + void **pfree = pfreelist; + void **plast; + + assert(sizeof(char) == 1); + assert(size >= sizeof(void *)); + assert(pfreelist != NULL); + assert(LIST_ALLOC > 0); + list_mutex_lock(&list_free_lock); + if (!*pfree) { + if ((*pfree = xmalloc(LIST_ALLOC * size))) { + px = *pfree; + plast = (void **) ((char *) *pfree + ((LIST_ALLOC - 1) * size)); + while (px < plast) + *px = (char *) px + size, px = *px; + *plast = NULL; + } + } + if ((px = *pfree)) + *pfree = *px; + else + errno = ENOMEM; + list_mutex_unlock(&list_free_lock); + return(px); +} + + +static void +list_free_aux (void *x, void *pfreelist) +{ +/* Frees the object [x], returning it to the freelist [*pfreelist]. + */ +#ifdef MEMORY_LEAK_DEBUG + xfree(x); +#else + void **px = x; + void **pfree = pfreelist; + + assert(x != NULL); + assert(pfreelist != NULL); + list_mutex_lock(&list_free_lock); + *px = *pfree; + *pfree = px; + list_mutex_unlock(&list_free_lock); +#endif + return; +} + +#ifdef WITH_PTHREADS +static void +list_reinit_mutexes (void) +{ + list_mutex_init(&list_free_lock); +} + +void list_install_fork_handlers (void) +{ + int err; + if ((err = pthread_atfork(NULL, NULL, &list_reinit_mutexes))) + lsd_fatal_error(__FILE__, __LINE__, "list atfork install"); + return; +} +#else +void list_install_fork_handlers (void) +{ + return; +} +#endif + +#ifndef NDEBUG +#ifdef WITH_PTHREADS +static int +list_mutex_is_locked (pthread_mutex_t *mutex) +{ +/* Returns true if the mutex is locked; o/w, returns false. + */ + int rc; + + assert(mutex != NULL); + rc = pthread_mutex_trylock(mutex); + return(rc == EBUSY ? 1 : 0); +} +#endif /* WITH_PTHREADS */ +#endif /* !NDEBUG */ diff --git a/executable_names/src/common/list.h b/executable_names/src/common/list.h new file mode 100644 index 0000000000000000000000000000000000000000..d9efbd693e6c2da9baf3ed1036d80ae9c36fa4fd --- /dev/null +++ b/executable_names/src/common/list.h @@ -0,0 +1,300 @@ +/***************************************************************************** + * $Id: list.h,v 1.14 2002/12/11 19:00:36 dun Exp $ + ***************************************************************************** + * $LSDId: list.h,v 1.14 2002/12/11 19:00:36 dun Exp $ + ***************************************************************************** + * Copyright (C) 2001-2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Chris Dunlap . + * + * This file is from LSD-Tools, the LLNL Software Development Toolbox. + * + * LSD-Tools 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * LSD-Tools 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 LSD-Tools; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *****************************************************************************/ + + +#ifndef LSD_LIST_H +#define LSD_LIST_H + + +/*********** + * Notes * + ***********/ +/* + * If NDEBUG is not defined, internal debug code will be enabled. This is + * intended for development use only and production code should define NDEBUG. + * + * If WITH_LSD_FATAL_ERROR_FUNC is defined, the linker will expect to + * find an external lsd_fatal_error(file,line,mesg) function. By default, + * lsd_fatal_error(file,line,mesg) is a macro definition that outputs an + * error message to stderr. This macro may be redefined to invoke another + * routine instead. + * + * If WITH_LSD_NOMEM_ERROR_FUNC is defined, the linker will expect to + * find an external lsd_nomem_error(file,line,mesg) function. By default, + * lsd_nomem_error(file,line,mesg) is a macro definition that returns NULL. + * This macro may be redefined to invoke another routine instead. + * + * If WITH_PTHREADS is defined, these routines will be thread-safe. + */ + + +/**************** + * Data Types * + ****************/ + +typedef struct list * List; +/* + * List opaque data type. + */ + +typedef struct listIterator * ListIterator; +/* + * List Iterator opaque data type. + */ + +typedef void (*ListDelF) (void *x); +/* + * Function prototype to deallocate data stored in a list. + * This function is responsible for freeing all memory associated + * with an item, including all subordinate items (if applicable). + */ + +typedef int (*ListCmpF) (void *x, void *y); +/* + * Function prototype for comparing two items in a list. + * Returns less-than-zero if (xy). + */ + +typedef int (*ListFindF) (void *x, void *key); +/* + * Function prototype for matching items in a list. + * Returns non-zero if (x==key); o/w returns zero. + */ + +typedef int (*ListForF) (void *x, void *arg); +/* + * Function prototype for operating on each item in a list. + * Returns less-than-zero on error. + */ + + +/******************************* + * General-Purpose Functions * + *******************************/ + +List list_create (ListDelF f); +/* + * Creates and returns a new empty list, or lsd_nomem_error() on failure. + * The deletion function [f] is used to deallocate memory used by items + * in the list; if this is NULL, memory associated with these items + * will not be freed when the list is destroyed. + * Note: Abandoning a list without calling list_destroy() will result + * in a memory leak. + */ + +void list_destroy (List l); +/* + * Destroys list [l], freeing memory used for list iterators and the + * list itself; if a deletion function was specified when the list + * was created, it will be called for each item in the list. + */ + +int list_is_empty (List l); +/* + * Returns non-zero if list [l] is empty; o/w returns zero. + */ + +int list_count (List l); +/* + * Returns the number of items in list [l]. + */ + + +/*************************** + * List Access Functions * + ***************************/ + +void * list_append (List l, void *x); +/* + * Inserts data [x] at the end of list [l]. + * Returns the data's ptr, or lsd_nomem_error() if insertion failed. + */ + +void * list_prepend (List l, void *x); +/* + * Inserts data [x] at the beginning of list [l]. + * Returns the data's ptr, or lsd_nomem_error() if insertion failed. + */ + +void * list_find_first (List l, ListFindF f, void *key); +/* + * Traverses list [l] using [f] to match each item with [key]. + * Returns a ptr to the first item for which the function [f] + * returns non-zero, or NULL if no such item is found. + * Note: This function differs from list_find() in that it does not require + * a list iterator; it should only be used when all list items are known + * to be unique (according to the function [f]). + */ + +int list_delete_all (List l, ListFindF f, void *key); +/* + * Traverses list [l] using [f] to match each item with [key]. + * Removes all items from the list for which the function [f] returns + * non-zero; if a deletion function was specified when the list was + * created, it will be called to deallocate each item being removed. + * Returns a count of the number of items removed from the list. + */ + +int list_for_each (List l, ListForF f, void *arg); +/* + * For each item in list [l], invokes the function [f] with [arg]. + * Returns a count of the number of items on which [f] was invoked. + * If [f] returns <0 for a given item, the iteration is aborted and the + * function returns the negative of that item's position in the list. + */ + +void list_sort (List l, ListCmpF f); +/* + * Sorts list [l] into ascending order according to the function [f]. + * Note: Sorting a list resets all iterators associated with the list. + * Note: The sort algorithm is stable. + */ + + +/**************************** + * Stack Access Functions * + ****************************/ + +void * list_push (List l, void *x); +/* + * Pushes data [x] onto the top of stack [l]. + * Returns the data's ptr, or lsd_nomem_error() if insertion failed. + */ + +void * list_pop (List l); +/* + * Pops the data item at the top of the stack [l]. + * Returns the data's ptr, or NULL if the stack is empty. + */ + +void * list_peek (List l); +/* + * Peeks at the data item at the top of the stack (or head of the queue) [l]. + * Returns the data's ptr, or NULL if the stack (or queue) is empty. + * Note: The item is not removed from the list. + */ + + +/**************************** + * Queue Access Functions * + ****************************/ + +void * list_enqueue (List l, void *x); +/* + * Enqueues data [x] at the tail of queue [l]. + * Returns the data's ptr, or lsd_nomem_error() if insertion failed. + */ + +void * list_dequeue (List l); +/* + * Dequeues the data item at the head of the queue [l]. + * Returns the data's ptr, or NULL if the queue is empty. + */ + + +/***************************** + * List Iterator Functions * + *****************************/ + +ListIterator list_iterator_create (List l); +/* + * Creates and returns a list iterator for non-destructively traversing + * list [l], or lsd_nomem_error() on failure. + */ + +void list_iterator_reset (ListIterator i); +/* + * Resets the list iterator [i] to start traversal at the beginning + * of the list. + */ + +void list_iterator_destroy (ListIterator i); +/* + * Destroys the list iterator [i]; list iterators not explicitly destroyed + * in this manner will be destroyed when the list is deallocated via + * list_destroy(). + */ + +void * list_next (ListIterator i); +/* + * Returns a ptr to the next item's data, + * or NULL once the end of the list is reached. + * Example: i=list_iterator_create(i); while ((x=list_next(i))) {...} + */ + +void * list_insert (ListIterator i, void *x); +/* + * Inserts data [x] immediately before the last item returned via list + * iterator [i]; once the list iterator reaches the end of the list, + * insertion is made at the list's end. + * Returns the data's ptr, or lsd_nomem_error() if insertion failed. + */ + +void * list_find (ListIterator i, ListFindF f, void *key); +/* + * Traverses the list from the point of the list iterator [i] + * using [f] to match each item with [key]. + * Returns a ptr to the next item for which the function [f] + * returns non-zero, or NULL once the end of the list is reached. + * Example: i=list_iterator_reset(i); while ((x=list_find(i,f,k))) {...} + */ + +void * list_remove (ListIterator i); +/* + * Removes from the list the last item returned via list iterator [i] + * and returns the data's ptr. + * Note: The client is responsible for freeing the returned data. + */ + +int list_delete (ListIterator i); +/* + * Removes from the list the last item returned via list iterator [i]; + * if a deletion function was specified when the list was created, + * it will be called to deallocate the item being removed. + * Returns a count of the number of items removed from the list + * (ie, '1' if the item was removed, and '0' otherwise). + */ + +void list_install_fork_handlers (void); +/* + * Install pthread_atfork() handlers if WITH_PTHREADS is defined. + * These handlers will ensure that any mutexes internal to the list + * functions are in a proper state after a fork. + */ + +#endif /* !LSD_LIST_H */ diff --git a/executable_names/src/common/log.c b/executable_names/src/common/log.c new file mode 100644 index 0000000000000000000000000000000000000000..1e6cbdd66c707cd7c5e4afc8b54e013440b3498d --- /dev/null +++ b/executable_names/src/common/log.c @@ -0,0 +1,921 @@ +/*****************************************************************************\ + * log.c - slurm logging facilities + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona + * UCRL-CODE-217948. + * + * Much of this code was derived or adapted from the log.c component of + * openssh which contains the following notices: + ***************************************************************************** + * Author: Tatu Ylonen + * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland + * All rights reserved + * + * As far as I am concerned, the code I have written for this software + * can be used freely for any purpose. Any derived versions of this + * software must be clearly marked as such, and if the derived work is + * incompatible with the protocol description in the RFC file, it must be + * called by a name other than "ssh" or "Secure Shell". + ***************************************************************************** + * Copyright (c) 2000 Markus Friedl. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +\*****************************************************************************/ + +/* +** MT safe +*/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#if HAVE_STRING_H +# include +#endif + +#include +#include +#include + +#ifdef WITH_PTHREADS +# include +#endif /* WITH_PTHREADS */ + + +#if HAVE_STDLIB_H +# include /* for abort() */ +#endif + +#include + +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/safeopen.h" +#include "src/common/xassert.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + +#ifndef LINEBUFSIZE +# define LINEBUFSIZE 256 +#endif + +/* +** Define slurm-specific aliases for use by plugins, see slurm_xlator.h +** for details. + */ +strong_alias(log_init, slurm_log_init); +strong_alias(log_reinit, slurm_log_reinit); +strong_alias(log_fini, slurm_log_fini); +strong_alias(log_alter, slurm_log_alter); +strong_alias(log_set_fpfx, slurm_log_set_fpfx); +strong_alias(log_fp, slurm_log_fp); +strong_alias(log_has_data, slurm_log_has_data); +strong_alias(log_flush, slurm_log_flush); +strong_alias(dump_cleanup_list, slurm_dump_cleanup_list); +strong_alias(fatal_add_cleanup, slurm_fatal_add_cleanup); +strong_alias(fatal_add_cleanup_job, slurm_fatal_add_cleanup_job); +strong_alias(fatal_remove_cleanup, slurm_fatal_remove_cleanup); +strong_alias(fatal_remove_cleanup_job, slurm_fatal_remove_cleanup_job); +strong_alias(fatal_cleanup, slurm_fatal_cleanup); +strong_alias(fatal, slurm_fatal); +strong_alias(error, slurm_error); +strong_alias(info, slurm_info); +strong_alias(verbose, slurm_verbose); +strong_alias(debug, slurm_debug); +strong_alias(debug2, slurm_debug2); +strong_alias(debug3, slurm_debug3); + +/* +** struct defining a "log" type +*/ +typedef struct { + char *argv0; + char *fpfx; /* optional prefix for logfile entries */ + FILE *logfp; /* log file pointer */ + cbuf_t buf; /* stderr data buffer */ + cbuf_t fbuf; /* logfile data buffer */ + log_facility_t facility; + log_options_t opt; + unsigned initialized:1; +} log_t; + +/* static variables */ +#ifdef WITH_PTHREADS + static pthread_mutex_t log_lock = PTHREAD_MUTEX_INITIALIZER; +#else + static int log_lock; +#endif /* WITH_PTHREADS */ +static log_t *log = NULL; + +#define LOG_INITIALIZED ((log != NULL) && (log->initialized)) + +/* define a default argv0 */ +#if HAVE_PROGRAM_INVOCATION_NAME +/* This used to use program_invocation_short_name, but on some systems + * that gets truncated at 16 bytes, too short for our needs. */ +extern char * program_invocation_name; +# define default_name program_invocation_name +#else +# define default_name "" +#endif + + +/* + * pthread_atfork handlers: + */ +#ifdef WITH_PTHREADS +static void _atfork_prep() { slurm_mutex_lock(&log_lock); } +static void _atfork_parent() { slurm_mutex_unlock(&log_lock); } +static void _atfork_child() { slurm_mutex_unlock(&log_lock); } +static bool at_forked = false; +# define atfork_install_handlers() \ + while (!at_forked) { \ + pthread_atfork(_atfork_prep, _atfork_parent, _atfork_child); \ + at_forked = true; \ + } +#else +# define atfork_install_handlers() (NULL) +#endif +static void _log_flush(); + +/* + * Initialize log with + * prog = program name to tag error messages with + * opt = log_options_t specifying max log levels for syslog, stderr, and file + * fac = log facility for syslog (unused if syslog level == LOG_QUIET) + * logfile = + * logfile name if logfile level > LOG_QUIET + */ +static int +_log_init(char *prog, log_options_t opt, log_facility_t fac, char *logfile ) +{ + int rc = 0; + + if (!log) { + log = (log_t *)xmalloc(sizeof(log_t)); + log->logfp = NULL; + log->argv0 = NULL; + log->buf = NULL; + log->fbuf = NULL; + log->fpfx = NULL; + atfork_install_handlers(); + } + + if (prog) { + if (log->argv0) + xfree(log->argv0); + log->argv0 = xstrdup(xbasename(prog)); + } else if (!log->argv0) { + char *short_name = strrchr(default_name, '/'); + if (short_name) + short_name++; + else + short_name = default_name; + log->argv0 = xstrdup(short_name); + } + + if (!log->fpfx) + log->fpfx = xstrdup(""); + + log->opt = opt; + + if (log->buf) + cbuf_destroy(log->buf); + if (log->fbuf) + cbuf_destroy(log->fbuf); + + if (log->opt.buffered) { + log->buf = cbuf_create(128, 8192); + log->fbuf = cbuf_create(128, 8192); + } + + if (log->opt.syslog_level > LOG_LEVEL_QUIET) + log->facility = fac; + + if (logfile && (log->opt.logfile_level > LOG_LEVEL_QUIET)) { + FILE *fp; + + fp = safeopen(logfile, "a", SAFEOPEN_LINK_OK); + + if (!fp) { + char *errmsg = NULL; + slurm_mutex_unlock(&log_lock); + xslurm_strerrorcat(errmsg); + fprintf(stderr, + "%s: log_init(): Unable to open logfile" + "`%s': %s\n", prog, logfile, errmsg); + xfree(errmsg); + rc = errno; + goto out; + } + + if (log->logfp) + fclose(log->logfp); /* Ignore errors */ + + log->logfp = fp; + } + + if (log->logfp && (fileno(log->logfp) < 0)) + log->logfp = NULL; + + log->initialized = 1; + out: + return rc; +} + + +/* initialize log mutex, then initialize log data structures + */ +int log_init(char *prog, log_options_t opt, log_facility_t fac, char *logfile) +{ + int rc = 0; + + slurm_mutex_lock(&log_lock); + rc = _log_init(prog, opt, fac, logfile); + slurm_mutex_unlock(&log_lock); + return rc; +} + +void log_fini() +{ + if (!log) + return; + + slurm_mutex_lock(&log_lock); + _log_flush(); + xfree(log->argv0); + xfree(log->fpfx); + if (log->buf) + cbuf_destroy(log->buf); + if (log->fbuf) + cbuf_destroy(log->fbuf); + if (log->logfp) + fclose(log->logfp); + xfree(log); + log = NULL; + slurm_mutex_unlock(&log_lock); +} + +void log_reinit() +{ + slurm_mutex_init(&log_lock); +} + +void log_set_fpfx(char *prefix) +{ + slurm_mutex_lock(&log_lock); + xfree(log->fpfx); + if (!prefix) + log->fpfx = xstrdup(""); + else { + log->fpfx = xstrdup(prefix); + xstrcatchar(log->fpfx, ' '); + } + slurm_mutex_unlock(&log_lock); +} + +void log_set_argv0(char *argv0) +{ + slurm_mutex_lock(&log_lock); + if (log->argv0) + xfree(log->argv0); + if (!argv0) + log->argv0 = xstrdup(""); + else + log->argv0 = xstrdup(argv0); + slurm_mutex_unlock(&log_lock); +} + +/* reinitialize log data structures. Like log_init, but do not init + * the log mutex + */ +int log_alter(log_options_t opt, log_facility_t fac, char *logfile) +{ + int rc = 0; + slurm_mutex_lock(&log_lock); + rc = _log_init(NULL, opt, fac, logfile); + slurm_mutex_unlock(&log_lock); + return rc; +} + +/* return the FILE * of the current logfile (stderr if logging to stderr) + */ +FILE *log_fp(void) +{ + FILE *fp; + slurm_mutex_lock(&log_lock); + if (log->logfp) + fp = log->logfp; + else + fp = stderr; + slurm_mutex_unlock(&log_lock); + return fp; +} + +/* return a heap allocated string formed from fmt and ap arglist + * returned string is allocated with xmalloc, so must free with xfree. + * + * args are like printf, with the addition of the following format chars: + * - %m expands to strerror(errno) + * - %t expands to strftime("%x %X") [ locally preferred short date/time ] + * - %T expands to rfc822 date time [ "dd Mon yyyy hh:mm:ss GMT offset" ] + * + * simple format specifiers are handled explicitly to avoid calls to + * vsnprintf and allow dynamic sizing of the message buffer. If a call + * is made to vsnprintf, however, the message will be limited to 1024 bytes. + * (inc. newline) + * + */ +static char *vxstrfmt(const char *fmt, va_list ap) +{ + char *buf = NULL; + char *p = NULL; + size_t len = (size_t) 0; + char tmp[LINEBUFSIZE]; + int unprocessed = 0; + + + while (*fmt != '\0') { + + if ((p = (char *)strchr(fmt, '%')) == NULL) { + /* no more format chars */ + xstrcat(buf, fmt); + break; + + } else { /* *p == '%' */ + + /* take difference from fmt to just before `%' */ + len = (size_t) ((long)(p) - (long)fmt); + + /* append from fmt to p into buf if there's + * anythere there + */ + if (len > 0) { + memcpy(tmp, fmt, len); + tmp[len] = '\0'; + xstrcat(buf, tmp); + } + + switch (*(++p)) { + case '%': /* "%%" => "%" */ + xstrcatchar(buf, '%'); + break; + + case 'm': /* "%m" => strerror(errno) */ + xslurm_strerrorcat(buf); + break; + + case 't': /* "%t" => locally preferred date/time*/ + xstrftimecat(buf, "%x %X"); + break; + case 'T': /* "%T" => "dd Mon yyyy hh:mm:ss off" */ + xstrftimecat(buf, "%a %d %b %Y %H:%M:%S %z"); + break; + case 'M': /* "%M" => "Mon DD hh:mm:ss" */ + xstrftimecat(buf, "%b %d %T"); + break; + case 's': /* "%s" => append string */ + /* we deal with this case for efficiency */ + if (unprocessed == 0) + xstrcat(buf, va_arg(ap, char *)); + else + xstrcat(buf, "%s"); + break; + case 'f': /* "%f" => append double */ + /* again, we only handle this for efficiency */ + if (unprocessed == 0) { + snprintf(tmp, sizeof(tmp), "%f", + va_arg(ap, double)); + xstrcat(buf, tmp); + } else + xstrcat(buf, "%f"); + break; + case 'd': + if (unprocessed == 0) { + snprintf(tmp, sizeof(tmp), "%d", + va_arg(ap, int)); + xstrcat(buf, tmp); + } else + xstrcat(buf, "%d"); + break; + case 'u': + if (unprocessed == 0) { + snprintf(tmp, sizeof(tmp), "%u", + va_arg(ap, int)); + xstrcat(buf, tmp); + } else + xstrcat(buf, "%u"); + break; + case 'l': + if ((unprocessed == 0) && (*(p+1) == 'u')) { + snprintf(tmp, sizeof(tmp), "%lu", + va_arg(ap, long unsigned)); + xstrcat(buf, tmp); + p++; + } else if ((unprocessed==0) && (*(p+1)=='d')) { + snprintf(tmp, sizeof(tmp), "%ld", + va_arg(ap, long int)); + xstrcat(buf, tmp); + p++; + } else if ((unprocessed==0) && (*(p+1)=='x')) { + snprintf(tmp, sizeof(tmp), "%lx", + va_arg(ap, long int)); + xstrcat(buf, tmp); + p++; + } else + xstrcat(buf, "%l"); + break; + default: /* try to handle the rest */ + xstrcatchar(buf, '%'); + xstrcatchar(buf, *p); + unprocessed++; + break; + } + + } + + fmt = p + 1; + } + + if (unprocessed > 0) { + vsnprintf(tmp, sizeof(tmp)-1, buf, ap); + xfree(buf); + return xstrdup(tmp); + } + + return buf; +} + +/* + * concatenate result of xstrfmt() to dst, expanding dst if necessary + */ +static void xlogfmtcat(char **dst, const char *fmt, ...) +{ + va_list ap; + char *buf = NULL; + + va_start(ap, fmt); + buf = vxstrfmt(fmt, ap); + va_end(ap); + + xstrcat(*dst, buf); + + xfree(buf); + +} + +static void +_log_printf(cbuf_t cb, FILE *stream, const char *fmt, ...) +{ + va_list ap; + + xassert(fileno(stream) >= 0); + + va_start(ap, fmt); + if (log->opt.buffered && (cb != NULL)) { + char *buf = vxstrfmt(fmt, ap); + int len = strlen(buf); + int dropped; + cbuf_write(cb, buf, len, &dropped); + cbuf_read_to_fd(cb, fileno(stream), -1); + xfree(buf); + } else { + vfprintf(stream, fmt, ap); + } + va_end(ap); + +} + +/* + * log a message at the specified level to facilities that have been + * configured to receive messages at that level + */ +static void log_msg(log_level_t level, const char *fmt, va_list args) +{ + char *pfx = ""; + char *buf = NULL; + char *msgbuf = NULL; + int priority = LOG_INFO; + + slurm_mutex_lock(&log_lock); + if (!LOG_INITIALIZED) { + log_options_t opts = LOG_OPTS_STDERR_ONLY; + _log_init(NULL, opts, 0, NULL); + } + + if (level > log->opt.syslog_level && + level > log->opt.logfile_level && + level > log->opt.stderr_level) { + slurm_mutex_unlock(&log_lock); + return; + } + + if (log->opt.prefix_level || log->opt.syslog_level > level) { + switch (level) { + case LOG_LEVEL_FATAL: + priority = LOG_CRIT; + pfx = "fatal: "; + break; + + case LOG_LEVEL_ERROR: + priority = LOG_ERR; + pfx = "error: "; + break; + + case LOG_LEVEL_INFO: + case LOG_LEVEL_VERBOSE: + priority = LOG_INFO; + break; + + case LOG_LEVEL_DEBUG: + priority = LOG_DEBUG; + pfx = "debug: "; + break; + + case LOG_LEVEL_DEBUG2: + priority = LOG_DEBUG; + pfx = "debug2: "; + break; + + case LOG_LEVEL_DEBUG3: + priority = LOG_DEBUG; + pfx = "debug3: "; + break; + + case LOG_LEVEL_DEBUG4: + priority = LOG_DEBUG; + pfx = "debug4: "; + break; + + case LOG_LEVEL_DEBUG5: + priority = LOG_DEBUG; + pfx = "debug5: "; + break; + + default: + priority = LOG_ERR; + pfx = "internal error: "; + break; + } + + } + + /* format the basic message */ + buf = vxstrfmt(fmt, args); + + if (level <= log->opt.stderr_level) { + fflush(stdout); + if (strlen(buf) > 0 && buf[strlen(buf) - 1] == '\n') + _log_printf( log->buf, stderr, "%s: %s%s", + log->argv0, pfx, buf); + else + _log_printf( log->buf, stderr, "%s: %s%s\n", + log->argv0, pfx, buf); + fflush(stderr); + } + + if (level <= log->opt.logfile_level && log->logfp != NULL) { + xlogfmtcat(&msgbuf, "[%M] %s%s%s", + log->fpfx, pfx, buf); + + if (strlen(buf) > 0 && buf[strlen(buf) - 1] == '\n') + _log_printf(log->fbuf, log->logfp, "%s", msgbuf); + else + _log_printf(log->fbuf, log->logfp, "%s\n", msgbuf); + fflush(log->logfp); + + xfree(msgbuf); + } + + if (level <= log->opt.syslog_level) { + xlogfmtcat(&msgbuf, "%s%s", pfx, buf); + + openlog(log->argv0, LOG_PID, log->facility); + syslog(priority, "%.500s", msgbuf); + closelog(); + + xfree(msgbuf); + } + + slurm_mutex_unlock(&log_lock); + + xfree(buf); +} + +bool +log_has_data() +{ + bool rc = false; + slurm_mutex_lock(&log_lock); + if (log->opt.buffered) + rc = (cbuf_used(log->buf) > 0); + slurm_mutex_unlock(&log_lock); + return rc; +} + +static void +_log_flush() +{ + if (!log->opt.buffered) + return; + + if (log->opt.stderr_level) + cbuf_read_to_fd(log->buf, fileno(stderr), -1); + else if (log->logfp && (fileno(log->logfp) > 0)) + cbuf_read_to_fd(log->fbuf, fileno(log->logfp), -1); +} + +void +log_flush() +{ + slurm_mutex_lock(&log_lock); + _log_flush(); + slurm_mutex_unlock(&log_lock); +} + +/* LLNL Software development Toolbox (LSD-Tools) + * fatal() and nomem() functions + */ +void +lsd_fatal_error(char *file, int line, char *msg) +{ + error("%s:%d %s: %m", file, line, msg); +} + +void * +lsd_nomem_error(char *file, int line, char *msg) +{ + error("%s:%d %s: %m", file, line, msg); + slurm_seterrno(ENOMEM); + return NULL; +} + +/* + * attempt to log message and abort() + */ +void fatal(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_msg(LOG_LEVEL_FATAL, fmt, ap); + va_end(ap); + log_flush(); + fatal_cleanup(); + + exit(1); +} + +int error(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_msg(LOG_LEVEL_ERROR, fmt, ap); + va_end(ap); + + /* + * Return SLURM_ERROR so calling functions can + * do "return error (...);" + */ + return SLURM_ERROR; +} + +void info(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_msg(LOG_LEVEL_INFO, fmt, ap); + va_end(ap); +} + +void verbose(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_msg(LOG_LEVEL_VERBOSE, fmt, ap); + va_end(ap); +} + +void debug(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_msg(LOG_LEVEL_DEBUG, fmt, ap); + va_end(ap); +} + +void debug2(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_msg(LOG_LEVEL_DEBUG2, fmt, ap); + va_end(ap); +} + +void debug3(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_msg(LOG_LEVEL_DEBUG3, fmt, ap); + va_end(ap); +} + +/* + * Debug levels higher than debug3 are not written to stderr in the + * slurmstepd process after stderr is connected back to the client (srun). + */ +void debug4(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_msg(LOG_LEVEL_DEBUG4, fmt, ap); + va_end(ap); +} + +void debug5(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_msg(LOG_LEVEL_DEBUG5, fmt, ap); + va_end(ap); +} + +/* Fatal cleanup */ + +struct fatal_cleanup { + pthread_t thread_id; + struct fatal_cleanup *next; + void (*proc) (void *); + void *context; +}; + +/* static variables */ +#ifdef WITH_PTHREADS + static pthread_mutex_t fatal_lock = PTHREAD_MUTEX_INITIALIZER; +#else + static int fatal_lock; +#endif /* WITH_PTHREADS */ +static struct fatal_cleanup *fatal_cleanups = NULL; + +/* Registers a cleanup function to be called by fatal() for this thread +** before exiting. */ +void +fatal_add_cleanup(void (*proc) (void *), void *context) +{ + struct fatal_cleanup *cu; + + slurm_mutex_lock(&fatal_lock); + cu = xmalloc(sizeof(*cu)); + cu->thread_id = pthread_self(); + cu->proc = proc; + cu->context = context; + cu->next = fatal_cleanups; + fatal_cleanups = cu; + slurm_mutex_unlock(&fatal_lock); +} + +/* Registers a cleanup function to be called by fatal() for all threads +** of the job. */ +void +fatal_add_cleanup_job(void (*proc) (void *), void *context) +{ + struct fatal_cleanup *cu; + + slurm_mutex_lock(&fatal_lock); + cu = xmalloc(sizeof(*cu)); + cu->thread_id = 0; + cu->proc = proc; + cu->context = context; + cu->next = fatal_cleanups; + fatal_cleanups = cu; + slurm_mutex_unlock(&fatal_lock); +} + +/* Removes a cleanup frunction to be called at fatal() for this thread. */ +void +fatal_remove_cleanup(void (*proc) (void *context), void *context) +{ + struct fatal_cleanup **cup, *cu; + pthread_t my_thread_id = pthread_self(); + + slurm_mutex_lock(&fatal_lock); + for (cup = &fatal_cleanups; *cup; cup = &cu->next) { + cu = *cup; + if (cu->thread_id == my_thread_id && + cu->proc == proc && + cu->context == context) { + *cup = cu->next; + xfree(cu); + slurm_mutex_unlock(&fatal_lock); + return; + } + } + slurm_mutex_unlock(&fatal_lock); + fatal("fatal_remove_cleanup: no such cleanup function: 0x%lx 0x%lx", + (u_long) proc, (u_long) context); +} + +/* Removes a cleanup frunction to be called at fatal() for all threads of +** the job. */ +void +fatal_remove_cleanup_job(void (*proc) (void *context), void *context) +{ + struct fatal_cleanup **cup, *cu; + + slurm_mutex_lock(&fatal_lock); + for (cup = &fatal_cleanups; *cup; cup = &cu->next) { + cu = *cup; + if (cu->thread_id == 0 && + cu->proc == proc && + cu->context == context) { + *cup = cu->next; + xfree(cu); + slurm_mutex_unlock(&fatal_lock); + return; + } + } + slurm_mutex_unlock(&fatal_lock); + fatal("fatal_remove_cleanup_job: no such cleanup function: " + "0x%lx 0x%lx", (u_long) proc, (u_long) context); +} + +/* Execute cleanup functions, first thread-specific then those for the +** whole job */ +void +fatal_cleanup(void) +{ + struct fatal_cleanup **cup, *cu; + pthread_t my_thread_id = pthread_self(); + + slurm_mutex_lock(&fatal_lock); + for (cup = &fatal_cleanups; *cup; ) { + cu = *cup; + if (cu->thread_id != my_thread_id) { + cup = &cu->next; + continue; + } + debug("Calling cleanup 0x%x(0x%x)", + (u_long) cu->proc, (u_long) cu->context); + (*cu->proc) (cu->context); + *cup = cu->next; + xfree(cu); + } + for (cup = &fatal_cleanups; *cup; cup = &cu->next) { + cu = *cup; + if (cu->thread_id != 0) + continue; + debug("Calling cleanup 0x%x(0x%x)", + (u_long) cu->proc, (u_long) cu->context); + (*cu->proc) (cu->context); + } + slurm_mutex_unlock(&fatal_lock); +} + +/* Print a list of cleanup frunctions to be called at fatal(). */ +void +dump_cleanup_list(void) +{ + struct fatal_cleanup **cup, *cu; + + slurm_mutex_lock(&fatal_lock); + for (cup = &fatal_cleanups; *cup; cup = &cu->next) { + cu = *cup; + info ("loc=%ld thread_id=%ld proc=%ld, context=%ld, next=%ld", + (long)cu, (long)cu->thread_id, (long)cu->proc, + (long)cu->context, (long)cu->next); + } + slurm_mutex_unlock(&fatal_lock); +} + diff --git a/executable_names/src/common/log.h b/executable_names/src/common/log.h new file mode 100644 index 0000000000000000000000000000000000000000..90f4c042a9cf438b7b44adb25538d5ecac16bd38 --- /dev/null +++ b/executable_names/src/common/log.h @@ -0,0 +1,219 @@ +/*****************************************************************************\ + * log.h - configurable logging for slurm: log to file, stderr and/or syslog. + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona + * UCRL-CODE-217948. + * + * Much of this code was derived or adapted from the log.c component of + * openssh which contains the following notices: + ***************************************************************************** + * Author: Tatu Ylonen + * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland + * All rights reserved + * + * As far as I am concerned, the code I have written for this software + * can be used freely for any purpose. Any derived versions of this + * software must be clearly marked as such, and if the derived work is + * incompatible with the protocol description in the RFC file, it must be + * called by a name other than "ssh" or "Secure Shell". + ***************************************************************************** + * Copyright (c) 2000 Markus Friedl. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +\*****************************************************************************/ + +#ifndef _LOG_H +#define _LOG_H + +#include +#include + +#include "src/common/macros.h" +#include "src/common/cbuf.h" + +/* supported syslog facilities and levels */ +typedef enum { + SYSLOG_FACILITY_DAEMON = LOG_DAEMON, + SYSLOG_FACILITY_USER = LOG_USER, + SYSLOG_FACILITY_AUTH = LOG_AUTH, +#ifdef LOG_AUTHPRIV + SYSLOG_FACILITY_AUTHPRIV = LOG_AUTHPRIV, +#endif + SYSLOG_FACILITY_LOCAL0 = LOG_LOCAL0, + SYSLOG_FACILITY_LOCAL1 = LOG_LOCAL1, + SYSLOG_FACILITY_LOCAL2 = LOG_LOCAL2, + SYSLOG_FACILITY_LOCAL3 = LOG_LOCAL3, + SYSLOG_FACILITY_LOCAL4 = LOG_LOCAL4, + SYSLOG_FACILITY_LOCAL5 = LOG_LOCAL5, + SYSLOG_FACILITY_LOCAL6 = LOG_LOCAL6, + SYSLOG_FACILITY_LOCAL7 = LOG_LOCAL7 +} log_facility_t; + +/* + * log levels, logging will occur at or below the selected level + * QUIET disable logging completely. + */ +typedef enum { + LOG_LEVEL_QUIET = 0, + LOG_LEVEL_FATAL, + LOG_LEVEL_ERROR, + LOG_LEVEL_INFO, + LOG_LEVEL_VERBOSE, + LOG_LEVEL_DEBUG, + LOG_LEVEL_DEBUG2, + LOG_LEVEL_DEBUG3, + LOG_LEVEL_DEBUG4, + LOG_LEVEL_DEBUG5, + LOG_LEVEL_END +} log_level_t; + + +/* + * log options: Each of stderr, syslog, and logfile can have a different level + */ +typedef struct { + log_level_t stderr_level; /* max level to log to stderr */ + log_level_t syslog_level; /* max level to log to syslog */ + log_level_t logfile_level; /* max level to log to logfile */ + unsigned prefix_level:1; /* prefix level (e.g. "debug: ") if 1 */ + unsigned buffered:1; /* Use internal buffer to never block */ +} log_options_t; + +/* some useful initializers for log_options_t + */ +#define LOG_OPTS_INITIALIZER \ + { LOG_LEVEL_INFO, LOG_LEVEL_INFO, LOG_LEVEL_INFO, 1, 0 } + +#define LOG_OPTS_SYSLOG_DEFAULT \ + { LOG_LEVEL_QUIET, LOG_LEVEL_INFO, LOG_LEVEL_QUIET, 1, 0 } + +#define LOG_OPTS_STDERR_ONLY \ + { LOG_LEVEL_INFO, LOG_LEVEL_QUIET, LOG_LEVEL_QUIET, 1, 0 } + +/* + * initialize log module (called only once) + * + * example: + * + * To initialize log module to print fatal messages to stderr, and + * all messages up to and including info() to syslog: + * + * log_options_t logopts = LOG_OPTS_INITIALIZER; + * logopts.stderr_level = LOG_LEVEL_FATAL; + * logopts.syslog_level = LOG_LEVEL_INFO; + * + * rc = log_init(argv[0], logopts, SYSLOG_FACILITY_DAEMON, NULL); + * + * log function automatically takes the basename() of argv0. + */ +int log_init(char *argv0, log_options_t opts, + log_facility_t fac, char *logfile); + +/* reinitialize log module. + * Keep same log options as previously initialized log, but reinit mutex + * that protects the log. This call is needed after a fork() in a threaded + * program + */ +void log_reinit(void); + +/* + * Close log and free associated memory + */ +void log_fini(void); + +/* Alter log facility, options are like log_init() above, except that + * an argv0 argument is not passed. + * + * This function may be called multiple times. + */ +int log_alter(log_options_t opts, log_facility_t fac, char *logfile); + +/* Set prefix for log file entries + * (really only useful for slurmd at this point) + */ +void log_set_fpfx(char *pfx); + +/* + * (re)set argv0 string prepended to all log messages + */ +void log_set_argv0(char *pfx); + +/* grab the FILE * of the current logfile (or stderr if not logging to + * a file) + */ +FILE *log_fp(void); + +/* + * Buffered log functions: + * + * log_has_data() returns true if there is data in the + * internal log buffer + */ +bool log_has_data(void); + +/* + * log_flush() attempts to flush all data in the internal + * log buffer to the appropriate output stream. + */ +void log_flush(void); + +/* + * the following log a message to the log facility at the appropriate level: + * + * Messages do not need a newline! + * + * args are printf style with the following exceptions: + * + * fmt expands to + * ~~~~ ~~~~~~~~~~~ + * "%m" => strerror(errno) + * "%t" => strftime "%x %X" (locally preferred short date/time) + * "%T" => strftime "%a %d %b %Y %H:%M:%S %z" (rfc822 date/time) + */ + +/* fatal() aborts program unless NDEBUG defined + * error() returns SLURM_ERROR + */ +void fatal(const char *, ...); +int error(const char *, ...); +void info(const char *, ...); +void verbose(const char *, ...); +void debug(const char *, ...); +void debug2(const char *, ...); +void debug3(const char *, ...); +/* + * Debug levels higher than debug3 are not written to stderr in the + * slurmstepd process after stderr is connected back to the client (srun). + */ +void debug4(const char *, ...); +void debug5(const char *, ...); + +void dump_cleanup_list(void); +void fatal_add_cleanup(void (*proc) (void *), void *context); +void fatal_add_cleanup_job(void (*proc) (void *), void *context); +void fatal_remove_cleanup(void (*proc) (void *context), void *context); +void fatal_remove_cleanup_job(void (*proc) (void *context), void *context); +void fatal_cleanup(void); + +#endif /* !_LOG_H */ + diff --git a/executable_names/src/common/macros.h b/executable_names/src/common/macros.h new file mode 100644 index 0000000000000000000000000000000000000000..5650ab9087fc7f97f31716da69dd3d99504c04dc --- /dev/null +++ b/executable_names/src/common/macros.h @@ -0,0 +1,264 @@ +/*****************************************************************************\ + * src/common/macros.h - some standard macros for slurm + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _MACROS_H +#define _MACROS_H 1 + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#ifndef NULL +# include /* for NULL */ +#endif + +#if HAVE_STDBOOL_H +# include +#else +typedef enum {false, true} bool; +#endif /* !HAVE_STDBOOL_H */ + +#if HAVE_PTHREAD_H +# include +#endif + +#include /* for errno */ +#include "src/common/log.h" /* for error() */ + +#ifndef FALSE +# define FALSE false +#endif + +#ifndef TRUE +# define TRUE true +#endif + +#ifndef MAX +# define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +/* Avoid going over 32 bits for a constant to avoid warnings on some systems */ +# define UINT64_SWAP_LE_BE(val) ((uint64_t) ( \ + (((uint64_t) (val) & \ + (uint64_t) (0x00000000000000ffU)) << 56) | \ + (((uint64_t) (val) & \ + (uint64_t) (0x000000000000ff00U)) << 40) | \ + (((uint64_t) (val) & \ + (uint64_t) (0x0000000000ff0000U)) << 24) | \ + (((uint64_t) (val) & \ + (uint64_t) (0x00000000ff000000U)) << 8) | \ + (((uint64_t) (val) >> 8) & \ + (uint64_t) (0x00000000ff000000U)) | \ + (((uint64_t) (val) >> 24) & \ + (uint64_t) (0x0000000000ff0000U)) | \ + (((uint64_t) (val) >> 40) & \ + (uint64_t) (0x000000000000ff00U)) | \ + (((uint64_t) (val) >> 56) & \ + (uint64_t) (0x00000000000000ffU)) )) + +#if SLURM_BIGENDIAN +# define HTON_int64(x) ((int64_t) (x)) +# define NTOH_int64(x) ((int64_t) (x)) +# define HTON_uint64(x) ((uint64_t) (x)) +# define NTOH_uint64(x) ((uint64_t) (x)) +#else +# define HTON_int64(x) ((int64_t) UINT64_SWAP_LE_BE (x)) +# define NTOH_int64(x) ((int64_t) UINT64_SWAP_LE_BE (x)) +# define HTON_uint64(x) UINT64_SWAP_LE_BE (x) +# define NTOH_uint64(x) UINT64_SWAP_LE_BE (x) +#endif /* SLURM_BIGENDIAN */ + + + +/* +** define __CURRENT_FUNC__ macro for returning current function +*/ +#if defined (__GNUC__) && (__GNUC__ < 3) +# define __CURRENT_FUNC__ __PRETTY_FUNCTION__ +#else /* !__GNUC__ */ +# ifdef _AIX +# define __CURRENT_FUNC__ __func__ +# else +# define __CURRENT_FUNC__ "" +# endif /* _AIX */ +#endif /* __GNUC__ */ + +#ifndef __STRING +# define __STRING(arg) #arg +#endif + +/* define macros for GCC function attributes if we're using gcc */ + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 4) +# define __PRINTF_ATTR( form_idx, arg_idx ) \ + __attribute__((__format__ (__printf__, form_idx, arg_idx))) +# define __NORETURN_ATTR \ + __attribute__((__noreturn__)) +#else /* !__GNUC__ */ +# define __PRINTF_ATTR( format_idx, arg_idx ) ((void)0) +# define __NORETURN_ATTR ((void)0) +#endif /* __GNUC__ */ + +/* the following is taken directly from glib 2.0, with minor changes */ + +/* Provide simple macro statement wrappers (adapted from Perl): + * _STMT_START { statements; } _STMT_END; + * can be used as a single statement, as in + * if (x) _STMT_START { ... } _STMT_END; else ... + * + * For gcc we will wrap the statements within `({' and `})' braces. + * For SunOS they will be wrapped within `if (1)' and `else (void) 0', + * and otherwise within `do' and `while (0)'. + */ +#if !(defined (_STMT_START) && defined (_STMT_END)) +# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus) +# define _STMT_START (void)( +# define _STMT_END ) +# else +# if (defined (sun) || defined (__sun__)) +# define _STMT_START if (1) +# define _STMT_END else (void)0 +# else +# define _STMT_START do +# define _STMT_END while (0) +# endif +# endif +#endif + +#ifdef WITH_PTHREADS + +# define slurm_mutex_init(mutex) \ + _STMT_START { \ + int err = pthread_mutex_init(mutex, NULL); \ + if (err) { \ + errno = err; \ + error("%s:%d %s: pthread_mutex_init(): %m", \ + __FILE__, __LINE__, __CURRENT_FUNC__); \ + } \ + } _STMT_END + +# define slurm_mutex_destroy(mutex) \ + _STMT_START { \ + int err = pthread_mutex_destroy(mutex); \ + if (err) { \ + errno = err; \ + error("%s:%d %s: pthread_mutex_destroy(): %m", \ + __FILE__, __LINE__, __CURRENT_FUNC__); \ + } \ + } _STMT_END + +# define slurm_mutex_lock(mutex) \ + _STMT_START { \ + int err = pthread_mutex_lock(mutex); \ + if (err) { \ + errno = err; \ + error("%s:%d %s: pthread_mutex_lock(): %m", \ + __FILE__, __LINE__, __CURRENT_FUNC__); \ + } \ + } _STMT_END + +# define slurm_mutex_unlock(mutex) \ + _STMT_START { \ + int err = pthread_mutex_unlock(mutex); \ + if (err) { \ + errno = err; \ + error("%s:%d %s: pthread_mutex_unlock(): %m", \ + __FILE__, __LINE__, __CURRENT_FUNC__); \ + } \ + } _STMT_END + +# ifdef PTHREAD_SCOPE_SYSTEM +# define slurm_attr_init(attr) \ + _STMT_START { \ + if (pthread_attr_init(attr)) \ + fatal("pthread_attr_init: %m"); \ + /* we want 1:1 threads if there is a choice */ \ + if (pthread_attr_setscope(attr, PTHREAD_SCOPE_SYSTEM)) \ + error("pthread_attr_setscope: %m"); \ + if (pthread_attr_setstacksize(attr, 1024*1024)) \ + error("pthread_attr_setstacksize: %m"); \ + } _STMT_END +# else +# define slurm_attr_init(attr) \ + _STMT_START { \ + if (pthread_attr_init(attr)) \ + fatal("pthread_attr_init: %m"); \ + if (pthread_attr_setstacksize(attr, 1024*1024)) \ + error("pthread_attr_setstacksize: %m"); \ + } _STMT_END +# endif + +# define slurm_attr_destroy(attr) \ + _STMT_START { \ + if (pthread_attr_destroy(attr)) \ + error("pthread_attr_destroy failed, possible memory leak!: %m"); \ + } _STMT_END + +#else /* !WITH_PTHREADS */ + +# define slurm_mutex_init(mutex) +# define slurm_mutex_destroy(mutex) +# define slurm_mutex_lock(mutex) +# define slurm_mutex_unlock(mutex) +# define slurm_attr_init(attr) +# define slurm_attr_destroy(attr) + +#endif /* WITH_PTHREADS */ + +#ifndef strong_alias +# if USE_ALIAS +# define strong_alias(name, aliasname) \ + extern __typeof (name) aliasname __attribute ((alias (#name))) +# else + /* dummy function definition, + * confirm "aliasname" is free and waste "name" */ +# define strong_alias(name, aliasname) \ + extern void aliasname(int name) +# endif +#endif + +#ifndef HAVE_STRNDUP +# undef strndup +# define strndup(src,size) strdup(src) +#endif + +#endif /* !_MACROS_H */ diff --git a/executable_names/src/common/malloc.c b/executable_names/src/common/malloc.c new file mode 100644 index 0000000000000000000000000000000000000000..26e5bd95fe4e2e7f9b4f372d3b295755bc8efcad --- /dev/null +++ b/executable_names/src/common/malloc.c @@ -0,0 +1,22 @@ +/* From the autoconf info document, required for AIX */ +#if HAVE_CONFIG_H +# include "config.h" +# if (!HAVE_MALLOC) + +# include + +# undef malloc + void *malloc (); + + /* Allocate an N-byte block of memory from the heap. + If N is zero, allocate a 1-byte block. */ + + void * rpl_malloc (size_t n) + { + if (n == 0) + n = 1; + return malloc (n); + } + +# endif /* (!HAVE_MALLOC) */ +#endif /* HAVE_CONFIG_H */ diff --git a/executable_names/src/common/malloc.h b/executable_names/src/common/malloc.h new file mode 100644 index 0000000000000000000000000000000000000000..bb2046dd363e0428333937f857b21a7bb6fe82df --- /dev/null +++ b/executable_names/src/common/malloc.h @@ -0,0 +1,10 @@ +/* From the autoconf info document, required for AIX */ +#if HAVE_CONFIG_H +# include "config.h" +# if (!HAVE_MALLOC) +# undef malloc + void *malloc (); +# undef rpl_malloc + void * rpl_malloc (); +# endif +#endif diff --git a/executable_names/src/common/mpi.c b/executable_names/src/common/mpi.c new file mode 100644 index 0000000000000000000000000000000000000000..554f45ed8bd818365ad87f840e4d0d3f2f2d4290 --- /dev/null +++ b/executable_names/src/common/mpi.c @@ -0,0 +1,295 @@ +/*****************************************************************************\ + * src/common/mpi.c - Generic mpi selector for slurm + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "src/common/macros.h" +#include "src/common/plugin.h" +#include "src/common/plugrack.h" +#include "src/common/env.h" +#include "src/common/mpi.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + + +/* + * WARNING: Do not change the order of these fields or add additional + * fields at the beginning of the structure. If you do, job completion + * logging plugins will stop working. If you need to add fields, add them + * at the end of the structure. + */ +typedef struct slurm_mpi_ops { + int (*init) (slurmd_job_t *job, int rank); + int (*create_thread) (srun_job_t *job); + int (*single_task) (void); + int (*exit) (void); +} slurm_mpi_ops_t; + +struct slurm_mpi_context { + char * mpi_type; + plugrack_t plugin_list; + plugin_handle_t cur_plugin; + int mpi_errno; + slurm_mpi_ops_t ops; +}; + +static slurm_mpi_context_t g_context = NULL; +static pthread_mutex_t context_lock = PTHREAD_MUTEX_INITIALIZER; + +static slurm_mpi_context_t +_slurm_mpi_context_create(const char *mpi_type) +{ + slurm_mpi_context_t c; + + if ( mpi_type == NULL ) { + debug3( "_slurm_mpi_context_create: no mpi type" ); + return NULL; + } + + c = xmalloc(sizeof(struct slurm_mpi_context)); + + c->mpi_errno = SLURM_SUCCESS; + + /* Copy the job completion authentication type. */ + c->mpi_type = xstrdup(mpi_type); + if (c->mpi_type == NULL ) { + debug3( "can't make local copy of mpi type" ); + xfree(c); + return NULL; + } + + /* Plugin rack is demand-loaded on first reference. */ + c->plugin_list = NULL; + c->cur_plugin = PLUGIN_INVALID_HANDLE; + + return c; +} + +static int +_slurm_mpi_context_destroy( slurm_mpi_context_t c ) +{ + /* + * Must check return code here because plugins might still + * be loaded and active. + */ + if ( c->plugin_list ) { + if ( plugrack_destroy( c->plugin_list ) != SLURM_SUCCESS ) { + return SLURM_ERROR; + } + } + + xfree(c->mpi_type); + xfree(c); + + return SLURM_SUCCESS; +} + +/* + * Resolve the operations from the plugin. + */ +static slurm_mpi_ops_t * +_slurm_mpi_get_ops( slurm_mpi_context_t c ) +{ + /* + * These strings must be kept in the same order as the fields + * declared for slurm_mpi_ops_t. + */ + static const char *syms[] = { + "mpi_p_init", + "mpi_p_thr_create", + "mpi_p_single_task", + "mpi_p_exit" + }; + int n_syms = sizeof( syms ) / sizeof( char * ); + char *plugin_dir = NULL; + + /* Get the plugin list, if needed. */ + if ( c->plugin_list == NULL ) { + c->plugin_list = plugrack_create(); + if ( c->plugin_list == NULL ) { + error("Unable to create a plugin manager"); + return NULL; + } + + plugrack_set_major_type(c->plugin_list, "mpi"); + plugrack_set_paranoia(c->plugin_list, + PLUGRACK_PARANOIA_NONE, + 0); + plugin_dir = slurm_get_plugin_dir(); + plugrack_read_dir(c->plugin_list, plugin_dir); + xfree(plugin_dir); + } + + if (strcasecmp (c->mpi_type, "mpi/list") == 0) { + plugrack_print_all_plugin(c->plugin_list); + exit(0); + } else { + /* Find the correct plugin. */ + c->cur_plugin = plugrack_use_by_type(c->plugin_list, + c->mpi_type); + if ( c->cur_plugin == PLUGIN_INVALID_HANDLE ) { + error("can't find a valid plugin for type %s", + c->mpi_type); + return NULL; + } + } + + /* Dereference the API. */ + if ( plugin_get_syms( c->cur_plugin, + n_syms, + syms, + (void **) &c->ops ) < n_syms ) { + error( "incomplete mpi plugin detected" ); + return NULL; + } + + return &c->ops; +} + +int _mpi_init (char *mpi_type) +{ + int retval = SLURM_SUCCESS; + char *full_type = NULL; + int got_default = 0; + + slurm_mutex_lock( &context_lock ); + + if ( g_context ) + goto done; + + if (mpi_type == NULL) { + mpi_type = slurm_get_mpi_default(); + got_default = 1; + } + if (mpi_type == NULL) { + error("No MPI default set."); + retval = SLURM_ERROR; + goto done; + } + setenvf (NULL, "SLURM_MPI_TYPE", "%s", mpi_type); + + full_type = xmalloc(sizeof(char) * (strlen(mpi_type)+5)); + sprintf(full_type,"mpi/%s",mpi_type); + + g_context = _slurm_mpi_context_create(full_type); + xfree(full_type); + if ( g_context == NULL ) { + error( "cannot create a context for %s", mpi_type); + retval = SLURM_ERROR; + goto done; + } + + if ( _slurm_mpi_get_ops( g_context ) == NULL ) { + error( "cannot resolve plugin operations for %s", mpi_type); + _slurm_mpi_context_destroy( g_context ); + g_context = NULL; + retval = SLURM_ERROR; + } + + +done: + if(got_default) + xfree(mpi_type); + slurm_mutex_unlock( &context_lock ); + return retval; +} + +int srun_mpi_init (char *mpi_type) +{ + debug("mpi type = %s", mpi_type); + + if(_mpi_init(mpi_type) == SLURM_ERROR) + return SLURM_ERROR; + + return SLURM_SUCCESS; +} + + +int slurmd_mpi_init (slurmd_job_t *job, int rank) +{ + char *mpi_type = getenvp (job->env, "SLURM_MPI_TYPE"); + + debug("mpi type = %s", mpi_type); + + if(_mpi_init(mpi_type) == SLURM_ERROR) + return SLURM_ERROR; + + unsetenvp (job->env, "SLURM_MPI_TYPE"); + return (*(g_context->ops.init))(job, rank); +} + +int mpi_fini (void) +{ + int rc; + + if (!g_context) + return SLURM_SUCCESS; + + rc = _slurm_mpi_context_destroy(g_context); + return rc; +} + +int slurm_mpi_thr_create(srun_job_t *job) +{ + if (_mpi_init(NULL) < 0) + return SLURM_ERROR; + + return (*(g_context->ops.create_thread))(job); +} + +int slurm_mpi_single_task_per_node (void) +{ + if (_mpi_init(NULL) < 0) + return SLURM_ERROR; + + return (*(g_context->ops.single_task))(); +} + +int slurm_mpi_exit (void) +{ + if (_mpi_init(NULL) < 0) + return SLURM_ERROR; + + return (*(g_context->ops.exit))(); +} + + diff --git a/executable_names/src/common/mpi.h b/executable_names/src/common/mpi.h new file mode 100644 index 0000000000000000000000000000000000000000..854170baa03c38513ff18a8e089ef910c07a98d4 --- /dev/null +++ b/executable_names/src/common/mpi.h @@ -0,0 +1,58 @@ +/*****************************************************************************\ + * src/common/mpi.h - Generic mpi selector for slurm + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SRUN_MPI_H +#define _SRUN_MPI_H + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include "src/common/global_srun.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" + +typedef struct slurm_mpi_context *slurm_mpi_context_t; + +int srun_mpi_init (char *mpi_type); +int slurmd_mpi_init (slurmd_job_t *job, int rank); +int mpi_fini (void); +int slurm_mpi_thr_create(srun_job_t *job); +int slurm_mpi_single_task_per_node (void); +int slurm_mpi_exit (void); + + +#endif /* !_SRUN_MPI_H */ diff --git a/executable_names/src/common/net.c b/executable_names/src/common/net.c new file mode 100644 index 0000000000000000000000000000000000000000..856fc3527b18a3d76354a79500f51f663664d461 --- /dev/null +++ b/executable_names/src/common/net.c @@ -0,0 +1,165 @@ +/*****************************************************************************\ + * net.c - basic network communications for user application I/O + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona , Kevin Tew , + * et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/common/log.h" +#include "src/common/net.h" + +#ifndef NET_DEFAULT_BACKLOG +# define NET_DEFAULT_BACKLOG 1024 +#endif + +/* + * Returns the port number in host byte order. + */ +static short _sock_bind_wild(int sockfd) +{ + socklen_t len; + struct sockaddr_in sin; + + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(INADDR_ANY); + sin.sin_port = htons(0); /* bind ephemeral port */ + + if (bind(sockfd, (struct sockaddr *) &sin, sizeof(sin)) < 0) + return (-1); + len = sizeof(sin); + if (getsockname(sockfd, (struct sockaddr *) &sin, &len) < 0) + return (-1); + return ntohs(sin.sin_port); +} + +/* open a stream socket on an ephemereal port and put it into + * the listen state. fd and port are filled in with the new + * socket's file descriptor and port #. + * + * OUT fd - listening socket file descriptor number + * OUT port - TCP port number in host byte order + */ +int net_stream_listen(int *fd, short *port) +{ + int rc, val; + + if ((*fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) + return -1; + + val = 1; + rc = setsockopt(*fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(int)); + if (rc > 0) + goto cleanup; + + *port = _sock_bind_wild(*fd); +#undef SOMAXCONN +#define SOMAXCONN 1024 + rc = listen(*fd, NET_DEFAULT_BACKLOG); + if (rc < 0) + goto cleanup; + + return 1; + + cleanup: + close(*fd); + return -1; +} + + +int accept_stream(int fd) +{ + int sd; + + while ((sd = accept(fd, NULL, NULL)) < 0) { + if (errno == EINTR) + continue; + if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) + return -1; + if (errno == ECONNABORTED) + return -1; + error("Unable to accept new connection"); + } + + return sd; +} + + +int readn(int fd, void *buf, size_t nbytes) +{ + int n = 0; + char *pbuf = (char *)buf; + size_t nleft = nbytes; + + while (nleft > 0) { + n = read(fd, (void *)pbuf, nleft); + if (n > 0) { + pbuf+=n; + nleft-=n; + } else if (n == 0) /* EOF */ + break; + else if (errno == EINTR) + continue; + else { + debug("read error: %m"); + break; + } + } + return(n); +} + +int net_set_low_water(int sock, size_t size) +{ + if (setsockopt(sock, SOL_SOCKET, SO_RCVLOWAT, + (const void *) &size, sizeof(size)) < 0) { + error("Unable to set low water socket option: %m"); + return -1; + } + + return 0; +} diff --git a/executable_names/src/common/net.h b/executable_names/src/common/net.h new file mode 100644 index 0000000000000000000000000000000000000000..7eeb52f9a3cd8e9f87f579287187d3a0bd690dbd --- /dev/null +++ b/executable_names/src/common/net.h @@ -0,0 +1,62 @@ +/*****************************************************************************\ + * net.h - basic network communications for user application I/O + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona , Kevin Tew , + * et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _NET_H +#define _NET_H + +#include + +/* open a stream socket on an ephemereal port and put it into + * the listen state. fd and port are filled in with the new + * socket's file descriptor and port #. + * + * OUT fd - listening socket file descriptor number + * OUT port - TCP port number in host byte order + */ +int net_stream_listen(int *fd, short *port); + +/* accept the incoming connection on the stream socket fd + */ +int net_accept_stream(int fd); + +/* set low water mark on socket + */ +int net_set_low_water(int sock, size_t size); + + +#endif /* !_NET_H */ diff --git a/executable_names/src/common/node_select.c b/executable_names/src/common/node_select.c new file mode 100644 index 0000000000000000000000000000000000000000..15b1dba8dd67a1b7ce3903c0ee46871180da7c71 --- /dev/null +++ b/executable_names/src/common/node_select.c @@ -0,0 +1,1183 @@ +/*****************************************************************************\ + * node_select.c - node selection plugin wrapper. + * + * NOTE: The node selection plugin itself is intimately tied to slurmctld + * functions and data structures. Some related functions (e.g. data structure + * un/packing, environment variable setting) are required by most SLURM + * commands. Since some of these commands must be executed on the BlueGene + * front-end nodes, the functions they require are here rather than within + * the plugin. This is because functions required by the plugin can not be + * resolved on the front-end nodes, so we can't load the plugins there. + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "src/common/list.h" +#include "src/common/node_select.h" +#include "src/common/plugin.h" +#include "src/common/plugrack.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/xstring.h" +#include "src/slurmctld/slurmctld.h" + +/* Define select_jobinfo_t below to avoid including extraneous slurm headers */ +#ifndef __select_jobinfo_t_defined +# define __select_jobinfo_t_defined + typedef struct select_jobinfo *select_jobinfo_t; /* opaque data type */ +#endif + +/* + * Local data + */ + +typedef struct slurm_select_ops { + int (*state_save) (char *dir_name); + int (*state_restore) (char *dir_name); + int (*job_init) (List job_list); + int (*node_init) (struct node_record *node_ptr, + int node_cnt); + int (*block_init) (List block_list); + int (*job_test) (struct job_record *job_ptr, + bitstr_t *bitmap, + uint32_t min_nodes, + uint32_t max_nodes, + uint32_t req_nodes, + bool test_only); + int (*job_begin) (struct job_record *job_ptr); + int (*job_ready) (struct job_record *job_ptr); + int (*job_fini) (struct job_record *job_ptr); + int (*job_suspend) (struct job_record *job_ptr); + int (*job_resume) (struct job_record *job_ptr); + int (*pack_node_info) (time_t last_query_time, + Buf *buffer_ptr); + int (*get_extra_jobinfo) (struct node_record *node_ptr, + struct job_record *job_ptr, + enum select_data_info cr_info, + void *data); + int (*get_select_nodeinfo) (struct node_record *node_ptr, + enum select_data_info cr_info, + void *data); + int (*update_nodeinfo) (struct job_record *job_ptr); + int (*update_block) (update_part_msg_t + *part_desc_ptr); + int (*get_info_from_plugin)(enum select_data_info cr_info, + void *data); + int (*update_node_state) (int index, uint16_t state); + int (*alter_node_cnt) (enum select_node_cnt type, + void *data); +} slurm_select_ops_t; + +typedef struct slurm_select_context { + char *select_type; + plugrack_t plugin_list; + plugin_handle_t cur_plugin; + int select_errno; + slurm_select_ops_t ops; +} slurm_select_context_t; + +static slurm_select_context_t * g_select_context = NULL; +static pthread_mutex_t g_select_context_lock = + PTHREAD_MUTEX_INITIALIZER; + +#ifdef HAVE_BG /* node selection specific logic */ +# define JOBINFO_MAGIC 0x83ac +struct select_jobinfo { + uint16_t start[SYSTEM_DIMENSIONS]; /* start position of block + * e.g. XYZ */ + uint16_t geometry[SYSTEM_DIMENSIONS]; /* node count in various + * dimensions, e.g. XYZ */ + uint16_t conn_type; /* see enum connection_type */ + uint16_t rotate; /* permit geometry rotation if set */ + uint16_t node_use; /* see enum node_use_type */ + char *bg_block_id; /* Blue Gene block ID */ + uint16_t magic; /* magic number */ + uint16_t quarter; /* for bg to tell which quarter of a small + * block the job is running */ + uint16_t nodecard; /* for bg to tell which nodecard of a quarter + * of a small block the job is running */ + uint32_t node_cnt; /* how many cnodes in block */ + uint16_t altered; /* see if we have altered this job + * or not yet */ + uint32_t max_procs; /* maximum processors to use */ +}; +#endif + +/* + * Local functions + */ +static slurm_select_context_t *_select_context_create(const char *select_type); +static int _select_context_destroy(slurm_select_context_t *c); +static slurm_select_ops_t *_select_get_ops(slurm_select_context_t *c); + +/* + * Locate and load the appropriate plugin + */ +static slurm_select_ops_t * _select_get_ops(slurm_select_context_t *c) +{ + /* + * Must be synchronized with slurm_select_ops_t above. + */ + static const char *syms[] = { + "select_p_state_save", + "select_p_state_restore", + "select_p_job_init", + "select_p_node_init", + "select_p_block_init", + "select_p_job_test", + "select_p_job_begin", + "select_p_job_ready", + "select_p_job_fini", + "select_p_job_suspend", + "select_p_job_resume", + "select_p_pack_node_info", + "select_p_get_extra_jobinfo", + "select_p_get_select_nodeinfo", + "select_p_update_nodeinfo", + "select_p_update_block", + "select_p_get_info_from_plugin", + "select_p_update_node_state", + "select_p_alter_node_cnt" + }; + int n_syms = sizeof( syms ) / sizeof( char * ); + + /* Get plugin list. */ + if ( c->plugin_list == NULL ) { + char *plugin_dir; + c->plugin_list = plugrack_create(); + if ( c->plugin_list == NULL ) { + error( "cannot create plugin manager" ); + return NULL; + } + plugrack_set_major_type( c->plugin_list, "select" ); + plugrack_set_paranoia( c->plugin_list, + PLUGRACK_PARANOIA_NONE, + 0 ); + plugin_dir = slurm_get_plugin_dir(); + plugrack_read_dir( c->plugin_list, plugin_dir ); + xfree(plugin_dir); + } + + c->cur_plugin = plugrack_use_by_type( c->plugin_list, c->select_type ); + if ( c->cur_plugin == PLUGIN_INVALID_HANDLE ) { + error( "cannot find node selection plugin for %s", + c->select_type ); + return NULL; + } + + /* Dereference the API. */ + if ( plugin_get_syms( c->cur_plugin, + n_syms, + syms, + (void **) &c->ops ) < n_syms ) { + error( "incomplete node selection plugin detected" ); + return NULL; + } + + return &c->ops; +} + +/* + * Create a node selection context + */ +static slurm_select_context_t *_select_context_create(const char *select_type) +{ + slurm_select_context_t *c; + + if ( select_type == NULL ) { + debug3( "_select_context_create: no uler type" ); + return NULL; + } + + c = xmalloc( sizeof( slurm_select_context_t ) ); + c->select_type = xstrdup( select_type ); + c->plugin_list = NULL; + c->cur_plugin = PLUGIN_INVALID_HANDLE; + c->select_errno = SLURM_SUCCESS; + + return c; +} + +/* + * Destroy a node selection context + */ +static int _select_context_destroy( slurm_select_context_t *c ) +{ + /* + * Must check return code here because plugins might still + * be loaded and active. + */ + if ( c->plugin_list ) { + if ( plugrack_destroy( c->plugin_list ) != SLURM_SUCCESS ) { + return SLURM_ERROR; + } + } + + xfree( c->select_type ); + xfree( c ); + + return SLURM_SUCCESS; +} + +/* + * Initialize context for node selection plugin + */ +extern int slurm_select_init(void) +{ + int retval = SLURM_SUCCESS; + char *select_type = NULL; + + slurm_mutex_lock( &g_select_context_lock ); + + if ( g_select_context ) + goto done; + + select_type = slurm_get_select_type(); + g_select_context = _select_context_create(select_type); + if ( g_select_context == NULL ) { + error( "cannot create node selection context for %s", + select_type ); + retval = SLURM_ERROR; + goto done; + } + + if ( _select_get_ops( g_select_context ) == NULL ) { + error( "cannot resolve node selection plugin operations" ); + _select_context_destroy( g_select_context ); + g_select_context = NULL; + retval = SLURM_ERROR; + } + + done: + slurm_mutex_unlock( &g_select_context_lock ); + xfree(select_type); + return retval; +} + +extern int slurm_select_fini(void) +{ + int rc; + + if (!g_select_context) + return SLURM_SUCCESS; + + rc = _select_context_destroy( g_select_context ); + g_select_context = NULL; + return rc; +} + +/* + * Save any global state information + * IN dir_name - directory into which the data can be stored + */ +extern int select_g_state_save(char *dir_name) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.state_save))(dir_name); +} + +/* + * Initialize context for node selection plugin and + * restore any global state information + * IN dir_name - directory from which the data can be restored + */ +extern int select_g_state_restore(char *dir_name) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.state_restore))(dir_name); +} + +/* + * Note the initialization of job records, issued upon restart of + * slurmctld and used to synchronize any job state. + */ +extern int select_g_job_init(List job_list) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.job_init))(job_list); +} + +/* + * Note re/initialization of node record data structure + * IN node_ptr - current node data + * IN node_count - number of node entries + */ +extern int select_g_node_init(struct node_record *node_ptr, int node_cnt) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.node_init))(node_ptr, node_cnt); +} + + +/* + * Note re/initialization of block record data structure + * IN block_list - list of partition records + */ +extern int select_g_block_init(List block_list) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.block_init))(block_list); +} + +/* + * Get selected data from a given node for a specific job. + * IN node_ptr - current node record + * IN job_ptr - current job record + * IN cr_info - type of data to get from the node record + * (see enum select_data_info) + * IN/OUT data - the data to get from node record + */ +extern int select_g_get_extra_jobinfo (struct node_record *node_ptr, + struct job_record *job_ptr, + enum select_data_info cr_info, + void *data) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.get_extra_jobinfo))(node_ptr, + job_ptr, + cr_info, + data); +} + +/* + * Get select data from a specific node record + * IN node_pts - current node record + * IN cr_info - type of data to get from the node record (see enum select_data_info) + * IN/OUT data - the data to get from node record + */ +extern int select_g_get_select_nodeinfo (struct node_record *node_ptr, + enum select_data_info cr_info, + void *data) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.get_select_nodeinfo))(node_ptr, + cr_info, + data); +} + +/* + * Update select data for a specific node record for a specific job + * IN cr_info - type of data to update for a given job record + * (see enum select_data_info) + * IN job_ptr - current job record + */ +extern int select_g_update_nodeinfo (struct job_record *job_ptr) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.update_nodeinfo))(job_ptr); +} + +/* + * Update specific block (usually something has gone wrong) + * IN cr_info - type of data to update for a given job record + * IN part_desc_ptr - information about the block + */ +extern int select_g_update_block (update_part_msg_t *part_desc_ptr) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.update_block))(part_desc_ptr); +} + +/* + * Get select data from a plugin + * IN node_pts - current node record + * IN cr_info - type of data to get from the node record + * (see enum select_data_info) + * IN/OUT data - the data to get from node record + */ +extern int select_g_get_info_from_plugin (enum select_data_info cr_info, + void *data) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.get_info_from_plugin))(cr_info, data); +} + +/* + * Updated a node state in the plugin, this should happen when a node is + * drained or put into a down state then changed back. + * IN index - index into the node record list + * IN state - state to update to + * RETURN SLURM_SUCCESS on success || SLURM_ERROR else wise + */ +extern int select_g_update_node_state (int index, uint16_t state) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.update_node_state))(index, state); +} + +/* + * Alter the node count for a job given the type of system we are on + * IN/OUT job_desc - current job desc + */ +extern int select_g_alter_node_cnt (enum select_node_cnt type, void *data) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + if (type == SELECT_GET_NODE_SCALING) { + /* default to one, so most plugins don't have to */ + uint32_t *nodes = (uint32_t *)data; + *nodes = 1; + } + return (*(g_select_context->ops.alter_node_cnt))(type, data); +} + +/* + * Select the "best" nodes for given job from those available + * IN job_ptr - pointer to job being considered for initiation + * IN/OUT bitmap - map of nodes being considered for allocation on input, + * map of nodes actually to be assigned on output + * IN min_nodes - minimum number of nodes to allocate to job + * IN max_nodes - maximum number of nodes to allocate to job + * IN req_nodes - requested (or desired) count of nodes + * IN test_only - if true, only test if ever could run, not necessarily now + */ +extern int select_g_job_test(struct job_record *job_ptr, bitstr_t *bitmap, + uint32_t min_nodes, uint32_t max_nodes, uint32_t req_nodes, + bool test_only) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.job_test))(job_ptr, bitmap, + min_nodes, max_nodes, + req_nodes, test_only); +} + +/* + * Note initiation of job is about to begin. Called immediately + * after select_g_job_test(). Executed from slurmctld. + * IN job_ptr - pointer to job being initiated + */ +extern int select_g_job_begin(struct job_record *job_ptr) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.job_begin))(job_ptr); +} + +/* + * determine if job is ready to execute per the node select plugin + * IN job_ptr - pointer to job being tested + * RET: -2 fatal error, -1 try again, 1 if ready to execute, + * 0 not ready to execute + */ +extern int select_g_job_ready(struct job_record *job_ptr) +{ + if (slurm_select_init() < 0) + return -1; + + return (*(g_select_context->ops.job_ready))(job_ptr); +} + +/* + * Note termination of job is starting. Executed from slurmctld. + * IN job_ptr - pointer to job being terminated + */ +extern int select_g_job_fini(struct job_record *job_ptr) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.job_fini))(job_ptr); +} +/* + * Suspend a job. Executed from slurmctld. + * IN job_ptr - pointer to job being suspended + * RET SLURM_SUCCESS or error code + */ +extern int select_g_job_suspend(struct job_record *job_ptr) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.job_suspend))(job_ptr); +} + +/* + * Resume a job. Executed from slurmctld. + * IN job_ptr - pointer to job being resumed + * RET SLURM_SUCCESS or error code + */ +extern int select_g_job_resume(struct job_record *job_ptr) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.job_resume))(job_ptr); +} + +extern int select_g_pack_node_info(time_t last_query_time, Buf *buffer) +{ + if (slurm_select_init() < 0) + return SLURM_ERROR; + + return (*(g_select_context->ops.pack_node_info)) + (last_query_time, buffer); +} + +#ifdef HAVE_BG /* node selection specific logic */ +static char *_job_conn_type_string(uint16_t inx) +{ + if (inx == SELECT_TORUS) + return "torus"; + else if (inx == SELECT_MESH) + return "mesh"; + else if (inx == SELECT_SMALL) + return "small"; + else + return "nav"; +} + +static char *_job_rotate_string(uint16_t inx) +{ + if (inx) + return "yes"; + else + return "no"; +} + +/* allocate storage for a select job credential + * OUT jobinfo - storage for a select job credential + * RET - slurm error code + * NOTE: storage must be freed using select_g_free_jobinfo + */ +extern int select_g_alloc_jobinfo (select_jobinfo_t *jobinfo) +{ + int i; + xassert(jobinfo != NULL); + + *jobinfo = xmalloc(sizeof(struct select_jobinfo)); + for (i=0; istart[i] = (uint16_t) NO_VAL; + for (i=0; igeometry[i] = 0; + (*jobinfo)->conn_type = SELECT_NAV; + (*jobinfo)->rotate = 1; + (*jobinfo)->node_use = SELECT_NAV; + (*jobinfo)->bg_block_id = NULL; + (*jobinfo)->magic = JOBINFO_MAGIC; + (*jobinfo)->quarter = (uint16_t) NO_VAL; + (*jobinfo)->nodecard = (uint16_t) NO_VAL; + (*jobinfo)->node_cnt = NO_VAL; + (*jobinfo)->max_procs = NO_VAL; + + return SLURM_SUCCESS; +} + +/* fill in a previously allocated select job credential + * IN/OUT jobinfo - updated select job credential + * IN data_type - type of data to enter into job credential + * IN data - the data to enter into job credential + */ +extern int select_g_set_jobinfo (select_jobinfo_t jobinfo, + enum select_data_type data_type, void *data) +{ + int i, rc = SLURM_SUCCESS; + uint16_t *uint16 = (uint16_t *) data; + uint32_t *uint32 = (uint32_t *) data; + char *tmp_char = (char *) data; + + if (jobinfo->magic != JOBINFO_MAGIC) { + error("select_g_set_jobinfo: jobinfo magic bad"); + return SLURM_ERROR; + } + + switch (data_type) { + case SELECT_DATA_START: + for (i=0; istart[i] = uint16[i]; + break; + case SELECT_DATA_GEOMETRY: + for (i=0; igeometry[i] = uint16[i]; + break; + case SELECT_DATA_ROTATE: + jobinfo->rotate = *uint16; + break; + case SELECT_DATA_NODE_USE: + jobinfo->node_use = *uint16; + break; + case SELECT_DATA_CONN_TYPE: + jobinfo->conn_type = *uint16; + break; + case SELECT_DATA_BLOCK_ID: + /* we xfree() any preset value to avoid a memory leak */ + xfree(jobinfo->bg_block_id); + jobinfo->bg_block_id = xstrdup(tmp_char); + break; + case SELECT_DATA_QUARTER: + jobinfo->quarter = *uint16; + break; + case SELECT_DATA_NODECARD: + jobinfo->nodecard = *uint16; + break; + case SELECT_DATA_NODE_CNT: + jobinfo->node_cnt = *uint32; + break; + case SELECT_DATA_ALTERED: + jobinfo->altered = *uint16; + break; + case SELECT_DATA_MAX_PROCS: + jobinfo->max_procs = *uint32; + break; + default: + debug("select_g_set_jobinfo data_type %d invalid", + data_type); + } + + return rc; +} + +/* get data from a select job credential + * IN jobinfo - updated select job credential + * IN data_type - type of data to enter into job credential + * OUT data - the data to get from job credential, caller must xfree + * data for data_tyep == SELECT_DATA_BLOCK_ID + */ +extern int select_g_get_jobinfo (select_jobinfo_t jobinfo, + enum select_data_type data_type, void *data) +{ + int i, rc = SLURM_SUCCESS; + uint16_t *uint16 = (uint16_t *) data; + uint32_t *uint32 = (uint32_t *) data; + char **tmp_char = (char **) data; + + if (jobinfo->magic != JOBINFO_MAGIC) { + error("select_g_get_jobinfo: jobinfo magic bad"); + return SLURM_ERROR; + } + + switch (data_type) { + case SELECT_DATA_START: + for (i=0; istart[i]; + } + break; + case SELECT_DATA_GEOMETRY: + for (i=0; igeometry[i]; + } + break; + case SELECT_DATA_ROTATE: + *uint16 = jobinfo->rotate; + break; + case SELECT_DATA_NODE_USE: + *uint16 = jobinfo->node_use; + break; + case SELECT_DATA_CONN_TYPE: + *uint16 = jobinfo->conn_type; + break; + case SELECT_DATA_BLOCK_ID: + if ((jobinfo->bg_block_id == NULL) + || (jobinfo->bg_block_id[0] == '\0')) + *tmp_char = NULL; + else + *tmp_char = xstrdup(jobinfo->bg_block_id); + break; + case SELECT_DATA_QUARTER: + *uint16 = jobinfo->quarter; + break; + case SELECT_DATA_NODECARD: + *uint16 = jobinfo->nodecard; + break; + case SELECT_DATA_NODE_CNT: + *uint32 = jobinfo->node_cnt; + break; + case SELECT_DATA_ALTERED: + *uint16 = jobinfo->altered; + break; + case SELECT_DATA_MAX_PROCS: + *uint32 = jobinfo->max_procs; + break; + default: + debug("select_g_get_jobinfo data_type %d invalid", + data_type); + } + + return rc; +} + +/* copy a select job credential + * IN jobinfo - the select job credential to be copied + * RET - the copy or NULL on failure + * NOTE: returned value must be freed using select_g_free_jobinfo + */ +extern select_jobinfo_t select_g_copy_jobinfo(select_jobinfo_t jobinfo) +{ + struct select_jobinfo *rc = NULL; + int i; + + if (jobinfo == NULL) + ; + else if (jobinfo->magic != JOBINFO_MAGIC) + error("select_g_copy_jobinfo: jobinfo magic bad"); + else { + rc = xmalloc(sizeof(struct select_jobinfo)); + for (i=0; istart[i] = (uint16_t)jobinfo->start[i]; + } + for (i=0; igeometry[i] = (uint16_t)jobinfo->geometry[i]; + } + rc->conn_type = jobinfo->conn_type; + rc->rotate = jobinfo->rotate; + rc->node_use = jobinfo->node_use; + rc->bg_block_id = xstrdup(jobinfo->bg_block_id); + rc->magic = JOBINFO_MAGIC; + rc->quarter = jobinfo->quarter; + rc->nodecard = jobinfo->nodecard; + rc->node_cnt = jobinfo->node_cnt; + rc->altered = jobinfo->altered; + rc->max_procs = jobinfo->max_procs; + } + + return rc; +} + +/* free storage previously allocated for a select job credential + * IN jobinfo - the select job credential to be freed + */ +extern int select_g_free_jobinfo (select_jobinfo_t *jobinfo) +{ + int rc = SLURM_SUCCESS; + + xassert(jobinfo != NULL); + if (*jobinfo == NULL) /* never set, treat as not an error */ + ; + else if ((*jobinfo)->magic != JOBINFO_MAGIC) { + error("select_g_free_jobinfo: jobinfo magic bad"); + rc = EINVAL; + } else { + (*jobinfo)->magic = 0; + xfree((*jobinfo)->bg_block_id); + xfree(*jobinfo); + } + return rc; +} + +/* pack a select job credential into a buffer in machine independent form + * IN jobinfo - the select job credential to be saved + * OUT buffer - buffer with select credential appended + * RET - slurm error code + */ +extern int select_g_pack_jobinfo (select_jobinfo_t jobinfo, Buf buffer) +{ + int i; + + if (jobinfo) { + /* NOTE: If new elements are added here, make sure to + * add equivalant pack of zeros below for NULL pointer */ + for (i=0; istart[i], buffer); + pack16((uint16_t)jobinfo->geometry[i], buffer); + } + pack16((uint16_t)jobinfo->conn_type, buffer); + pack16((uint16_t)jobinfo->rotate, buffer); + pack16((uint16_t)jobinfo->quarter, buffer); + pack16((uint16_t)jobinfo->nodecard, buffer); + pack32((uint32_t)jobinfo->node_cnt, buffer); + pack32((uint32_t)jobinfo->max_procs, buffer); + packstr(jobinfo->bg_block_id, buffer); + } else { + for (i=0; i<((SYSTEM_DIMENSIONS*2)+4); i++) + pack16((uint16_t) 0, buffer); + pack32((uint32_t) 0, buffer); + pack32((uint32_t) 0, buffer); + packstr("", buffer); + } + + return SLURM_SUCCESS; +} + +/* unpack a select job credential from a buffer + * OUT jobinfo - the select job credential read + * IN buffer - buffer with select credential read from current pointer loc + * RET - slurm error code + * NOTE: returned value must be freed using select_g_free_jobinfo + */ +extern int select_g_unpack_jobinfo(select_jobinfo_t jobinfo, Buf buffer) +{ + int i; + uint16_t uint16_tmp; + + for (i=0; istart[i]), buffer); + safe_unpack16(&(jobinfo->geometry[i]), buffer); + } + safe_unpack16(&(jobinfo->conn_type), buffer); + safe_unpack16(&(jobinfo->rotate), buffer); + safe_unpack16(&(jobinfo->quarter), buffer); + safe_unpack16(&(jobinfo->nodecard), buffer); + safe_unpack32(&(jobinfo->node_cnt), buffer); + safe_unpack32(&(jobinfo->max_procs), buffer); + safe_unpackstr_xmalloc(&(jobinfo->bg_block_id), &uint16_tmp, buffer); + return SLURM_SUCCESS; + + unpack_error: + return SLURM_ERROR; +} + +/* write select job credential to a string + * IN jobinfo - a select job credential + * OUT buf - location to write job credential contents + * IN size - byte size of buf + * IN mode - print mode, see enum select_print_mode + * RET - the string, same as buf + */ +extern char *select_g_sprint_jobinfo(select_jobinfo_t jobinfo, + char *buf, size_t size, int mode) +{ + uint16_t geometry[SYSTEM_DIMENSIONS]; + int i; + char max_procs_char[7], start_char[32]; + + if (buf == NULL) { + error("select_g_sprint_jobinfo: buf is null"); + return NULL; + } + + if ((mode != SELECT_PRINT_DATA) + && jobinfo && (jobinfo->magic != JOBINFO_MAGIC)) { + error("select_g_sprint_jobinfo: jobinfo magic bad"); + return NULL; + } + + if (jobinfo == NULL) { + if (mode != SELECT_PRINT_HEAD) { + error("select_g_sprint_jobinfo: jobinfo bad"); + return NULL; + } + } else if (jobinfo->geometry[0] == (uint16_t) NO_VAL) { + for (i=0; igeometry[i]; + } + + switch (mode) { + case SELECT_PRINT_HEAD: + snprintf(buf, size, + "CONNECT ROTATE MAX_PROCS GEOMETRY START BLOCK_ID"); + break; + case SELECT_PRINT_DATA: + if (jobinfo->max_procs == NO_VAL) + sprintf(max_procs_char, "None"); + else + convert_num_unit((float)jobinfo->max_procs, + max_procs_char, UNIT_NONE); + if (jobinfo->start[0] == (uint16_t) NO_VAL) + sprintf(start_char, "None"); + else { + snprintf(start_char, sizeof(start_char), + "%1ux%1ux%1u", jobinfo->start[0], + jobinfo->start[1], jobinfo->start[2]); + } + snprintf(buf, size, + "%7.7s %6.6s %9s %1ux%1ux%1u %5s %-16s", + _job_conn_type_string(jobinfo->conn_type), + _job_rotate_string(jobinfo->rotate), + max_procs_char, + geometry[0], geometry[1], geometry[2], + start_char, jobinfo->bg_block_id); + break; + case SELECT_PRINT_MIXED: + if (jobinfo->max_procs == NO_VAL) + sprintf(max_procs_char, "None"); + else + convert_num_unit((float)jobinfo->max_procs, + max_procs_char, UNIT_NONE); + if (jobinfo->start[0] == (uint16_t) NO_VAL) + sprintf(start_char, "None"); + else { + snprintf(start_char, sizeof(start_char), + "%1ux%1ux%1u", jobinfo->start[0], + jobinfo->start[1], jobinfo->start[2]); + } + snprintf(buf, size, + "Connection=%s Rotate=%s MaxProcs=%s " + "Geometry=%ux%ux%u Start=%s Block_ID=%s", + _job_conn_type_string(jobinfo->conn_type), + _job_rotate_string(jobinfo->rotate), + max_procs_char, + geometry[0], geometry[1], geometry[2], + start_char, jobinfo->bg_block_id); + break; + case SELECT_PRINT_BG_ID: + snprintf(buf, size, "%s", jobinfo->bg_block_id); + break; + default: + error("select_g_sprint_jobinfo: bad mode %d", mode); + if (size > 0) + buf[0] = '\0'; + } + + return buf; +} + +/* NOTE: The matching pack functions are directly in the select/bluegene + * plugin. The unpack functions can not be there since the plugin is + * dependent upon libraries which do not exist on the BlueGene front-end + * nodes. */ +static int _unpack_node_info(bg_info_record_t *bg_info_record, Buf buffer) +{ + uint16_t uint16_tmp; + uint32_t uint32_tmp; + char *bp_inx_str; + + safe_unpackstr_xmalloc(&(bg_info_record->nodes), &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&bg_info_record->owner_name, &uint16_tmp, + buffer); + safe_unpackstr_xmalloc(&bg_info_record->bg_block_id, &uint16_tmp, + buffer); + + safe_unpack16(&uint16_tmp, buffer); + bg_info_record->state = (int) uint16_tmp; + safe_unpack16(&uint16_tmp, buffer); + bg_info_record->conn_type = (int) uint16_tmp; + safe_unpack16(&uint16_tmp, buffer); + bg_info_record->node_use = (int) uint16_tmp; + safe_unpack16(&uint16_tmp, buffer); + bg_info_record->quarter = (int) uint16_tmp; + safe_unpack16(&uint16_tmp, buffer); + bg_info_record->nodecard = (int) uint16_tmp; + safe_unpack32(&uint32_tmp, buffer); + bg_info_record->node_cnt = (int) uint32_tmp; + safe_unpackstr_xmalloc(&bp_inx_str, &uint16_tmp, buffer); + if (bp_inx_str == NULL) { + bg_info_record->bp_inx = bitfmt2int(""); + } else { + bg_info_record->bp_inx = bitfmt2int(bp_inx_str); + xfree(bp_inx_str); + } + + return SLURM_SUCCESS; + +unpack_error: + xfree(bg_info_record->nodes); + xfree(bg_info_record->owner_name); + xfree(bg_info_record->bg_block_id); + xfree(bg_info_record->bp_inx); + return SLURM_ERROR; +} + +static void _free_node_info(bg_info_record_t *bg_info_record) +{ + xfree(bg_info_record->nodes); + xfree(bg_info_record->owner_name); + xfree(bg_info_record->bg_block_id); +} + +/* Unpack node select info from a buffer */ +extern int select_g_unpack_node_info(node_select_info_msg_t ** + node_select_info_msg_pptr, Buf buffer) +{ + int i, record_count = 0; + node_select_info_msg_t *buf; + + buf = xmalloc(sizeof(bg_info_record_t)); + safe_unpack32(&(buf->record_count), buffer); + safe_unpack_time(&(buf->last_update), buffer); + buf->bg_info_array = xmalloc(sizeof(bg_info_record_t) * + buf->record_count); + record_count = buf->record_count; + + for(i=0; ibg_info_array[i]), buffer)) + goto unpack_error; + } + *node_select_info_msg_pptr = buf; + return SLURM_SUCCESS; + +unpack_error: + for(i=0; ibg_info_array[i])); + xfree(buf->bg_info_array); + xfree(buf); + return SLURM_ERROR; +} + +/* Free a node select information buffer */ +extern int select_g_free_node_info(node_select_info_msg_t ** + node_select_info_msg_pptr) +{ + int i; + node_select_info_msg_t *buf; + + if (node_select_info_msg_pptr == NULL) + return EINVAL; + buf = *node_select_info_msg_pptr; + + if (buf->bg_info_array == NULL) + buf->record_count = 0; + for(i=0; irecord_count; i++) + _free_node_info(&(buf->bg_info_array[i])); + xfree(buf); + return SLURM_SUCCESS; +} + +#else /* !HAVE_BG */ + +/* allocate storage for a select job credential + * OUT jobinfo - storage for a select job credential + * RET - slurm error code + * NOTE: storage must be freed using select_g_free_jobinfo + */ +extern int select_g_alloc_jobinfo (select_jobinfo_t *jobinfo) +{ + return SLURM_SUCCESS; +} + +/* fill in a previously allocated select job credential + * IN/OUT jobinfo - updated select job credential + * IN data_type - type of data to enter into job credential + * IN data - the data to enter into job credential + */ +extern int select_g_set_jobinfo (select_jobinfo_t jobinfo, + enum select_data_type data_type, void *data) +{ + return SLURM_SUCCESS; +} + +/* get data from a select job credential + * IN jobinfo - updated select job credential + * IN data_type - type of data to enter into job credential + * IN/OUT data - the data to enter into job credential + */ +extern int select_g_get_jobinfo (select_jobinfo_t jobinfo, + enum select_data_type data_type, void *data) +{ + return SLURM_ERROR; +} + +/* copy a select job credential + * IN jobinfo - the select job credential to be copied + * RET - the copy or NULL on failure + * NOTE: returned value must be freed using select_g_free_jobinfo + */ +extern select_jobinfo_t select_g_copy_jobinfo(select_jobinfo_t jobinfo) +{ + return NULL; +} + +/* free storage previously allocated for a select job credential + * IN jobinfo - the select job credential to be freed + */ +extern int select_g_free_jobinfo (select_jobinfo_t *jobinfo) +{ + return SLURM_SUCCESS; +} + +/* pack a select job credential into a buffer in machine independent form + * IN jobinfo - the select job credential to be saved + * OUT buffer - buffer with select credential appended + * RET - slurm error code + */ +extern int select_g_pack_jobinfo (select_jobinfo_t jobinfo, Buf buffer) +{ + return SLURM_SUCCESS; +} + +/* unpack a select job credential from a buffer + * OUT jobinfo - the select job credential read + * IN buffer - buffer with select credential read from current pointer loc + * RET - slurm error code + * NOTE: returned value must be freed using select_g_free_jobinfo + */ +extern int select_g_unpack_jobinfo(select_jobinfo_t jobinfo, Buf buffer) +{ + return SLURM_SUCCESS; +} + +/* write select job credential to a string + * IN jobinfo - a select job credential + * OUT buf - location to write job credential contents + * IN size - byte size of buf + * IN mode - print mode, see enum select_print_mode + * RET - the string, same as buf + */ +extern char *select_g_sprint_jobinfo(select_jobinfo_t jobinfo, + char *buf, size_t size, int mode) +{ + if (buf && size) { + buf[0] = '\0'; + return buf; + } else + return NULL; +} + +extern int select_g_unpack_node_info(node_select_info_msg_t ** + node_select_info_msg_pptr, Buf buffer) +{ + return SLURM_ERROR; +} + +extern int select_g_free_node_info(node_select_info_msg_t ** + node_select_info_msg_pptr) +{ + return SLURM_ERROR; +} + +#endif diff --git a/executable_names/src/common/node_select.h b/executable_names/src/common/node_select.h new file mode 100644 index 0000000000000000000000000000000000000000..ae06864f87720fd8cc5ed97bd3ee20c2dad8e353 --- /dev/null +++ b/executable_names/src/common/node_select.h @@ -0,0 +1,292 @@ +/*****************************************************************************\ + * node_select.h - Define node selection plugin functions. + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2004-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _NODE_SELECT_H +#define _NODE_SELECT_H + +#include "src/api/node_select_info.h" +#include "src/common/list.h" +#include "src/slurmctld/slurmctld.h" +#include +#include + +/*****************************************\ + * GLOBAL SELECT STATE MANGEMENT FUNCIONS * +\*****************************************/ + +/* + * Initialize context for node selection plugin + */ +extern int slurm_select_init(void); + +/* + * Terminate plugin and free all associated memory + */ +extern int slurm_select_fini(void); + +/* + * Save any global state information + * IN dir_name - directory into which the data can be stored + */ +extern int select_g_state_save(char *dir_name); + +/* + * Initialize context for node selection plugin and + * restore any global state information + * IN dir_name - directory from which the data can be restored + */ +extern int select_g_state_restore(char *dir_name); + +/* + * Note re/initialization of node record data structure + * IN node_ptr - current node data + * IN node_count - number of node entries + */ +extern int select_g_node_init(struct node_record *node_ptr, int node_cnt); + +/* + * Get select data from a specific node record + * IN node_pts - current node record + * IN cr_info - type of data to get from the node record + * IN/OUT data - the data to get from node record + */ +extern int select_g_get_select_nodeinfo (struct node_record *node_ptr, + enum select_data_info cr_info, + void *data); + +/* + * Update select data for a specific node record for a specific job + * IN job_ptr - current job record + */ +extern int select_g_update_nodeinfo (struct job_record *job_ptr); + +/* + * Update specific block (usually something has gone wrong) + * IN cr_info - type of data to update for a given job record + * IN part_desc_ptr - information about the block + */ +extern int select_g_update_block (update_part_msg_t *part_desc_ptr); + +/* + * Get select data from a plugin + * IN node_pts - current node record + * IN cr_info - type of data to get from the node record + * (see enum select_data_info) + * IN/OUT data - the data to get from node record + */ +extern int select_g_get_info_from_plugin (enum select_data_info cr_info, + void *data); + +/* + * Updated a node state in the plugin, this should happen when a node is + * drained or put into a down state then changed back. + * IN index - index into the node record list + * IN state - state to update to + * RETURN SLURM_SUCCESS on success || SLURM_ERROR else wise + */ +extern int select_g_update_node_state (int index, uint16_t state); + +/* + * Alter the node count for a job given the type of system we are on + * IN/OUT job_desc - current job desc + */ +extern int select_g_alter_node_cnt (enum select_node_cnt type, void *data); + +/* + * Note re/initialization of partition record data structure + * IN part_list - list of partition records + */ +extern int select_g_block_init(List part_list); + +/* + * Note the initialization of job records, issued upon restart of + * slurmctld and used to synchronize any job state. + */ +extern int select_g_job_init(List job_list); + + +extern int select_g_block_init(List part_list); + +/******************************************************\ + * JOB-SPECIFIC SELECT CREDENTIAL MANAGEMENT FUNCIONS * +\******************************************************/ + +/* + * Select the "best" nodes for given job from those available + * IN job_ptr - pointer to job being considered for initiation + * IN/OUT bitmap - map of nodes being considered for allocation on input, + * map of nodes actually to be assigned on output + * IN min_nodes - minimum number of nodes to allocate to job + * IN max_nodes - maximum number of nodes to allocate to job + * IN req_nodes - requested (or desired) count of nodes + * IN test_only - if true, only test if ever could run, not necessarily now + */ +extern int select_g_job_test(struct job_record *job_ptr, bitstr_t *bitmap, + uint32_t min_nodes, uint32_t max_nodes, + uint32_t req_nodes, bool test_only); + +/* + * Note initiation of job is about to begin. Called immediately + * after select_g_job_test(). Executed from slurmctld. + * IN job_ptr - pointer to job being initiated + */ +extern int select_g_job_begin(struct job_record *job_ptr); + +/* + * determine if job is ready to execute per the node select plugin + * IN job_ptr - pointer to job being tested + * RET -1 on error, 1 if ready to execute, 0 otherwise + */ +extern int select_g_job_ready(struct job_record *job_ptr); + +/* + * Note termination of job is starting. Executed from slurmctld. + * IN job_ptr - pointer to job being terminated + */ +extern int select_g_job_fini(struct job_record *job_ptr); + +/* + * Suspend a job. Executed from slurmctld. + * IN job_ptr - pointer to job being suspended + * RET SLURM_SUCCESS or error code + */ +extern int select_g_job_suspend(struct job_record *job_ptr); + +/* + * Resume a job. Executed from slurmctld. + * IN job_ptr - pointer to job being resumed + * RET SLURM_SUCCESS or error code + */ +extern int select_g_job_resume(struct job_record *job_ptr); + +/* allocate storage for a select job credential + * OUT jobinfo - storage for a select job credential + * RET - slurm error code + * NOTE: storage must be freed using select_g_free_jobinfo + */ +extern int select_g_alloc_jobinfo (select_jobinfo_t *jobinfo); + +/* fill in a previously allocated select job credential + * IN/OUT jobinfo - updated select job credential + * IN data_type - type of data to enter into job credential + * IN data - the data to enter into job credential + */ +extern int select_g_set_jobinfo (select_jobinfo_t jobinfo, + enum select_data_type data_type, void *data); + +/* get data from a select job credential + * IN jobinfo - updated select job credential + * IN data_type - type of data to enter into job credential + * OUT data - the data to get from job credential, caller must xfree + * data for data_tyep == SELECT_DATA_PART_ID + */ +extern int select_g_get_jobinfo (select_jobinfo_t jobinfo, + enum select_data_type data_type, void *data); + +/* copy a select job credential + * IN jobinfo - the select job credential to be copied + * RET - the copy or NULL on failure + * NOTE: returned value must be freed using select_g_free_jobinfo + */ +extern select_jobinfo_t select_g_copy_jobinfo(select_jobinfo_t jobinfo); + +/* free storage previously allocated for a select job credential + * IN jobinfo - the select job credential to be freed + * RET - slurm error code + */ +extern int select_g_free_jobinfo (select_jobinfo_t *jobinfo); + +/* + * Get selected data from a given node for a specific job. + * IN node_ptr - current node record + * IN job_ptr - current job record + * IN cr_info - type of data to get from the node record + * IN/OUT data - the data to get from node record + */ +extern int select_g_get_extra_jobinfo (struct node_record *node_ptr, + struct job_record *job_ptr, + enum select_data_info cr_info, + void *data); + +/* pack a select job credential into a buffer in machine independent form + * IN jobinfo - the select job credential to be saved + * OUT buffer - buffer with select credential appended + * RET - slurm error code + */ +extern int select_g_pack_jobinfo (select_jobinfo_t jobinfo, Buf buffer); + +/* unpack a select job credential from a buffer + * OUT jobinfo - the select job credential read + * IN buffer - buffer with select credential read from current pointer loc + * RET - slurm error code + * NOTE: returned value must be freed using select_g_free_jobinfo + */ +extern int select_g_unpack_jobinfo(select_jobinfo_t jobinfo, Buf buffer); + +/* write select job credential to a string + * IN jobinfo - a select job credential + * OUT buf - location to write job credential contents + * IN size - byte size of buf + * IN mode - print mode, see enum select_print_mode + * RET - the string, same as buf + */ +extern char *select_g_sprint_jobinfo(select_jobinfo_t jobinfo, + char *buf, size_t size, int mode); + +/******************************************************\ + * NODE-SELECT PLUGIN SPECIFIC INFORMATION FUNCTIONS * +\******************************************************/ + +/* pack node-select plugin specific information into a buffer in + * machine independent form + * IN last_update_time - time of latest information consumer has + * OUT buffer - location to hold the data, consumer must free + * RET - slurm error code + */ +extern int select_g_pack_node_info(time_t last_query_time, Buf *buffer); + +/* Unpack node select info from a buffer */ +extern int select_g_unpack_node_info(node_select_info_msg_t ** + node_select_info_msg_pptr, Buf buffer); + +/* Free a node select information buffer */ +extern int select_g_free_node_info(node_select_info_msg_t ** + node_select_info_msg_pptr); + +#endif /*__SELECT_PLUGIN_API_H__*/ diff --git a/executable_names/src/common/optz.c b/executable_names/src/common/optz.c new file mode 100644 index 0000000000000000000000000000000000000000..6af6177896165a259e3d004c5523e7dec95008da --- /dev/null +++ b/executable_names/src/common/optz.c @@ -0,0 +1,114 @@ +/*****************************************************************************\ + * optz.c - dynamic option table handling + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "src/common/optz.h" +#include "src/common/xmalloc.h" + +static const struct option opt_table_end = { NULL, 0, NULL, 0 }; + +struct option *optz_create(void) +{ + struct option *optz = xmalloc(sizeof(*optz)); + optz[0] = opt_table_end; + return (optz); +} + +void optz_destroy(struct option *optz) +{ + xfree(optz); + return; +} + +int optz_add(struct option **optz, const struct option *opt) +{ + int len = 0; + struct option *op = *optz; + struct option *t = *optz; + + for (; op->name != NULL; op++) { + if (strcmp(op->name, opt->name) == 0) + slurm_seterrno_ret(EEXIST); + len++; + } + + ++len; /* Add one for incoming option */ + + t = xrealloc(t, (len + 1) * sizeof(struct option)); + + t[len - 1] = *opt; + t[len] = opt_table_end; + + *optz = t; + + return (0); +} + +int optz_append(struct option **optz, const struct option *opts) +{ + int len1 = 0; + int len2 = 0; + int i; + const struct option *op; + struct option *t = *optz; + + if (opts == NULL) + return (0); + + for (op = *optz; op && op->name != NULL; op++) + len1++; + + for (op = opts; op && op->name != NULL; op++) + len2++; + + t = xrealloc(t, (len1 + len2 + 2) * sizeof(struct option)); + + i = len1; + for (op = opts; op->name != NULL; op++, i++) + t[i] = *op; + + t[i] = opt_table_end; + + *optz = t; + + return (0); +} diff --git a/executable_names/src/common/optz.h b/executable_names/src/common/optz.h new file mode 100644 index 0000000000000000000000000000000000000000..bb16a7558ae9d4c9c7658357dc534182b1261d60 --- /dev/null +++ b/executable_names/src/common/optz.h @@ -0,0 +1,60 @@ +/*****************************************************************************\ + * optz.h -- dynamic option table functions + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _OPTZ_H +#define _OPTZ_H + +#if HAVE_CONFIG_H +# include +#endif + +#define _GNU_SOURCE + +#if HAVE_GETOPT_H +# include +#else +# include "src/common/getopt.h" +#endif + +struct option * optz_create (void); + +void optz_destroy (struct option *optz); + +int optz_add (struct option **optz, const struct option *opt); + +int optz_append (struct option **optz, const struct option *); + +#endif /* !_OPTZ_H */ diff --git a/executable_names/src/common/pack.c b/executable_names/src/common/pack.c new file mode 100644 index 0000000000000000000000000000000000000000..d55ca93b3b9adfe514a354177f0f9bd8f1f616d8 --- /dev/null +++ b/executable_names/src/common/pack.c @@ -0,0 +1,534 @@ +/****************************************************************************\ + * pack.c - lowest level un/pack functions + * NOTE: The memory buffer will expand as needed using xrealloc() + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jim Garlick , + * Morris Jette , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include + +#include "src/common/pack.h" +#include "src/common/macros.h" +#include "src/common/xmalloc.h" + +/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +strong_alias(create_buf, slurm_create_buf); +strong_alias(free_buf, slurm_free_buf); +strong_alias(grow_buf, slurm_grow_buf); +strong_alias(init_buf, slurm_init_buf); +strong_alias(xfer_buf_data, slurm_xfer_buf_data); +strong_alias(pack_time, slurm_pack_time); +strong_alias(unpack_time, slurm_unpack_time); +strong_alias(pack32, slurm_pack32); +strong_alias(unpack32, slurm_unpack32); +strong_alias(pack16, slurm_pack16); +strong_alias(unpack16, slurm_unpack16); +strong_alias(pack8, slurm_pack8); +strong_alias(unpack8, slurm_unpack8); +strong_alias(pack32_array, slurm_pack32_array); +strong_alias(unpack32_array, slurm_unpack32_array); +strong_alias(packmem, slurm_packmem); +strong_alias(unpackmem, slurm_unpackmem); +strong_alias(unpackmem_ptr, slurm_unpackmem_ptr); +strong_alias(unpackmem_xmalloc, slurm_unpackmem_xmalloc); +strong_alias(unpackmem_malloc, slurm_unpackmem_malloc); +strong_alias(packstr_array, slurm_packstr_array); +strong_alias(unpackstr_array, slurm_unpackstr_array); +strong_alias(packmem_array, slurm_packmem_array); +strong_alias(unpackmem_array, slurm_unpackmem_array); + +/* Basic buffer management routines */ +/* create_buf - create a buffer with the supplied contents, contents must + * be xalloc'ed */ +Buf create_buf(char *data, int size) +{ + Buf my_buf; + + my_buf = xmalloc(sizeof(struct slurm_buf)); + my_buf->magic = BUF_MAGIC; + my_buf->size = size; + my_buf->processed = 0; + my_buf->head = data; + + return my_buf; +} + +/* free_buf - release memory associated with a given buffer */ +void free_buf(Buf my_buf) +{ + assert(my_buf->magic == BUF_MAGIC); + if (my_buf->head) + xfree(my_buf->head); + xfree(my_buf); +} + +/* Grow a buffer by the specified amount */ +void grow_buf (Buf buffer, int size) +{ + buffer->size += size; + xrealloc(buffer->head, buffer->size); +} + +/* init_buf - create an empty buffer of the given size */ +Buf init_buf(int size) +{ + Buf my_buf; + + my_buf = xmalloc(sizeof(struct slurm_buf)); + my_buf->magic = BUF_MAGIC; + my_buf->size = size; + my_buf->processed = 0; + my_buf->head = xmalloc(sizeof(char)*size); + memset(my_buf->head, 0, size); + return my_buf; +} + +/* xfer_buf_data - return a pointer to the buffer's data and release the + * buffer's structure */ +void *xfer_buf_data(Buf my_buf) +{ + void *data_ptr; + + assert(my_buf->magic == BUF_MAGIC); + data_ptr = (void *) my_buf->head; + xfree(my_buf); + return data_ptr; +} + +/* + * Given a time_t in host byte order, promote it to int64_t, convert to + * network byte order, store in buffer and adjust buffer acc'd'ngly + */ +void pack_time(time_t val, Buf buffer) +{ + int64_t n64 = HTON_int64((int64_t) val); + + if (remaining_buf(buffer) < sizeof(n64)) { + buffer->size += BUF_SIZE; + xrealloc(buffer->head, buffer->size); + } + + memcpy(&buffer->head[buffer->processed], &n64, sizeof(n64)); + buffer->processed += sizeof(n64); +} + +int unpack_time(time_t * valp, Buf buffer) +{ + int64_t n64; + + if (remaining_buf(buffer) < sizeof(n64)) + return SLURM_ERROR; + + memcpy(&n64, &buffer->head[buffer->processed], sizeof(n64)); + buffer->processed += sizeof(n64); + *valp = (time_t) NTOH_int64(n64); + return SLURM_SUCCESS; +} + + +/* + * Given a 32-bit integer in host byte order, convert to network byte order + * store in buffer, and adjust buffer counters. + */ +void pack32(uint32_t val, Buf buffer) +{ + uint32_t nl = htonl(val); + + if (remaining_buf(buffer) < sizeof(nl)) { + buffer->size += BUF_SIZE; + xrealloc(buffer->head, buffer->size); + } + + memcpy(&buffer->head[buffer->processed], &nl, sizeof(nl)); + buffer->processed += sizeof(nl); +} + +/* + * Given a buffer containing a network byte order 32-bit integer, + * store a host integer at 'valp', and adjust buffer counters. + */ +int unpack32(uint32_t * valp, Buf buffer) +{ + uint32_t nl; + if (remaining_buf(buffer) < sizeof(nl)) + return SLURM_ERROR; + + memcpy(&nl, &buffer->head[buffer->processed], sizeof(nl)); + *valp = ntohl(nl); + buffer->processed += sizeof(nl); + return SLURM_SUCCESS; +} + +/* Given a *uint32_t, it will pack an array of size_val */ +void pack32_array(uint32_t * valp, uint32_t size_val, Buf buffer) +{ + uint32_t i = 0; + + pack32(size_val, buffer); + + for (i = 0; i < size_val; i++) { + pack32(*(valp + i), buffer); + } +} + +/* Given a int ptr, it will unpack an array of size_val + */ +int unpack32_array(uint32_t ** valp, uint32_t * size_val, Buf buffer) +{ + uint32_t i = 0; + + if (unpack32(size_val, buffer)) + return SLURM_ERROR; + + *valp = xmalloc((*size_val) * sizeof(uint32_t)); + for (i = 0; i < *size_val; i++) { + if (unpack32((*valp) + i, buffer)) + return SLURM_ERROR; + } + return SLURM_SUCCESS; +} + +/* + * Given a 16-bit integer in host byte order, convert to network byte order, + * store in buffer and adjust buffer counters. + */ +void pack16(uint16_t val, Buf buffer) +{ + uint16_t ns = htons(val); + + if (remaining_buf(buffer) < sizeof(ns)) { + buffer->size += BUF_SIZE; + xrealloc(buffer->head, buffer->size); + } + + memcpy(&buffer->head[buffer->processed], &ns, sizeof(ns)); + buffer->processed += sizeof(ns); +} + +/* + * Given a buffer containing a network byte order 16-bit integer, + * store a host integer at 'valp', and adjust buffer counters. + */ +int unpack16(uint16_t * valp, Buf buffer) +{ + uint16_t ns; + + if (remaining_buf(buffer) < sizeof(ns)) + return SLURM_ERROR; + + memcpy(&ns, &buffer->head[buffer->processed], sizeof(ns)); + *valp = ntohs(ns); + buffer->processed += sizeof(ns); + return SLURM_SUCCESS; +} + +/* + * Given a 8-bit integer in host byte order, convert to network byte order + * store in buffer, and adjust buffer counters. + */ +void pack8(uint8_t val, Buf buffer) +{ + if (remaining_buf(buffer) < sizeof(uint8_t)) { + buffer->size += BUF_SIZE; + xrealloc(buffer->head, buffer->size); + } + + memcpy(&buffer->head[buffer->processed], &val, sizeof(uint8_t)); + buffer->processed += sizeof(uint8_t); +} + +/* + * Given a buffer containing a network byte order 8-bit integer, + * store a host integer at 'valp', and adjust buffer counters. + */ +int unpack8(uint8_t * valp, Buf buffer) +{ + if (remaining_buf(buffer) < sizeof(uint8_t)) + return SLURM_ERROR; + + memcpy(valp, &buffer->head[buffer->processed], sizeof(uint8_t)); + buffer->processed += sizeof(uint8_t); + return SLURM_SUCCESS; +} + +/* + * Given a pointer to memory (valp) and a size (size_val), convert + * size_val to network byte order and store at buffer followed by + * the data at valp. Adjust buffer counters. + */ +void packmem(char *valp, uint16_t size_val, Buf buffer) +{ + uint16_t ns = htons(size_val); + + if (remaining_buf(buffer) < (sizeof(ns) + size_val)) { + buffer->size += (size_val + BUF_SIZE); + xrealloc(buffer->head, buffer->size); + } + + memcpy(&buffer->head[buffer->processed], &ns, sizeof(ns)); + buffer->processed += sizeof(ns); + + if (size_val) { + memcpy(&buffer->head[buffer->processed], valp, size_val); + buffer->processed += size_val; + } +} + + +/* + * Given a buffer containing a network byte order 16-bit integer, + * and an arbitrary data string, return a pointer to the + * data string in 'valp'. Also return the sizes of 'valp' in bytes. + * Adjust buffer counters. + * NOTE: valp is set to point into the buffer bufp, a copy of + * the data is not made + */ +int unpackmem_ptr(char **valp, uint16_t * size_valp, Buf buffer) +{ + uint16_t ns; + + if (remaining_buf(buffer) < sizeof(ns)) + return SLURM_ERROR; + + memcpy(&ns, &buffer->head[buffer->processed], sizeof(ns)); + *size_valp = ntohs(ns); + buffer->processed += sizeof(ns); + + if (*size_valp > 0) { + if (remaining_buf(buffer) < *size_valp) + return SLURM_ERROR; + *valp = &buffer->head[buffer->processed]; + buffer->processed += *size_valp; + } else + *valp = NULL; + return SLURM_SUCCESS; +} + + +/* + * Given a buffer containing a network byte order 16-bit integer, + * and an arbitrary data string, copy the data string into the location + * specified by valp. Also return the sizes of 'valp' in bytes. + * Adjust buffer counters. + * NOTE: The caller is responsible for the management of valp and + * insuring it has sufficient size + */ +int unpackmem(char *valp, uint16_t * size_valp, Buf buffer) +{ + uint16_t ns; + + if (remaining_buf(buffer) < sizeof(ns)) + return SLURM_ERROR; + + memcpy(&ns, &buffer->head[buffer->processed], sizeof(ns)); + *size_valp = ntohs(ns); + buffer->processed += sizeof(ns); + + if (*size_valp > 0) { + if (remaining_buf(buffer) < *size_valp) + return SLURM_ERROR; + memcpy(valp, &buffer->head[buffer->processed], *size_valp); + buffer->processed += *size_valp; + } else + *valp = 0; + return SLURM_SUCCESS; +} + +/* + * Given a buffer containing a network byte order 16-bit integer, + * and an arbitrary data string, copy the data string into the location + * specified by valp. Also return the sizes of 'valp' in bytes. + * Adjust buffer counters. + * NOTE: valp is set to point into a newly created buffer, + * the caller is responsible for calling xfree() on *valp + * if non-NULL (set to NULL on zero size buffer value) + */ +int unpackmem_xmalloc(char **valp, uint16_t * size_valp, Buf buffer) +{ + uint16_t ns; + + if (remaining_buf(buffer) < sizeof(ns)) + return SLURM_ERROR; + + memcpy(&ns, &buffer->head[buffer->processed], sizeof(ns)); + *size_valp = ntohs(ns); + buffer->processed += sizeof(ns); + + if (*size_valp > 0) { + if (remaining_buf(buffer) < *size_valp) + return SLURM_ERROR; + *valp = xmalloc(*size_valp); + memcpy(*valp, &buffer->head[buffer->processed], + *size_valp); + buffer->processed += *size_valp; + } else + *valp = NULL; + return SLURM_SUCCESS; +} + +/* + * Given a buffer containing a network byte order 16-bit integer, + * and an arbitrary data string, copy the data string into the location + * specified by valp. Also return the sizes of 'valp' in bytes. + * Adjust buffer counters. + * NOTE: valp is set to point into a newly created buffer, + * the caller is responsible for calling free() on *valp + * if non-NULL (set to NULL on zero size buffer value) + */ +int unpackmem_malloc(char **valp, uint16_t * size_valp, Buf buffer) +{ + uint16_t ns; + + if (remaining_buf(buffer) < sizeof(ns)) + return SLURM_ERROR; + + memcpy(&ns, &buffer->head[buffer->processed], sizeof(ns)); + *size_valp = ntohs(ns); + buffer->processed += sizeof(ns); + + if (*size_valp > 0) { + if (remaining_buf(buffer) < *size_valp) + return SLURM_ERROR; + *valp = malloc(*size_valp); + memcpy(*valp, &buffer->head[buffer->processed], + *size_valp); + buffer->processed += *size_valp; + } else + *valp = NULL; + return SLURM_SUCCESS; +} + +/* + * Given a pointer to array of char * (char ** or char *[] ) and a size + * (size_val), convert size_val to network byte order and store in the + * buffer followed by the data at valp. Adjust buffer counters. + */ +void packstr_array(char **valp, uint16_t size_val, Buf buffer) +{ + int i; + uint16_t ns = htons(size_val); + + if (remaining_buf(buffer) < sizeof(ns)) { + buffer->size += BUF_SIZE; + xrealloc(buffer->head, buffer->size); + } + + memcpy(&buffer->head[buffer->processed], &ns, sizeof(ns)); + buffer->processed += sizeof(ns); + + for (i = 0; i < size_val; i++) { + packstr(valp[i], buffer); + } + +} + +/* + * Given 'buffer' pointing to a network byte order 16-bit integer + * (size) and a array of strings store the number of strings in + * 'size_valp' and the array of strings in valp + * NOTE: valp is set to point into a newly created buffer, + * the caller is responsible for calling xfree on *valp + * if non-NULL (set to NULL on zero size buffer value) + */ +int unpackstr_array(char ***valp, uint16_t * size_valp, Buf buffer) +{ + int i; + uint16_t ns; + uint16_t uint16_tmp; + + if (remaining_buf(buffer) < sizeof(ns)) + return SLURM_ERROR; + + memcpy(&ns, &buffer->head[buffer->processed], sizeof(ns)); + *size_valp = ntohs(ns); + buffer->processed += sizeof(ns); + + if (*size_valp > 0) { + *valp = xmalloc(sizeof(char *) * (*size_valp + 1)); + for (i = 0; i < *size_valp; i++) { + if (unpackmem_xmalloc(&(*valp)[i], &uint16_tmp, buffer)) + return SLURM_ERROR; + } + (*valp)[i] = NULL; /* NULL terminated array so that execle */ + /* can detect end of array */ + } else + *valp = NULL; + return SLURM_SUCCESS; +} + +/* + * Given a pointer to memory (valp), size (size_val), and buffer, + * store the memory contents into the buffer + */ +void packmem_array(char *valp, uint32_t size_val, Buf buffer) +{ + if (remaining_buf(buffer) < size_val) { + buffer->size += (size_val + BUF_SIZE); + xrealloc(buffer->head, buffer->size); + } + + memcpy(&buffer->head[buffer->processed], valp, size_val); + buffer->processed += size_val; +} + +/* + * Given a pointer to memory (valp), size (size_val), and buffer, + * store the buffer contents into memory + */ +int unpackmem_array(char *valp, uint32_t size_valp, Buf buffer) +{ + if (remaining_buf(buffer) >= size_valp) { + memcpy(valp, &buffer->head[buffer->processed], size_valp); + buffer->processed += size_valp; + return SLURM_SUCCESS; + } else { + *valp = 0; + return SLURM_ERROR; + } +} diff --git a/executable_names/src/common/pack.h b/executable_names/src/common/pack.h new file mode 100644 index 0000000000000000000000000000000000000000..ce9185d0610d530a143461544c8256d7f5704176 --- /dev/null +++ b/executable_names/src/common/pack.h @@ -0,0 +1,320 @@ +/****************************************************************************\ + * pack.h - definitions for lowest level un/pack functions. all functions + * utilize a Buf structure. Call init_buf, un/pack, and free_buf + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew , Morris Jette , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\****************************************************************************/ + +#ifndef _PACK_INCLUDED +#define _PACK_INCLUDED + +#if HAVE_CONFIG_H +# include "config.h" +#if HAVE_INTTYPES_H +# include +#else /* !HAVE_INTTYPES_H */ +# if HAVE_STDINT_H +# include +# endif +#endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +#include +#endif /* HAVE_CONFIG_H */ + +#include +#include +#include + +#define BUF_MAGIC 0x42554545 +#define BUF_SIZE (16 * 1024) + +struct slurm_buf { + uint32_t magic; + char *head; + uint32_t size; + uint32_t processed; +}; + +typedef struct slurm_buf * Buf; + +#define get_buf_data(__buf) (__buf->head) +#define get_buf_offset(__buf) (__buf->processed) +#define set_buf_offset(__buf,__val) (__buf->processed = __val) +#define remaining_buf(__buf) (__buf->size - __buf->processed) +#define size_buf(__buf) (__buf->size) + +Buf create_buf (char *data, int size); +void free_buf(Buf my_buf); +Buf init_buf(int size); +void grow_buf (Buf my_buf, int size); +void *xfer_buf_data(Buf my_buf); + +void pack_time(time_t val, Buf buffer); +int unpack_time(time_t *valp, Buf buffer); + +void pack32(uint32_t val, Buf buffer); +int unpack32(uint32_t *valp, Buf buffer); + +void pack16(uint16_t val, Buf buffer); +int unpack16(uint16_t *valp, Buf buffer); + +void pack8(uint8_t val, Buf buffer); +int unpack8(uint8_t *valp, Buf buffer); + +void pack32_array(uint32_t *valp, uint32_t size_val, Buf buffer); +int unpack32_array( uint32_t **valp, uint32_t* size_val, Buf buffer); + +void packmem(char *valp, uint16_t size_val, Buf buffer); +int unpackmem(char *valp, uint16_t *size_valp, Buf buffer); +int unpackmem_ptr(char **valp, uint16_t *size_valp, Buf buffer); +int unpackmem_xmalloc(char **valp, uint16_t *size_valp, Buf buffer); +int unpackmem_malloc(char **valp, uint16_t *size_valp, Buf buffer); + +void packstr_array(char **valp, uint16_t size_val, Buf buffer); +int unpackstr_array(char ***valp, uint16_t* size_val, Buf buffer); + +void packmem_array(char *valp, uint32_t size_val, Buf buffer); +int unpackmem_array(char *valp, uint32_t size_valp, Buf buffer); + +#define safe_pack_time(val,buf) do { \ + assert(sizeof(val) == sizeof(time_t)); \ + assert(buf->magic == BUF_MAGIC); \ + pack_time(val,buf); \ +} while (0) + +#define safe_unpack_time(valp,buf) do { \ + assert((valp) != NULL); \ + assert(sizeof(*valp) == sizeof(time_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpack_time(valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_pack32(val,buf) do { \ + assert(sizeof(val) == sizeof(uint32_t)); \ + assert(buf->magic == BUF_MAGIC); \ + pack32(val,buf); \ +} while (0) + +#define safe_unpack32(valp,buf) do { \ + assert((valp) != NULL); \ + assert(sizeof(*valp) == sizeof(uint32_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpack32(valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_pack16(val,buf) do { \ + assert(sizeof(val) == sizeof(uint16_t)); \ + assert(buf->magic == BUF_MAGIC); \ + pack16(val,buf); \ +} while (0) + +#define safe_unpack16(valp,buf) do { \ + assert((valp) != NULL); \ + assert(sizeof(*valp) == sizeof(uint16_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpack16(valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_pack8(val,buf) do { \ + assert(sizeof(val) == sizeof(uint8_t)); \ + assert(buf->magic == BUF_MAGIC); \ + pack8(val,buf); \ +} while (0) + +#define safe_unpack8(valp,buf) do { \ + assert((valp) != NULL); \ + assert(sizeof(*valp) == sizeof(uint8_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpack8(valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_pack32_array(array,size_val,buf) do { \ + assert(size_val == 0 || array != NULL); \ + assert(buf->magic == BUF_MAGIC); \ + pack32_array(array,size_val,buf); \ +} while (0) + +#define safe_unpack32_array(valp,size_valp,buf) do { \ + assert(valp != NULL); \ + assert(sizeof(*size_valp) == sizeof(uint32_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpack32_array(valp,size_valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_packmem(valp,size_val,buf) do { \ + assert(sizeof(size_val) == sizeof(uint16_t)); \ + assert(size_val == 0 || valp != NULL); \ + assert(buf->magic == BUF_MAGIC); \ + packmem(valp,size_val,buf); \ +} while (0) + +#define safe_unpackmem(valp,size_valp,buf) do { \ + assert(valp != NULL); \ + assert(sizeof(*size_valp) == sizeof(uint16_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpackmem(valp,size_valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_unpackmem_ptr(valp,size_valp,buf) do { \ + assert(valp != NULL); \ + assert(sizeof(*size_valp) == sizeof(uint16_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpackmem_ptr(valp,size_valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_unpackmem_xmalloc(valp,size_valp,buf) do { \ + assert(valp != NULL); \ + assert(sizeof(*size_valp) == sizeof(uint16_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpackmem_xmalloc(valp,size_valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_unpackmem_malloc(valp,size_valp,buf) do { \ + assert(valp != NULL); \ + assert(sizeof(*size_valp) == sizeof(uint16_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpackmem_malloc(valp,size_valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_pack_bit_fmt(bitmap,max_len,buf) do { \ + assert(buf->magic == BUF_MAGIC); \ + assert(max_len < 0xffff); \ + if (bitmap) { \ + char _tmp_str[max_len]; \ + uint32_t _size; \ + bit_fmt(_tmp_str,max_len,bitmap); \ + _size = strlen(_tmp_str)+1; \ + packmem(_tmp_str,(uint16_t)_size,buf); \ + } else \ + packmem(NULL,(uint16_t)0,buf); \ +} while (0) + +#define safe_packstr(str,max_len,buf) do { \ + uint32_t _size; \ + assert(buf->magic == BUF_MAGIC); \ + assert(max_len <= 0xffff); \ + _size = (str ? strlen(str)+1 : 0); \ + assert(_size == 0 || str != NULL); \ + if (_size <= max_len) \ + packmem(str,(uint16_t)_size,buf); \ + else { \ + char tmp_str[max_len]; \ + strncpy(tmp_str, str, max_len-1); \ + tmp_str[max_len - 1] = (char) NULL; \ + packmem(tmp_str,(uint16_t)max_len,buf); \ + } \ +} while (0) + +#define packstr(str,buf) do { \ + uint32_t _size; \ + _size = (uint32_t)(str ? strlen(str)+1 : 0); \ + assert(_size == 0 || str != NULL); \ + assert(_size <= 0xffff); \ + assert(buf->magic == BUF_MAGIC); \ + packmem(str,(uint16_t)_size,buf); \ +} while (0) + +#define packnull(buf) do { \ + assert(buf != NULL); \ + assert(buf->magic == BUF_MAGIC); \ + packmem(NULL, 0, buf); \ +} while (0) + +#define pack_bit_fmt(bitmap,buf) do { \ + assert(buf->magic == BUF_MAGIC); \ + if (bitmap) { \ + char _tmp_str[0xfffe]; \ + uint32_t _size; \ + bit_fmt(_tmp_str,0xfffe,bitmap); \ + _size = strlen(_tmp_str)+1; \ + packmem(_tmp_str,(uint16_t)_size,buf); \ + } else \ + packmem(NULL,(uint16_t)0,buf); \ +} while (0) + +#define unpackstr_ptr \ + unpackmem_ptr + +#define unpackstr_malloc \ + unpackmem_malloc + +#define unpackstr_xmalloc \ + unpackmem_xmalloc + +#define safe_unpackstr_malloc \ + safe_unpackmem_malloc + +#define safe_unpackstr_xmalloc \ + safe_unpackmem_xmalloc + +#define safe_packstr_array(array,size_val,buf) do { \ + assert(size_val == 0 || array != NULL); \ + assert(buf->magic == BUF_MAGIC); \ + packstr_array(array,size_val,buf); \ +} while (0) + +#define safe_unpackstr_array(valp,size_valp,buf) do { \ + assert(valp != NULL); \ + assert(size_valp != NULL); \ + assert(sizeof(*size_valp) == sizeof(uint16_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpackstr_array(valp,size_valp,buf)) \ + goto unpack_error; \ +} while (0) + +#define safe_packmem_array(valp,size,buf) do { \ + assert(size == 0 || valp != NULL); \ + assert(sizeof(size) == sizeof(uint32_t)); \ + assert(buf->magic == BUF_MAGIC); \ + packmem_array(valp,size,buf); \ +} while (0) + +#define safe_unpackmem_array(valp,size,buf) do { \ + assert(valp != NULL); \ + assert(sizeof(size) == sizeof(uint32_t)); \ + assert(buf->magic == BUF_MAGIC); \ + if (unpackmem_array(valp,size,buf)) \ + goto unpack_error; \ +} while (0) + +#endif /* _PACK_INCLUDED */ diff --git a/executable_names/src/common/parse_config.c b/executable_names/src/common/parse_config.c new file mode 100644 index 0000000000000000000000000000000000000000..453ce128460250f09475dcdfbf131a80a61dfeec --- /dev/null +++ b/executable_names/src/common/parse_config.c @@ -0,0 +1,1209 @@ +/*****************************************************************************\ + * parse_config.c - parse any slurm.conf-like configuration file + * + * NOTE: when you see the prefix "s_p_", think "slurm parser". + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Christopher J. Morrone . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +/* #include "src/common/slurm_protocol_defs.h" */ +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/xassert.h" +/* #include "src/common/slurm_rlimits_info.h" */ +#include "src/common/parse_config.h" + +#include + +#define BUFFER_SIZE 4096 + +#define CONF_HASH_LEN 26 + +static regex_t keyvalue_re; +static char *keyvalue_pattern = + "^[[:space:]]*" + "([[:alpha:]]+)" /* key */ + "[[:space:]]*=[[:space:]]*" + "((\"([^\"]*)\")|([^[:space:]]+))" /* value: quoted with whitespace, + * or unquoted and no whitespace */ + "([[:space:]]|$)"; +static bool keyvalue_initialized = false; + +struct s_p_values { + char *key; + int type; + int data_count; + void *data; + int (*handler)(void **data, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover); + void (*destroy)(void *data); + s_p_values_t *next; +}; + +/* + * NOTE - "key" is case insensitive. + */ +static int _conf_hashtbl_index(const char *key) +{ + int i; + int idx = 0; + + xassert(key); + for (i = 0; i < 10; i++) { + if (key[i] == '\0') + break; + idx += tolower(key[i]); + } + return idx % CONF_HASH_LEN; +} + +static void _conf_hashtbl_insert(s_p_hashtbl_t *hashtbl, + s_p_values_t *value) +{ + int idx; + + xassert(value); + idx = _conf_hashtbl_index(value->key); + value->next = hashtbl[idx]; + hashtbl[idx] = value; +} + +/* + * NOTE - "key" is case insensitive. + */ +static s_p_values_t *_conf_hashtbl_lookup( + const s_p_hashtbl_t *hashtbl, const char *key) +{ + int idx; + s_p_values_t *p; + + xassert(key); + if (hashtbl == NULL) + return NULL; + + idx = _conf_hashtbl_index(key); + for (p = hashtbl[idx]; p != NULL; p = p->next) { + if (strcasecmp(p->key, key) == 0) + return p; + } + return NULL; +} + +s_p_hashtbl_t *s_p_hashtbl_create( + s_p_options_t options[]) +{ + s_p_options_t *op = NULL; + s_p_values_t *value = NULL; + s_p_hashtbl_t *hashtbl = NULL; + int len; + + len = CONF_HASH_LEN * sizeof(s_p_values_t *); + hashtbl = (s_p_hashtbl_t *)xmalloc(len); + memset(hashtbl, 0, len); + + for (op = options; op->key != NULL; op++) { + value = xmalloc(sizeof(s_p_values_t)); + value->key = xstrdup(op->key); + value->type = op->type; + value->data_count = 0; + value->data = NULL; + value->next = NULL; + value->handler = op->handler; + value->destroy = op->destroy; + _conf_hashtbl_insert(hashtbl, value); + } + + return hashtbl; +} + +static void _conf_file_values_free(s_p_values_t *p) +{ + int i; + + if (p->data_count > 0) { + switch(p->type) { + case S_P_ARRAY: + for (i = 0; i < p->data_count; i++) { + void **ptr_array = (void **)p->data; + if (p->destroy != NULL) { + p->destroy(ptr_array[i]); + } else { + xfree(ptr_array[i]); + } + } + xfree(p->data); + break; + default: + if (p->destroy != NULL) { + p->destroy(p->data); + } else { + xfree(p->data); + } + break; + } + } + xfree(p->key); + xfree(p); +} + +void s_p_hashtbl_destroy(s_p_hashtbl_t *hashtbl) { + int i; + s_p_values_t *p, *next; + + for (i = 0; i < CONF_HASH_LEN; i++) { + for (p = hashtbl[i]; p != NULL; p = next) { + next = p->next; + _conf_file_values_free(p); + } + } + xfree(hashtbl); +} + +static void _keyvalue_regex_init(void) +{ + if (!keyvalue_initialized) { + if (regcomp(&keyvalue_re, keyvalue_pattern, + REG_EXTENDED) != 0) { + /* FIXME - should be fatal? */ + error("keyvalue regex compilation failed\n"); + } + keyvalue_initialized = true; + } +} + +/* + * IN line - string to be search for a key=value pair + * OUT key - pointer to the key string (caller must free with xfree()) + * OUT value - pointer to the value string (caller must free with xfree()) + * OUT remaining - pointer into the "line" string denoting the start + * of the unsearched portion of the string + * Return 0 when a key-value pair is found, and -1 otherwise. + */ +static int _keyvalue_regex(const char *line, + char **key, char **value, char **remaining) +{ + size_t nmatch = 8; + regmatch_t pmatch[8]; + + *key = NULL; + *value = NULL; + *remaining = (char *)line; + memset(pmatch, 0, sizeof(regmatch_t)*nmatch); + if (regexec(&keyvalue_re, line, nmatch, pmatch, 0) + == REG_NOMATCH) { + return -1; + } + + *key = (char *)(xstrndup(line + pmatch[1].rm_so, + pmatch[1].rm_eo - pmatch[1].rm_so)); + + + if (pmatch[4].rm_so != -1) { + *value = (char *)(xstrndup(line + pmatch[4].rm_so, + pmatch[4].rm_eo - pmatch[4].rm_so)); + } else if (pmatch[5].rm_so != -1) { + *value = (char *)(xstrndup(line + pmatch[5].rm_so, + pmatch[5].rm_eo - pmatch[5].rm_so)); + } else { + *value = xstrdup(""); + } + + *remaining = (char *)(line + pmatch[2].rm_eo); + + return 0; +} + +static int _strip_continuation(char *buf, int len) +{ + char *ptr; + int bs = 0; + + for (ptr = buf+len-1; ptr >= buf; ptr--) { + if (*ptr == '\\') + bs++; + else if (isspace(*ptr) && bs == 0) + continue; + else + break; + } + /* Check for an odd number of contiguous backslashes at + the end of the line */ + if (bs % 2 == 1) { + ptr = ptr + bs; + *ptr = '\0'; + return (ptr - buf); + } else { + return len; /* no continuation */ + } +} + +/* + * Strip out trailing carriage returns and newlines + */ +static void _strip_cr_nl(char *line) +{ + int len = strlen(line); + char *ptr; + + for (ptr = line+len-1; ptr >= line; ptr--) { + if (*ptr=='\r' || *ptr=='\n') { + *ptr = '\0'; + } else { + return; + } + } +} + +/* Strip comments from a line by terminating the string + * where the comment begins. + * Everything after a non-escaped "#" is a comment. + */ +static void _strip_comments(char *line) +{ + int i; + int len = strlen(line); + int bs_count = 0; + + for (i = 0; i < len; i++) { + /* if # character is preceded by an even number of + * escape characters '\' */ + if (line[i] == '#' && (bs_count%2) == 0) { + line[i] = '\0'; + break; + } else if (line[i] == '\\') { + bs_count++; + } else { + bs_count = 0; + } + } +} + +/* + * Strips any escape characters, "\". If you WANT a back-slash, + * it must be escaped, "\\". + */ +static void _strip_escapes(char *line) +{ + int i, j; + int len = strlen(line); + + for (i = 0, j = 0; i < len+1; i++, j++) { + if (line[i] == '\\') + i++; + line[j] = line[i]; + } +} + +/* + * Reads the next line from the "file" into buffer "buf". + * + * Concatonates together lines that are continued on + * the next line by a trailing "\". Strips out comments, + * replaces escaped "\#" with "#", and replaces "\\" with "\". + */ +static int _get_next_line(char *buf, int buf_size, FILE *file) +{ + char *ptr = buf; + int leftover = buf_size; + int read_size, new_size; + int lines = 0; + + while (fgets(ptr, leftover, file)) { + lines++; + _strip_comments(ptr); + read_size = strlen(ptr); + new_size = _strip_continuation(ptr, read_size); + if (new_size < read_size) { + ptr += new_size; + leftover -= new_size; + } else { /* no continuation */ + break; + } + } + /* _strip_cr_nl(buf); */ /* not necessary */ + _strip_escapes(buf); + + return lines; +} + +static int _handle_string(s_p_values_t *v, + const char *value, const char *line, char **leftover) +{ + if (v->data_count != 0) { + debug("%s specified more than once", v->key); + xfree(v->data); + v->data_count = 0; + } + + if (v->handler != NULL) { + /* call the handler function */ + int rc; + rc = v->handler(&v->data, v->type, v->key, value, + line, leftover); + if (rc != 1) + return rc == 0 ? 0 : -1; + } else { + v->data = xstrdup(value); + } + + v->data_count = 1; + return 1; +} + +static int _handle_long(s_p_values_t *v, + const char *value, const char *line, char **leftover) +{ + if (v->data_count != 0) { + debug("%s specified more than once", v->key); + xfree(v->data); + v->data_count = 0; + } + + if (v->handler != NULL) { + /* call the handler function */ + int rc; + rc = v->handler(&v->data, v->type, v->key, value, + line, leftover); + if (rc != 1) + return rc == 0 ? 0 : -1; + } else { + char *endptr; + long num; + errno = 0; + num = strtol(value, &endptr, 0); + if ((num == 0 && errno == EINVAL) + || (*endptr != '\0')) { + if (strcasecmp(value, "UNLIMITED") == 0 + || strcasecmp(value, "INFINITE") == 0) { + num = (long)-1; + } else { + error("\"%s\" is not a valid number", value); + return -1; + } + } else if (errno == ERANGE) { + error("\"%s\" is out of range", value); + return -1; + } + v->data = xmalloc(sizeof(long)); + *(long *)v->data = num; + } + + v->data_count = 1; + return 1; +} + +static int _handle_uint16(s_p_values_t *v, + const char *value, const char *line, char **leftover) +{ + if (v->data_count != 0) { + debug("%s specified more than once", v->key); + xfree(v->data); + v->data_count = 0; + } + + if (v->handler != NULL) { + /* call the handler function */ + int rc; + rc = v->handler(&v->data, v->type, v->key, value, + line, leftover); + if (rc != 1) + return rc == 0 ? 0 : -1; + } else { + char *endptr; + unsigned long num; + + errno = 0; + num = strtoul(value, &endptr, 0); + if ((num == 0 && errno == EINVAL) + || (*endptr != '\0')) { + if (strcasecmp(value, "UNLIMITED") == 0 + || strcasecmp(value, "INFINITE") == 0) { + num = (uint16_t)-1; + } else { + error("%s value \"%s\" is not a valid number", + v->key, value); + return -1; + } + } else if (errno == ERANGE) { + error("%s value (%s) is out of range", v->key, value); + return -1; + } else if (num < 0) { + error("%s value (%s) is less than zero", v->key, value); + return -1; + } else if (num > 0xffff) { + error("%s value (%s) is greater than 65535", v->key, value); + return -1; + } + v->data = xmalloc(sizeof(uint16_t)); + *(uint16_t *)v->data = (uint16_t)num; + } + + v->data_count = 1; + return 1; +} + +static int _handle_uint32(s_p_values_t *v, + const char *value, const char *line, char **leftover) +{ + if (v->data_count != 0) { + debug("%s specified more than once", v->key); + xfree(v->data); + v->data_count = 0; + } + + if (v->handler != NULL) { + /* call the handler function */ + int rc; + rc = v->handler(&v->data, v->type, v->key, value, + line, leftover); + if (rc != 1) + return rc == 0 ? 0 : -1; + } else { + char *endptr; + unsigned long num; + + errno = 0; + num = strtoul(value, &endptr, 0); + if ((num == 0 && errno == EINVAL) + || (*endptr != '\0')) { + if (strcasecmp(value, "UNLIMITED") == 0 + || strcasecmp(value, "INFINITE") == 0) { + num = (uint32_t)-1; + } else { + error("%s value (%s) is not a valid number", + v->key, value); + return -1; + } + } else if (errno == ERANGE) { + error("%s value (%s) is out of range", v->key, value); + return -1; + } else if (num < 0) { + error("%s value (%s) is less than zero", v->key, value); + return -1; + } else if (num > 0xffffffff) { + error("%s value (%s) is greater than 4294967295", + v->key, value); + return -1; + } + v->data = xmalloc(sizeof(uint32_t)); + *(uint32_t *)v->data = (uint32_t)num; + } + + v->data_count = 1; + return 1; +} + +static int _handle_pointer(s_p_values_t *v, + const char *value, const char *line, char **leftover) +{ + if (v->handler != NULL) { + /* call the handler function */ + int rc; + rc = v->handler(&v->data, v->type, v->key, value, + line, leftover); + if (rc != 1) + return rc == 0 ? 0 : -1; + } else { + if (v->data_count != 0) { + debug("%s specified more than once", v->key); + xfree(v->data); + v->data_count = 0; + } + v->data = xstrdup(value); + } + + v->data_count = 1; + return 1; +} + +static int _handle_array(s_p_values_t *v, + const char *value, const char *line, char **leftover) +{ + void *new_ptr; + void **data; + + if (v->handler != NULL) { + /* call the handler function */ + int rc; + rc = v->handler(&new_ptr, v->type, v->key, value, + line, leftover); + if (rc != 1) + return rc == 0 ? 0 : -1; + } else { + new_ptr = xstrdup(value); + } + v->data_count += 1; + v->data = xrealloc(v->data, (v->data_count)*sizeof(void *)); + data = &((void**)v->data)[v->data_count-1]; + *data = new_ptr; + + return 1; +} + +static int _handle_boolean(s_p_values_t *v, + const char *value, const char *line, char **leftover) +{ + if (v->data_count != 0) { + debug("%s specified more than once", v->key); + xfree(v->data); + v->data_count = 0; + } + + if (v->handler != NULL) { + /* call the handler function */ + int rc; + rc = v->handler(&v->data, v->type, v->key, value, + line, leftover); + if (rc != 1) + return rc == 0 ? 0 : -1; + } else { + bool flag; + + if (!strcasecmp(value, "yes") + || !strcasecmp(value, "up") + || !strcasecmp(value, "1")) { + flag = true; + } else if (!strcasecmp(value, "no") + || !strcasecmp(value, "down") + || !strcasecmp(value, "0")) { + flag = false; + } else { + error("\"%s\" is not a valid option for \"%s\"", + value, v->key); + return -1; + } + + v->data = xmalloc(sizeof(bool)); + *(bool *)v->data = flag; + } + + v->data_count = 1; + return 1; +} + + +/* + * IN line: the entire line that currently being parsed + * IN/OUT leftover: leftover is a pointer into the "line" string. + * The incoming leftover point is a pointer to the + * character just after the already parsed key/value pair. + * If the handler for that key parses more of the line, + * it will move the leftover pointer to point to the character + * after it has finished parsing in the line. + */ +static void _handle_keyvalue_match(s_p_values_t *v, + const char *value, const char *line, + char **leftover) +{ +/* debug3("key = %s, value = %s, line = \"%s\"", */ +/* v->key, value, line); */ + switch (v->type) { + case S_P_IGNORE: + /* do nothing */ + break; + case S_P_STRING: + _handle_string(v, value, line, leftover); + break; + case S_P_LONG: + _handle_long(v, value, line, leftover); + break; + case S_P_UINT16: + _handle_uint16(v, value, line, leftover); + break; + case S_P_UINT32: + _handle_uint32(v, value, line, leftover); + break; + case S_P_POINTER: + _handle_pointer(v, value, line, leftover); + break; + case S_P_ARRAY: + _handle_array(v, value, line, leftover); + break; + case S_P_BOOLEAN: + _handle_boolean(v, value, line, leftover); + break; + } +} + +/* + * Return 1 if all characters in "line" are white-space characters, + * otherwise return 0. + */ +static int _line_is_space(const char *line) +{ + int len; + int i; + + if (line == NULL) { + return 1; + } + len = strlen(line); + for (i = 0; i < len; i++) { + if (!isspace(line[i])) + return 0; + } + + return 1; +} + + +/* + * Returns 1 if the line is parsed cleanly, and 0 otherwise. + */ +int s_p_parse_line(s_p_hashtbl_t *hashtbl, const char *line, char **leftover) +{ + char *key, *value; + char *ptr = (char *)line; + s_p_values_t *p; + char *new_leftover; + + _keyvalue_regex_init(); + + while (_keyvalue_regex(ptr, &key, &value, &new_leftover) == 0) { + if ((p = _conf_hashtbl_lookup(hashtbl, key))) { + _handle_keyvalue_match(p, value, + new_leftover, &new_leftover); + *leftover = ptr = new_leftover; + } else { + error("Parsing error at unrecognized key: %s", key); + xfree(key); + xfree(value); + return 0; + } + xfree(key); + xfree(value); + } + + return 1; +} + +/* + * Returns 1 if the line is parsed cleanly, and 0 otherwise. + */ +static int _parse_next_key(s_p_hashtbl_t *hashtbl, + const char *line, char **leftover) +{ + char *key, *value; + s_p_values_t *p; + char *new_leftover; + + _keyvalue_regex_init(); + + if (_keyvalue_regex(line, &key, &value, &new_leftover) == 0) { + if ((p = _conf_hashtbl_lookup(hashtbl, key))) { + _handle_keyvalue_match(p, value, + new_leftover, &new_leftover); + *leftover = new_leftover; + } else { + error("Parsing error at unrecognized key: %s", key); + xfree(key); + xfree(value); + *leftover = (char *)line; + return 0; + } + xfree(key); + xfree(value); + } else { + *leftover = (char *)line; + } + + return 1; +} + +/* + * Returns 1 if the line contained an include directive and the included + * file was parsed without error. Returns -1 if the line was an include + * directive but the included file contained errors. Returns 0 if + * no include directive is found. + */ +static int _parse_include_directive(s_p_hashtbl_t *hashtbl, + const char *line, char **leftover) +{ + char *ptr; + char *fn_start, *fn_stop; + char *filename; + + *leftover = NULL; + if (strncasecmp("include", line, strlen("include")) == 0) { + ptr = (char *)line + strlen("include"); + if (!isspace(*ptr)) + return 0; + while (isspace(*ptr)) + ptr++; + fn_start = ptr; + while (!isspace(*ptr)) + ptr++; + fn_stop = *leftover = ptr; + filename = xstrndup(fn_start, fn_stop-fn_start); + if (s_p_parse_file(hashtbl, filename) == SLURM_SUCCESS) { + xfree(filename); + return 1; + } else { + xfree(filename); + return -1; + } + } else { + return 0; + } +} + +int s_p_parse_file(s_p_hashtbl_t *hashtbl, char *filename) +{ + FILE *f; + char line[BUFFER_SIZE]; + char *leftover = NULL; + int rc = SLURM_SUCCESS; + int line_number; + int merged_lines; + int inc_rc; + + if(!filename) { + error("s_p_parse_file: No filename given."); + return SLURM_ERROR; + } + + _keyvalue_regex_init(); + + f = fopen(filename, "r"); + if (f == NULL) { + error("s_p_parse_file: unable to read \"%s\": %m", + filename); + return SLURM_ERROR; + } + + line_number = 1; + while((merged_lines = _get_next_line(line, BUFFER_SIZE, f)) > 0) { + /* skip empty lines */ + if (line[0] == '\0') { + line_number += merged_lines; + continue; + } + + inc_rc = _parse_include_directive(hashtbl, line, &leftover); + if (inc_rc == 0) { + _parse_next_key(hashtbl, line, &leftover); + } else if (inc_rc < 0) { + error("\"Include\" failed in file %s line %d", + filename, line_number); + rc = SLURM_ERROR; + line_number += merged_lines; + continue; + } + + /* Make sure that after parsing only whitespace is left over */ + if (!_line_is_space(leftover)) { + char *ptr = xstrdup(leftover); + _strip_cr_nl(ptr); + error("Parse error in file %s line %d: \"%s\"", + filename, line_number, ptr); + xfree(ptr); + rc = SLURM_ERROR; + } + line_number += merged_lines; + } + + fclose(f); + return rc; +} + +/* + * s_p_get_string + * + * Search for a key in a s_p_hashtbl_t with value of type + * string. If the key is found and has a set value, the + * value is retuned in "str". + * + * OUT str - pointer to a copy of the string value + * (caller is resonsible for freeing str with xfree()) + * IN key - hash table key. + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "str" + * was successfully set, otherwise returns 0; + * + * NOTE: Caller is responsible for freeing the returned string with xfree! + */ +int s_p_get_string(char **str, const char *key, const s_p_hashtbl_t *hashtbl) +{ + s_p_values_t *p; + + if (!hashtbl) + return 0; + p = _conf_hashtbl_lookup(hashtbl, key); + if (p == NULL) { + error("Invalid key \"%s\"", key); + return 0; + } + if (p->type != S_P_STRING) { + error("Key \"%s\" is not a string\n", key); + return 0; + } + if (p->data_count == 0) { + return 0; + } + + *str = xstrdup((char *)p->data); + + return 1; +} + +/* + * s_p_get_long + * + * Search for a key in a s_p_hashtbl_t with value of type + * long. If the key is found and has a set value, the + * value is retuned in "num". + * + * OUT num - pointer to a long where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "num" + * was successfully set, otherwise returns 0; + */ +int s_p_get_long(long *num, const char *key, const s_p_hashtbl_t *hashtbl) +{ + s_p_values_t *p; + + if (!hashtbl) + return 0; + p = _conf_hashtbl_lookup(hashtbl, key); + if (p == NULL) { + error("Invalid key \"%s\"", key); + return 0; + } + if (p->type != S_P_LONG) { + error("Key \"%s\" is not a long\n", key); + return 0; + } + if (p->data_count == 0) { + return 0; + } + + *num = *(long *)p->data; + + return 1; +} + +/* + * s_p_get_uint16 + * + * Search for a key in a s_p_hashtbl_t with value of type + * uint16. If the key is found and has a set value, the + * value is retuned in "num". + * + * OUT num - pointer to a uint16_t where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "num" + * was successfully set, otherwise returns 0; + */ +int s_p_get_uint16(uint16_t *num, const char *key, + const s_p_hashtbl_t *hashtbl) +{ + s_p_values_t *p; + + if (!hashtbl) + return 0; + p = _conf_hashtbl_lookup(hashtbl, key); + if (p == NULL) { + error("Invalid key \"%s\"", key); + return 0; + } + if (p->type != S_P_UINT16) { + error("Key \"%s\" is not a uint16_t\n", key); + return 0; + } + if (p->data_count == 0) { + return 0; + } + + *num = *(uint16_t *)p->data; + + return 1; +} + +/* + * s_p_get_uint32 + * + * Search for a key in a s_p_hashtbl_t with value of type + * uint32. If the key is found and has a set value, the + * value is retuned in "num". + * + * OUT num - pointer to a uint32_t where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "num" + * was successfully set, otherwise returns 0; + */ +int s_p_get_uint32(uint32_t *num, const char *key, + const s_p_hashtbl_t *hashtbl) +{ + s_p_values_t *p; + + if (!hashtbl) + return 0; + p = _conf_hashtbl_lookup(hashtbl, key); + if (p == NULL) { + error("Invalid key \"%s\"", key); + return 0; + } + if (p->type != S_P_UINT32) { + error("Key \"%s\" is not a uint32_t\n", key); + return 0; + } + if (p->data_count == 0) { + return 0; + } + + *num = *(uint32_t *)p->data; + + return 1; +} + +/* + * s_p_get_pointer + * + * Search for a key in a s_p_hashtbl_t with value of type + * pointer. If the key is found and has a set value, the + * value is retuned in "ptr". + * + * OUT ptr - pointer to a void pointer where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "ptr" + * was successfully set, otherwise returns 0; + */ +int s_p_get_pointer(void **ptr, const char *key, const s_p_hashtbl_t *hashtbl) +{ + s_p_values_t *p; + + if (!hashtbl) + return 0; + p = _conf_hashtbl_lookup(hashtbl, key); + if (p == NULL) { + error("Invalid key \"%s\"", key); + return 0; + } + if (p->type != S_P_POINTER) { + error("Key \"%s\" is not a pointer\n", key); + return 0; + } + if (p->data_count == 0) { + return 0; + } + + *ptr = p->data; + + return 1; +} + + +/* + * s_p_get_array + * + * Most s_p_ data types allow a key to appear only once in a file + * (s_p_parse_file) or line (s_p_parse_line). S_P_ARRAY is the exception. + * + * S_P_ARRAY allows a key to appear any number of times. Each time + * a particular key is found the value array grows by one element, and + * that element contains a pointer to the newly parsed value. You can + * think of this as being an array of S_P_POINTER types. + * + * OUT ptr_array - pointer to a void pointer-pointer where the value is returned + * OUT count - length of ptr_array + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and both + * "ptr_array" and "count" were successfully set, otherwise returns 0. + */ +int s_p_get_array(void **ptr_array[], int *count, + const char *key, const s_p_hashtbl_t *hashtbl) +{ + s_p_values_t *p; + + if (!hashtbl) + return 0; + p = _conf_hashtbl_lookup(hashtbl, key); + if (p == NULL) { + error("Invalid key \"%s\"", key); + return 0; + } + if (p->type != S_P_ARRAY) { + error("Key \"%s\" is not an array\n", key); + return 0; + } + if (p->data_count == 0) { + return 0; + } + + *ptr_array = (void **)p->data; + *count = p->data_count; + + return 1; +} + +/* + * s_p_get_boolean + * + * Search for a key in a s_p_hashtbl_t with value of type + * boolean. If the key is found and has a set value, the + * value is retuned in "flag". + * + * OUT flag - pointer to a bool where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "num" + * was successfully set, otherwise returns 0; + */ +int s_p_get_boolean(bool *flag, const char *key, const s_p_hashtbl_t *hashtbl) +{ + s_p_values_t *p; + + if (!hashtbl) + return 0; + p = _conf_hashtbl_lookup(hashtbl, key); + if (p == NULL) { + error("Invalid key \"%s\"", key); + return 0; + } + if (p->type != S_P_BOOLEAN) { + error("Key \"%s\" is not a boolean\n", key); + return 0; + } + if (p->data_count == 0) { + return 0; + } + + *flag = *(bool *)p->data; + + return 1; +} + + +/* + * Given an "options" array, print the current values of all + * options in supplied hash table "hashtbl". + * + * Primarily for debugging purposes. + */ +void s_p_dump_values(const s_p_hashtbl_t *hashtbl, + const s_p_options_t options[]) +{ + const s_p_options_t *op = NULL; + long num; + uint16_t num16; + uint32_t num32; + char *str; + void *ptr; + void **ptr_array; + int count; + bool flag; + + for (op = options; op->key != NULL; op++) { + switch(op->type) { + case S_P_STRING: + if (s_p_get_string(&str, op->key, hashtbl)) { + verbose("%s = %s", op->key, str); + xfree(str); + } else { + verbose("%s", op->key); + } + break; + case S_P_LONG: + if (s_p_get_long(&num, op->key, hashtbl)) + verbose("%s = %ld", op->key, num); + else + verbose("%s", op->key); + break; + case S_P_UINT16: + if (s_p_get_uint16(&num16, op->key, hashtbl)) + verbose("%s = %hu", op->key, num16); + else + verbose("%s", op->key); + break; + case S_P_UINT32: + if (s_p_get_uint32(&num32, op->key, hashtbl)) + verbose("%s = %u", op->key, num32); + else + verbose("%s", op->key); + break; + case S_P_POINTER: + if (s_p_get_pointer(&ptr, op->key, hashtbl)) + verbose("%s = %x", op->key, ptr); + else + verbose("%s", op->key); + break; + case S_P_ARRAY: + if (s_p_get_array(&ptr_array, &count, + op->key, hashtbl)) { + verbose("%s, count = %d", op->key, count); + } else { + verbose("%s", op->key); + } + break; + case S_P_BOOLEAN: + if (s_p_get_boolean(&flag, op->key, hashtbl)) { + verbose("%s = %s", op->key, + flag ? "TRUE" : "FALSE"); + } else { + verbose("%s", op->key); + } + break; + case S_P_IGNORE: + break; + } + } +} diff --git a/executable_names/src/common/parse_config.h b/executable_names/src/common/parse_config.h new file mode 100644 index 0000000000000000000000000000000000000000..bfc3221cf25e3eacfee4e5baaf9df76fb78b2422 --- /dev/null +++ b/executable_names/src/common/parse_config.h @@ -0,0 +1,321 @@ +/***************************************************************************** + * parse_config.h - parse any slurm.conf-like configuration file + * + * NOTE: when you see the prefix "s_p_", think "slurm parser". + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Christopher J. Morrone . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _PARSE_CONFIG_H +#define _PARSE_CONFIG_H + +#include + +/* + * This slurm file parser provides a method for parsing a file + * for key-value pairs of the form "key = value". This parser can be used + * for any slurm-like configuration file, not just slurm.conf. If you are + * looking for code specific to slurm.conf, look in + * src/common/slurm_conf.[hc]. + * + * In the parsed file, any amount of white-space is allowed between the the + * key, equal-sign, and value. The parser handles comments, line + * continuations, and escaped characters automatically. Double-quotes can + * be used to surround an entire value if white-space is needed within + * a value string. + * + * A comment begins with a "#" and ends at the end of the line. A line + * continuation is a "\" character at the end of the line (only white-space + * may follow the "\"). A line continuation tells the parser to + * concatenate the following line with the current line. + * + * To include a literal "\" or "#" character in a file, it can be escaped + * by a preceding "\". + * + * Double-quotes CANNOT be escaped, and they must surround the entire value + * string, they cannot be used within some substring of a value string. + * An empty string can be specified with doubles quotes: Apple="". + * + * To use this parser, first construct an array of s_p_options_t structures. + * Only the "key" string needs to be non-zero. Zero or NULL are valid + * defaults for type, handler, and destroy, which conventiently allows + * then to be left out in any static initializations of options arrays. For + * instance: + * + * s_p_options_t options[] = {{"Apples", S_P_UINT16}, + * {"Oranges"}, + * {NULL}}; + * + * In this example, the handler and destroy functions for the "Apples" key + * are NULL pointers, and for key "Oranges" even the type is zero. A zero + * type is equivalent to specifying type S_P_IGNORE. + * + * Once an s_p_options_t array is defined, it is converted into a slurm + * parser hash table structure with the s_p_hashtbl_create() function. + * The s_p_hashtbl_t thus returned can be given to the s_p_parse_file() + * function to parse a file, and fill in the s_p_hashtbl_t structure with + * the values found in the file. Values for keys can then be retrieved + * from the s_p_hashtbl_t with the functions with names beginning with + * "s_p_get_", e.g. s_p_get_boolean(), s_p_get_string(), s_p_get_uint16(), + * etc. + * + * Valid types + * ----------- + * + * S_P_IGNORE - Any instance of specified key and associated value in a file + * will be allowed, but the value will not be stored and will not + * be retirevable from the s_p_hashtbl_t. + * S_P_STRING - The value for a given key will be saved in string form, no + * converstions will be performed on the value. + * S_P_LONG - The value for a given key must be a valid + * string representation of a long integer (as determined by strtol()), + * otherwise an error will be raised. + * S_P_UINT16 - The value for a given key must be a valid + * string representation of an unsigned 16-bit integer. + * S_P_LONG - The value for a given key must be be a valid + * string representation of an unsigned 32-bit integer. + * S_P_POINTER - The parser makes no assumption about the type of the value. + * The s_p_get_pointer() function will return a pointer to the + * s_p_hashtbl_t's internal copy of the value. By default, the value + * will simply be the string representation of the value found in the file. + * This differs from S_P_STRING in that s_p_get_string() returns a COPY + * of the value which must be xfree'ed by the user. The pointer + * returns by s_p_get_pointer() must NOT be freed by the user. + * It is intended that normally S_P_POINTER with be used in conjunction + * with "handler" and "destroy" functions to implement a custom type. + * S_P_ARRAY - This (and S_P_IGNORE, which does not record the fact that it + * has seen the key previously) is the only type which allows its key to + * appear multiple times in a file. With any other type (except + * S_P_IGNORE), an error will be raised when a key is seen more than + * once in a file. + * S_P_ARRAY works mostly the same as S_P_POINTER, except that it builds + * an array of pointers to the found values. + * + * Handlers and destructors + * ------------------------ + * + * Any key specified in an s_p_options_t array can have function callbacks for + * a "handler" function and a "destroy" function. The prototypes for each + * are available below in the typedef of s_p_options_t. + * + * The "handler" function is given the the "key" string, "value" string, and a + * pointer to the remainder of the "line" on which the key-value pair was found + * (this is the line after the parser has removed comments and concatenated + * continued lines). The handler can transform the value any way it desires, + * and then return a pointer to the newly allocated value data in the "data" + * pointer. The handler shall also return int the "leftover" parameter a + * pointer into the "line" buffer designating the start of any leftover, + * unparsed characters in the string. The return code from "handler" must be + * -1 if the value is invalid, 0 if the value is valid but no value will be set + * for "data" (the parser will not flag this key as already seen, and the + * destroy() function will not be called during s_p_hashtbl_destroy()), + * and 1 if "data" is set. + * + * If the "destroy" function is set for a key, and the parser will mark the key + * as "seen" during parsing, then it will pass the pointer to the value data + * to the "destroy" function when s_p_hashtbl_destroy() is called. If + * a key was "seen" during parsing, but the "destroy" function is NULL, + * s_p_hashtbl_destroy() will call xfree() on the data pointer. + */ + +typedef struct s_p_values s_p_values_t; +typedef s_p_values_t * s_p_hashtbl_t; + +typedef enum slurm_parser_enum { + S_P_IGNORE = 0, + S_P_STRING, + S_P_LONG, + S_P_UINT16, + S_P_UINT32, + S_P_POINTER, + S_P_ARRAY, + S_P_BOOLEAN +} slurm_parser_enum_t; + +typedef struct conf_file_options { + char *key; + slurm_parser_enum_t type; + int (*handler)(void **data, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover); + void (*destroy)(void *data); +} s_p_options_t; + + +s_p_hashtbl_t *s_p_hashtbl_create(struct conf_file_options options[]); +void s_p_hashtbl_destroy(s_p_hashtbl_t *hashtbl); + +/* Returns SLURM_SUCCESS if file was opened and parse correctly */ +int s_p_parse_file(s_p_hashtbl_t *hashtbl, char *filename); + +/* + * Returns 1 if the line is parsed cleanly, and 0 otherwise. + */ +int s_p_parse_line(s_p_hashtbl_t *hashtbl, const char *line, char **leftover); + +/* + * s_p_get_string + * + * Search for a key in a s_p_hashtbl_t with value of type + * string. If the key is found and has a set value, the + * value is retuned in "str". + * + * OUT str - pointer to a copy of the string value + * (caller is resonsible for freeing str with xfree()) + * IN key - hash table key. + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "str" + * was successfully set, otherwise returns 0; + * + * NOTE: Caller is responsible for freeing the returned string with xfree! + */ +int s_p_get_string(char **str, const char *key, const s_p_hashtbl_t *hashtbl); + +/* + * s_p_get_long + * + * Search for a key in a s_p_hashtbl_t with value of type + * long. If the key is found and has a set value, the + * value is retuned in "num". + * + * OUT num - pointer to a long where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "num" + * was successfully set, otherwise returns 0; + */ +int s_p_get_long(long *num, const char *key, const s_p_hashtbl_t *hashtbl); + +/* + * s_p_get_uint16 + * + * Search for a key in a s_p_hashtbl_t with value of type + * uint16. If the key is found and has a set value, the + * value is retuned in "num". + * + * OUT num - pointer to a uint16_t where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "num" + * was successfully set, otherwise returns 0; + */ +int s_p_get_uint16(uint16_t *num, const char *key, + const s_p_hashtbl_t *hashtbl); + +/* + * s_p_get_uint32 + * + * Search for a key in a s_p_hashtbl_t with value of type + * uint32. If the key is found and has a set value, the + * value is retuned in "num". + * + * OUT num - pointer to a uint32_t where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "num" + * was successfully set, otherwise returns 0; + */ +int s_p_get_uint32(uint32_t *num, const char *key, + const s_p_hashtbl_t *hashtbl); + +/* + * s_p_get_pointer + * + * Search for a key in a s_p_hashtbl_t with value of type + * pointer. If the key is found and has a set value, the + * value is retuned in "ptr". + * + * OUT num - pointer to a void pointer where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "ptr" + * was successfully set, otherwise returns 0; + */ +int s_p_get_pointer(void **ptr, const char *key, const s_p_hashtbl_t *hashtbl); + +/* + * s_p_get_array + * + * Most s_p_ data types allow a key to appear only once in a file + * (s_p_parse_file) or line (s_p_parse_line). S_P_ARRAY is the exception. + * + * S_P_ARRAY allows a key to appear any number of times. Each time + * a particular key is found the value array grows by one element, and + * that element contains a pointer to the newly parsed value. You can + * think of this as being an array of S_P_POINTER types. + * + * OUT num - pointer to a void pointer-pointer where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "ptr" + * was successfully set, otherwise returns 0; + */ +int s_p_get_array(void **ptr_array[], int *count, + const char *key, const s_p_hashtbl_t *hashtbl); + +/* + * s_p_get_boolean + * + * Search for a key in a s_p_hashtbl_t with value of type + * boolean. If the key is found and has a set value, the + * value is retuned in "flag". + * + * OUT flag - pointer to a bool where the value is returned + * IN key - hash table key + * IN hashtbl - hash table created by s_p_hashtbl_create() + * + * Returns 1 when a value was set for "key" during parsing and "num" + * was successfully set, otherwise returns 0; + */ +int s_p_get_boolean(bool *flag, const char *key, const s_p_hashtbl_t *hashtbl); + +/* + * Given an "options" array, print the current values of all + * options in supplied hash table "hashtbl". + * + * Primarily for debugging purposes. + */ +void s_p_dump_values(const s_p_hashtbl_t *hashtbl, + const s_p_options_t options[]); + + +#endif /* !_PARSE_CONFIG_H */ diff --git a/executable_names/src/common/parse_spec.c b/executable_names/src/common/parse_spec.c new file mode 100644 index 0000000000000000000000000000000000000000..d6b96c2dc48681ce70f7f1573c3df62bdd337d8f --- /dev/null +++ b/executable_names/src/common/parse_spec.c @@ -0,0 +1,341 @@ +/* $Id$ */ +/*****************************************************************************\ + * parse_spec.c - configuration file parser + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include "src/common/log.h" +#include "src/common/parse_spec.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + + +#define BUFFER_SIZE 1024 +#define SEPCHARS " \n\t" + +static int _load_long (long *destination, char *keyword, char *in_line) ; +static int _load_integer (int *destination, char *keyword, char *in_line) ; +static int _load_float (float *destination, char *keyword, char *in_line) ; +static char *_strcasestr(char *haystack, char *needle); + +/* + * slurm_parser - parse the supplied specification into keyword/value pairs + * only the keywords supplied will be searched for. The supplied + * specification is altered, overwriting the keyword and value pairs + * with spaces. + * spec - pointer to the string of specifications, sets of three values + * (as many sets as required): keyword, type, value + * IN keyword - string with the keyword to search for including equal sign + * (e.g. "name=") + * IN type - char with value 'd'==int, 'f'==float, 's'==string, 'l'==long + * IN/OUT value - pointer to storage location for value (char **) for type 's' + * RET 0 if no error, otherwise errno code + * NOTE: terminate with a keyword value of "END" + * NOTE: values of type (char *) are xfreed if non-NULL. caller must xfree any + * returned value + */ +int +slurm_parser (char *spec, ...) +{ + va_list ap; + char *keyword, **str_ptr; + int error_code, *int_ptr, type; + long *long_ptr; + float *float_ptr; + + error_code = 0; + va_start(ap, spec); + while (error_code == 0) { + keyword = va_arg(ap, char *); + if (strcmp (keyword, "END") == 0) + break; + type = va_arg(ap, int); + switch (type) { + case 'd': + int_ptr = va_arg(ap, int *); + error_code = _load_integer(int_ptr, keyword, spec); + break; + case 'f': + float_ptr = va_arg(ap, float *); + error_code = _load_float(float_ptr, keyword, spec); + break; + case 'l': + long_ptr = va_arg(ap, long *); + error_code = _load_long(long_ptr, keyword, spec); + break; + case 's': + str_ptr = va_arg(ap, char **); + error_code = load_string (str_ptr, keyword, spec); + break; + default: + fatal ("parse_spec: invalid type %c", type); + } + } + va_end(ap); + return error_code; +} + + +/* + * _load_float - parse a string for a keyword, value pair, and load the float + * value + * IN keyword - string to search for + * IN/OUT in_line - string to search for keyword, the keyword and value + * (if present) are overwritten by spaces + * OUT destination - set to value, no change if value not found + * RET 0 if no error, otherwise an error code + * NOTE: in_line is overwritten, do not use a constant + */ +static int +_load_float (float *destination, char *keyword, char *in_line) +{ + char scratch[BUFFER_SIZE]; /* scratch area for parsing the input line */ + char *str_ptr1, *str_ptr2, *str_ptr3; + int i, str_len1, str_len2; + + str_ptr1 = (char *) _strcasestr (in_line, keyword); + if (str_ptr1 != NULL) { + str_len1 = strlen (keyword); + strcpy (scratch, str_ptr1 + str_len1); + if ((scratch[0] < '0') && (scratch[0] > '9')) { + error ("_load_float: bad value for keyword %s", + keyword); + return EINVAL; + } + str_ptr2 = (char *) strtok_r (scratch, SEPCHARS, &str_ptr3); + str_len2 = strlen (str_ptr2); + *destination = (float) strtod (scratch, (char **) NULL); + for (i = 0; i < (str_len1 + str_len2); i++) { + str_ptr1[i] = ' '; + } + } + return 0; +} + + +/* + * _load_integer - parse a string for a keyword, value pair, and load the + * integer value + * OUT destination - location into which result is stored + * set to 1 if keyword found without value, + * set to -1 if keyword followed by "unlimited" + * IN keyword - string to search for + * IN/OUT in_line - string to search for keyword, the keyword and value + * (if present) are overwritten by spaces + * RET 0 if no error, otherwise an error code + */ +static int +_load_integer (int *destination, char *keyword, char *in_line) +{ + char scratch[BUFFER_SIZE]; /* scratch area for parsing the input line */ + char *str_ptr1, *str_ptr2, *str_ptr3; + int i, str_len1, str_len2; + + str_ptr1 = (char *) _strcasestr (in_line, keyword); + if (str_ptr1 != NULL) { + str_len1 = strlen (keyword); + strcpy (scratch, str_ptr1 + str_len1); + if ((scratch[0] == (char) NULL) || + (isspace ((int) scratch[0]))) { + /* keyword with no value set */ + *destination = 1; + str_len2 = 0; + } + else { + str_ptr2 = (char *) strtok_r (scratch, SEPCHARS, + &str_ptr3); + str_len2 = strlen (str_ptr2); + if (strcasecmp (str_ptr2, "UNLIMITED") == 0) + *destination = -1; + else if ((str_ptr2[0] >= '0') && + (str_ptr2[0] <= '9')) { + *destination = (int) strtol (scratch, + (char **) NULL, + 10); + } + else { + error ("_load_integer: bad value for keyword %s", + keyword); + return EINVAL; + } + } + + for (i = 0; i < (str_len1 + str_len2); i++) { + str_ptr1[i] = ' '; + } + } + return 0; +} + + +/* + * _load_long - parse a string for a keyword, value pair, and load the + * long value + * IN/OUT destination - location into which result is stored, set to value, + * no change if value not found, + * set to 1 if keyword found without value, + * set to -1 if keyword followed by "unlimited" + * IN keyword - string to search for + * IN/OUR in_line - string to search for keyword, the keyword and value + * (if present) are overwritten by spaces + * RET 0 if no error, otherwise an error code + * NOTE: in_line is overwritten, do not use a constant + */ +static int +_load_long (long *destination, char *keyword, char *in_line) +{ + char scratch[BUFFER_SIZE]; /* scratch area for parsing the input line */ + char *str_ptr1, *str_ptr2, *str_ptr3; + int i, str_len1, str_len2; + + str_ptr1 = (char *) _strcasestr (in_line, keyword); + if (str_ptr1 != NULL) { + str_len1 = strlen (keyword); + strcpy (scratch, str_ptr1 + str_len1); + if ((scratch[0] == (char) NULL) || + (isspace ((int) scratch[0]))) { + /* keyword with no value set */ + *destination = 1; + str_len2 = 0; + } + else { + str_ptr2 = (char *) strtok_r (scratch, SEPCHARS, + &str_ptr3); + str_len2 = strlen (str_ptr2); + if (strcasecmp (str_ptr2, "UNLIMITED") == 0) + *destination = -1L; + else if ((str_ptr2[0] == '-') || + ((str_ptr2[0] >= '0') && + (str_ptr2[0] <= '9'))) { + *destination = strtol (scratch, + (char **) NULL, 10); + } + else { + error ("_load_long: bad value for keyword %s", + keyword); + return EINVAL; + } + } + + for (i = 0; i < (str_len1 + str_len2); i++) { + str_ptr1[i] = ' '; + } + } + return 0; +} + + +/* + * load_string - parse a string for a keyword, value pair, and load the + * char value + * IN/OUT destination - location into which result is stored, set to value, + * no change if value not found, if destination had previous value, + * that memory location is automatically freed + * IN keyword - string to search for + * IN/OUT in_line - string to search for keyword, the keyword and value + * (if present) are overwritten by spaces + * RET 0 if no error, otherwise an error code + * NOTE: destination must be free when no longer required + * NOTE: if destination is non-NULL at function call time, it will be freed + * NOTE: in_line is overwritten, do not use a constant + */ +int +load_string (char **destination, char *keyword, char *in_line) +{ + char scratch[BUFFER_SIZE];/* scratch area for parsing the input line */ + char *str_ptr1, *str_ptr2, *str_ptr3; + int i, str_len1, str_len2; + + str_ptr1 = (char *) _strcasestr (in_line, keyword); + if (str_ptr1 != NULL) { + int quoted = 0; + str_len1 = strlen (keyword); + if (str_ptr1[str_len1] == '"') + quoted = 1; + strcpy (scratch, str_ptr1 + str_len1 + quoted); + if (quoted) + str_ptr2 = strtok_r (scratch, "\042\n", &str_ptr3); + else + str_ptr2 = strtok_r (scratch, SEPCHARS, &str_ptr3); + if ((str_ptr2 == NULL) || + ((str_len2 = strlen (str_ptr2))== 0)){ + info ("load_string : keyword %s lacks value", + keyword); + return EINVAL; + } + xfree (destination[0]); + destination[0] = xstrdup(str_ptr2); + for (i = 0; i < (str_len1 + str_len2 + quoted); i++) + str_ptr1[i] = ' '; + if (quoted && (str_ptr1[i] == '"')) + str_ptr1[i] = ' '; + } + return 0; +} + +/* case insensitve version of strstr() */ +static char * +_strcasestr(char *haystack, char *needle) +{ + int hay_inx, hay_size = strlen(haystack); + int need_inx, need_size = strlen(needle); + char *hay_ptr = haystack; + + for (hay_inx=0; hay_inx + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PARSE_H_ +#define _SLURM_PARSE_H_ + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +/* + * slurm_parser - parse the supplied specification into keyword/value pairs + * only the keywords supplied will be searched for. the supplied + * specification is altered, overwriting the keyword and value pairs + * with spaces. + * spec - pointer to the string of specifications, sets of three values + * (as many sets as required): keyword, type, value + * IN keyword - string with the keyword to search for including equal sign + * (e.g. "name=") + * IN type - char with value 'd'==int, 'f'==float, 's'==string, 'l'==long + * IN/OUT value - pointer to storage location for value (char **) for type 's' + * RET 0 if no error, otherwise errno code + * NOTE: terminate with a keyword value of "END" + * NOTE: values of type (char *) are xfreed if non-NULL. caller must xfree any + * returned value + */ +extern int slurm_parser (char *spec, ...) ; + +/* + * load_string - parse a string for a keyword, value pair, and load the + * char value + * IN/OUT destination - location into which result is stored, set to value, + * no change if value not found, if destination had previous value, + * that memory location is automatically freed + * IN keyword - string to search for + * IN/OUT in_line - string to search for keyword, the keyword and value + * (if present) are overwritten by spaces + * RET 0 if no error, otherwise an error code + * NOTE: destination must be free when no longer required + * NOTE: if destination is non-NULL at function call time, it will be freed + * NOTE: in_line is overwritten, do not use a constant + */ +extern int load_string (char **destination, char *keyword, char *in_line) ; + +#endif diff --git a/executable_names/src/common/parse_time.c b/executable_names/src/common/parse_time.c new file mode 100644 index 0000000000000000000000000000000000000000..6d70566fcafd17ea5e3015ca3480b020f0cb6af2 --- /dev/null +++ b/executable_names/src/common/parse_time.c @@ -0,0 +1,428 @@ +/*****************************************************************************\ + * src/common/parse_time.c - time parsing utility functions + * $Id$ + ***************************************************************************** + * Copyright (C) 2005-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include +#define __USE_ISOC99 /* isblank() */ +#include + +#define _RUN_STAND_ALONE 0 + +time_t time_now; +struct tm *time_now_tm; + +/* convert time differential string into a number of seconds + * time_str (in): string to parse + * pos (in/out): position of parse start/end + * delta (out): delta in seconds + * RET: -1 on error, 0 otherwise + */ +static int _get_delta(char *time_str, int *pos, long *delta) +{ + int offset; + long cnt = 0; + + offset = (*pos) + 1; + for ( ; ((time_str[offset]!='\0')&&(time_str[offset]!='\n')); offset++) { + if (isspace(time_str[offset])) + continue; + if (strncasecmp(time_str+offset, "minutes", 7) == 0) { + cnt *= 60; + offset +=7; + break; + } + if (strncasecmp(time_str+offset, "hours", 5) == 0) { + cnt *= (60 * 60); + offset += 5; + break; + } + if (strncasecmp(time_str+offset, "days", 4) == 0) { + cnt *= (24 * 60 * 60); + offset += 4; + break; + } + if (strncasecmp(time_str+offset, "weeks", 5) == 0) { + cnt *= (7 * 24 * 60 * 60); + offset += 5; + break; + } + if ((time_str[offset] >= '0') && (time_str[offset] <= '9')) { + cnt = (cnt * 10) + (time_str[offset] - '0'); + continue; + } + goto prob; + } + *pos = offset - 1; + *delta = cnt; + return 0; + + prob: *pos = offset - 1; + return -1; +} + +/* convert "HH:MM[:SS] [AM|PM]" string to numeric values + * time_str (in): string to parse + * pos (in/out): position of parse start/end + * hour, minute, second (out): numberic values + * RET: -1 on error, 0 otherwise + */ +static int +_get_time(char *time_str, int *pos, int *hour, int *minute, int * second) +{ + int hr, min, sec; + int offset = *pos; + + /* get hour */ + if ((time_str[offset] < '0') || (time_str[offset] > '9')) + goto prob; + hr = time_str[offset++] - '0'; + if ((time_str[offset] < '0') || (time_str[offset] > '9')) + goto prob; + hr = (hr * 10) + time_str[offset++] - '0'; + if (time_str[offset] != ':') + goto prob; + offset++; + + /* get minute */ + if ((time_str[offset] < '0') || (time_str[offset] > '9')) + goto prob; + min = time_str[offset++] - '0'; + if ((time_str[offset] < '0') || (time_str[offset] > '9')) + goto prob; + min = (min * 10) + time_str[offset++] - '0'; + + /* get optional second */ + if (time_str[offset] == ':') { + offset++; + if ((time_str[offset] < '0') || (time_str[offset] > '9')) + goto prob; + sec = time_str[offset++] - '0'; + if ((time_str[offset] < '0') || (time_str[offset] > '9')) + goto prob; + sec = (sec * 10) + time_str[offset++] - '0'; + } else + sec = 0; + + while (isspace(time_str[offset])) { + offset++; + } + if (strncasecmp(time_str+offset, "pm", 2)== 0) { + hr += 12; + offset += 2; + } else if (strncasecmp(time_str+offset, "am", 2) == 0) { + offset += 2; + } + + *pos = offset - 1; + *hour = hr; + *minute = min; + *second = sec; + return 0; + + prob: *pos = offset; + return -1; +} + +/* convert "MMDDYY" "MM.DD.YY" or "MM/DD/YY" string to numeric values + * time_str (in): string to parse + * pos (in/out): position of parse start/end + * month, mday, year (out): numberic values + * RET: -1 on error, 0 otherwise + */ +static int _get_date(char *time_str, int *pos, int *month, int *mday, int *year) +{ + int mon, day, yr; + int offset = *pos; + + /* get month */ + mon = time_str[offset++] - '0'; + if ((time_str[offset] >= '0') && (time_str[offset] <= '9')) + mon = (mon * 10) + time_str[offset++] - '0'; + if ((mon < 1) || (mon > 12)) { + offset -= 2; + goto prob; + } + if ((time_str[offset] == '.') || (time_str[offset] == '/')) + offset++; + + /* get day */ + if ((time_str[offset] < '0') || (time_str[offset] > '9')) + goto prob; + day = time_str[offset++] - '0'; + if ((time_str[offset] >= '0') && (time_str[offset] <= '9')) + day = (day * 10) + time_str[offset++] - '0'; + if ((day < 1) || (day > 31)) { + offset -= 2; + goto prob; + } + if ((time_str[offset] == '.') || (time_str[offset] == '/')) + offset++; + + /* get optional year */ + if ((time_str[offset] >= '0') && (time_str[offset] <= '9')) { + yr = time_str[offset++] - '0'; + if ((time_str[offset] < '0') || (time_str[offset] > '9')) + goto prob; + yr = (yr * 10) + time_str[offset++] - '0'; + } else + yr = 0; + + *pos = offset - 1; + *month = mon - 1; /* zero origin */ + *mday = day; + if (yr) + *year = yr + 100; /* 1900 == "00" */ + return 0; + + prob: *pos = offset; + return -1; +} + + +/* Convert string to equivalent time value + * input formats: + * today or tomorrow + * midnight, noon, teatime (4PM) + * HH:MM[:SS] [AM|PM] + * MMDD[YY] or MM/DD[/YY] or MM.DD[.YY] + * now + count [minutes | hours | days | weeks] + * + * Invalid input results in message to stderr and return value of zero + * NOTE: not thread safe + */ +extern time_t parse_time(char *time_str) +{ + int hour = -1, minute = -1, second = 0; + int month = -1, mday = -1, year = -1; + int pos = 0; + struct tm res_tm; + + time_now = time(NULL); + time_now_tm = localtime(&time_now); + + for (pos=0; ((time_str[pos] != '\0')&&(time_str[pos] != '\n')); pos++) { + if (isblank(time_str[pos]) || (time_str[pos] == '-')) + continue; + if (strncasecmp(time_str+pos, "today", 5) == 0) { + month = time_now_tm->tm_mon; + mday = time_now_tm->tm_mday; + year = time_now_tm->tm_year; + pos += 4; + continue; + } + if (strncasecmp(time_str+pos, "tomorrow", 8) == 0) { + time_t later = time_now + (24 * 60 * 60); + struct tm *later_tm = localtime(&later); + month = later_tm->tm_mon; + mday = later_tm->tm_mday; + year = later_tm->tm_year; + pos += 7; + continue; + } + if (strncasecmp(time_str+pos, "midnight", 8) == 0) { + hour = 0; + minute = 0; + second = 0; + pos += 7; + continue; + } + if (strncasecmp(time_str+pos, "noon", 4) == 0) { + hour = 12; + minute = 0; + pos += 3; + continue; + } + if (strncasecmp(time_str+pos, "teatime", 7) == 0) { + hour = 16; + minute = 0; + pos += 6; + continue; + } + if (strncasecmp(time_str+pos, "now", 3) == 0) { + int i; + long delta = 0; + time_t later; + struct tm *later_tm; + for (i=(pos+3); ; i++) { + if (time_str[i] == '+') { + pos += i; + if (_get_delta(time_str, &pos, &delta)) + goto prob; + break; + } + if (isblank(time_str[i])) + continue; + if ((time_str[i] == '\0') || (time_str[i] == '\n')) { + pos += (i-1); + break; + } + pos += i; + goto prob; + } + later = time_now + delta; + later_tm = localtime(&later); + month = later_tm->tm_mon; + mday = later_tm->tm_mday; + year = later_tm->tm_year; + hour = later_tm->tm_hour; + minute = later_tm->tm_min; + second = later_tm->tm_sec; + continue; + } + if ((time_str[pos] < '0') || (time_str[pos] > '9')) /* invalid */ + goto prob; + /* We have some numeric value to process */ + if (time_str[pos+2] == ':') { /* time */ + if (_get_time(time_str, &pos, &hour, &minute, &second)) + goto prob; + continue; + } + if (_get_date(time_str, &pos, &month, &mday, &year)) + goto prob; + } + /* printf("%d/%d/%d %d:%d\n",month+1,mday,year+1900,hour+1,minute); */ + + + if ((hour == -1) && (month == -1)) /* nothing specified, time=0 */ + return (time_t) 0; + else if ((hour == -1) && (month != -1)) { /* date, no time implies 00:00 */ + hour = 0; + minute = 0; + } + else if ((hour != -1) && (month == -1)) { /* time, no date implies soonest day */ + if ((hour > time_now_tm->tm_hour) + || ((hour == time_now_tm->tm_hour) && (minute > time_now_tm->tm_min))) { + /* today */ + month = time_now_tm->tm_mon; + mday = time_now_tm->tm_mday; + year = time_now_tm->tm_year; + } else {/* tomorrow */ + time_t later = time_now + (24 * 60 * 60); + struct tm *later_tm = localtime(&later); + month = later_tm->tm_mon; + mday = later_tm->tm_mday; + year = later_tm->tm_year; + + } + } + if (year == -1) { + if ((month > time_now_tm->tm_mon) + || ((month == time_now_tm->tm_mon) && (mday > time_now_tm->tm_mday)) + || ((month == time_now_tm->tm_mon) && (mday == time_now_tm->tm_mday) + && (hour > time_now_tm->tm_hour)) + || ((month == time_now_tm->tm_mon) && (mday == time_now_tm->tm_mday) + && (hour == time_now_tm->tm_hour) && (minute > time_now_tm->tm_min))) { + /* this year */ + year = time_now_tm->tm_year; + } else { + year = time_now_tm->tm_year + 1; + } + } + + /* convert the time into time_t format */ + bzero(&res_tm, sizeof(res_tm)); + res_tm.tm_sec = second; + res_tm.tm_min = minute; + res_tm.tm_hour = hour; + res_tm.tm_mday = mday; + res_tm.tm_mon = month; + res_tm.tm_year = year; + res_tm.tm_isdst = -1; + return mktime(&res_tm); + + prob: fprintf(stderr, "Invalid time specification (pos=%d): %s\n", pos, time_str); + return (time_t) 0; +} + +#if _RUN_STAND_ALONE +int main(int argc, char *argv[]) +{ + char in_line[128]; + time_t when; + + while (1) { + printf("time> "); + if ((fgets(in_line, sizeof(in_line), stdin) == NULL) + || (in_line[0] == '\n')) + break; + when = parse_time(in_line); + if (when) + printf("%s", asctime(localtime(&when))); + } +} +#endif + +/* + * slurm_make_time_str - convert time_t to string with a format of + * "month/date hour:min:sec" for use in user command output + * + * IN time - a time stamp + * OUT string - pointer user defined buffer + * IN size - length of string buffer, we recommend a size of 32 bytes to + * easily support different site-specific formats + */ +extern void +slurm_make_time_str (time_t *time, char *string, int size) +{ + struct tm time_tm; + + localtime_r(time, &time_tm); + if ( *time == (time_t) 0 ) { + snprintf(string, size, "Unknown"); + } else { +#ifdef ISO8601 + /* Format YYYY-MM-DDTHH:MM:SS, ISO8601 standard format, + * NOTE: This is expected to break Maui, Moab and LSF + * schedulers management of SLURM. */ + snprintf(string, size, + "%4.4u-%2.2u-%2.2uT%2.2u:%2.2u:%2.2u", + (time_tm.tm_year + 1900), (time_tm.tm_mon+1), + time_tm.tm_mday, time_tm.tm_hour, time_tm.tm_min, + time_tm.tm_sec); +#else + /* Format MM/DD-HH:MM:SS */ + snprintf(string, size, + "%2.2u/%2.2u-%2.2u:%2.2u:%2.2u", + (time_tm.tm_mon+1), time_tm.tm_mday, + time_tm.tm_hour, time_tm.tm_min, time_tm.tm_sec); + +#endif + } +} + diff --git a/executable_names/src/common/parse_time.h b/executable_names/src/common/parse_time.h new file mode 100644 index 0000000000000000000000000000000000000000..123228a4abd44f050fc0d6e107267cb26527f2cb --- /dev/null +++ b/executable_names/src/common/parse_time.h @@ -0,0 +1,68 @@ +/*****************************************************************************\ + * src/common/parse_time.h - time parsing utility functions + * $Id$ + ***************************************************************************** + * Copyright (C) 2005-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _PARSE_TIME_H_ +#define _PARSE_TIME_H_ + +#include + +/* Convert string to equivalent time value + * input formats: + * today or tomorrow + * midnight, noon, teatime (4PM) + * HH:MM [AM|PM] + * MMDDYY or MM/DD/YY or MM.DD.YY + * now + count [minutes | hours | days | weeks] + * + * Invalid input results in message to stderr and return value of zero + */ +extern time_t parse_time(char *time_str); + +/* + * slurm_make_time_str - convert time_t to string with a format of + * "month/date hour:min:sec" + * + * IN time - a time stamp + * OUT string - pointer user defined buffer + * IN size - length of string buffer, we recommend a size of 32 bytes to + * easily support different site-specific formats + */ +extern void +slurm_make_time_str (time_t *time, char *string, int size); + +#endif diff --git a/executable_names/src/common/plugin.c b/executable_names/src/common/plugin.c new file mode 100644 index 0000000000000000000000000000000000000000..2bbc1a25136a17765a2b910c5648c26a195ac8a2 --- /dev/null +++ b/executable_names/src/common/plugin.c @@ -0,0 +1,228 @@ +/*****************************************************************************\ + * plugin.h - plugin architecture implementation. + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jay Windley . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include /* don't know if there's an autoconf for this. */ +#include + +#include "src/common/log.h" +#include "src/common/plugin.h" +#include + +/* dlerror() on AIX sometimes fails, revert to strerror() as needed */ +static char *_dlerror(void) +{ + int error_code = errno; + char *rc = dlerror(); + + if ((rc == NULL) || (rc[0] == '\0')) + rc = strerror(error_code); + + return rc; +} + +int +plugin_peek( const char *fq_path, + char *plugin_type, + const size_t type_len, + uint32_t *plugin_version ) +{ + plugin_handle_t plug; + char *type; + uint32_t *version; + + plug = dlopen( fq_path, RTLD_LAZY ); + if ( plug == NULL ) { + debug3( "plugin_peek: dlopen(%s): %s", fq_path, _dlerror() ); + return SLURM_ERROR; + } + if ( ( type = dlsym( plug, PLUGIN_TYPE ) ) != NULL ) { + if ( plugin_type != NULL ) { + strncpy( plugin_type, type, type_len ); + } + } else { + dlclose( plug ); + /* could be vestigial library, don't treat as an error */ + verbose( "%s: not a SLURM plugin", fq_path ); + return SLURM_ERROR; + } + + if ( ( version = (uint32_t *) dlsym( plug, PLUGIN_VERSION ) ) != NULL ) { + if ( plugin_version != NULL ) { + *plugin_version = *version; + } + } else { + dlclose( plug ); + /* could be vestigial library, don't treat as an error */ + verbose( "%s: not a SLURM plugin", fq_path ); + return SLURM_ERROR; + } + + dlclose( plug ); + return SLURM_SUCCESS; +} + +plugin_handle_t +plugin_load_from_file( const char *fq_path ) +{ + plugin_handle_t plug; + int (*init)( void ); + + /* + * Try to open the shared object. + * + * Use RTLD_LAZY to allow plugins to use symbols that may be + * defined in only one slurm entity (e.g. srun and not slurmd), + * when the use of that symbol is restricted to within the + * entity from which it is available. (i.e. srun symbols are only + * used in the context of srun, not slurmd.) + * + */ + plug = dlopen( fq_path, RTLD_LAZY ); + if ( plug == NULL ) { + error( "plugin_load_from_file: dlopen(%s): %s", + fq_path, + _dlerror() ); + return PLUGIN_INVALID_HANDLE; + } + + /* Now see if our required symbols are defined. */ + if ( ( dlsym( plug, PLUGIN_NAME ) == NULL ) || + ( dlsym( plug, PLUGIN_TYPE ) == NULL ) || + ( dlsym( plug, PLUGIN_VERSION ) == NULL ) ) { + debug( "plugin_load_from_file: invalid symbol"); + /* slurm_seterrno( SLURM_PLUGIN_SYMBOLS ); */ + return PLUGIN_INVALID_HANDLE; + } + + /* + * Now call its init() function, if present. If the function + * returns nonzero, unload the plugin and signal an error. + */ + if ( ( init = dlsym( plug, "init" ) ) != NULL ) { + if ( (*init)() != 0 ) { + error( "plugin_load_from_file(%s): init() returned SLURM_ERROR", + fq_path ); + (void) dlclose( plug ); + return PLUGIN_INVALID_HANDLE; + } + } + + return plug; +} + + +/* + * Must test plugin validity before doing dlopen() and dlsym() + * operations because some implementations of these functions + * crash if the library handle is not valid. + */ + +void +plugin_unload( plugin_handle_t plug ) +{ + void (*fini)(void); + + if ( plug != PLUGIN_INVALID_HANDLE ) { + if ( ( fini = dlsym( plug, "fini" ) ) != NULL ) { + (*fini)(); + } + (void) dlclose( plug ); + } +} + + +void * +plugin_get_sym( plugin_handle_t plug, const char *name ) +{ + if ( plug != PLUGIN_INVALID_HANDLE ) + return dlsym( plug, name ); + else + return NULL; +} + +const char * +plugin_get_name( plugin_handle_t plug ) +{ + if ( plug != PLUGIN_INVALID_HANDLE ) + return (const char *) dlsym( plug, PLUGIN_NAME ); + else + return NULL; +} + +const char * +plugin_get_type( plugin_handle_t plug ) +{ + if ( plug != PLUGIN_INVALID_HANDLE ) + return (const char *) dlsym( plug, PLUGIN_TYPE ); + else + return NULL; +} + +uint32_t +plugin_get_version( plugin_handle_t plug ) +{ + uint32_t *ptr; + + if ( plug == PLUGIN_INVALID_HANDLE ) return 0; + ptr = (uint32_t *) dlsym( plug, PLUGIN_VERSION ); + return ptr ? *ptr : 0; +} + +int +plugin_get_syms( plugin_handle_t plug, + int n_syms, + const char *names[], + void *ptrs[] ) +{ + int i, count; + + count = 0; + for ( i = 0; i < n_syms; ++i ) { + ptrs[ i ] = dlsym( plug, names[ i ] ); + if ( ptrs[ i ] ) ++count; + } + + return count; +} + diff --git a/executable_names/src/common/plugin.h b/executable_names/src/common/plugin.h new file mode 100644 index 0000000000000000000000000000000000000000..508ec7e5997bceb6c4ba21b9d1595a0d7e0cef19 --- /dev/null +++ b/executable_names/src/common/plugin.h @@ -0,0 +1,158 @@ +/*****************************************************************************\ + * plugin.h - plugin abstraction and operations. + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jay Windlay . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef __GENERIC_PLUGIN_H__ +#define __GENERIC_PLUGIN_H__ + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +# if HAVE_SYS_TYPES_H +# include +# endif +#else /* ! HAVE_CONFIG_H_ */ +# include +#endif /* HAVE_CONFIG_H */ + +#include + +/* + * These symbols are required to be defined in any plugin managed by + * this code. Use these macros instead of string literals in order to + * avoid typographical errors. + * + * Their meanings are described in the sample plugin. + */ +#define PLUGIN_NAME "plugin_name" +#define PLUGIN_TYPE "plugin_type" +#define PLUGIN_VERSION "plugin_version" + +/* + * Opaque type for plugin handle. Most plugin operations will want + * of these. + * + * Currently there is no user-space memory associated with the plugin + * handle other than the pointer with which it is implemented. While + * allowing a handle to pass out of scope without explicit destruction + * will not leak user memory, it may leave the plugin loaded in memory. + */ +typedef void *plugin_handle_t; + +#define PLUGIN_INVALID_HANDLE ((void*)0) + +/* + * "Peek" into a plugin to discover its type and version. This does + * not run the plugin's init() or fini() functions (as defined in this + * API) but the _init() and _fini() functions (defined by the underlying + * OS) are run. + * + * fq_path - fully-qualified pathname to the plugin. + * plugin_type - a buffer in which to store the plugin type. May be + * NULL to indicate that the caller is not interested in the + * plugin type. + * type_len - the number of bytes available in plugin_type. The type + * will be zero-terminated if space permits. + * plugin_version - pointer to place to store the plugin version. May + * be NULL to indicate that the caller is not interested in the + * plugin version. + * + * Returns a SLURM errno. + */ +int plugin_peek( const char *fq_path, + char *plugin_type, + const size_t type_len, + uint32_t *plugin_version ); + + +/* + * Simplest way to get a plugin -- load it from a file. + * + * fq_path - the fully-qualified pathname (i.e., from root) to + * the plugin to load. + * + * Returns a handle if successful, or NULL if not. + * + * The plugin's initialization code will be executed prior + * to this function's return. + */ +plugin_handle_t plugin_load_from_file( const char *fq_path ); + + +/* + * Unload a plugin from memory. + */ +void plugin_unload( plugin_handle_t plug ); + +/* + * Get the address of a named symbol in the plugin. + * + * Returns the address of the symbol or NULL if not found. + */ +void *plugin_get_sym( plugin_handle_t plug, const char *name ); + +/* + * Access functions to get the name, type, and version of a plugin + * from the plugin itself. + */ +const char *plugin_get_name( plugin_handle_t plug ); +const char *plugin_get_type( plugin_handle_t plug ); +uint32_t plugin_get_version( plugin_handle_t plug ); + +/* + * Get the addresses of several symbols from the plugin at once. + * + * n_syms - the number of symbols in names[]. + * names[] - an argv-like array of symbol names to resolve. + * ptrs[] - an array of pointers into which the addresses of the respective + * symbols should be placed. ptrs[i] will receive the address of + * names[i]. + * + * Returns the number of symbols successfully resolved. Pointers whose + * associated symbol name was not found will be set to NULL. + */ +int plugin_get_syms( plugin_handle_t plug, + int n_syms, + const char *names[], + void *ptrs[] ); + +#endif /*__GENERIC_PLUGIN_H__*/ diff --git a/executable_names/src/common/plugrack.c b/executable_names/src/common/plugrack.c new file mode 100644 index 0000000000000000000000000000000000000000..7e51980c0d96277ea8850b558e49345397901b4e --- /dev/null +++ b/executable_names/src/common/plugrack.c @@ -0,0 +1,644 @@ +/*****************************************************************************\ + * plugrack.c - an intelligent container for plugins + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jay Windley . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" + +# if HAVE_DIRENT_H +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +# else /* ! HAVE_DIRENT_H */ +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# endif /* HAVE_DIRENT_H */ + +# if STDC_HEADERS +# include +# else /* ! STDC_HEADERS */ +# if !HAVE_STRCHR +# define strchr index +# define strrchr rindex +char *strchr(), *strrchr(); +# endif /* HAVE_STRCHR */ +# endif /* STDC_HEADERS */ + +# if HAVE_UNISTD_H +# include +# endif /* HAVE_UNISTD_H */ +# if HAVE_SYS_TYPES_H +# include +# endif +# if HAVE_SYS_STAT_H +# include +# endif + +# if HAVE_STDLIB_H +# include +# endif + +#else /* ! HAVE_CONFIG_H */ +# include +# include +# include +# include +# include +# include +# include +#endif /* HAVE_CONFIG_H */ + +#include "src/common/macros.h" +#include "src/common/xassert.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/plugrack.h" + +/* + * Represents a plugin in the rack. + * + * full_type is the fully-qualified plugin type, e.g., "auth/kerberos". + * For the low-level plugin interface the type can be whatever it needs + * to be. For the rack-level interface, the type exported by the plugin + * must be of the form "/". + * + * fq_path is the fully-qualified pathname to the plugin. + * + * plug is the plugin handle. If it is equal to PLUGIN_INVALID_HANDLE + * then the plugin is not currently loaded in memory. + * + * refcount shows how many clients have requested to use the plugin. + * If this is zero, the rack code may decide to unload the plugin. + */ +typedef struct _plugrack_entry { + const char *full_type; + const char *fq_path; + plugin_handle_t plug; + int refcount; +} plugrack_entry_t; + +/* + * Implementation of the plugin rack. + * + * entries is the list of plugrack_entry_t. + * + * uid is the Linux UID of the person authorized to own the plugin + * and write to the plugin file and the directory where it is stored. + * This field is used only if paranoia is nonzero. + * + * paranoia is a set of bit flags indicating what operations should be + * done to verify the integrity and authority of the plugin before + * loading it. + */ +struct _plugrack { + List entries; + const char *major_type; + uid_t uid; + uint8_t paranoia; +}; + +#define PLUGRACK_UID_NOBODY 99 /* RedHat's, anyway. */ + +static bool _match_major ( const char *path_name, const char *major_type ); +static int _plugrack_read_single_dir( plugrack_t rack, char *dir ); +static bool _so_file( char *pathname ); + +/* + * Destructor function for the List code. This should entirely + * clean up a plugin_entry_t. + */ +static void +plugrack_entry_destructor( void *v ) +{ + plugrack_entry_t *victim = v; + + if ( victim == NULL ) return; + + /* + * Free memory and unload the plugin if necessary. The assert + * is to make sure we were actually called from the List destructor + * which should only be callable from plugrack_destroy(). + */ + xassert( victim->refcount == 0 ); + xfree( victim->full_type ); + xfree( victim->fq_path ); + if ( victim->plug != PLUGIN_INVALID_HANDLE ) + plugin_unload( victim->plug ); + xfree( victim ); +} + +/* + * Check a pathname to see if it is owned and writable by the appropriate + * users, and writable by no one else. The path can be either to a file + * or to a directory. This is so, when fishing for plugins in a whole + * directory, we can test the directory once and then each file. + * + * Returns non-zero if the file system node indicated by the path name + * is owned by the user in the plugin rack and not writable by anyone + * else, and these actions are requested by the rack's paranoia policy. + */ +static int +accept_path_paranoia( plugrack_t rack, + const char *fq_path, + int check_own, + int check_write ) +{ + struct stat st; + + /* Internal function, so assert rather than fail gracefully. */ + xassert( rack ); + xassert( fq_path ); + + if ( stat( fq_path, &st ) < 0 ) { + debug3( "accept_path_paranoia: stat(%s) failed", fq_path ); + return 0; + } + + /* Is path owned by authorized user? */ + if ( check_own ) { + if ( st.st_uid != rack->uid ) { + debug3( "accept_path_paranoia: %s not owned by " + "proper user", fq_path ); + return 0; + } + } + + /* Is path writable by others? */ + if ( check_write ) { + if ( ( st.st_mode & S_IWGRP ) + || ( st.st_mode & S_IWOTH ) ) { + debug3( "accept_path_paranoia: %s writable by others", + fq_path ); + return 0; + } + } + + return 1; +} + + +plugrack_t plugrack_create( void ) +{ + plugrack_t rack = (plugrack_t) xmalloc( sizeof( struct _plugrack ) ); + + rack->paranoia = PLUGRACK_PARANOIA_NONE; + rack->major_type = NULL; + rack->uid = PLUGRACK_UID_NOBODY; + rack->entries = list_create( plugrack_entry_destructor ); + if ( rack->entries == NULL ) { + xfree( rack ); + return NULL; + } + return rack; +} + + +int +plugrack_destroy( plugrack_t rack ) +{ + ListIterator it; + plugrack_entry_t *e; + + if ( ! rack ) return SLURM_ERROR; + + /* + * See if there are any plugins still being used. If we unload them, + * the program might crash because cached virtual mapped addresses + * will suddenly be outside our virtual address space. + */ + it = list_iterator_create( rack->entries ); + while ( ( e = list_next( it ) ) != NULL ) { + if ( e->refcount > 0 ) { + debug2( "plugrack_destroy: attempt to destroy " + "plugin rack that is still in use" ); + list_iterator_destroy( it ); + return SLURM_ERROR; /* plugins still in use. */ + } + } + list_iterator_destroy( it ); + + list_destroy( rack->entries ); + xfree( rack->major_type ); + xfree( rack ); + return SLURM_SUCCESS; +} + + +int +plugrack_set_major_type( plugrack_t rack, const char *type ) +{ + if ( ! rack ) return SLURM_ERROR; + if ( ! type ) return SLURM_ERROR; + + /* Free any pre-existing type. */ + if ( rack->major_type ) xfree( rack->major_type ); + rack->major_type = NULL; + + /* Install a new one. */ + if ( type != NULL ) { + rack->major_type = xstrdup( type ); + if ( rack->major_type == NULL ) { + debug3( "plugrack_set_major_type: unable to set type" ); + return SLURM_ERROR; + } + } + + return SLURM_SUCCESS; +} + + +int +plugrack_set_paranoia( plugrack_t rack, + const uint32_t flags, + const uid_t uid ) + +{ + if ( ! rack ) return SLURM_ERROR; + + rack->paranoia = flags; + if ( flags ) { + rack->uid = uid; + } + + return SLURM_SUCCESS; +} + +static int +plugrack_add_plugin_path( plugrack_t rack, + const char *full_type, + const char *fq_path ) +{ + plugrack_entry_t *e; + + if ( ! rack ) return SLURM_ERROR; + if ( ! fq_path ) return SLURM_ERROR; + + e = (plugrack_entry_t *) xmalloc( sizeof( plugrack_entry_t ) ); + + e->full_type = xstrdup( full_type ); + e->fq_path = xstrdup( fq_path ); + e->plug = PLUGIN_INVALID_HANDLE; + e->refcount = 0; + list_append( rack->entries, e ); + + return SLURM_SUCCESS; +} + + +/* test for the plugin in the various colon separated directories */ +int +plugrack_read_dir( plugrack_t rack, const char *dir ) +{ + char *head, *dir_array; + int i, rc = SLURM_SUCCESS; + + if ( ( ! rack ) || (! dir ) ) + return SLURM_ERROR; + + dir_array = xmalloc( strlen( dir ) + 1 ); + xassert( dir_array ); + strcpy( dir_array, dir ); + head = dir_array; + for (i=0; ; i++) { + if (dir_array[i] == '\0') { + if ( _plugrack_read_single_dir( rack, head ) == + SLURM_ERROR) + rc = SLURM_ERROR; + break; + } + else if (dir_array[i] == ':') { + dir_array[i] = '\0'; + if ( _plugrack_read_single_dir( rack, head ) == + SLURM_ERROR) + rc = SLURM_ERROR; + head = dir_array + i + 1; + } + } + xfree( dir_array ); + return rc; +} + +static int +_plugrack_read_single_dir( plugrack_t rack, char *dir ) +{ + char *fq_path; + char *tail; + DIR *dirp; + struct dirent *e; + struct stat st; + static const size_t type_len = 64; + char plugin_type[ type_len ]; + static int max_path_len = 0; + + /* Allocate a buffer for fully-qualified path names. */ + if (max_path_len == 0) { + max_path_len = pathconf("/", _PC_NAME_MAX); + if (max_path_len <= 0) + max_path_len = 256; + } + fq_path = xmalloc( strlen( dir ) + max_path_len + 1 ); + xassert( fq_path ); + + /* + * Write the directory name in it, then a separator, then + * keep track of where we want to write the individual file + * names. + */ + strcpy( fq_path, dir ); + tail = &fq_path[ strlen( dir ) ]; + *tail = '/'; + ++tail; + + /* Check whether we should be paranoid about this directory. */ + if ( ! accept_path_paranoia( rack, + dir, + rack->paranoia & + PLUGRACK_PARANOIA_DIR_OWN, + rack->paranoia & + PLUGRACK_PARANOIA_DIR_WRITABLE ) ) { + xfree( fq_path ); + return SLURM_ERROR; + } + + /* Open the directory. */ + dirp = opendir( dir ); + if ( dirp == NULL ) { + error( "cannot open plugin directory %s", dir ); + xfree( fq_path ); + return SLURM_ERROR; + } + + while ( 1 ) { + e = readdir( dirp ); + if ( e == NULL ) + break; + + /* + * Compose file name. Where NAME_MAX is defined it represents + * the largest file name given in a dirent. This macro is used + * in the allocation of "tail" above, so this unbounded copy + * should work. + */ + strcpy( tail, e->d_name ); + + /* Check only regular files. */ + if ( (strncmp(e->d_name, ".", 1) == 0) + || (stat( fq_path, &st ) < 0) + || (! S_ISREG(st.st_mode)) ) + continue; + + /* Check only shared object files */ + if (! _so_file(e->d_name)) + continue; + + /* file's prefix must match specified major_type + * to avoid having some program try to open a + * plugin designed for a different program and + * discovering undefined symbols */ + if ((rack->major_type) && + (!_match_major(e->d_name, rack->major_type))) + continue; + + /* See if we should be paranoid about this file. */ + if (!accept_path_paranoia( rack, + fq_path, + rack->paranoia & + PLUGRACK_PARANOIA_FILE_OWN, + rack->paranoia & + PLUGRACK_PARANOIA_FILE_WRITABLE )) { + debug3( "plugin_read_dir: skipping %s for security " + "reasons", fq_path ); + continue; + } + + /* Test the type. */ + if ( plugin_peek( fq_path, + plugin_type, + type_len, + NULL ) == SLURM_ERROR ) { + continue; + } + + if ( rack->major_type + && ( strncmp( rack->major_type, + plugin_type, + strlen( rack->major_type ) ) != 0 ) ) { + continue; + } + + /* Add it to the list. */ + (void) plugrack_add_plugin_path( rack, plugin_type, fq_path ); + } + + closedir( dirp ); + + xfree( fq_path ); + return SLURM_SUCCESS; +} + +/* Return TRUE if the specified pathname is recognized as that of a shared + * object (i.e. containing ".so") */ +static bool +_so_file ( char *file_name ) +{ + int i; + + if (file_name == NULL) + return false; + + for (i=0; file_name[i] ;i++) { + if ( (file_name[i] == '.') && (file_name[i+1] == 's') && + (file_name[i+2] == 'o') ) + return true; + } + return false; +} + +/* Return TRUE of the specified major_type is a prefix of the shared object + * pathname (i.e. either "..." or "lib...") */ +static bool +_match_major ( const char *path_name, const char *major_type ) +{ + char *head = (char *)path_name; + + /* Special case for BlueGene systems */ + if (strncmp(head, "libsched_if", 11) == 0) + return FALSE; + + if (strncmp(head, "lib", 3) == 0) + head += 3; + if (strncmp(head, major_type, strlen(major_type))) + return FALSE; + return TRUE; +} + +int +plugrack_read_cache( plugrack_t rack, + const char *cache_file ) +{ + /* Don't care for now. */ + + return SLURM_ERROR; +} + + +int +plugrack_purge_idle( plugrack_t rack ) +{ + ListIterator it; + plugrack_entry_t *e; + + if ( ! rack ) return SLURM_ERROR; + + it = list_iterator_create( rack->entries ); + while ( ( e = list_next( it ) ) != NULL ) { + if ( ( e->plug != PLUGIN_INVALID_HANDLE ) && + ( e->refcount == 0 ) ){ + plugin_unload( e->plug ); + e->plug = PLUGIN_INVALID_HANDLE; + } + } + + list_iterator_destroy( it ); + return SLURM_SUCCESS; +} + + +int +plugrack_load_all( plugrack_t rack ) +{ + ListIterator it; + plugrack_entry_t *e; + + if ( ! rack ) return SLURM_ERROR; + + it = list_iterator_create( rack->entries ); + while ( ( e = list_next( it ) ) != NULL ) { + if ( e->plug == PLUGIN_INVALID_HANDLE ) { + e->plug = plugin_load_from_file( e->fq_path ); + } + } + + list_iterator_destroy( it ); + return SLURM_SUCCESS; +} + + +int +plugrack_write_cache( plugrack_t rack, + const char *cache ) +{ + /* Not implemented. */ + + return SLURM_SUCCESS; +} + +plugin_handle_t +plugrack_use_by_type( plugrack_t rack, + const char *full_type ) +{ + ListIterator it; + plugrack_entry_t *e; + + if ( ! rack ) + return PLUGIN_INVALID_HANDLE; + if ( ! full_type ) + return PLUGIN_INVALID_HANDLE; + + it = list_iterator_create( rack->entries ); + while ( ( e = list_next( it ) ) != NULL ) { + if ( strcmp( full_type, e->full_type ) != 0 ) + continue; + + /* See if plugin is loaded. */ + if ( e->plug == PLUGIN_INVALID_HANDLE ) + e->plug = plugin_load_from_file( e->fq_path ); + + /* If load was successful, increment the reference count. */ + if ( e->plug == PLUGIN_INVALID_HANDLE ) + e->refcount++; + + /* + * Return the plugin, even if it failed to load -- this serves + * as an error return value. + */ + list_iterator_destroy( it ); + return e->plug; + } + + /* Couldn't find a suitable plugin. */ + list_iterator_destroy( it ); + return PLUGIN_INVALID_HANDLE; +} + + +int +plugrack_finished_with_plugin( plugrack_t rack, plugin_handle_t plug ) +{ + ListIterator it; + plugrack_entry_t *e; + + if ( ! rack ) return SLURM_ERROR; + + it = list_iterator_create( rack->entries ); + while ( ( e = list_next( it ) ) != NULL ) { + if ( e->plug == plug ) { + e->refcount--; + if ( e->refcount < 0 ) e->refcount = 0; + + /* Do something here with purge policy. */ + + list_iterator_destroy( it ); + return SLURM_SUCCESS; + } + } + + /* Plugin not in this rack. */ + list_iterator_destroy( it ); + return SLURM_ERROR; +} + +int +plugrack_print_all_plugin(plugrack_t rack) +{ + ListIterator itr; + plugrack_entry_t *e = NULL; + itr = list_iterator_create(rack->entries); + info("MPI types are..."); + while ((e = list_next(itr)) != NULL ) { + info("%s",e->full_type); + } + return SLURM_SUCCESS; +} diff --git a/executable_names/src/common/plugrack.h b/executable_names/src/common/plugrack.h new file mode 100644 index 0000000000000000000000000000000000000000..250f50d728a720dc419a5df51828232e38824a1d --- /dev/null +++ b/executable_names/src/common/plugrack.h @@ -0,0 +1,182 @@ +/*****************************************************************************\ + * plugrack.h - an intelligent container for plugins + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jay Windley . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef __PLUGRACK_H__ +#define __PLUGRACK_H__ + +#include + +#include "src/common/plugin.h" +#include "src/common/list.h" + +/* Opaque type for plugin rack. */ +typedef struct _plugrack * plugrack_t; + +/* + * Returns a new plugin rack object on success and NULL on failure. + */ +plugrack_t plugrack_create( void ); + +/* + * Destroy a plugin rack. All the associated plugins are unloaded and + * all associated memory is deallocated. + * + * Returns a SLURM errno. + */ +int plugrack_destroy( plugrack_t rack ); + +/* + * Set the major type of the plugins for this rack. This affects + * subsequent calls to add plugins from files. + * + * Pass NULL to disable typing in plugins handled by this rack. + * This is the default. + * + * Returns a SLURM errno. + */ +int plugrack_set_major_type( plugrack_t rack, const char *type ); + +/* + * Paranoia settings. OR these together, if desired. + * + * _DIR_OWN - verify that the directory containing the plugin is owned + * by a certain user. + * _DIR_WRITABLE - verify that the directory containing the plugin is + * not writable by anyone except its owner. + * _FILE_OWN - verify that the plugin is owned by a certain user. + * _FILE_WRITABLE - verify that the plugin is not writable by anyone + * except its onwer. + */ +#define PLUGRACK_PARANOIA_NONE 0x00 +#define PLUGRACK_PARANOIA_DIR_OWN 0x01 +#define PLUGRACK_PARANOIA_DIR_WRITABLE 0x02 +#define PLUGRACK_PARANOIA_FILE_OWN 0x04 +#define PLUGRACK_PARANOIA_FILE_WRITABLE 0x08 + +/* + * Indicate the manner in which the rack should be paranoid about + * accepting plugins. + * + * paranoia_flags is an ORed combination of the flags listed above. + * They do not combine across separate calls; the flags must be fully + * specified at each call. + * + * The paranoia setting affects only subsequent attempts to place + * plugins in the rack. + * + * If the flag parameter specifies ownership checking, "uid" gives the + * numerical user ID of the authorized owner of the plugin and the + * directory where it resides. If no ownership checking is requested, + * this parameter is ignored. + * + * Returns a SLURM errno. + */ +int plugrack_set_paranoia( plugrack_t rack, + const uint32_t paranoia_flags, + const uid_t uid ); + +/* + * Add plugins to a rack by scanning the given directory. If a + * type has been set for this rack, only those plugins whose major type + * matches the rack's type will be loaded. If a rack's paranoia factors + * have been set, they are applied to files considered candidates for + * plugins. Plugins that fail the paranoid examination are not loaded. + * + * Returns a SLURM errno. + */ +int plugrack_read_dir( plugrack_t rack, + const char *dir ); + +/* + * Add plugins to the rack by reading the given cache. Note that plugins + * may not actually load, but the rack will be made aware of them. + * + * NOT CURRENTLY IMPLEMENTED. + */ +int plugrack_read_cache( plugrack_t rack, + const char *cache ); + +/* + * Remove from memory all plugins that are not currently in use by the + * program. + * + * Returns a SLURM errno. + */ +int plugrack_purge_idle( plugrack_t rack ); + +/* + * Load into memory all plugins which are currently unloaded. + * + * Returns a SLURM errno. + */ +int plugrack_load_all( plugrack_t rack ); + +/* + * Write the current contents of the plugin rack to a file + * in cache format, suitable to be read later using plugrack_read_cache(). + * + * Returns a SLURM errno. + */ +int plugrack_write_cache( plugrack_t rack, const char *cache ); + +/* + * Find a plugin in the rack which matches the given minor type, + * load it if necessary, and return a handle to it. + * + * Returns PLUGIN_INVALID_HANDLE if a suitable plugin cannot be + * found or loaded. + */ +plugin_handle_t plugrack_use_by_type( plugrack_t rack, + const char *type ); + +/* + * Indicate that a plugin is no longer needed. Whether the plugin + * is actually unloaded depends on the rack's disposal policy. + * + * Returns a SLURM errno. + */ +int plugrack_finished_with_plugin( plugrack_t rack, plugin_handle_t plug ); + +/* + * print all plugins in rack + * + * Returns a SLURM errno. + */ +int plugrack_print_all_plugin( plugrack_t rack); + + +#endif /*__PLUGRACK_H__*/ diff --git a/executable_names/src/common/plugstack.c b/executable_names/src/common/plugstack.c new file mode 100644 index 0000000000000000000000000000000000000000..8f5c87f6b99bcdd07f4c3e54a4a62df1cbb03d49 --- /dev/null +++ b/executable_names/src/common/plugstack.c @@ -0,0 +1,1223 @@ +/*****************************************************************************\ + * plugstack.c -- stackable plugin architecture for node job kontrol (SPANK) + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "src/common/plugin.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/xassert.h" +#include "src/common/safeopen.h" +#include "src/common/strlcpy.h" +#include "src/common/read_config.h" +#include "src/common/plugstack.h" +#include "src/common/optz.h" +#include "src/common/job_options.h" + +#include "src/slurmd/slurmstepd/slurmstepd_job.h" + +#include + +#define REQUIRED "required" +#define OPTIONAL "optional" + +struct spank_plugin_operations { + spank_f *init; + spank_f *user_init; + spank_f *user_task_init; + spank_f *task_post_fork; + spank_f *task_exit; + spank_f *exit; +}; + +const int n_spank_syms = 6; +const char *spank_syms[] = { + "slurm_spank_init", + "slurm_spank_user_init", + "slurm_spank_task_init", + "slurm_spank_task_post_fork", + "slurm_spank_task_exit", + "slurm_spank_exit" +}; + +struct spank_plugin { + const char *name; + char *fq_path; + plugin_handle_t plugin; + bool required; + int ac; + char **argv; + struct spank_plugin_operations ops; + struct spank_option *opts; +}; + +/* + * SPANK Plugin options + */ +struct spank_plugin_opt { + struct spank_option *opt; /* Copy of plugin option info */ + struct spank_plugin *plugin;/* Link back to plugin structure */ + int optval; /* Globally unique value */ + int found:1; /* 1 if option was found, 0 otherwise */ + int disabled:1; /* 1 if option is cached but disabled */ + char *optarg; /* Option argument. */ +}; + +/* + * Initial value for global optvals for SPANK plugin options + */ +static int spank_optval = 0xfff; + +/* + * Cache of options provided by spank plugins + */ +static List option_cache = NULL; + + +/* + * SPANK handle for plugins + * + * Handle types: local or remote. + */ +typedef enum spank_handle_type { + S_TYPE_LOCAL, /* LOCAL == srun */ + S_TYPE_REMOTE /* REMOTE == slurmd */ +} spank_handle_type_t; + +/* + * SPANK plugin hook types: + */ +typedef enum step_fn { + SPANK_INIT = 0, + STEP_USER_INIT, + STEP_USER_TASK_INIT, + STEP_TASK_POST_FORK, + STEP_TASK_EXIT, + SPANK_EXIT +} step_fn_t; + +struct spank_handle { +# define SPANK_MAGIC 0x00a5a500 + int magic; /* Magic identifier to ensure validity. */ + spank_handle_type_t type; /* remote(slurmd) || local(srun) */ + step_fn_t phase; /* Which spank fn are we called from? */ + slurmd_job_t * job; /* Reference to current slurmd job */ + slurmd_task_info_t * task; /* Reference to current task (if valid) */ +}; + + +/* + * SPANK plugins stack + */ +static List spank_stack = NULL; + +static pthread_mutex_t spank_mutex = PTHREAD_MUTEX_INITIALIZER; + +/* + * Default plugin dir + */ +static const char * default_spank_path = NULL; + +/* + * Forward declarations + */ +static int _spank_plugin_options_cache(struct spank_plugin *p); + + +static void _argv_append(char ***argv, int ac, const char *newarg) +{ + *argv = xrealloc(*argv, (++ac + 1) * sizeof(char *)); + (*argv)[ac] = NULL; + (*argv)[ac - 1] = xstrdup(newarg); + return; +} + +static int +_plugin_stack_parse_line(char *line, char **plugin, int *acp, char ***argv, + bool * required) +{ + int ac; + const char *separators = " \t\n"; + char *path; + char *option; + char *s; + char **av; + char *sp; + + *plugin = NULL; + *argv = NULL; + *acp = 0; + + /* Nullify any comments + */ + if ((s = strchr(line, '#'))) + *s = '\0'; + + /* + * Remove trailing whitespace + */ + for (s = line + strlen (line) - 1; isspace (*s) || *s == '\n'; s--) + *s = '\0'; + + if (!(option = strtok_r(line, separators, &sp))) + return 0; + + if (strncmp(option, REQUIRED, strlen(option)) == 0) { + *required = true; + } + else if (strncmp(option, OPTIONAL, strlen(option)) == 0) { + *required = false; + } + else { + error("spank: Invalid option \"%s\". Must be either %s or %s", + option, REQUIRED, OPTIONAL); + return (-1); + } + + if (!(path = strtok_r(NULL, separators, &sp))) + return (-1); + + ac = 0; + av = NULL; + + while ((s = strtok_r(NULL, separators, &sp))) + _argv_append(&av, ac++, s); + + *plugin = xstrdup(path); + *argv = av; + *acp = ac; + + return (0); +} + +static struct spank_plugin *_spank_plugin_create(char *path, int ac, + char **av, bool required) +{ + struct spank_plugin *plugin; + plugin_handle_t p; + struct spank_plugin_operations ops; + + if (!(p = plugin_load_from_file(path))) + return NULL; + + if (plugin_get_syms(p, n_spank_syms, spank_syms, (void **)&ops) == 0) { + error("spank: \"%s\" exports 0 symbols\n", path); + return NULL; + } + + plugin = xmalloc(sizeof(struct spank_plugin)); + + plugin->fq_path = path; /* fq_path is xstrdup'd in *process_line */ + plugin->plugin = p; + plugin->name = plugin_get_name(p); /* no need to dup */ + plugin->required = required; + plugin->ac = ac; + plugin->argv = av; + plugin->ops = ops; + + plugin->opts = plugin_get_sym(p, "spank_options"); + + return (plugin); +} + +void _spank_plugin_destroy(struct spank_plugin *sp) +{ + if (sp == NULL) + return; + + xfree(sp->fq_path); + + /* No need to free "name" it was defined within plugin */ + sp->name = NULL; + + plugin_unload(sp->plugin); + sp->plugin = NULL; + if (sp->argv) { + int i; + for (i = 0; sp->argv[i]; i++) + xfree(sp->argv[i]); + xfree(sp->argv); + } + xfree(sp); + return; +} + +static char * +_spank_plugin_find (const char *path, const char *file) +{ + char dir [4096]; + char *p, *entry; + int pathlen = strlen (path); + + if (strlcpy(dir, path, sizeof (dir)) > sizeof (dir)) + return (NULL); + + /* + * Ensure PATH ends with a : + */ + if (dir[pathlen - 1] != ':') { + dir[pathlen] = ':'; + dir[pathlen+1] = '\0'; + } + + entry = dir; + while ((p = strchr(entry, ':'))) { + char *fq_path; + *(p++) = '\0'; + + fq_path = xstrdup (entry); + if (entry [strlen(entry) - 1] != '/') + xstrcatchar (fq_path, '/'); + xstrcat (fq_path, file); + + if (plugin_peek (fq_path, NULL, 0, NULL) != SLURM_ERROR) + return (fq_path); + + xfree (fq_path); + entry = p; + } + + return (NULL); +} + +static int +_spank_stack_process_line(const char *file, int line, char *buf, + struct spank_plugin **plugin) +{ + char **argv; + int ac; + char *path; + bool required = FALSE; + + struct spank_plugin *p; + + *plugin = NULL; + + if (_plugin_stack_parse_line(buf, &path, &ac, &argv, &required) < 0) { + error("spank: %s:%d: Invalid line. Ignoring.", file, line); + return (0); + } + + if (path == NULL) /* No plugin listed on this line */ + return (0); + + if (path[0] != '/') { + char *f; + + if ((f = _spank_plugin_find (default_spank_path, path))) { + xfree (path); + path = f; + } + } + + if (!(p = _spank_plugin_create(path, ac, argv, required))) { + if (required) + error ("spank: %s:%d: Failed to load plugin %s. Aborting.", + file, line, path); + else + verbose ("spank: %s:%d: Failed to load optional plugin %s. Ignored.", + file, line, path); + return (required ? -1 : 0); + } + + *plugin = p; + + return (0); +} + +static int _spank_stack_create(const char *path, List * listp) +{ + int line; + char buf[4096]; + FILE *fp; + + *listp = NULL; + + verbose("spank: opening plugin stack %s\n", path); + + if (!(fp = safeopen(path, "r", SAFEOPEN_NOCREATE))) + return -1; + + line = 1; + while (fgets(buf, sizeof(buf), fp)) { + struct spank_plugin *p; + + if (_spank_stack_process_line(path, line, buf, &p) < 0) + goto fail_immediately; + + if (p == NULL) + continue; + + if (*listp == NULL) + *listp = + list_create((ListDelF) _spank_plugin_destroy); + + verbose("spank: loaded plugin %s\n", + xbasename(p->fq_path)); + list_append(*listp, p); + + _spank_plugin_options_cache(p); + + line++; + } + + fclose(fp); + return (0); + + fail_immediately: + if (*listp != NULL) { + list_destroy(*listp); + *listp = NULL; + } + fclose(fp); + return (-1); +} + +static int +_spank_handle_init(struct spank_handle *spank, slurmd_job_t * job, + int taskid, step_fn_t fn) +{ + memset(spank, 0, sizeof(*spank)); + spank->magic = SPANK_MAGIC; + + spank->phase = fn; + + if (job != NULL) { + spank->type = S_TYPE_REMOTE; + spank->job = job; + if (taskid >= 0) + spank->task = job->task[taskid]; + } else { + spank->type = S_TYPE_LOCAL; + } + return (0); +} + +static const char *_step_fn_name(step_fn_t type) +{ + switch (type) { + case SPANK_INIT: + return ("init"); + case STEP_USER_INIT: + return ("user_init"); + case STEP_USER_TASK_INIT: + return ("task_init"); + case STEP_TASK_POST_FORK: + return ("task_post_fork"); + case STEP_TASK_EXIT: + return ("task_exit"); + case SPANK_EXIT: + return ("exit"); + } + + /* NOTREACHED */ + return ("unknown"); +} + +static int _do_call_stack(step_fn_t type, slurmd_job_t * job, int taskid) +{ + int rc = 0; + ListIterator i; + struct spank_plugin *sp; + struct spank_handle spank[1]; + const char *fn_name; + + if (!spank_stack) + return (0); + + if (_spank_handle_init(spank, job, taskid, type) < 0) { + error("spank: Failed to initialize handle for plugins"); + return (-1); + } + + fn_name = _step_fn_name(type); + + i = list_iterator_create(spank_stack); + while ((sp = list_next(i))) { + const char *name = xbasename(sp->fq_path); + + switch (type) { + case SPANK_INIT: + if (sp->ops.init) { + rc = (*sp->ops.init) (spank, sp->ac, + sp->argv); + debug2("spank: %s: %s = %d\n", name, + fn_name, rc); + } + break; + case STEP_USER_INIT: + if (sp->ops.user_init) { + rc = (*sp->ops.user_init) (spank, sp->ac, + sp->argv); + debug2("spank: %s: %s = %d\n", name, + fn_name, rc); + } + break; + case STEP_USER_TASK_INIT: + if (sp->ops.user_task_init) { + rc = (*sp->ops.user_task_init) (spank, + sp->ac, + sp->argv); + debug2("spank: %s: %s = %d\n", name, + fn_name, rc); + } + break; + case STEP_TASK_POST_FORK: + if (sp->ops.task_post_fork) { + rc = (*sp->ops.task_post_fork) (spank, + sp->ac, + sp->argv); + debug2("spank: %s: %s = %d\n", name, + fn_name, rc); + } + break; + case STEP_TASK_EXIT: + if (sp->ops.task_exit) { + rc = (*sp->ops.task_exit) (spank, sp->ac, + sp->argv); + debug2("spank: %s: %s = %d", name, fn_name, + rc); + } + break; + case SPANK_EXIT: + if (sp->ops.exit) { + rc = (*sp->ops.exit) (spank, sp->ac, + sp->argv); + debug2("spank: %s: %s = %d\n", name, + fn_name, rc); + } + break; + } + + if ((rc < 0) && sp->required) { + error("spank: required plugin %s: " + "%s() failed with rc=%d", name, fn_name, rc); + break; + } else + rc = 0; + } + + list_iterator_destroy(i); + + return (rc); +} + +int spank_init(slurmd_job_t * job) +{ + slurm_ctl_conf_t *conf = slurm_conf_lock(); + const char *path = conf->plugstack; + default_spank_path = conf->plugindir; + slurm_conf_unlock(); + + if (_spank_stack_create(path, &spank_stack) < 0) { + /* No error if spank config doesn't exist */ + if (errno == ENOENT) + return (0); + error("spank: failed to create plugin stack"); + return (-1); + } + + if (_do_call_stack(SPANK_INIT, job, -1) < 0) + return (-1); + + if (job && spank_get_remote_options(job->options) < 0) { + error("spank: Unable to get remote options"); + return (-1); + } + + return (0); +} + +int spank_user(slurmd_job_t * job) +{ + return (_do_call_stack(STEP_USER_INIT, job, -1)); +} + +int spank_user_task(slurmd_job_t * job, int taskid) +{ + return (_do_call_stack(STEP_USER_TASK_INIT, job, taskid)); +} + +int spank_task_post_fork(slurmd_job_t * job, int taskid) +{ + return (_do_call_stack(STEP_TASK_POST_FORK, job, taskid)); +} + +int spank_task_exit(slurmd_job_t * job, int taskid) +{ + return (_do_call_stack(STEP_TASK_EXIT, job, taskid)); +} + +int spank_fini(slurmd_job_t * job) +{ + int rc = _do_call_stack(SPANK_EXIT, job, -1); + + if (option_cache) + list_destroy(option_cache); + if (spank_stack) + list_destroy(spank_stack); + + return (rc); +} + +/* + * SPANK options functions + */ + +static int _spank_next_option_val(void) +{ + int optval; + slurm_mutex_lock(&spank_mutex); + optval = spank_optval++; + slurm_mutex_unlock(&spank_mutex); + return (optval); +} + +static struct spank_plugin_opt *_spank_plugin_opt_create(struct + spank_plugin *p, + struct + spank_option *opt, + int disabled) +{ + struct spank_plugin_opt *spopt = xmalloc(sizeof(*spopt)); + spopt->opt = opt; + spopt->plugin = p; + spopt->optval = _spank_next_option_val(); + spopt->found = 0; + spopt->optarg = NULL; + + spopt->disabled = disabled; + + return (spopt); +} + +void _spank_plugin_opt_destroy(struct spank_plugin_opt *spopt) +{ + xfree(spopt->optarg); + xfree(spopt); +} + +static int _opt_by_val(struct spank_plugin_opt *opt, int *optvalp) +{ + return (opt->optval == *optvalp); +} + +static int _opt_by_name(struct spank_plugin_opt *opt, char *optname) +{ + return (strcmp(opt->opt->name, optname) == 0); +} + +static int _spank_plugin_options_cache(struct spank_plugin *p) +{ + int disabled = 0; + struct spank_option *opt = p->opts; + + if ((opt == NULL) || opt->name == NULL) + return (0); + + if (!option_cache) { + option_cache = + list_create((ListDelF) _spank_plugin_opt_destroy); + } + + for (; opt && opt->name != NULL; opt++) { + struct spank_plugin_opt *spopt; + + spopt = + list_find_first(option_cache, (ListFindF) _opt_by_name, + opt->name); + if (spopt) { + struct spank_plugin *q = spopt->plugin; + info("spank: option \"%s\" " + "provided by both %s and %s", + opt->name, xbasename(p->fq_path), + xbasename(q->fq_path)); + /* + * Disable this option, but still cache it, in case + * options are loaded in a different order on the + * remote side. + */ + disabled = 1; + } + + if ((strlen(opt->name) > SPANK_OPTION_MAXLEN)) { + error + ("spank: option \"%s\" provided by %s too long." + " Ignoring.", opt->name, p->name); + continue; + } + + verbose("SPANK: appending plugin option \"%s\"\n", + opt->name); + list_append(option_cache, + _spank_plugin_opt_create(p, opt, disabled)); + } + + return (0); +} + +static int _add_one_option(struct option **optz, struct spank_plugin_opt *spopt) +{ + struct option opt; + + opt.name = spopt->opt->name; + opt.has_arg = spopt->opt->has_arg; + opt.flag = NULL; + opt.val = spopt->optval; + + if (optz_add(optz, &opt) < 0) { + if (errno == EEXIST) { + error ("Ingoring conflicting option \"%s\" " + "in plugin \"%s\"", + opt.name, spopt->plugin->name); + } else { + error("Unable to add option \"%s\" " + "from plugin \"%s\"", + opt.name, spopt->plugin->name); + } + + return (-1); + } + + return (0); +} + + +struct option *spank_option_table_create(const struct option *orig) +{ + struct spank_plugin_opt *spopt; + struct option *opts = NULL; + ListIterator i = NULL; + + opts = optz_create(); + + /* + * Start with original options: + */ + if ((orig != NULL) && (optz_append(&opts, orig) < 0)) { + optz_destroy(opts); + return (NULL); + } + + if (option_cache == NULL || (list_count(option_cache) == 0)) + return (opts); + + i = list_iterator_create(option_cache); + while ((spopt = list_next(i))) { + if (!spopt->disabled && (_add_one_option (&opts, spopt) < 0)) + spopt->disabled = 1; + } + + list_iterator_destroy(i); + + return (opts); +} + +void spank_option_table_destroy(struct option *optz) +{ + optz_destroy(optz); +} + +int spank_process_option(int optval, const char *arg) +{ + struct spank_plugin_opt *opt; + int rc = 0; + + opt = + list_find_first(option_cache, (ListFindF) _opt_by_val, + &optval); + + if (!opt) + return (-1); + + /* + * Call plugin callback if such a one exists + */ + if (opt->opt->cb + && (rc = ((*opt->opt->cb) (opt->opt->val, arg, 0))) < 0) + return (rc); + + /* + * Set optarg and "found" so that option will be forwarded + * to remote side. + */ + if (opt->opt->has_arg) + opt->optarg = xstrdup(arg); + opt->found = 1; + + return (0); +} + +static void +_spank_opt_print(struct spank_option *opt, FILE * fp, int left_pad, + int width) +{ + int n; + char *equals = ""; + char *arginfo = ""; + char buf[81]; + + + if (opt->arginfo) { + equals = "="; + arginfo = opt->arginfo; + } + + n = snprintf(buf, sizeof(buf), "%*s--%s%s%s", + left_pad, "", opt->name, equals, arginfo); + + if ((n < 0) || (n > sizeof(buf))) { + const char trunc[] = "+"; + int len = strlen(trunc); + char *p = buf + sizeof(buf) - len - 1; + + snprintf(p, len + 1, "%s", trunc); + } + + if (n < width) + fprintf(fp, "%-*s%s\n", width, buf, opt->usage); + else + fprintf(fp, "\n%s\n%*s%s\n", buf, width, "", opt->usage); + + return; +} + +int spank_print_options(FILE * fp, int left_pad, int width) +{ + struct spank_plugin_opt *p; + ListIterator i; + + if ((option_cache == NULL) || (list_count(option_cache) == 0)) + return (0); + + i = list_iterator_create(option_cache); + while ((p = list_next(i))) { + if (p->disabled) + continue; + _spank_opt_print(p->opt, fp, left_pad, width); + } + list_iterator_destroy(i); + + return (0); +} + +#define OPT_TYPE_SPANK 0x4400 + +int spank_set_remote_options(job_options_t opts) +{ + struct spank_plugin_opt *p; + ListIterator i; + + if ((option_cache == NULL) || (list_count(option_cache) == 0)) + return (0); + + i = list_iterator_create(option_cache); + while ((p = list_next(i))) { + char optstr[1024]; + + if (!p->found) + continue; + + snprintf(optstr, sizeof(optstr), "%s:%s", + p->opt->name, p->plugin->name); + + job_options_append(opts, OPT_TYPE_SPANK, optstr, + p->optarg); + } + list_iterator_destroy(i); + return (0); +} + +struct opt_find_args { + const char *optname; + const char *plugin_name; +}; + +static int _opt_find(struct spank_plugin_opt *p, + struct opt_find_args *args) +{ + if (strcmp(p->plugin->name, args->plugin_name) != 0) + return (0); + if (strcmp(p->opt->name, args->optname) != 0) + return (0); + return (1); +} + +static struct spank_plugin_opt *_find_remote_option_by_name(const char + *str) +{ + struct spank_plugin_opt *opt; + struct opt_find_args args; + char buf[256]; + char *name; + + if (strlcpy(buf, str, sizeof(buf)) >= sizeof(buf)) { + error("plugin option \"%s\" too big. Ignoring.", str); + return (NULL); + } + + if (!(name = strchr(buf, ':'))) { + error("Malformed plugin option \"%s\" recieved. Ignoring", + str); + return (NULL); + } + + *(name++) = '\0'; + + args.optname = buf; + args.plugin_name = name; + + opt = list_find_first(option_cache, (ListFindF) _opt_find, &args); + + if (opt == NULL) { + error("warning: plugin \"%s\" option \"%s\" not found.", + name, buf); + return (NULL); + } + + return (opt); +} + +int spank_get_remote_options(job_options_t opts) +{ + const struct job_option_info *j; + + job_options_iterator_reset(opts); + while ((j = job_options_next(opts))) { + struct spank_plugin_opt *opt; + struct spank_option *p; + + if (j->type != OPT_TYPE_SPANK) + continue; + + if (!(opt = _find_remote_option_by_name(j->option))) + continue; + + p = opt->opt; + + if (p->cb && (((*p->cb) (p->val, j->optarg, 1)) < 0)) { + error("spank: failed to process option %s=%s", + p->name, j->optarg); + } + } + + return (0); +} + +/* + * Return a task info structure corresponding to pid. + */ +static slurmd_task_info_t * job_task_info_by_pid (slurmd_job_t *job, pid_t pid) +{ + slurmd_task_info_t *task = NULL; + int i; + for (i = 0; i < job->ntasks; i++) { + if (job->task[i]->pid == pid) + task = job->task[i]; + } + return (task); +} + +static int tasks_execd (spank_t spank) +{ + return ( (spank->phase == STEP_TASK_POST_FORK) + || (spank->phase == STEP_TASK_EXIT) + || (spank->phase == SPANK_EXIT) ); +} + +static spank_err_t +global_to_local_id (slurmd_job_t *job, uint32_t gid, uint32_t *p2uint32) +{ + int i; + *p2uint32 = (uint32_t) -1; + if (gid >= job->nprocs) + return (ESPANK_BAD_ARG); + for (i = 0; i < job->ntasks; i++) { + if (job->task[i]->gtid == gid) { + *p2uint32 = job->task[i]->id; + return (ESPANK_SUCCESS); + } + } + return (ESPANK_NOEXIST); +} + + +/* + * Global functions for SPANK plugins + */ + +int spank_remote(spank_t spank) +{ + if ((spank == NULL) || (spank->magic != SPANK_MAGIC)) + return (-1); + if (spank->type == S_TYPE_REMOTE) + return (1); + else + return (0); +} + +spank_err_t spank_get_item(spank_t spank, spank_item_t item, ...) +{ + int *p2int; + uint32_t *p2uint32; + uint32_t uint32; + uint16_t *p2uint16; + uid_t *p2uid; + gid_t *p2gid; + gid_t **p2gids; + pid_t *p2pid; + pid_t pid; + char ***p2argv; + slurmd_task_info_t *task; + va_list vargs; spank_err_t rc = ESPANK_SUCCESS; + + if ((spank == NULL) || (spank->magic != SPANK_MAGIC)) + return (ESPANK_BAD_ARG); + + if (spank->type != S_TYPE_REMOTE) + return (ESPANK_NOT_REMOTE); + + if (spank->job == NULL) + return (ESPANK_BAD_ARG); + + va_start(vargs, item); + switch (item) { + case S_JOB_UID: + p2uid = va_arg(vargs, uid_t *); + *p2uid = spank->job->uid; + break; + case S_JOB_GID: + p2gid = va_arg(vargs, gid_t *); + *p2gid = spank->job->gid; + break; + case S_JOB_SUPPLEMENTARY_GIDS: + p2gids = va_arg(vargs, gid_t **); + p2int = va_arg(vargs, int *); + *p2gids = spank->job->gids; + *p2int = spank->job->ngids; + break; + case S_JOB_ID: + p2uint32 = va_arg(vargs, uint32_t *); + *p2uint32 = spank->job->jobid; + break; + case S_JOB_STEPID: + p2uint32 = va_arg(vargs, uint32_t *); + *p2uint32 = spank->job->stepid; + break; + case S_JOB_NNODES: + p2uint32 = va_arg(vargs, uint32_t *); + *p2uint32 = spank->job->nnodes; + break; + case S_JOB_NODEID: + p2uint32 = va_arg(vargs, uint32_t *); + *p2uint32 = spank->job->nodeid; + break; + case S_JOB_LOCAL_TASK_COUNT: + p2uint32 = va_arg(vargs, uint32_t *); + *p2uint32 = spank->job->ntasks; + break; + case S_JOB_TOTAL_TASK_COUNT: + p2uint32 = va_arg(vargs, uint32_t *); + *p2uint32 = spank->job->nprocs; + break; + case S_JOB_NCPUS: + p2uint16 = va_arg(vargs, uint16_t *); + *p2uint16 = spank->job->cpus; + break; + case S_JOB_ARGV: + p2int = va_arg(vargs, int *); + *p2int = spank->job->argc; + p2argv = va_arg(vargs, char ***); + *p2argv = spank->job->argv; + break; + case S_JOB_ENV: + p2argv = va_arg(vargs, char ***); + *p2argv = spank->job->env; + break; + case S_TASK_ID: + p2int = va_arg(vargs, int *); + if (!spank->task) { + *p2int = -1; + rc = ESPANK_NOT_TASK; + } else { + *p2int = spank->task->id; + } + break; + case S_TASK_GLOBAL_ID: + p2uint32 = va_arg(vargs, uint32_t *); + if (!spank->task) { + rc = ESPANK_NOT_TASK; + } else { + *p2uint32 = spank->task->gtid; + } + break; + case S_TASK_EXIT_STATUS: + p2int = va_arg(vargs, int *); + if (!spank->task || !spank->task->exited) { + rc = ESPANK_NOT_TASK; + } else { + *p2int = spank->task->estatus; + } + break; + case S_TASK_PID: + p2pid = va_arg(vargs, pid_t *); + if (!spank->task) { + rc = ESPANK_NOT_TASK; + *p2pid = 0; + } else { + *p2pid = spank->task->pid; + } + break; + case S_JOB_PID_TO_GLOBAL_ID: + pid = va_arg(vargs, pid_t); + p2uint32 = va_arg(vargs, uint32_t *); + *p2uint32 = (uint32_t) -1; + + if (!tasks_execd(spank)) + rc = ESPANK_NOT_EXECD; + else if (!(task = job_task_info_by_pid (spank->job, pid))) + rc = ESPANK_NOEXIST; + else + *p2uint32 = task->gtid; + break; + case S_JOB_PID_TO_LOCAL_ID: + pid = va_arg(vargs, pid_t); + p2uint32 = va_arg(vargs, uint32_t *); + *p2uint32 = (uint32_t) -1; + + if (!tasks_execd(spank)) + rc = ESPANK_NOT_EXECD; + else if (!(task = job_task_info_by_pid (spank->job, pid))) + rc = ESPANK_NOEXIST; + else + *p2uint32 = task->id; + break; + case S_JOB_LOCAL_TO_GLOBAL_ID: + uint32 = va_arg(vargs, uint32_t); + p2uint32 = va_arg(vargs, uint32_t *); + *p2uint32 = (uint32_t) -1; + + if (uint32 <= spank->job->ntasks) + *p2uint32 = spank->job->task[uint32]->gtid; + else + rc = ESPANK_NOEXIST; + break; + case S_JOB_GLOBAL_TO_LOCAL_ID: + uint32 = va_arg(vargs, uint32_t); + p2uint32 = va_arg(vargs, uint32_t *); + rc = global_to_local_id (spank->job, uint32, p2uint32); + break; + default: + rc = ESPANK_BAD_ARG; + break; + } + va_end(vargs); + return (rc); +} + +spank_err_t spank_getenv(spank_t spank, const char *var, char *buf, + int len) +{ + char *val; + + if ((spank == NULL) || (spank->magic != SPANK_MAGIC)) + return (ESPANK_BAD_ARG); + + if (spank->type != S_TYPE_REMOTE) + return (ESPANK_NOT_REMOTE); + + if (spank->job == NULL) + return (ESPANK_BAD_ARG); + + if (len < 0) + return (ESPANK_BAD_ARG); + + if (!(val = getenvp(spank->job->env, var))) + return (ESPANK_ENV_NOEXIST); + + if (strlcpy(buf, val, len) >= len) + return (ESPANK_NOSPACE); + + return (ESPANK_SUCCESS); +} + +spank_err_t spank_setenv(spank_t spank, const char *var, const char *val, + int overwrite) +{ + if ((spank == NULL) || (spank->magic != SPANK_MAGIC)) + return (ESPANK_BAD_ARG); + + if (spank->type != S_TYPE_REMOTE) + return (ESPANK_NOT_REMOTE); + + if (spank->job == NULL) + return (ESPANK_BAD_ARG); + + if ((var == NULL) || (val == NULL)) + return (ESPANK_BAD_ARG); + + if (getenvp(spank->job->env, var) && !overwrite) + return (ESPANK_ENV_EXISTS); + + if (setenvf(&spank->job->env, var, "%s", val) < 0) + return (ESPANK_ERROR); + + return (ESPANK_SUCCESS); +} + +spank_err_t spank_unsetenv (spank_t spank, const char *var) +{ + if ((spank == NULL) || (spank->magic != SPANK_MAGIC)) + return (ESPANK_BAD_ARG); + + if (spank->type != S_TYPE_REMOTE) + return (ESPANK_NOT_REMOTE); + + if (spank->job == NULL) + return (ESPANK_BAD_ARG); + + if (var == NULL) + return (ESPANK_BAD_ARG); + + unsetenvp(spank->job->env, var); + + return (ESPANK_SUCCESS); +} diff --git a/executable_names/src/common/plugstack.h b/executable_names/src/common/plugstack.h new file mode 100644 index 0000000000000000000000000000000000000000..9c5bc9441e30a29fcc220c470cdfd36a81c30f02 --- /dev/null +++ b/executable_names/src/common/plugstack.h @@ -0,0 +1,123 @@ +/*****************************************************************************\ + * plugstack.h -- plugin stack handling + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _PLUGSTACK_H + +#if HAVE_CONFIG_H +# include +#endif + +#define _GNU_SOURCE + +#if HAVE_GETOPT_H +# include +#else +# include "src/common/getopt.h" +#endif + +#include "src/common/job_options.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" + +int spank_init (slurmd_job_t *job); + +int spank_user (slurmd_job_t *job); + +int spank_user_task (slurmd_job_t *job, int taskid); + +int spank_task_post_fork (slurmd_job_t *job, int taskid); + +int spank_task_exit (slurmd_job_t *job, int taskid); + +int spank_fini (slurmd_job_t *job); + +/* + * Option processing + */ + +/* + * Create a struct option table (suitable for passing to getopt_long()) + * from SPANK plugin provided options, optionally prepending an existing + * table of options `orig_options' Result must be freed by + * spank_option_table_destroy(). + * + * If any options in orig_options conflict with internal spank options, + * a warning will be printed and the spank option will be disabled. + * + */ +struct option *spank_option_table_create (const struct option *orig_options); + +/* + * Free memory associated with an option table created by + * spank_p[tion_table_create. + */ +void spank_option_table_destroy (struct option *opt_table); + +/* + * Process a single spank option which was tagged by `optval' in the + * spank option table. If the option takes and argument (i.e. has_arg = 1) + * then optarg must be non-NULL. + * + * Returns < 0 if no option is found which matches `optval', or if + * the option belongs to a *required* plugin, and the plugin's callback + * for that option fails. + */ +int spank_process_option (int optval, const char *optarg); + +/* + * Generate --help style output on stream `fp' for all internal spank + * options which were not previously disabled (e.g. due to conflicts + * with existing options or other plugins). `width' defines the column + * after which the usage text may be displayed, and `left_pad' is the + * amount of space to pad on the left before printing the --option. + */ +int spank_print_options (FILE *fp, int width, int left_pad); + +/* Set all registered remote options (i.e. those passed to + * spank_process_option) in the job options `options'. + */ +int spank_set_remote_options (job_options_t options); + +/* Register any remote spank options that exist in `options' + * to their respective spank plugins. This function ends up invoking + * all plugin option callbacks, and will fail (return < 0) if + * a *required* plugin callback returns < 0. + * + * A warning is printed if no plugin matches a remote option + * in the job_options structure, but the funtion does not return failure. + */ +int spank_get_remote_options (job_options_t options); + +#endif /* !_PLUGSTACK_H */ diff --git a/executable_names/src/common/read_config.c b/executable_names/src/common/read_config.c new file mode 100644 index 0000000000000000000000000000000000000000..f2062b0347d8fc54ca1031353ee61521cfa92495 --- /dev/null +++ b/executable_names/src/common/read_config.c @@ -0,0 +1,1650 @@ +/*****************************************************************************\ + * read_config.c - read the overall slurm configuration file + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "src/common/hostlist.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/parse_spec.h" +#include "src/common/read_config.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/slurm_rlimits_info.h" +#include "src/common/parse_config.h" +#include "src/common/slurm_selecttype_info.h" + +/* Instantiation of the "extern slurm_ctl_conf_t slurmcltd_conf" + * found in slurmctld.h */ +slurm_ctl_conf_t slurmctld_conf; + +static pthread_mutex_t conf_lock = PTHREAD_MUTEX_INITIALIZER; +static s_p_hashtbl_t *conf_hashtbl = NULL; +static slurm_ctl_conf_t *conf_ptr = &slurmctld_conf; +static bool conf_initialized = false; + +/* + * FIXME - If we eliminate the SlurmdPort option altogether, then + * default_slurmd_port and parse_slurmd_port can + * be removed. + */ +static uint16_t default_slurmd_port; +static int parse_slurmd_port(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover); + +static s_p_hashtbl_t *default_nodename_tbl; +static s_p_hashtbl_t *default_partition_tbl; + +inline static void _normalize_debug_level(uint16_t *level); +static void _init_slurm_conf(const char *file_name); + +#define NAME_HASH_LEN 512 +typedef struct names_ll_s { + char *alias; /* NodeName */ + char *hostname; /* NodeHostname */ + char *address; /* NodeAddr */ + uint16_t port; + uint16_t cpus; + uint16_t sockets; + uint16_t cores; + uint16_t threads; + slurm_addr addr; + bool addr_initialized; + struct names_ll_s *next_alias; + struct names_ll_s *next_hostname; +} names_ll_t; +bool nodehash_initialized = false; +static names_ll_t *host_to_node_hashtbl[NAME_HASH_LEN] = {NULL}; +static names_ll_t *node_to_host_hashtbl[NAME_HASH_LEN] = {NULL}; + +static int parse_nodename(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover); +static void destroy_nodename(void *ptr); +static int parse_partitionname(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover); +static void destroy_partitionname(void *ptr); +static int parse_downnodes(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover); +static void destroy_downnodes(void *ptr); +static int defunct_option(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover); +static void validate_and_set_defaults(slurm_ctl_conf_t *conf, + s_p_hashtbl_t *hashtbl); + +s_p_options_t slurm_conf_options[] = { + {"AuthType", S_P_STRING}, + {"CheckpointType", S_P_STRING}, + {"CacheGroups", S_P_UINT16}, + {"BackupAddr", S_P_STRING}, + {"BackupController", S_P_STRING}, + {"ControlAddr", S_P_STRING}, + {"ControlMachine", S_P_STRING}, + {"Epilog", S_P_STRING}, + {"FastSchedule", S_P_UINT16}, + {"FirstJobId", S_P_UINT32}, + {"HashBase", S_P_LONG, defunct_option}, + {"HeartbeatInterval", S_P_LONG, defunct_option}, + {"InactiveLimit", S_P_UINT16}, + {"JobAcctLogFile", S_P_STRING}, + {"JobAcctFrequency", S_P_UINT16}, + {"JobAcctType", S_P_STRING}, + {"JobCompLoc", S_P_STRING}, + {"JobCompType", S_P_STRING}, + {"JobCredentialPrivateKey", S_P_STRING}, + {"JobCredentialPublicCertificate", S_P_STRING}, + {"KillTree", S_P_UINT16, defunct_option}, + {"KillWait", S_P_UINT16}, + {"MailProg", S_P_STRING}, + {"MaxJobCount", S_P_UINT16}, + {"MessageTimeout", S_P_UINT16}, + {"MinJobAge", S_P_UINT16}, + {"MpichGmDirectSupport", S_P_LONG}, + {"MpiDefault", S_P_STRING}, + {"PluginDir", S_P_STRING}, + {"PlugStackConfig", S_P_STRING}, + {"ProctrackType", S_P_STRING}, + {"Prolog", S_P_STRING}, + {"PropagatePrioProcess", S_P_UINT16}, + {"PropagateResourceLimitsExcept", S_P_STRING}, + {"PropagateResourceLimits", S_P_STRING}, + {"ReturnToService", S_P_UINT16}, + {"SchedulerAuth", S_P_STRING}, + {"SchedulerPort", S_P_UINT16}, + {"SchedulerRootFilter", S_P_UINT16}, + {"SchedulerType", S_P_STRING}, + {"SelectType", S_P_STRING}, + {"SelectTypeParameters", S_P_STRING}, + {"SlurmUser", S_P_STRING}, + {"SlurmctldDebug", S_P_UINT16}, + {"SlurmctldLogFile", S_P_STRING}, + {"SlurmctldPidFile", S_P_STRING}, + {"SlurmctldPort", S_P_UINT32}, + {"SlurmctldTimeout", S_P_UINT16}, + {"SlurmdDebug", S_P_UINT16}, + {"SlurmdLogFile", S_P_STRING}, + {"SlurmdPidFile", S_P_STRING}, + {"SlurmdPort", S_P_UINT32, parse_slurmd_port}, + {"SlurmdSpoolDir", S_P_STRING}, + {"SlurmdTimeout", S_P_UINT16}, + {"SrunEpilog", S_P_STRING}, + {"SrunProlog", S_P_STRING}, + {"StateSaveLocation", S_P_STRING}, + {"SwitchType", S_P_STRING}, + {"TaskEpilog", S_P_STRING}, + {"TaskProlog", S_P_STRING}, + {"TaskPlugin", S_P_STRING}, + {"TmpFS", S_P_STRING}, + {"TreeWidth", S_P_UINT16}, + {"UsePAM", S_P_BOOLEAN}, + {"WaitTime", S_P_UINT16}, + + {"NodeName", S_P_ARRAY, parse_nodename, destroy_nodename}, + {"PartitionName", S_P_ARRAY, parse_partitionname, destroy_partitionname}, + {"DownNodes", S_P_ARRAY, parse_downnodes, destroy_downnodes}, + + {NULL} +}; + + +/* + * This function works almost exactly the same as the + * default S_P_UINT32 handler, except that it also sets the + * global variable default_slurmd_port. + */ +static int parse_slurmd_port(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover) +{ + char *endptr; + unsigned long num; + uint32_t *ptr; + + errno = 0; + num = strtoul(value, &endptr, 0); + if ((num == 0 && errno == EINVAL) + || (*endptr != '\0')) { + error("%s value (%s) is not a valid number", key, value); + return -1; + } else if (errno == ERANGE) { + error("%s value (%s) is out of range", key, value); + return -1; + } else if (num < 0) { + error("value %s (%s) is less than zero", key, value); + return -1; + } else if (num > 0xffffffff) { + error("%s value (%s) is greater than 4294967295", + key, value); + return -1; + } + + default_slurmd_port = (uint32_t)num; + + ptr = (uint32_t *)xmalloc(sizeof(uint32_t)); + *ptr = (uint32_t)num; + *dest = (void *)ptr; + + return 1; +} + +static int defunct_option(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover) +{ + error("The option \"%s\" is defunct, see man slurm.conf.", key); + return 0; +} + +static int parse_nodename(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover) +{ + s_p_hashtbl_t *tbl, *dflt; + slurm_conf_node_t *n; + static s_p_options_t _nodename_options[] = { + {"NodeHostname", S_P_STRING}, + {"NodeAddr", S_P_STRING}, + {"CoresPerSocket", S_P_UINT16}, + {"Feature", S_P_STRING}, + {"Port", S_P_UINT16}, + {"Procs", S_P_UINT16}, + {"RealMemory", S_P_UINT32}, + {"Reason", S_P_STRING}, + {"Sockets", S_P_UINT16}, + {"State", S_P_STRING}, + {"ThreadsPerCore", S_P_UINT16}, + {"TmpDisk", S_P_UINT32}, + {"Weight", S_P_UINT32}, + {NULL} + }; + + tbl = s_p_hashtbl_create(_nodename_options); + s_p_parse_line(tbl, *leftover, leftover); + /* s_p_dump_values(tbl, _nodename_options); */ + + if (strcasecmp(value, "DEFAULT") == 0) { + char *tmp; + if (s_p_get_string(&tmp, "NodeHostname", tbl)) { + error("NodeHostname not allowed with NodeName=DEFAULT"); + xfree(tmp); + s_p_hashtbl_destroy(tbl); + return -1; + } + if (s_p_get_string(&tmp, "NodeAddr", tbl)) { + error("NodeAddr not allowed with NodeName=DEFAULT"); + xfree(tmp); + s_p_hashtbl_destroy(tbl); + return -1; + } + + if (default_nodename_tbl != NULL) + s_p_hashtbl_destroy(default_nodename_tbl); + default_nodename_tbl = tbl; + + return 0; + } else { + bool no_cpus = false; + bool no_sockets = false; + bool no_cores = false; + bool no_threads = false; + + n = xmalloc(sizeof(slurm_conf_node_t)); + dflt = default_nodename_tbl; + + n->nodenames = xstrdup(value); + if (!s_p_get_string(&n->hostnames, "NodeHostname", tbl)) + n->hostnames = xstrdup(n->nodenames); + if (!s_p_get_string(&n->addresses, "NodeAddr", tbl)) + n->addresses = xstrdup(n->hostnames); + + if (!s_p_get_uint16(&n->cores, "CoresPerSocket", tbl) + && !s_p_get_uint16(&n->cores, "CoresPerSocket", dflt)) { + n->cores = 1; + no_cores = true; + } + + if (!s_p_get_string(&n->feature, "Feature", tbl)) + s_p_get_string(&n->feature, "Feature", dflt); + + if (!s_p_get_uint16(&n->port, "Port", tbl) + && !s_p_get_uint16(&n->port, "Port", dflt)) { + if (default_slurmd_port != 0) + n->port = default_slurmd_port; + else + n->port = SLURMD_PORT; + } + + if (!s_p_get_uint16(&n->cpus, "Procs", tbl) + && !s_p_get_uint16(&n->cpus, "Procs", dflt)) { + n->cpus = 1; + no_cpus = true; + } + + if (!s_p_get_uint32(&n->real_memory, "RealMemory", tbl) + && !s_p_get_uint32(&n->real_memory, "RealMemory", dflt)) + n->real_memory = 1; + + if (!s_p_get_string(&n->reason, "Reason", tbl)) + s_p_get_string(&n->reason, "Reason", dflt); + + if (!s_p_get_uint16(&n->sockets, "Sockets", tbl) + && !s_p_get_uint16(&n->sockets, "Sockets", dflt)) { + n->sockets = 1; + no_sockets = true; + } + + if (!s_p_get_string(&n->state, "State", tbl) + && !s_p_get_string(&n->state, "State", dflt)) + n->state = NULL; + + if (!s_p_get_uint16(&n->threads, "ThreadsPerCore", tbl) + && !s_p_get_uint16(&n->threads, "ThreadsPerCore", dflt)) { + n->threads = 1; + no_threads = true; + } + + if (!s_p_get_uint32(&n->tmp_disk, "TmpDisk", tbl) + && !s_p_get_uint32(&n->tmp_disk, "TmpDisk", dflt)) + n->tmp_disk = 1; + + if (!s_p_get_uint32(&n->weight, "Weight", tbl) + && !s_p_get_uint32(&n->weight, "Weight", dflt)) + n->weight = 1; + + s_p_hashtbl_destroy(tbl); + + if (n->cores == 0) /* make sure cores is non-zero */ + n->cores = 1; + if (n->threads == 0) /* make sure threads is non-zero */ + n->threads = 1; + + if (!no_cpus && /* infer missing Sockets= */ + no_sockets) { + n->sockets = n->cpus / (n->cores * n->threads); + } + + if (n->sockets == 0) /* make sure sockets is non-zero */ + n->sockets = 1; + + if (no_cpus && /* infer missing Procs= */ + !no_sockets) { + n->cpus = n->sockets * n->cores * n->threads; + } + + /* if only Procs= and Sockets= specified check for match */ + if (!no_cpus && + !no_sockets && + no_cores && + no_threads) { + if (n->cpus != n->sockets) { + n->sockets = n->cpus; + error("Procs doesn't match Sockets, " + "setting Sockets to %d", + n->sockets); + } + } + + *dest = (void *)n; + + return 1; + } + + /* should not get here */ +} + +static void destroy_nodename(void *ptr) +{ + slurm_conf_node_t *n = (slurm_conf_node_t *)ptr; + xfree(n->nodenames); + xfree(n->hostnames); + xfree(n->addresses); + xfree(n->feature); + xfree(n->reason); + xfree(n->state); + xfree(ptr); +} + +int slurm_conf_nodename_array(slurm_conf_node_t **ptr_array[]) +{ + int count; + slurm_conf_node_t **ptr; + + if (s_p_get_array((void ***)&ptr, &count, "NodeName", conf_hashtbl)) { + *ptr_array = ptr; + return count; + } else { + *ptr_array = NULL; + return 0; + } +} + +static int parse_partitionname(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover) +{ + s_p_hashtbl_t *tbl, *dflt; + slurm_conf_partition_t *p; + char *tmp = NULL; + static s_p_options_t _partition_options[] = { + {"AllowGroups", S_P_STRING}, + {"Default", S_P_BOOLEAN}, /* YES or NO */ + {"Hidden", S_P_BOOLEAN}, /* YES or NO */ + {"MaxTime", S_P_UINT32}, /* INFINITE or a number */ + {"MaxNodes", S_P_UINT32}, /* INFINITE or a number */ + {"MinNodes", S_P_UINT32}, + {"Nodes", S_P_STRING}, + {"RootOnly", S_P_BOOLEAN}, /* YES or NO */ + {"Shared", S_P_STRING}, /* YES, NO, or FORCE */ + {"State", S_P_BOOLEAN}, /* UP or DOWN */ + {NULL} + }; + + + tbl = s_p_hashtbl_create(_partition_options); + s_p_parse_line(tbl, *leftover, leftover); + /* s_p_dump_values(tbl, _partition_options); */ + + if (strcasecmp(value, "DEFAULT") == 0) { + if (default_partition_tbl != NULL) + s_p_hashtbl_destroy(default_partition_tbl); + default_partition_tbl = tbl; + + return 0; + } else { + p = xmalloc(sizeof(slurm_conf_partition_t)); + dflt = default_partition_tbl; + + p->name = xstrdup(value); + + if (!s_p_get_string(&p->allow_groups, "AllowGroups", tbl)) + s_p_get_string(&p->allow_groups, "AllowGroups", dflt); + if (p->allow_groups && strcasecmp(p->allow_groups, "ALL")==0) { + xfree(p->allow_groups); + p->allow_groups = NULL; /* NULL means allow all */ + } + + if (!s_p_get_boolean(&p->default_flag, "Default", tbl) + && !s_p_get_boolean(&p->default_flag, "Default", dflt)) + p->default_flag = false; + + if (!s_p_get_boolean(&p->hidden_flag, "Hidden", tbl) + && !s_p_get_boolean(&p->hidden_flag, "Hidden", dflt)) + p->hidden_flag = false; + + if (!s_p_get_uint32(&p->max_time, "MaxTime", tbl) + && !s_p_get_uint32(&p->max_time, "MaxTime", dflt)) + p->max_time = INFINITE; + + if (!s_p_get_uint32(&p->max_nodes, "MaxNodes", tbl) + && !s_p_get_uint32(&p->max_nodes, "MaxNodes", dflt)) + p->max_nodes = INFINITE; + + if (!s_p_get_uint32(&p->min_nodes, "MinNodes", tbl) + && !s_p_get_uint32(&p->min_nodes, "MinNodes", dflt)) + p->min_nodes = 1; + + if (!s_p_get_string(&p->nodes, "Nodes", tbl) + && !s_p_get_string(&p->nodes, "Nodes", dflt)) + p->nodes = NULL; + + if (!s_p_get_boolean(&p->root_only_flag, "RootOnly", tbl) + && !s_p_get_boolean(&p->root_only_flag, "RootOnly", dflt)) + p->root_only_flag = false; + + if (!s_p_get_string(&tmp, "Shared", tbl) + && !s_p_get_string(&tmp, "Shared", dflt)) { + p->shared = SHARED_NO; + } else { + if (strcasecmp(tmp, "NO") == 0) + p->shared = SHARED_NO; +#ifndef HAVE_XCPU + /* Only "Shared=NO" is valid on XCPU systems */ + else if (strcasecmp(tmp, "YES") == 0) + p->shared = SHARED_YES; + else if (strcasecmp(tmp, "FORCE") == 0) + p->shared = SHARED_FORCE; +#endif + else { + error("Bad value \"%s\" for Shared", tmp); + destroy_partitionname(p); + s_p_hashtbl_destroy(tbl); + xfree(tmp); + return -1; + } + } + xfree(tmp); + + if (!s_p_get_boolean(&p->state_up_flag, "State", tbl) + && !s_p_get_boolean(&p->state_up_flag, "State", dflt)) + p->state_up_flag = true; + + s_p_hashtbl_destroy(tbl); + + *dest = (void *)p; + + return 1; + } + + /* should not get here */ +} + +static void destroy_partitionname(void *ptr) +{ + slurm_conf_partition_t *p = (slurm_conf_partition_t *)ptr; + + xfree(p->name); + xfree(p->nodes); + xfree(p->allow_groups); + xfree(ptr); +} + +int slurm_conf_partition_array(slurm_conf_partition_t **ptr_array[]) +{ + int count; + slurm_conf_partition_t **ptr; + + if (s_p_get_array((void ***)&ptr, &count, "PartitionName", + conf_hashtbl)) { + *ptr_array = ptr; + return count; + } else { + *ptr_array = NULL; + return 0; + } +} + +static int parse_downnodes(void **dest, slurm_parser_enum_t type, + const char *key, const char *value, + const char *line, char **leftover) +{ + s_p_hashtbl_t *tbl, *dflt; + slurm_conf_downnodes_t *n; + static s_p_options_t _downnodes_options[] = { + {"Reason", S_P_STRING}, + {"State", S_P_STRING}, + {NULL} + }; + + tbl = s_p_hashtbl_create(_downnodes_options); + s_p_parse_line(tbl, *leftover, leftover); + /* s_p_dump_values(tbl, _downnodes_options); */ + + n = xmalloc(sizeof(slurm_conf_node_t)); + dflt = default_nodename_tbl; + + n->nodenames = xstrdup(value); + + if (!s_p_get_string(&n->reason, "Reason", tbl)) + n->reason = xstrdup("Set in slurm.conf"); + + if (!s_p_get_string(&n->state, "State", tbl)) + n->state = NULL; + + s_p_hashtbl_destroy(tbl); + + *dest = (void *)n; + + return 1; +} + +static void destroy_downnodes(void *ptr) +{ + slurm_conf_downnodes_t *n = (slurm_conf_downnodes_t *)ptr; + xfree(n->nodenames); + xfree(n->reason); + xfree(n->state); + xfree(ptr); +} + +int slurm_conf_downnodes_array(slurm_conf_downnodes_t **ptr_array[]) +{ + int count; + slurm_conf_downnodes_t **ptr; + + if (s_p_get_array((void ***)&ptr, &count, "DownNodes", conf_hashtbl)) { + *ptr_array = ptr; + return count; + } else { + *ptr_array = NULL; + return 0; + } +} + +static void _free_name_hashtbl() +{ + int i; + names_ll_t *p, *q; + + for (i=0; ialias); + xfree(p->hostname); + xfree(p->address); + q = p->next_alias; + xfree(p); + p = q; + } + node_to_host_hashtbl[i] = NULL; + host_to_node_hashtbl[i] = NULL; + } + nodehash_initialized = false; +} + +static void _init_name_hashtbl() +{ + return; +} + +static int _get_hash_idx(const char *s) +{ + int i; + + i = 0; + while (*s) i += (int)*s++; + return i % NAME_HASH_LEN; +} + +static void _push_to_hashtbls(char *alias, char *hostname, + char *address, uint16_t port, + uint16_t cpus, uint16_t sockets, + uint16_t cores, uint16_t threads) +{ + int hostname_idx, alias_idx; + names_ll_t *p, *new; + + alias_idx = _get_hash_idx(alias); + hostname_idx = _get_hash_idx(hostname); + +#if !defined(HAVE_FRONT_END) && !defined(MULTIPLE_SLURMD) + /* Ensure only one slurmd configured on each host */ + p = host_to_node_hashtbl[hostname_idx]; + while (p) { + if (strcmp(p->hostname, hostname)==0) { + error("Duplicated NodeHostname %s in the config file", + hostname); + return; + } + p = p->next_hostname; + } +#endif + /* Ensure only one instance of each NodeName */ + p = node_to_host_hashtbl[alias_idx]; + while (p) { + if (strcmp(p->alias, alias)==0) { + fatal("Duplicated NodeName %s in the config file", + p->alias); + return; + } + p = p->next_alias; + } + + /* Create the new data structure and link it into the hash tables */ + new = (names_ll_t *)xmalloc(sizeof(*new)); + new->alias = xstrdup(alias); + new->hostname = xstrdup(hostname); + new->address = xstrdup(address); + new->port = port; + new->cpus = cpus; + new->sockets = sockets; + new->cores = cores; + new->threads = threads; + new->addr_initialized = false; + new->next_hostname = host_to_node_hashtbl[hostname_idx]; + host_to_node_hashtbl[hostname_idx] = new; + new->next_alias = node_to_host_hashtbl[alias_idx]; + node_to_host_hashtbl[alias_idx] = new; +} + +/* + * Register the given NodeName in the alias table. + * If node_hostname is NULL, only node_name will be used and + * no lookup table record is created. + */ +static int _register_conf_node_aliases(slurm_conf_node_t *node_ptr) +{ + hostlist_t alias_list = NULL; + hostlist_t hostname_list = NULL; + hostlist_t address_list = NULL; + char *alias = NULL; + char *hostname = NULL; + char *address = NULL; + int error_code = SLURM_SUCCESS; + + if (node_ptr->nodenames == NULL || *node_ptr->nodenames == '\0') + return -1; + + if ((alias_list = hostlist_create(node_ptr->nodenames)) == NULL) { + error("Unable to create NodeName list from %s", + node_ptr->nodenames); + error_code = errno; + goto cleanup; + } + if ((hostname_list = hostlist_create(node_ptr->hostnames)) == NULL) { + error("Unable to create NodeHostname list from %s", + node_ptr->hostnames); + error_code = errno; + goto cleanup; + } + if ((address_list = hostlist_create(node_ptr->addresses)) == NULL) { + error("Unable to create NodeAddr list from %s", + node_ptr->addresses); + error_code = errno; + goto cleanup; + } + + /* some sanity checks */ +#ifdef HAVE_FRONT_END + if (hostlist_count(hostname_list) != 1 + || hostlist_count(address_list) != 1) { + error("Only one hostname and address allowed " + "in FRONT_END mode"); + goto cleanup; + } + hostname = node_ptr->hostnames; + address = node_ptr->addresses; +#else + if (hostlist_count(hostname_list) < hostlist_count(alias_list)) { + error("At least as many NodeHostname are required " + "as NodeName"); + goto cleanup; + } + if (hostlist_count(address_list) < hostlist_count(alias_list)) { + error("At least as many NodeAddr are required as NodeName"); + goto cleanup; + } +#endif + + /* now build the individual node structures */ + while ((alias = hostlist_shift(alias_list))) { +#ifndef HAVE_FRONT_END + hostname = hostlist_shift(hostname_list); + address = hostlist_shift(address_list); +#endif + + _push_to_hashtbls(alias, hostname, address, node_ptr->port, + node_ptr->cpus, node_ptr->sockets, + node_ptr->cores, node_ptr->threads); + + free(alias); +#ifndef HAVE_FRONT_END + free(hostname); + free(address); +#endif + + } + + /* free allocated storage */ +cleanup: + if (alias_list) + hostlist_destroy(alias_list); + if (hostname_list) + hostlist_destroy(hostname_list); + if (address_list) + hostlist_destroy(address_list); + return error_code; +} + +static void _init_slurmd_nodehash(void) +{ + slurm_conf_node_t **ptr_array; + int count; + int i; + + if (nodehash_initialized) + return; + else + nodehash_initialized = true; + + if(!conf_initialized) + _init_slurm_conf(NULL); + + count = slurm_conf_nodename_array(&ptr_array); + if (count == 0) { + return; + } + + for (i = 0; i < count; i++) { + _register_conf_node_aliases(ptr_array[i]); + } +} + +extern void slurm_conf_nodehash_init(void) +{ + slurm_conf_lock(); + _init_slurmd_nodehash(); + slurm_conf_unlock(); +} + + +/* + * slurm_conf_get_hostname - Return the NodeHostname for given NodeName + */ +extern char *slurm_conf_get_hostname(const char *node_name) +{ + int idx; + names_ll_t *p; + + slurm_conf_lock(); + _init_slurmd_nodehash(); + + idx = _get_hash_idx(node_name); + p = node_to_host_hashtbl[idx]; + while (p) { + if (strcmp(p->alias, node_name) == 0) { + char *hostname = xstrdup(p->hostname); + slurm_conf_unlock(); + return hostname; + } + p = p->next_alias; + } + slurm_conf_unlock(); + + return NULL; +} + +/* + * slurm_conf_get_nodename - Return the NodeName for given NodeHostname + */ +extern char *slurm_conf_get_nodename(const char *node_hostname) +{ + int idx; + names_ll_t *p; + + slurm_conf_lock(); + _init_slurmd_nodehash(); + idx = _get_hash_idx(node_hostname); + + p = host_to_node_hashtbl[idx]; + while (p) { + if (strcmp(p->hostname, node_hostname) == 0) { + char *alias = xstrdup(p->alias); + slurm_conf_unlock(); + return alias; + } + p = p->next_hostname; + } + slurm_conf_unlock(); + + return NULL; +} + +/* + * slurm_conf_get_port - Return the port for a given NodeName + */ +extern uint16_t slurm_conf_get_port(const char *node_name) +{ + int idx; + names_ll_t *p; + + slurm_conf_lock(); + _init_slurmd_nodehash(); + + idx = _get_hash_idx(node_name); + p = node_to_host_hashtbl[idx]; + while (p) { + if (strcmp(p->alias, node_name) == 0) { + uint16_t port = p->port; + slurm_conf_unlock(); + return port; + } + p = p->next_alias; + } + slurm_conf_unlock(); + + return 0; +} + +/* + * slurm_conf_get_addr - Return the slurm_addr for a given NodeName + * Returns SLURM_SUCCESS on success, SLURM_FAILURE on failure. + */ +extern int slurm_conf_get_addr(const char *node_name, slurm_addr *address) +{ + int idx; + names_ll_t *p; + + slurm_conf_lock(); + _init_slurmd_nodehash(); + + idx = _get_hash_idx(node_name); + p = node_to_host_hashtbl[idx]; + while (p) { + if (strcmp(p->alias, node_name) == 0) { + if (!p->addr_initialized) { + slurm_set_addr(&p->addr, p->port, p->address); + p->addr_initialized = true; + } + *address = p->addr; + slurm_conf_unlock(); + return SLURM_SUCCESS; + } + p = p->next_alias; + } + slurm_conf_unlock(); + + return SLURM_FAILURE; +} + +/* + * slurm_conf_get_cpus_sct - + * Return the cpus, sockets, cores, and threads for a given NodeName + * Returns SLURM_SUCCESS on success, SLURM_FAILURE on failure. + */ +extern int slurm_conf_get_cpus_sct(const char *node_name, + uint16_t *cpus, uint16_t *sockets, + uint16_t *cores, uint16_t *threads) +{ + int idx; + names_ll_t *p; + + slurm_conf_lock(); + _init_slurmd_nodehash(); + + idx = _get_hash_idx(node_name); + p = node_to_host_hashtbl[idx]; + while (p) { + if (strcmp(p->alias, node_name) == 0) { + if (cpus) + *cpus = p->cpus; + if (sockets) + *sockets = p->sockets; + if (cores) + *cores = p->cores; + if (threads) + *threads = p->threads; + slurm_conf_unlock(); + return SLURM_SUCCESS; + } + p = p->next_alias; + } + slurm_conf_unlock(); + + return SLURM_FAILURE; +} + + +/* getnodename - equivalent to gethostname, but return only the first + * component of the fully qualified name + * (e.g. "linux123.foo.bar" becomes "linux123") + * OUT name + */ +int +getnodename (char *name, size_t len) +{ + int error_code, name_len; + char *dot_ptr, path_name[1024]; + + error_code = gethostname (path_name, sizeof(path_name)); + if (error_code) + return error_code; + + dot_ptr = strchr (path_name, '.'); + if (dot_ptr == NULL) + dot_ptr = path_name + strlen(path_name); + else + dot_ptr[0] = '\0'; + + name_len = (dot_ptr - path_name); + if (name_len > len) + return ENAMETOOLONG; + + strcpy (name, path_name); + return 0; +} + +/* + * free_slurm_conf - free all storage associated with a slurm_ctl_conf_t. + * IN/OUT ctl_conf_ptr - pointer to data structure to be freed + */ +void +free_slurm_conf (slurm_ctl_conf_t *ctl_conf_ptr) +{ + xfree (ctl_conf_ptr->authtype); + xfree (ctl_conf_ptr->checkpoint_type); + xfree (ctl_conf_ptr->backup_addr); + xfree (ctl_conf_ptr->backup_controller); + xfree (ctl_conf_ptr->control_addr); + xfree (ctl_conf_ptr->control_machine); + xfree (ctl_conf_ptr->epilog); + xfree (ctl_conf_ptr->job_acct_logfile); + xfree (ctl_conf_ptr->job_acct_type); + xfree (ctl_conf_ptr->job_comp_loc); + xfree (ctl_conf_ptr->job_comp_type); + xfree (ctl_conf_ptr->job_credential_private_key); + xfree (ctl_conf_ptr->job_credential_public_certificate); + xfree (ctl_conf_ptr->mail_prog); + xfree (ctl_conf_ptr->mpi_default); + xfree (ctl_conf_ptr->plugindir); + xfree (ctl_conf_ptr->plugstack); + xfree (ctl_conf_ptr->proctrack_type); + xfree (ctl_conf_ptr->prolog); + xfree (ctl_conf_ptr->propagate_rlimits_except); + xfree (ctl_conf_ptr->propagate_rlimits); + xfree (ctl_conf_ptr->schedtype); + xfree (ctl_conf_ptr->select_type); + xfree (ctl_conf_ptr->slurm_conf); + xfree (ctl_conf_ptr->slurm_user_name); + xfree (ctl_conf_ptr->slurmctld_logfile); + xfree (ctl_conf_ptr->slurmctld_pidfile); + xfree (ctl_conf_ptr->slurmd_logfile); + xfree (ctl_conf_ptr->slurmd_pidfile); + xfree (ctl_conf_ptr->slurmd_spooldir); + xfree (ctl_conf_ptr->state_save_location); + xfree (ctl_conf_ptr->switch_type); + xfree (ctl_conf_ptr->tmp_fs); + xfree (ctl_conf_ptr->task_epilog); + xfree (ctl_conf_ptr->task_prolog); + xfree (ctl_conf_ptr->task_plugin); + xfree (ctl_conf_ptr->tmp_fs); + xfree (ctl_conf_ptr->srun_prolog); + xfree (ctl_conf_ptr->srun_epilog); + xfree (ctl_conf_ptr->node_prefix); + + _free_name_hashtbl(); +} + +/* + * init_slurm_conf - initialize or re-initialize the slurm configuration + * values to defaults (NULL or NO_VAL). Note that the configuration + * file pathname (slurm_conf) is not changed. + * IN/OUT ctl_conf_ptr - pointer to data structure to be initialized + */ +void +init_slurm_conf (slurm_ctl_conf_t *ctl_conf_ptr) +{ + ctl_conf_ptr->last_update = time(NULL); + xfree (ctl_conf_ptr->authtype); + ctl_conf_ptr->cache_groups = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->checkpoint_type); + xfree (ctl_conf_ptr->backup_addr); + xfree (ctl_conf_ptr->backup_controller); + xfree (ctl_conf_ptr->control_addr); + xfree (ctl_conf_ptr->control_machine); + xfree (ctl_conf_ptr->epilog); + ctl_conf_ptr->fast_schedule = (uint16_t) NO_VAL; + ctl_conf_ptr->first_job_id = (uint32_t) NO_VAL; + ctl_conf_ptr->inactive_limit = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->job_acct_logfile); + ctl_conf_ptr->job_acct_freq = 0; + xfree (ctl_conf_ptr->job_acct_type); + xfree (ctl_conf_ptr->job_comp_loc); + xfree (ctl_conf_ptr->job_comp_type); + xfree (ctl_conf_ptr->job_credential_private_key); + xfree (ctl_conf_ptr->job_credential_public_certificate); + ctl_conf_ptr->kill_wait = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->mail_prog); + ctl_conf_ptr->max_job_cnt = (uint16_t) NO_VAL; + ctl_conf_ptr->min_job_age = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->mpi_default); + ctl_conf_ptr->msg_timeout = (uint16_t) NO_VAL; + ctl_conf_ptr->next_job_id = (uint32_t) NO_VAL; + xfree (ctl_conf_ptr->plugindir); + xfree (ctl_conf_ptr->plugstack); + xfree (ctl_conf_ptr->proctrack_type); + xfree (ctl_conf_ptr->prolog); + ctl_conf_ptr->propagate_prio_process = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->propagate_rlimits_except); + xfree (ctl_conf_ptr->propagate_rlimits); + ctl_conf_ptr->ret2service = (uint16_t) NO_VAL; + ctl_conf_ptr->schedport = (uint16_t) NO_VAL; + ctl_conf_ptr->schedrootfltr = (uint16_t) NO_VAL; + xfree( ctl_conf_ptr->schedtype ); + xfree( ctl_conf_ptr->select_type ); + ctl_conf_ptr->select_type_param = (uint16_t) NO_VAL; + ctl_conf_ptr->slurm_user_id = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->slurm_user_name); + ctl_conf_ptr->slurmctld_debug = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->slurmctld_logfile); + xfree (ctl_conf_ptr->slurmctld_pidfile); + ctl_conf_ptr->slurmctld_port = (uint32_t) NO_VAL; + ctl_conf_ptr->slurmctld_timeout = (uint16_t) NO_VAL; + ctl_conf_ptr->slurmd_debug = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->slurmd_logfile); + xfree (ctl_conf_ptr->slurmd_pidfile); + ctl_conf_ptr->slurmd_port = (uint32_t) NO_VAL; + xfree (ctl_conf_ptr->slurmd_spooldir); + ctl_conf_ptr->slurmd_timeout = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->state_save_location); + xfree (ctl_conf_ptr->switch_type); + xfree (ctl_conf_ptr->task_epilog); + xfree (ctl_conf_ptr->task_prolog); + xfree (ctl_conf_ptr->task_plugin); + xfree (ctl_conf_ptr->tmp_fs); + ctl_conf_ptr->wait_time = (uint16_t) NO_VAL; + xfree (ctl_conf_ptr->srun_prolog); + xfree (ctl_conf_ptr->srun_epilog); + xfree (ctl_conf_ptr->node_prefix); + ctl_conf_ptr->tree_width = (uint16_t) NO_VAL; + ctl_conf_ptr->use_pam = 0; + + _free_name_hashtbl(); + _init_name_hashtbl(); + + return; +} + +/* caller must lock conf_lock */ +static void +_init_slurm_conf(const char *file_name) +{ + char *name = (char *)file_name; + /* conf_ptr = (slurm_ctl_conf_t *)xmalloc(sizeof(slurm_ctl_conf_t)); */ + default_slurmd_port = 0; + + if (name == NULL) { + name = getenv("SLURM_CONF"); + if (name == NULL) + name = default_slurm_config_file; + } + if(conf_initialized) { + error("the conf_hashtbl is already inited"); + } + conf_hashtbl = s_p_hashtbl_create(slurm_conf_options); + conf_ptr->last_update = time(NULL); + if(s_p_parse_file(conf_hashtbl, name) == SLURM_ERROR) + fatal("something wrong with opening/reading conf file"); + /* s_p_dump_values(conf_hashtbl, slurm_conf_options); */ + validate_and_set_defaults(conf_ptr, conf_hashtbl); + conf_ptr->slurm_conf = xstrdup(name); +} + +/* caller must lock conf_lock */ +static void +_destroy_slurm_conf() +{ + s_p_hashtbl_destroy(conf_hashtbl); + if (default_nodename_tbl != NULL) { + s_p_hashtbl_destroy(default_nodename_tbl); + default_nodename_tbl = NULL; + } + if (default_partition_tbl != NULL) { + s_p_hashtbl_destroy(default_partition_tbl); + default_partition_tbl = NULL; + } + free_slurm_conf(conf_ptr); + conf_initialized = false; + + /* xfree(conf_ptr); */ +} + +/* + * slurm_conf_init - load the slurm configuration from the a file. + * IN file_name - name of the slurm configuration file to be read + * If file_name is NULL, then this routine tries to use + * the value in the SLURM_CONF env variable. Failing that, + * it uses the compiled-in default file name. + * If the conf structures have already been initialized by a call to + * slurm_conf_init, any subsequent calls will do nothing until + * slurm_conf_destroy is called. + * RET SLURM_SUCCESS if conf file is initialized. If the slurm conf + * was already initialied, return SLURM_ERROR. + */ +extern int +slurm_conf_init(const char *file_name) +{ + pthread_mutex_lock(&conf_lock); + + if (conf_initialized) { + pthread_mutex_unlock(&conf_lock); + return SLURM_ERROR; + } + + _init_slurm_conf(file_name); + conf_initialized = true; + + pthread_mutex_unlock(&conf_lock); + return SLURM_SUCCESS; +} + +static int _internal_reinit(const char *file_name) +{ + char *name = (char *)file_name; + + if (name == NULL) { + name = getenv("SLURM_CONF"); + if (name == NULL) + name = default_slurm_config_file; + } + + if (conf_initialized) { + /* could check modified time on slurm.conf here */ + _destroy_slurm_conf(); + } + + _init_slurm_conf(name); + + conf_initialized = true; + + return SLURM_SUCCESS; +} + +/* + * slurm_conf_reinit - reload the slurm configuration from a file. + * IN file_name - name of the slurm configuration file to be read + * If file_name is NULL, then this routine tries to use + * the value in the SLURM_CONF env variable. Failing that, + * it uses the compiled-in default file name. + * Unlike slurm_conf_init, slurm_conf_reinit will always reread the + * file and reinitialize the configuration structures. + * RET SLURM_SUCCESS if conf file is reinitialized, otherwise SLURM_ERROR. + */ +extern int +slurm_conf_reinit(const char *file_name) +{ + int rc; + + pthread_mutex_lock(&conf_lock); + rc = _internal_reinit(file_name); + pthread_mutex_unlock(&conf_lock); + + return rc; +} + +/* + * slurm_conf_reinit_nolock - reload the slurm configuration from a file. + * This does the same thing as slurm_conf_reinit, but it performs + * no internal locking. You are responsible for calling slurm_conf_lock() + * before calling this function, and calling slurm_conf_unlock() + * afterwards. + * IN file_name - name of the slurm configuration file to be read + * If file_name is NULL, then this routine tries to use + * the value in the SLURM_CONF env variable. Failing that, + * it uses the compiled-in default file name. + * Unlike slurm_conf_init, slurm_conf_reinit will always reread the + * file and reinitialize the configuration structures. + * RET SLURM_SUCCESS if conf file is reinitialized, otherwise SLURM_ERROR. + */ +extern int +slurm_conf_reinit_nolock(const char *file_name) +{ + return _internal_reinit(file_name); +} + +extern void +slurm_conf_mutex_init(void) +{ + pthread_mutex_init(&conf_lock, NULL); +} + +extern void +slurm_conf_install_fork_handlers() +{ + int err; + if ((err = pthread_atfork(NULL, NULL, &slurm_conf_mutex_init))) + fatal("can't install slurm_conf atfork handler"); + return; +} + +extern int +slurm_conf_destroy(void) +{ + pthread_mutex_lock(&conf_lock); + + if (!conf_initialized) { + pthread_mutex_unlock(&conf_lock); + return SLURM_SUCCESS; + } + + _destroy_slurm_conf(); + + pthread_mutex_unlock(&conf_lock); + + return SLURM_SUCCESS; +} + +extern slurm_ctl_conf_t * +slurm_conf_lock(void) +{ + pthread_mutex_lock(&conf_lock); + + if (!conf_initialized) { + _init_slurm_conf(NULL); + conf_initialized = true; + } + + return conf_ptr; +} + +extern void +slurm_conf_unlock(void) +{ + pthread_mutex_unlock(&conf_lock); +} + +/* Normalize supplied debug level to be in range per log.h definitions */ +static void _normalize_debug_level(uint16_t *level) +{ + if (*level > LOG_LEVEL_END) { + error("Normalizing debug level from %u to %d", + *level, (LOG_LEVEL_END - 1)); + *level = (LOG_LEVEL_END - 1); + } + /* level is uint16, always > LOG_LEVEL_QUIET(0), can't underflow */ +} + +/* + * + * IN/OUT ctl_conf_ptr - a configuration as loaded by read_slurm_conf_ctl + * + * NOTE: a backup_controller or control_machine of "localhost" are over-written + * with this machine's name. + * NOTE: if backup_addr is NULL, it is over-written by backup_controller + * NOTE: if control_addr is NULL, it is over-written by control_machine + */ +static void +validate_and_set_defaults(slurm_ctl_conf_t *conf, s_p_hashtbl_t *hashtbl) +{ + char *temp_str = NULL; + bool truth; + + if (s_p_get_string(&conf->backup_controller, "BackupController", + hashtbl) + && strcasecmp("localhost", conf->backup_controller) == 0) { + xfree(conf->backup_controller); + conf->backup_controller = xmalloc (MAX_SLURM_NAME); + if (getnodename(conf->backup_controller, MAX_SLURM_NAME)) + fatal("getnodename: %m"); + } + if (s_p_get_string(&conf->backup_addr, "BackupAddr", hashtbl)) { + if (conf->backup_controller == NULL) { + error("BackupAddr specified without BackupController"); + xfree(conf->backup_addr); + } + } else { + if (conf->backup_controller != NULL) + conf->backup_addr = xstrdup(conf->backup_controller); + } + + if (!s_p_get_string(&conf->control_machine, "ControlMachine", hashtbl)) + fatal ("validate_and_set_defaults: " + "ControlMachine not specified."); + else if (strcasecmp("localhost", conf->control_machine) == 0) { + xfree (conf->control_machine); + conf->control_machine = xmalloc(MAX_SLURM_NAME); + if (getnodename(conf->control_machine, MAX_SLURM_NAME)) + fatal("getnodename: %m"); + } + + if (!s_p_get_string(&conf->control_addr, "ControlAddr", hashtbl) + && conf->control_machine != NULL) + conf->control_addr = xstrdup (conf->control_machine); + + if ((conf->backup_controller != NULL) + && (strcmp(conf->backup_controller, conf->control_machine) == 0)) { + error("ControlMachine and BackupController identical"); + xfree(conf->backup_addr); + xfree(conf->backup_controller); + } + + if (!s_p_get_string(&conf->job_credential_private_key, + "JobCredentialPrivateKey", hashtbl)) + fatal("JobCredentialPrivateKey not set"); + if (!s_p_get_string(&conf->job_credential_public_certificate, + "JobCredentialPublicCertificate", hashtbl)) + fatal("JobCredentialPublicCertificate not set"); + + if (s_p_get_uint16(&conf->max_job_cnt, "MaxJobCount", hashtbl) + && conf->max_job_cnt < 1) + fatal("MaxJobCount=%u, No jobs permitted", conf->max_job_cnt); + + if (!s_p_get_string(&conf->authtype, "AuthType", hashtbl)) + conf->authtype = xstrdup(DEFAULT_AUTH_TYPE); + + if (!s_p_get_uint16(&conf->cache_groups, "CacheGroups", hashtbl)) + conf->cache_groups = DEFAULT_CACHE_GROUPS; + + if (!s_p_get_string(&conf->checkpoint_type, "CheckpointType", hashtbl)) + conf->checkpoint_type = xstrdup(DEFAULT_CHECKPOINT_TYPE); + + s_p_get_string(&conf->epilog, "Epilog", hashtbl); + + if (!s_p_get_uint16(&conf->fast_schedule, "FastSchedule", hashtbl)) + conf->fast_schedule = DEFAULT_FAST_SCHEDULE; + + if (!s_p_get_uint32(&conf->first_job_id, "FirstJobId", hashtbl)) + conf->first_job_id = DEFAULT_FIRST_JOB_ID; + + if (s_p_get_uint16(&conf->inactive_limit, "InactiveLimit", hashtbl)) { +#ifdef HAVE_BG + /* Inactive limit must be zero on Blue Gene */ + if (conf->inactive_limit) { + error("InactiveLimit=%ld is invalid on Blue Gene", + conf->inactive_limit); + } + conf->inactive_limit = 0; +#endif + } else { +#ifdef HAVE_BG + conf->inactive_limit = 0; +#endif + conf->inactive_limit = DEFAULT_INACTIVE_LIMIT; + } + + if (!s_p_get_string(&conf->job_acct_logfile, + "JobAcctLogFile", hashtbl)) + conf->job_acct_logfile = xstrdup(DEFAULT_JOB_ACCT_LOGFILE); + + if (!s_p_get_uint16(&conf->job_acct_freq, "JobAcctFrequency", hashtbl)) + conf->job_acct_freq = DEFAULT_JOB_ACCT_FREQ; + + if (!s_p_get_string(&conf->job_acct_type, "JobAcctType", hashtbl)) + conf->job_acct_type = xstrdup(DEFAULT_JOB_ACCT_TYPE); + + s_p_get_string(&conf->job_comp_loc, "JobCompLoc", hashtbl); + + if (!s_p_get_string(&conf->job_comp_type, "JobCompType", hashtbl)) + conf->job_comp_type = xstrdup(DEFAULT_JOB_COMP_TYPE); + + if (!s_p_get_uint16(&conf->kill_wait, "KillWait", hashtbl)) + conf->kill_wait = DEFAULT_KILL_WAIT; + + if (!s_p_get_string(&conf->mail_prog, "MailProg", hashtbl)) + conf->mail_prog = xstrdup(DEFAULT_MAIL_PROG); + + if (!s_p_get_uint16(&conf->max_job_cnt, "MaxJobCount", hashtbl)) + conf->max_job_cnt = DEFAULT_MAX_JOB_COUNT; + + if (!s_p_get_uint16(&conf->msg_timeout, "MessageTimeout", hashtbl)) + conf->msg_timeout = DEFAULT_MSG_TIMEOUT; + else if (conf->msg_timeout > 100) + info("WARNING: MessageTimeout is too high for effective fault-tolerance"); + + if (!s_p_get_uint16(&conf->min_job_age, "MinJobAge", hashtbl)) + conf->min_job_age = DEFAULT_MIN_JOB_AGE; + + if (!s_p_get_string(&conf->mpi_default, "MpiDefault", hashtbl)) + conf->mpi_default = xstrdup(DEFAULT_MPI_DEFAULT); + + if (!s_p_get_string(&conf->plugindir, "PluginDir", hashtbl)) + conf->plugindir = xstrdup(default_plugin_path); + + if (!s_p_get_string(&conf->plugstack, "PlugStackConfig", hashtbl)) + conf->plugstack = xstrdup(default_plugstack); + + if (!s_p_get_string(&conf->switch_type, "SwitchType", hashtbl)) + conf->switch_type = xstrdup(DEFAULT_SWITCH_TYPE); + + if (!s_p_get_string(&conf->proctrack_type, "ProctrackType", hashtbl)) { + if (!strcmp(conf->switch_type,"switch/elan")) + conf->proctrack_type = xstrdup("proctrack/rms"); + else + conf->proctrack_type = + xstrdup(DEFAULT_PROCTRACK_TYPE); + } + if ((!strcmp(conf->switch_type, "switch/elan")) + && (!strcmp(conf->proctrack_type,"proctrack/linuxproc"))) + fatal("proctrack/linuxproc is incompatable with switch/elan"); + + s_p_get_string(&conf->prolog, "Prolog", hashtbl); + + if (!s_p_get_uint16(&conf->propagate_prio_process, + "PropagatePrioProcess", hashtbl)) { + conf->propagate_prio_process = DEFAULT_PROPAGATE_PRIO_PROCESS; + } else if (conf->propagate_prio_process > 1) { + fatal("Bad PropagatePrioProcess: %u", + conf->propagate_prio_process); + } + + if (s_p_get_string(&conf->propagate_rlimits_except, + "PropagateResourceLimitsExcept", hashtbl)) { + if ((parse_rlimits(conf->propagate_rlimits_except, + NO_PROPAGATE_RLIMITS)) < 0) + fatal("Bad PropagateResourceLimitsExcept: %s", + conf->propagate_rlimits_except); + } else { + if (!s_p_get_string(&conf->propagate_rlimits, + "PropagateResourceLimits", hashtbl)) + conf->propagate_rlimits = xstrdup( "ALL" ); + if ((parse_rlimits(conf->propagate_rlimits, + PROPAGATE_RLIMITS )) < 0) + fatal("Bad PropagateResourceLimits: %s", + conf->propagate_rlimits); + } + + if (!s_p_get_uint16(&conf->ret2service, "ReturnToService", hashtbl)) + conf->ret2service = DEFAULT_RETURN_TO_SERVICE; + + if (s_p_get_uint16(&conf->schedport, "SchedulerPort", hashtbl)) { + if (conf->schedport == 0) { + error("SchedulerPort=0 is invalid"); + conf->schedport = (uint16_t)NO_VAL; + } + } + + if (!s_p_get_uint16(&conf->schedrootfltr, + "SchedulerRootFilter", hashtbl)) + conf->schedrootfltr = DEFAULT_SCHEDROOTFILTER; + + if (!s_p_get_string(&conf->schedtype, "SchedulerType", hashtbl)) + conf->schedtype = xstrdup(DEFAULT_SCHEDTYPE); + + if (!s_p_get_string(&conf->select_type, "SelectType", hashtbl)) + conf->select_type = xstrdup(DEFAULT_SELECT_TYPE); + + if (s_p_get_string(&temp_str, + "SelectTypeParameters", hashtbl)) { + select_type_plugin_info_t type_param; + if ((parse_select_type_param(temp_str, &type_param) < 0)) { + xfree(temp_str); + fatal("Bad SelectTypeParameter: %s", + conf->select_type_param); + } + conf->select_type_param = (uint16_t) type_param; + xfree(temp_str); + } else { + if (strcmp(conf->select_type,"select/cons_res") == 0) + conf->select_type_param = CR_CPU; + else + conf->select_type_param = SELECT_TYPE_INFO_NONE; + } + + if (!s_p_get_string( &conf->slurm_user_name, "SlurmUser", hashtbl)) { + conf->slurm_user_name = xstrdup("root"); + conf->slurm_user_id = 0; + } else { + struct passwd *slurm_passwd; + slurm_passwd = getpwnam(conf->slurm_user_name); + if (slurm_passwd == NULL) { + error ("Invalid user for SlurmUser %s, ignored", + conf->slurm_user_name); + xfree(conf->slurm_user_name); + } else { + if (slurm_passwd->pw_uid > 0xffff) + error("SlurmUser numeric overflow, " + "will be fixed soon"); + else + conf->slurm_user_id = slurm_passwd->pw_uid; + } + } + + if (s_p_get_uint16(&conf->slurmctld_debug, "SlurmctldDebug", hashtbl)) + _normalize_debug_level(&conf->slurmctld_debug); + else + conf->slurmctld_debug = LOG_LEVEL_INFO; + + if (!s_p_get_string(&conf->slurmctld_pidfile, + "SlurmctldPidFile", hashtbl)) + conf->slurmctld_pidfile = xstrdup(DEFAULT_SLURMCTLD_PIDFILE); + + s_p_get_string(&conf->slurmctld_logfile, "SlurmctldLogFile", hashtbl); + + if (!s_p_get_uint32(&conf->slurmctld_port, "SlurmctldPort", hashtbl)) + conf->slurmctld_port = SLURMCTLD_PORT; + + if (!s_p_get_uint16(&conf->slurmctld_timeout, + "SlurmctldTimeout", hashtbl)) + conf->slurmctld_timeout = DEFAULT_SLURMCTLD_TIMEOUT; + + if (s_p_get_uint16(&conf->slurmd_debug, "SlurmdDebug", hashtbl)) + _normalize_debug_level(&conf->slurmd_debug); + else + conf->slurmd_debug = LOG_LEVEL_INFO; + + s_p_get_string(&conf->slurmd_logfile, "SlurmdLogFile", hashtbl); + + if (!s_p_get_string(&conf->slurmd_pidfile, "SlurmdPidFile", hashtbl)) + conf->slurmd_pidfile = xstrdup(DEFAULT_SLURMD_PIDFILE); + + if (!s_p_get_uint32(&conf->slurmd_port, "SlurmdPort", hashtbl)) + conf->slurmd_port = SLURMD_PORT; + + if (!s_p_get_string(&conf->slurmd_spooldir, "SlurmdSpoolDir", hashtbl)) + conf->slurmd_spooldir = xstrdup(DEFAULT_SPOOLDIR); + + if (!s_p_get_uint16(&conf->slurmd_timeout, "SlurmdTimeout", hashtbl)) + conf->slurmd_timeout = DEFAULT_SLURMD_TIMEOUT; + + s_p_get_string(&conf->srun_prolog, "SrunProlog", hashtbl); + s_p_get_string(&conf->srun_epilog, "SrunEpilog", hashtbl); + + if (!s_p_get_string(&conf->state_save_location, + "StateSaveLocation", hashtbl)) + conf->state_save_location = xstrdup(DEFAULT_SAVE_STATE_LOC); + + /* see above for switch_type, order dependent */ + + if (!s_p_get_string(&conf->task_plugin, "TaskPlugin", hashtbl)) + conf->task_plugin = xstrdup(DEFAULT_TASK_PLUGIN); + + s_p_get_string(&conf->task_epilog, "TaskEpilog", hashtbl); + s_p_get_string(&conf->task_prolog, "TaskProlog", hashtbl); + + if (!s_p_get_string(&conf->tmp_fs, "TmpFS", hashtbl)) + conf->tmp_fs = xstrdup(DEFAULT_TMP_FS); + + if (!s_p_get_uint16(&conf->wait_time, "WaitTime", hashtbl)) + conf->wait_time = DEFAULT_WAIT_TIME; + + if (s_p_get_uint16(&conf->tree_width, "TreeWidth", hashtbl)) { + if (conf->tree_width == 0) { + error("TreeWidth=0 is invalid"); + conf->tree_width = DEFAULT_TREE_WIDTH; /* default? */ + } + } else { + conf->tree_width = DEFAULT_TREE_WIDTH; + } + + if (s_p_get_boolean(&truth, "UsePAM", hashtbl) && truth) { + conf->use_pam = 1; + } else { + conf->use_pam = 0; + } +} + diff --git a/executable_names/src/common/read_config.h b/executable_names/src/common/read_config.h new file mode 100644 index 0000000000000000000000000000000000000000..e3f0b11c45a34735ca0d671dfbf27ba804744fb9 --- /dev/null +++ b/executable_names/src/common/read_config.h @@ -0,0 +1,291 @@ +/***************************************************************************** + * read_config.h - definitions for reading the overall slurm configuration + * file + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Mette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _READ_CONFIG_H +#define _READ_CONFIG_H + +#include "src/common/slurm_protocol_defs.h" +#include "src/common/slurm_protocol_socket_common.h" +#include "src/common/parse_config.h" + +extern slurm_ctl_conf_t slurmctld_conf; +extern char *default_slurm_config_file; +extern char *default_plugin_path; +extern char *default_plugstack; + +#define DEFAULT_AUTH_TYPE "auth/none" +#define DEFAULT_CACHE_GROUPS 0 +#define DEFAULT_FAST_SCHEDULE 1 +#define DEFAULT_FIRST_JOB_ID 1 +/* NOTE: DEFAULT_INACTIVE_LIMIT must be 0 for Blue Gene/L systems */ +#define DEFAULT_INACTIVE_LIMIT 0 +#define DEFAULT_JOB_ACCT_LOGFILE "/var/log/slurm_accounting.log" +#define DEFAULT_JOB_ACCT_FREQ 30 +#define DEFAULT_JOB_ACCT_TYPE "jobacct/none" +#define DEFAULT_JOB_COMP_TYPE "jobcomp/none" +#define DEFAULT_KILL_TREE 0 +#define DEFAULT_KILL_WAIT 30 +#define DEFAULT_MAIL_PROG "/bin/mail" +#define DEFAULT_MAX_JOB_COUNT 2000 +#define DEFAULT_MIN_JOB_AGE 300 +#define DEFAULT_MPI_DEFAULT "none" +#define DEFAULT_MSG_TIMEOUT 5 +#ifdef HAVE_AIX /* AIX specific default configuration parameters */ +# define DEFAULT_CHECKPOINT_TYPE "checkpoint/aix" +# define DEFAULT_PROCTRACK_TYPE "proctrack/aix" +#else +# define DEFAULT_CHECKPOINT_TYPE "checkpoint/none" +# define DEFAULT_PROCTRACK_TYPE "proctrack/pgid" +#endif +#define DEFAULT_PROPAGATE_PRIO_PROCESS 0 +#define DEFAULT_RETURN_TO_SERVICE 0 +#define DEFAULT_SAVE_STATE_LOC "/tmp" +#define DEFAULT_SCHEDROOTFILTER 1 +#define DEFAULT_SCHEDTYPE "sched/builtin" +#ifdef HAVE_BG /* Blue Gene specific default configuration parameters */ +# define DEFAULT_SELECT_TYPE "select/bluegene" +#else +# define DEFAULT_SELECT_TYPE "select/linear" +#endif +#define DEFAULT_SLURMCTLD_PIDFILE "/var/run/slurmctld.pid" +#define DEFAULT_SLURMCTLD_TIMEOUT 120 +#define DEFAULT_SLURMD_PIDFILE "/var/run/slurmd.pid" +#define DEFAULT_SLURMD_TIMEOUT 300 +#define DEFAULT_SPOOLDIR "/var/spool/slurmd" +#define DEFAULT_SWITCH_TYPE "switch/none" +#define DEFAULT_TASK_PLUGIN "task/none" +#define DEFAULT_TMP_FS "/tmp" +#define DEFAULT_WAIT_TIME 0 +#define DEFAULT_TREE_WIDTH 50 + +typedef struct slurm_conf_node { + char *nodenames; + char *hostnames; + char *addresses; + char *feature; /* arbitrary list of features associated */ + uint16_t port; + uint16_t cpus; /* count of cpus running on the node */ + uint16_t sockets; /* number of sockets per node */ + uint16_t cores; /* number of cores per CPU */ + uint16_t threads; /* number of threads per core */ + uint32_t real_memory; /* MB real memory on the node */ + char *reason; + char *state; + uint32_t tmp_disk; /* MB total storage in TMP_FS file system */ + uint32_t weight; /* arbitrary priority of node for + * scheduling work on */ +} slurm_conf_node_t; + +typedef struct slurm_conf_partition { + char *name; /* name of the partition */ + bool hidden_flag; /* 1 if hidden by default */ + uint32_t max_time; /* minutes or INFINITE */ + uint32_t max_nodes; /* per job or INFINITE */ + uint32_t min_nodes; /* per job */ + uint32_t total_nodes; /* total number of nodes in the partition */ + uint32_t total_cpus; /* total number of cpus in the partition */ + bool root_only_flag;/* 1 if allocate/submit RPC can only be + issued by user root */ + uint16_t shared; /* 1 if job can share a node, + 2 if sharing required */ + bool state_up_flag; /* 1 if state is up, 0 if down */ + char *nodes; /* comma delimited list names of nodes */ + char *allow_groups; /* comma delimited list of groups, + * NULL indicates all */ + bool default_flag; +} slurm_conf_partition_t; + +typedef struct slurm_conf_downnodes { + char *nodenames; + char *reason; + char *state; +} slurm_conf_downnodes_t; + +/* + * slurm_conf_init - load the slurm configuration from the a file. + * IN file_name - name of the slurm configuration file to be read + * If file_name is NULL, then this routine tries to use + * the value in the SLURM_CONF env variable. Failing that, + * it uses the compiled-in default file name. + * If the conf structures have already been initialized by a call to + * slurm_conf_init, any subsequent calls will do nothing until + * slurm_conf_destroy is called. + * RET SLURM_SUCCESS if conf file is initialized. If the slurm conf + * was already initialied, return SLURM_ERROR. + * NOTE: Caller must NOT be holding slurm_conf_lock(). + */ +extern int slurm_conf_init(const char *file_name); + +/* + * slurm_conf_reinit - reload the slurm configuration from a file. + * IN file_name - name of the slurm configuration file to be read + * If file_name is NULL, then this routine tries to use + * the value in the SLURM_CONF env variable. Failing that, + * it uses the compiled-in default file name. + * Unlike slurm_conf_init, slurm_conf_reinit will always reread the + * file and reinitialize the configuration structures. + * RET SLURM_SUCCESS if conf file is reinitialized, otherwise SLURM_ERROR. + * NOTE: Caller must NOT be holding slurm_conf_lock(). + */ +extern int slurm_conf_reinit(const char *file_name); + +/* + * slurm_conf_reinit_nolock - reload the slurm configuration from a file. + * This does the same thing as slurm_conf_reinit, but it performs + * no internal locking. You are responsible for calling slurm_conf_lock() + * before calling this function, and calling slurm_conf_unlock() + * afterwards. + * IN file_name - name of the slurm configuration file to be read + * If file_name is NULL, then this routine tries to use + * the value in the SLURM_CONF env variable. Failing that, + * it uses the compiled-in default file name. + * Unlike slurm_conf_init, slurm_conf_reinit will always reread the + * file and reinitialize the configuration structures. + * RET SLURM_SUCCESS if conf file is reinitialized, otherwise SLURM_ERROR. + */ +extern int slurm_conf_reinit_nolock(const char *file_name); + +/* + * slurm_conf_mutex_init - init the slurm_conf mutex + */ +extern void slurm_conf_mutex_init(void); + +/* slurm_conf_install_fork_handlers + * installs what to do with a fork with the conf mutex + */ +void slurm_conf_install_fork_handlers(); + +/* + * NOTE: Caller must NOT be holding slurm_conf_lock(). + */ +extern int slurm_conf_destroy(void); + +extern slurm_ctl_conf_t *slurm_conf_lock(void); + +extern void slurm_conf_unlock(void); + +/* + * Set "ptr_array" with the pointer to an array of pointers to + * slurm_conf_node_t structures. + * + * Return value is the length of the array. + */ +extern int slurm_conf_nodename_array(slurm_conf_node_t **ptr_array[]); + +/* + * Set "ptr_array" with the pointer to an array of pointers to + * slurm_conf_partition_t structures. + * + * Return value is the length of the array. + */ +extern int slurm_conf_partition_array(slurm_conf_partition_t **ptr_array[]); + +/* + * Set "ptr_array" with the pointer to an array of pointers to + * slurm_conf_node_t structures. + * + * Return value is the length of the array. + */ +extern int slurm_conf_downnodes_array(slurm_conf_downnodes_t **ptr_array[]); + +/* + * slurm_conf_get_hostname - Return the NodeHostname for given NodeName + * + * NOTE: Caller must NOT be holding slurm_conf_lock(). + */ +extern char *slurm_conf_get_hostname(const char *node_name); + +/* + * slurm_conf_get_nodename - Return the NodeName for given NodeHostname + * + * NOTE: Caller must NOT be holding slurm_conf_lock(). + */ +extern char *slurm_conf_get_nodename(const char *node_hostname); + +/* + * slurm_conf_get_port - Return the port for a given NodeName + * + * NOTE: Caller must NOT be holding slurm_conf_lock(). + */ +extern uint16_t slurm_conf_get_port(const char *node_name); + +/* + * slurm_conf_get_addr - Return the slurm_addr for a given NodeName in + * the parameter "address". The return code is SLURM_SUCCESS on success, + * and SLURM_FAILURE if the address lookup failed. + * + * NOTE: Caller must NOT be holding slurm_conf_lock(). + */ +extern int slurm_conf_get_addr(const char *node_name, slurm_addr *address); + +/* + * slurm_conf_get_cpus_sct - + * Return the cpus, sockets, cores, and threads configured for a given NodeName + * Returns SLURM_SUCCESS on success, SLURM_FAILURE on failure. + * + * NOTE: Caller must NOT be holding slurm_conf_lock(). + */ +extern int slurm_conf_get_cpus_sct(const char *node_name, + uint16_t *procs, uint16_t *sockets, + uint16_t *cores, uint16_t *threads); + +/* + * init_slurm_conf - initialize or re-initialize the slurm configuration + * values defaults (NULL or NO_VAL). Note that the configuration + * file pathname (slurm_conf) is not changed. + * IN/OUT ctl_conf_ptr - pointer to data structure to be initialized + */ +extern void init_slurm_conf (slurm_ctl_conf_t *ctl_conf_ptr); + +/* + * free_slurm_conf - free all storage associated with a slurm_ctl_conf_t. + * IN/OUT ctl_conf_ptr - pointer to data structure to be freed + */ +extern void free_slurm_conf (slurm_ctl_conf_t *ctl_conf_ptr); + +/* + * getnodename - equivalent to gethostname(), but return only the first + * component of the fully qualified name (e.g. "linux123.foo.bar" + * becomes "linux123") + * NOTE: NodeName in the config may be different from real hostname. + * Use get_conf_node_name() to get the former. + */ +extern int getnodename (char *name, size_t len); + + +#endif /* !_READ_CONFIG_H */ diff --git a/executable_names/src/common/safeopen.c b/executable_names/src/common/safeopen.c new file mode 100644 index 0000000000000000000000000000000000000000..ab79f68f6cf1a51275ca6c135bcafa4a7a330341 --- /dev/null +++ b/executable_names/src/common/safeopen.c @@ -0,0 +1,92 @@ +/*****************************************************************************\ + * safeopen.c - safer interface to open() + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_UNISTD_H +# include +#endif +#include +#include +#include +#include +#include +#include + +#include "src/common/safeopen.h" +#include "src/common/xassert.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + +FILE * safeopen(const char *path, const char *mode, int flags) +{ + int fd; + int oflags; + struct stat fb1, fb2; + + if(mode[0] == 'w') { + oflags = O_WRONLY; + } else if (mode[0] == 'a') { + oflags = O_CREAT | O_WRONLY | O_APPEND; + } else + oflags = O_RDONLY; + + oflags |= !(flags & SAFEOPEN_NOCREATE) ? O_CREAT : 0; + oflags |= (flags & SAFEOPEN_CREATE_ONLY) ? O_EXCL : 0; + + if ((fd = open(path, oflags, S_IRUSR|S_IWUSR)) < 0) + return NULL; + + if (!(flags & SAFEOPEN_LINK_OK)) { + lstat(path, &fb1); + fstat(fd, &fb2); + + if (fb2.st_ino != fb1.st_ino) { + fprintf(stderr, "safeopen(): refusing to open `%s', " + "which is a soft link\n", path); + close(fd); + return NULL; + } + } + + return fdopen(fd, mode); + +} + diff --git a/executable_names/src/common/safeopen.h b/executable_names/src/common/safeopen.h new file mode 100644 index 0000000000000000000000000000000000000000..83ffc49f1e6396f94e4d49e24d1d23cdf818630e --- /dev/null +++ b/executable_names/src/common/safeopen.h @@ -0,0 +1,58 @@ +/*****************************************************************************\ + * safeopen.h - safer interface to open() + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SAFEOPEN_H +#define _SAFEOPEN_H + +#include +#include +#include + +/* safeopen flags: + * + * default is to create if needed, and fail if path is a soft link + */ +#define SAFEOPEN_LINK_OK (1<<0) /* do not check for soft link */ +#define SAFEOPEN_CREATE_ONLY (1<<1) /* create, fail if file exists */ +#define SAFEOPEN_NOCREATE (1<<2) /* fail if file doesn't exist */ + +/* open a file for read, write, or append + * perform some simple sanity checks on file and return stream pointer + */ +FILE *safeopen(const char *path, const char *mode, int flags); + +#endif /* _SAFEOPEN_H */ diff --git a/executable_names/src/common/slurm_auth.c b/executable_names/src/common/slurm_auth.c new file mode 100644 index 0000000000000000000000000000000000000000..c2bde36c06b11960d3a048b6c56154e365528322 --- /dev/null +++ b/executable_names/src/common/slurm_auth.c @@ -0,0 +1,476 @@ +/*****************************************************************************\ + * slurm_auth.c - implementation-independent authentication API definitions + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jay Windley + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include + +#include + +#include "src/common/macros.h" +#include "src/common/xmalloc.h" +#include "src/common/xassert.h" +#include "src/common/xstring.h" +#include "src/common/slurm_auth.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/plugin.h" +#include "src/common/plugrack.h" +#include "src/common/arg_desc.h" + +static bool auth_dummy = false; /* for security testing */ + +/* + * WARNING: Do not change the order of these fields or add additional + * fields at the beginning of the structure. If you do, authentication + * plugins will stop working. If you need to add fields, add them at the + * end of the structure. + */ +typedef struct slurm_auth_ops { + void * (*create) ( void *argv[] ); + int (*destroy) ( void *cred ); + int (*verify) ( void *cred, void *argv[] ); + uid_t (*get_uid) ( void *cred ); + gid_t (*get_gid) ( void *cred ); + int (*pack) ( void *cred, Buf buf ); + void * (*unpack) ( Buf buf ); + int (*print) ( void *cred, FILE *fp ); + int (*sa_errno) ( void *cred ); + const char * (*sa_errstr) ( int slurm_errno ); +} slurm_auth_ops_t; + +/* + * Implementation of the authentication context. Hopefully everything + * having to do with plugins will be abstracted under here so that the + * callers can just deal with creating a context and asking for the + * operations implemented pertinent to that context. + * + * auth_type - the string (presumably from configuration files) + * describing the desired form of authentication, such as "auth/munge" + * or "auth/kerberos" or "auth/none". + * + * plugin_list - the plugin rack managing the loading and unloading of + * plugins for authencation. + * + * cur_plugin - the plugin currently supplying operations to the caller. + * + * ops - a table of pointers to functions in the plugin which correspond + * to the standardized plugin API. We create this table by text references + * into the plugin's symbol table. + */ +struct slurm_auth_context { + char * auth_type; + plugrack_t plugin_list; + plugin_handle_t cur_plugin; + int auth_errno; + slurm_auth_ops_t ops; +}; + +/* + * A global authentication context. "Global" in the sense that there's + * only one, with static bindings. We don't export it. + */ +static slurm_auth_context_t g_context = NULL; +static pthread_mutex_t context_lock = PTHREAD_MUTEX_INITIALIZER; + +/* + * Order of advisory arguments passed to some of the plugins. + */ +static arg_desc_t auth_args[] = { + { ARG_HOST_LIST }, + { ARG_TIMEOUT }, + { NULL } +}; + +/* + * Resolve the operations from the plugin. + */ +static slurm_auth_ops_t * +slurm_auth_get_ops( slurm_auth_context_t c ) +{ + /* + * These strings must be kept in the same order as the fields + * declared for slurm_auth_ops_t. + */ + static const char *syms[] = { + "slurm_auth_create", + "slurm_auth_destroy", + "slurm_auth_verify", + "slurm_auth_get_uid", + "slurm_auth_get_gid", + "slurm_auth_pack", + "slurm_auth_unpack", + "slurm_auth_print", + "slurm_auth_errno", + "slurm_auth_errstr" + }; + int n_syms = sizeof( syms ) / sizeof( char * ); + + /* Get the plugin list, if needed. */ + if ( c->plugin_list == NULL ) { + char *plugin_dir; + c->plugin_list = plugrack_create(); + if ( c->plugin_list == NULL ) { + error( "Unable to create auth plugin manager" ); + return NULL; + } + + plugrack_set_major_type( c->plugin_list, "auth" ); + plugrack_set_paranoia( c->plugin_list, + PLUGRACK_PARANOIA_NONE, + 0 ); + plugin_dir = slurm_get_plugin_dir(); + plugrack_read_dir( c->plugin_list, plugin_dir ); + xfree(plugin_dir); + } + + /* Find the correct plugin. */ + c->cur_plugin = plugrack_use_by_type( c->plugin_list, c->auth_type ); + if ( c->cur_plugin == PLUGIN_INVALID_HANDLE ) { + error( "can't find a plugin for type %s", c->auth_type ); + return NULL; + } + + /* Dereference the API. */ + if ( plugin_get_syms( c->cur_plugin, + n_syms, + syms, + (void **) &c->ops ) < n_syms ) { + error( "incomplete auth plugin detected" ); + return NULL; + } + + return &c->ops; +} + +const arg_desc_t * +slurm_auth_get_arg_desc( void ) +{ + return auth_args; +} + +static void ** +slurm_auth_marshal_args( void *hosts, int timeout ) +{ + static int hostlist_idx = -1; + static int timeout_idx = -1; + static int count = sizeof( auth_args ) / sizeof( struct _arg_desc ) - 1; + void **argv; + + /* Get indices from descriptor, if we haven't already. */ + if ( ( hostlist_idx == -1 ) && + ( timeout_idx == -1 ) ) { + hostlist_idx = arg_idx_by_name( auth_args, ARG_HOST_LIST ); + timeout_idx = arg_idx_by_name( auth_args, ARG_TIMEOUT ); + } + + argv = xmalloc( count * sizeof( void * ) ); + + /* Marshal host list. Don't quite know how to do this yet. */ + argv[ hostlist_idx ] = hosts; + + /* Marshal timeout. + * This strange looking code avoids warnings on IA64 */ + argv[ timeout_idx ] = ((char *) NULL) + timeout; + + return argv; +} + + +slurm_auth_context_t +slurm_auth_context_create( const char *auth_type ) +{ + slurm_auth_context_t c; + + if ( auth_type == NULL ) { + debug3( "slurm_auth_context_create: no authentication type" ); + return NULL; + } + + c = xmalloc( sizeof( struct slurm_auth_context ) ); + + c->auth_errno = SLURM_SUCCESS; + + /* Copy the authentication type. */ + c->auth_type = xstrdup( auth_type ); + if ( c->auth_type == NULL ) { + debug3( "can't make local copy of authentication type" ); + xfree( c ); + return NULL; + } + + /* Plugin rack is demand-loaded on first reference. */ + c->plugin_list = NULL; + c->cur_plugin = PLUGIN_INVALID_HANDLE; + + return c; +} + + +static const char * +slurm_auth_generic_errstr( int slurm_errno ) +{ + static struct { + int err; + const char *msg; + } generic_table[] = { + { SLURM_SUCCESS, "no error" }, + { SLURM_ERROR, "unknown error" }, + { SLURM_AUTH_NOPLUGIN, "no authentication plugin installed" }, + { SLURM_AUTH_BADARG, "bad argument to plugin function" }, + { SLURM_AUTH_MEMORY, "memory management error" }, + { SLURM_AUTH_NOUSER, "no such user" }, + { SLURM_AUTH_INVALID, "authentication credential invalid" }, + { SLURM_AUTH_MISMATCH, "authentication type mismatch" }, + { 0, NULL } + }; + + int i; + + for ( i = 0; ; ++i ) { + if ( generic_table[ i ].msg == NULL ) return NULL; + if ( generic_table[ i ].err == slurm_errno ) + return generic_table[ i ].msg; + } +} + + +static int +_slurm_auth_context_destroy( slurm_auth_context_t c ) +{ + /* + * Must check return code here because plugins might still + * be loaded and active. + */ + if ( c->plugin_list ) { + if ( plugrack_destroy( c->plugin_list ) != SLURM_SUCCESS ) { + return SLURM_ERROR; + } + } + + xfree( c->auth_type ); + xfree( c ); + + return SLURM_SUCCESS; +} + +int inline +slurm_auth_init( void ) +{ + int retval = SLURM_SUCCESS; + char *auth_type = NULL; + + slurm_mutex_lock( &context_lock ); + + if ( g_context ) + goto done; + + auth_type = slurm_get_auth_type(); + if (strcmp(auth_type, "auth/dummy") == 0) { + info( "warning: %s plugin selected", auth_type); + auth_dummy = true; + goto done; + } + + g_context = slurm_auth_context_create( auth_type ); + if ( g_context == NULL ) { + error( "cannot create a context for %s", auth_type ); + retval = SLURM_ERROR; + goto done; + } + + if ( slurm_auth_get_ops( g_context ) == NULL ) { + error( "cannot resolve %s plugin operations", + auth_type ); + _slurm_auth_context_destroy( g_context ); + g_context = NULL; + retval = SLURM_ERROR; + } + + done: + xfree(auth_type); + slurm_mutex_unlock( &context_lock ); + return retval; +} + +/* Release all global memory associated with the plugin */ +extern int +slurm_auth_fini( void ) +{ + int rc; + + if ( !g_context ) + return SLURM_SUCCESS; + + rc = _slurm_auth_context_destroy( g_context ); + g_context = NULL; + return rc; +} + +/* + * Static bindings for the global authentication context. The test + * of the function pointers is omitted here because the global + * context initialization includes a test for the completeness of + * the API function dispatcher. + */ + +void * +g_slurm_auth_create( void *hosts, int timeout ) +{ + void **argv; + void *ret; + + if ( slurm_auth_init() < 0 ) + return NULL; + + if ( auth_dummy ) + return xmalloc(0); + + if ( ( argv = slurm_auth_marshal_args( hosts, timeout ) ) == NULL ) { + return NULL; + } + + ret = (*(g_context->ops.create))( argv ); + xfree( argv ); + return ret; +} + +int +g_slurm_auth_destroy( void *cred ) +{ + if ( slurm_auth_init() < 0 ) + return SLURM_ERROR; + + if ( auth_dummy ) /* don't worry about leak in testing */ + return SLURM_SUCCESS; + + return (*(g_context->ops.destroy))( cred ); +} + +int +g_slurm_auth_verify( void *cred, void *hosts, int timeout ) +{ + int ret; + void **argv; + + if ( slurm_auth_init() < 0 ) + return SLURM_ERROR; + + if ( auth_dummy ) + return SLURM_SUCCESS; + + if ( ( argv = slurm_auth_marshal_args( hosts, timeout ) ) == NULL ) { + return SLURM_ERROR; + } + + ret = (*(g_context->ops.verify))( cred, argv ); + xfree( argv ); + return ret; +} + +uid_t +g_slurm_auth_get_uid( void *cred ) +{ + if (( slurm_auth_init() < 0 ) || auth_dummy ) + return SLURM_AUTH_NOBODY; + + return (*(g_context->ops.get_uid))( cred ); +} + +gid_t +g_slurm_auth_get_gid( void *cred ) +{ + if (( slurm_auth_init() < 0 ) || auth_dummy ) + return SLURM_AUTH_NOBODY; + + return (*(g_context->ops.get_gid))( cred ); +} + +int +g_slurm_auth_pack( void *cred, Buf buf ) +{ + if ( slurm_auth_init() < 0 ) + return SLURM_ERROR; + + if ( auth_dummy ) + return SLURM_SUCCESS; + + return (*(g_context->ops.pack))( cred, buf ); +} + +void * +g_slurm_auth_unpack( Buf buf ) +{ + if (( slurm_auth_init() < 0 ) || auth_dummy ) + return NULL; + + return (*(g_context->ops.unpack))( buf ); +} + +int +g_slurm_auth_print( void *cred, FILE *fp ) +{ + if ( slurm_auth_init() < 0 ) + return SLURM_ERROR; + + if ( auth_dummy ) + return SLURM_SUCCESS; + + return (*(g_context->ops.print))( cred, fp ); +} + +int +g_slurm_auth_errno( void *cred ) +{ + if (( slurm_auth_init() < 0 ) || auth_dummy ) + return SLURM_ERROR; + + return (*(g_context->ops.sa_errno))( cred ); +} + +const char * +g_slurm_auth_errstr( int slurm_errno ) +{ + static char auth_init_msg[] = "authentication initialization failure"; + char *generic; + + if (( slurm_auth_init() < 0 ) || auth_dummy ) + return auth_init_msg; + + if (( generic = (char *) slurm_auth_generic_errstr( slurm_errno ) )) + return generic; + + return (*(g_context->ops.sa_errstr))( slurm_errno ); +} diff --git a/executable_names/src/common/slurm_auth.h b/executable_names/src/common/slurm_auth.h new file mode 100644 index 0000000000000000000000000000000000000000..d4d7ecd427124951d2e2481a1d7c283472a9d4da --- /dev/null +++ b/executable_names/src/common/slurm_auth.h @@ -0,0 +1,168 @@ +/*****************************************************************************\ + * slurm_auth.h - implementation-independent authentication API definitions + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef __SLURM_AUTHENTICATION_H__ +#define __SLURM_AUTHENTICATION_H__ + +#include + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +#include "src/common/plugrack.h" +#include "src/common/pack.h" +#include "src/common/arg_desc.h" + +/* + * This API operates on a global authentication + * context, one per application. The API thunks with the "g_" prefix + * operate on that global instance. It is initialized implicitly if + * necessary when any API thunk is called, or explicitly with + * + * slurm_auth_init(); + * + * The authentication type and other parameters are taken from the + * system's global configuration. A typical order of calls is: + * + * void *bar = g_slurm_auth_alloc(); + * g_slurm_auth_verify( bar ); + * g_slurm_auth_free( bar ); + * + */ + +/* + * General error codes that plugins (or the plugin system) can + * generate. Plugins may produce additional codes starting with + * SLURM_AUTH_FIRST_LOCAL_ERROR. They are responsible for providing + * text messages to accompany the codes. This API resolves string + * messages for these codes. + */ +enum { + SLURM_AUTH_NOPLUGIN, /* No plugin for this type. */ + SLURM_AUTH_BADARG, /* Bad argument to an API func. */ + SLURM_AUTH_MEMORY, /* Problem allocating memory. */ + SLURM_AUTH_NOUSER, /* User not defined on host. */ + SLURM_AUTH_INVALID, /* Invalid credential. */ + SLURM_AUTH_MISMATCH, /* Credential from another plugin. */ + + SLURM_AUTH_FIRST_LOCAL_ERROR /* Always keep me last. */ +}; + +/* + * Text labels for advisory arguments passed to plugin functions. + * Use these labels rather than string literals in order to avoid + * misspellings. + */ +#define ARG_HOST_LIST "HostList" +#define ARG_TIMEOUT "Timeout" + +/* + * Return the argument descriptor for the argument vectors in the + * plugin API. + */ +const arg_desc_t *slurm_auth_get_arg_desc( void ); + +/* + * SLURM authentication context opaque type. + */ +typedef struct slurm_auth_context * slurm_auth_context_t; + +/* + * Create an authentication context. + * + * Returns NULL on failure. + */ +slurm_auth_context_t slurm_auth_context_create( const char *auth_type ); + +/* + * Destroy an authentication context. Any jumptables returned by + * calls to slurm_auth_get_ops() for this context will silently become + * invalid, and calls to their functions may result in core dumps and + * other nasty behavior. + * + * Returns a SLURM errno. + */ +int slurm_auth_context_destroy( slurm_auth_context_t ctxt ); + +/* + * This is what the UID and GID accessors return on error. The value + * is currently RedHat Linux's ID for the user "nobody". + */ +#define SLURM_AUTH_NOBODY 99 + +/* + * Prepare the global context. + */ +extern int slurm_auth_init( void ); + +/* + * Destroy global context, free memory. + */ +extern int slurm_auth_fini( void ); + +/* + * Static bindings for the global authentication context. + */ +extern void *g_slurm_auth_create( void *hosts, int timeout ); +extern int g_slurm_auth_destroy( void *cred ); +extern int g_slurm_auth_verify( void *cred, void *hosts, int timeout ); +extern uid_t g_slurm_auth_get_uid( void *cred ); +extern gid_t g_slurm_auth_get_gid( void *cred ); +extern int g_slurm_auth_pack( void *cred, Buf buf ); + +/* + * WARNING! The returned auth pointer WILL have pointers + * into "buf" so do NOT free "buf" until you are done + * with the auth pointer. + */ +extern void *g_slurm_auth_unpack( Buf buf ); + +int g_slurm_auth_print( void *cred, FILE *fp ); +int g_slurm_auth_errno( void *cred ); +const char *g_slurm_auth_errstr( int slurm_errno ); + +#endif /*__SLURM_AUTHENTICATION_H__*/ diff --git a/executable_names/src/common/slurm_cred.c b/executable_names/src/common/slurm_cred.c new file mode 100644 index 0000000000000000000000000000000000000000..e344d5c5dfce8c97d94176299cbca162686313f6 --- /dev/null +++ b/executable_names/src/common/slurm_cred.c @@ -0,0 +1,1483 @@ +/*****************************************************************************\ + * src/common/slurm_cred.c - SLURM job credential functions + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark A. Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include +#include +#include +#include + +/* + * OpenSSL includes + */ +#include +#include +#include + +#if WITH_PTHREADS +# include +#endif /* WITH_PTHREADS */ + +#include "src/common/macros.h" +#include "src/common/list.h" +#include "src/common/log.h" +#include "src/common/xmalloc.h" +#include "src/common/xassert.h" +#include "src/common/xstring.h" +#include "src/common/io_hdr.h" + +#include "src/common/slurm_cred.h" + +/* + * Default credential information expiration window: + */ +#define DEFAULT_EXPIRATION_WINDOW 600 + +#define MAX_TIME 0x7fffffff + +/* + * slurm job credential state + * + */ +typedef struct { + uint32_t jobid; /* SLURM job id for this credential */ + uint32_t stepid; /* SLURM step id for this credential */ + time_t expiration; /* Time at which cred is no longer good */ +} cred_state_t; + +/* + * slurm job state information + * tracks jobids for which all future credentials have been revoked + * + */ +typedef struct { + uint32_t jobid; + time_t revoked; /* Time at which credentials were revoked */ + time_t ctime; /* Time that this entry was created */ + time_t expiration; /* Time at which credentials can be purged */ +} job_state_t; + + +/* + * Completion of slurm credential context + */ +enum ctx_type { + SLURM_CRED_CREATOR, + SLURM_CRED_VERIFIER +}; + +struct slurm_cred_context { +#ifndef NDEBUG +# define CRED_CTX_MAGIC 0x0c0c0c + int magic; +#endif +#if WITH_PTHREADS + pthread_mutex_t mutex; +#endif + enum ctx_type type; /* type of context (creator or verifier) */ + EVP_PKEY *key; /* private or public key */ + List job_list; /* List of used jobids (for verifier) */ + List state_list; /* List of cred states (for verifier) */ + + int expiry_window; /* expiration window for cached creds */ + + EVP_PKEY *exkey; /* Old public key if key is updated */ + time_t exkey_exp; /* Old key expiration time */ +}; + + +/* + * Completion of slurm job credential type: + * + */ +struct slurm_job_credential { +#ifndef NDEBUG +# define CRED_MAGIC 0x0b0b0b + int magic; +#endif +#ifdef WITH_PTHREADS + pthread_mutex_t mutex; +#endif + uint32_t jobid; /* Job ID associated with this credential */ + uint32_t stepid; /* Job step ID for this credential */ + uid_t uid; /* user for which this cred is valid */ + time_t ctime; /* time of credential creation */ + char *nodes; /* list of hostnames for which the cred is ok*/ + uint32_t alloc_lps_cnt; /* Number of hosts in the list above */ + uint32_t *alloc_lps; /* Number of tasks on each host */ + + unsigned char *signature; /* credential signature */ + unsigned int siglen; /* signature length in bytes */ +}; + + + +/* + * Static prototypes: + */ + +static slurm_cred_ctx_t _slurm_cred_ctx_alloc(void); +static slurm_cred_t _slurm_cred_alloc(void); + +static int _ctx_update_private_key(slurm_cred_ctx_t ctx, const char *path); +static int _ctx_update_public_key(slurm_cred_ctx_t ctx, const char *path); +static bool _exkey_is_valid(slurm_cred_ctx_t ctx); + +static cred_state_t * _cred_state_create(slurm_cred_ctx_t ctx, slurm_cred_t c); +static job_state_t * _job_state_create(uint32_t jobid); +static void _cred_state_destroy(cred_state_t *cs); +static void _job_state_destroy(job_state_t *js); + +static job_state_t * _find_job_state(slurm_cred_ctx_t ctx, uint32_t jobid); +static job_state_t * _insert_job_state(slurm_cred_ctx_t ctx, uint32_t jobid); +static int _find_cred_state(cred_state_t *c, slurm_cred_t cred); + +static void _insert_cred_state(slurm_cred_ctx_t ctx, slurm_cred_t cred); +static void _clear_expired_job_states(slurm_cred_ctx_t ctx); +static void _clear_expired_credential_states(slurm_cred_ctx_t ctx); +static void _verifier_ctx_init(slurm_cred_ctx_t ctx); + +static bool _credential_replayed(slurm_cred_ctx_t ctx, slurm_cred_t cred); +static bool _credential_revoked(slurm_cred_ctx_t ctx, slurm_cred_t cred); + +static EVP_PKEY * _read_private_key(const char *path); +static EVP_PKEY * _read_public_key(const char *path); + +static int _slurm_cred_sign(slurm_cred_ctx_t ctx, slurm_cred_t cred); +static int _slurm_cred_verify_signature(slurm_cred_ctx_t ctx, slurm_cred_t c); + +static job_state_t * _job_state_unpack_one(Buf buffer); +static cred_state_t * _cred_state_unpack_one(Buf buffer); + +static void _pack_cred(slurm_cred_t cred, Buf buffer); +static void _job_state_unpack(slurm_cred_ctx_t ctx, Buf buffer); +static void _job_state_pack(slurm_cred_ctx_t ctx, Buf buffer); +static void _cred_state_unpack(slurm_cred_ctx_t ctx, Buf buffer); +static void _cred_state_pack(slurm_cred_ctx_t ctx, Buf buffer); +static void _job_state_pack_one(job_state_t *j, Buf buffer); +static void _cred_state_pack_one(cred_state_t *s, Buf buffer); + +#ifndef DISABLE_LOCALTIME +static char * timestr (const time_t *tp, char *buf, size_t n); +#endif + +slurm_cred_ctx_t +slurm_cred_creator_ctx_create(const char *path) +{ + slurm_cred_ctx_t ctx = NULL; + + xassert(path != NULL); + + ctx = _slurm_cred_ctx_alloc(); + slurm_mutex_lock(&ctx->mutex); + + ctx->type = SLURM_CRED_CREATOR; + + if (!(ctx->key = _read_private_key(path))) + goto fail; + + slurm_mutex_unlock(&ctx->mutex); + return ctx; + + fail: + slurm_mutex_unlock(&ctx->mutex); + slurm_cred_ctx_destroy(ctx); + return NULL; +} + + +slurm_cred_ctx_t +slurm_cred_verifier_ctx_create(const char *path) +{ + slurm_cred_ctx_t ctx = NULL; + + xassert(path != NULL); + + ctx = _slurm_cred_ctx_alloc(); + slurm_mutex_lock(&ctx->mutex); + + ctx->type = SLURM_CRED_VERIFIER; + + if (!(ctx->key = _read_public_key(path))) + goto fail; + + _verifier_ctx_init(ctx); + + slurm_mutex_unlock(&ctx->mutex); + return ctx; + + fail: + slurm_mutex_unlock(&ctx->mutex); + slurm_cred_ctx_destroy(ctx); + return NULL; +} + + +void +slurm_cred_ctx_destroy(slurm_cred_ctx_t ctx) +{ + if (ctx == NULL) + return; + + slurm_mutex_lock(&ctx->mutex); + xassert(ctx->magic == CRED_CTX_MAGIC); + + if (ctx->key) + EVP_PKEY_free(ctx->key); + if (ctx->job_list) + list_destroy(ctx->job_list); + if (ctx->state_list) + list_destroy(ctx->state_list); + + xassert(ctx->magic = ~CRED_CTX_MAGIC); + + slurm_mutex_unlock(&ctx->mutex); + slurm_mutex_destroy(&ctx->mutex); + + xfree(ctx); + + return; +} + +int +slurm_cred_ctx_set(slurm_cred_ctx_t ctx, slurm_cred_opt_t opt, ...) +{ + int rc = SLURM_SUCCESS; + va_list ap; + + xassert(ctx != NULL); + + va_start(ap, opt); + + slurm_mutex_lock(&ctx->mutex); + xassert(ctx->magic == CRED_CTX_MAGIC); + + switch (opt) { + case SLURM_CRED_OPT_EXPIRY_WINDOW: + ctx->expiry_window = va_arg(ap, int); + break; + default: + slurm_seterrno(EINVAL); + rc = SLURM_ERROR; + break; + } + + slurm_mutex_unlock(&ctx->mutex); + + va_end(ap); + + return rc; +} + +int +slurm_cred_ctx_get(slurm_cred_ctx_t ctx, slurm_cred_opt_t opt, ...) +{ + int rc = SLURM_SUCCESS; + va_list ap; + int *intp; + + xassert(ctx != NULL); + + va_start(ap, opt); + + slurm_mutex_lock(&ctx->mutex); + xassert(ctx->magic == CRED_CTX_MAGIC); + + switch (opt) { + case SLURM_CRED_OPT_EXPIRY_WINDOW: + intp = va_arg(ap, int *); + *intp = ctx->expiry_window; + break; + default: + slurm_seterrno(EINVAL); + rc = SLURM_ERROR; + break; + } + + slurm_mutex_unlock(&ctx->mutex); + + va_end(ap); + + return rc; +} + +int +slurm_cred_ctx_key_update(slurm_cred_ctx_t ctx, const char *path) +{ + if (ctx->type == SLURM_CRED_CREATOR) + return _ctx_update_private_key(ctx, path); + else + return _ctx_update_public_key(ctx, path); +} + + +slurm_cred_t +slurm_cred_create(slurm_cred_ctx_t ctx, slurm_cred_arg_t *arg) +{ + slurm_cred_t cred = NULL; + + xassert(ctx != NULL); + xassert(arg != NULL); + + slurm_mutex_lock(&ctx->mutex); + + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_CREATOR); + + cred = _slurm_cred_alloc(); + + xassert(cred != NULL); + + slurm_mutex_lock(&cred->mutex); + + xassert(cred->magic == CRED_MAGIC); + + cred->jobid = arg->jobid; + cred->stepid = arg->stepid; + cred->uid = arg->uid; + cred->nodes = xstrdup(arg->hostlist); + cred->alloc_lps_cnt = arg->alloc_lps_cnt; + cred->alloc_lps = NULL; + if (cred->alloc_lps_cnt > 0) { + cred->alloc_lps = xmalloc(cred->alloc_lps_cnt * sizeof(int)); + memcpy(cred->alloc_lps, arg->alloc_lps, cred->alloc_lps_cnt * sizeof(int)); + } + cred->ctime = time(NULL); + + if (_slurm_cred_sign(ctx, cred) < 0) + goto fail; + + slurm_mutex_unlock(&ctx->mutex); + slurm_mutex_unlock(&cred->mutex); + + return cred; + + fail: + slurm_mutex_unlock(&ctx->mutex); + slurm_mutex_unlock(&cred->mutex); + slurm_cred_destroy(cred); + return NULL; +} + +slurm_cred_t +slurm_cred_copy(slurm_cred_t cred) +{ + slurm_cred_t rcred = NULL; + + xassert(cred != NULL); + + slurm_mutex_lock(&cred->mutex); + + rcred = _slurm_cred_alloc(); + + xassert(rcred != NULL); + + slurm_mutex_lock(&rcred->mutex); + + xassert(rcred->magic == CRED_MAGIC); + + rcred->jobid = cred->jobid; + rcred->stepid = cred->stepid; + rcred->uid = cred->uid; + rcred->nodes = xstrdup(cred->nodes); + rcred->alloc_lps_cnt = cred->alloc_lps_cnt; + rcred->alloc_lps = NULL; + if (rcred->alloc_lps_cnt > 0) { + rcred->alloc_lps = xmalloc(rcred->alloc_lps_cnt * sizeof(int)); + memcpy(rcred->alloc_lps, cred->alloc_lps, + rcred->alloc_lps_cnt * sizeof(int)); + } + rcred->ctime = cred->ctime; + rcred->signature = (unsigned char *)xstrdup((char *)cred->signature); + + slurm_mutex_unlock(&cred->mutex); + slurm_mutex_unlock(&rcred->mutex); + + return rcred; +} + +slurm_cred_t +slurm_cred_faker(slurm_cred_arg_t *arg) +{ + int fd; + slurm_cred_t cred = NULL; + + xassert(arg != NULL); + + cred = _slurm_cred_alloc(); + + slurm_mutex_lock(&cred->mutex); + + cred->jobid = arg->jobid; + cred->stepid = arg->stepid; + cred->uid = arg->uid; + cred->nodes = xstrdup(arg->hostlist); + cred->alloc_lps_cnt = arg->alloc_lps_cnt; + cred->alloc_lps = NULL; + if (cred->alloc_lps_cnt > 0) { + cred->alloc_lps = xmalloc(cred->alloc_lps_cnt * sizeof(int)); + memcpy(cred->alloc_lps, arg->alloc_lps, cred->alloc_lps_cnt * sizeof(int)); + } + cred->ctime = time(NULL); + cred->siglen = SLURM_IO_KEY_SIZE; + + cred->signature = xmalloc(cred->siglen * sizeof(char)); + + if ((fd = open("/dev/urandom", O_RDONLY)) >= 0) { + if (read(fd, cred->signature, cred->siglen) == -1) + error("reading fake signature from /dev/urandom: %m"); + if (close(fd) < 0) + error("close(/dev/urandom): %m"); + } else { /* Note: some systems lack this file */ + unsigned int i; + struct timeval tv; + gettimeofday(&tv, NULL); + i = (unsigned int) (tv.tv_sec + tv.tv_usec); + srand((unsigned int) i); + for (i=0; isiglen; i++) + cred->signature[i] = (rand() & 0xff); + } + + slurm_mutex_unlock(&cred->mutex); + return cred; + +} + + +int +slurm_cred_verify(slurm_cred_ctx_t ctx, slurm_cred_t cred, + slurm_cred_arg_t *arg) +{ + time_t now = time(NULL); + + xassert(ctx != NULL); + xassert(cred != NULL); + xassert(arg != NULL); + + slurm_mutex_lock(&ctx->mutex); + slurm_mutex_lock(&cred->mutex); + + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_VERIFIER); + xassert(cred->magic == CRED_MAGIC); + + if (_slurm_cred_verify_signature(ctx, cred) < 0) { + slurm_seterrno(ESLURMD_INVALID_JOB_CREDENTIAL); + goto error; + } + + if (now > (cred->ctime + ctx->expiry_window)) { + slurm_seterrno(ESLURMD_CREDENTIAL_EXPIRED); + goto error; + } + + if (_credential_revoked(ctx, cred)) { + slurm_seterrno(ESLURMD_CREDENTIAL_REVOKED); + goto error; + } + + if (_credential_replayed(ctx, cred)) { + slurm_seterrno(ESLURMD_CREDENTIAL_REPLAYED); + goto error; + } + + slurm_mutex_unlock(&ctx->mutex); + + /* + * set arguments to cred contents + */ + arg->jobid = cred->jobid; + arg->stepid = cred->stepid; + arg->uid = cred->uid; + arg->hostlist = xstrdup(cred->nodes); + arg->alloc_lps_cnt = cred->alloc_lps_cnt; + arg->alloc_lps = NULL; + if (arg->alloc_lps_cnt > 0) { + arg->alloc_lps = xmalloc(arg->alloc_lps_cnt * sizeof(int)); + memcpy(arg->alloc_lps, cred->alloc_lps, arg->alloc_lps_cnt * sizeof(int)); + } + + slurm_mutex_unlock(&cred->mutex); + + return SLURM_SUCCESS; + + error: + slurm_mutex_unlock(&ctx->mutex); + slurm_mutex_unlock(&cred->mutex); + return SLURM_ERROR; +} + + +void +slurm_cred_destroy(slurm_cred_t cred) +{ + if (cred == NULL) + return; + + xassert(cred->magic == CRED_MAGIC); + + slurm_mutex_lock(&cred->mutex); + xfree(cred->nodes); + xfree(cred->alloc_lps); + xfree(cred->signature); + xassert(cred->magic = ~CRED_MAGIC); + + slurm_mutex_unlock(&cred->mutex); + slurm_mutex_destroy(&cred->mutex); + + xfree(cred); +} + + +bool +slurm_cred_jobid_cached(slurm_cred_ctx_t ctx, uint32_t jobid) +{ + bool retval = false; + + xassert(ctx != NULL); + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_VERIFIER); + + slurm_mutex_lock(&ctx->mutex); + + _clear_expired_job_states(ctx); + + /* + * Return true if we find a cached job state for job id `jobid' + */ + retval = (_find_job_state(ctx, jobid) != NULL); + + slurm_mutex_unlock(&ctx->mutex); + + return retval; +} + +int +slurm_cred_insert_jobid(slurm_cred_ctx_t ctx, uint32_t jobid) +{ + xassert(ctx != NULL); + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_VERIFIER); + + slurm_mutex_lock(&ctx->mutex); + + _clear_expired_job_states(ctx); + (void) _insert_job_state(ctx, jobid); + + slurm_mutex_unlock(&ctx->mutex); + + return SLURM_SUCCESS; +} + +int +slurm_cred_rewind(slurm_cred_ctx_t ctx, slurm_cred_t cred) +{ + int rc = 0; + + xassert(ctx != NULL); + + slurm_mutex_lock(&ctx->mutex); + + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_VERIFIER); + + rc = list_delete_all(ctx->state_list, (ListFindF) _find_cred_state, cred); + + slurm_mutex_unlock(&ctx->mutex); + + return (rc > 0 ? SLURM_SUCCESS : SLURM_FAILURE); +} + +int +slurm_cred_revoke(slurm_cred_ctx_t ctx, uint32_t jobid, time_t time) +{ + job_state_t *j = NULL; + + xassert(ctx != NULL); + + slurm_mutex_lock(&ctx->mutex); + + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_VERIFIER); + + _clear_expired_job_states(ctx); + + if (!(j = _find_job_state(ctx, jobid))) { + /* + * This node has not yet seen a job step for this + * job. Insert a job state object so that we can + * revoke any future credentials. + */ + j = _insert_job_state(ctx, jobid); + } + + if (j->revoked) { + slurm_seterrno(EEXIST); + goto error; + } + + j->revoked = time; + + slurm_mutex_unlock(&ctx->mutex); + return SLURM_SUCCESS; + + error: + slurm_mutex_unlock(&ctx->mutex); + return SLURM_FAILURE; +} + +int +slurm_cred_begin_expiration(slurm_cred_ctx_t ctx, uint32_t jobid) +{ + char buf[64]; + job_state_t *j = NULL; + + xassert(ctx != NULL); + + slurm_mutex_lock(&ctx->mutex); + + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_VERIFIER); + + _clear_expired_job_states(ctx); + + if (!(j = _find_job_state(ctx, jobid))) { + slurm_seterrno(ESRCH); + goto error; + } + + if (j->expiration < (time_t) MAX_TIME) { + slurm_seterrno(EEXIST); + goto error; + } + + j->expiration = time(NULL) + ctx->expiry_window; + + debug2 ("set revoke expiration for jobid %u to %s", + j->jobid, timestr (&j->expiration, buf, 64) ); + + slurm_mutex_unlock(&ctx->mutex); + return SLURM_SUCCESS; + + error: + slurm_mutex_unlock(&ctx->mutex); + return SLURM_ERROR; +} + +int +slurm_cred_get_signature(slurm_cred_t cred, char **datap, int *datalen) +{ + xassert(cred != NULL); + xassert(datap != NULL); + xassert(datalen != NULL); + + slurm_mutex_lock(&cred->mutex); + + *datap = (char *) cred->signature; + *datalen = cred->siglen; + + slurm_mutex_unlock(&cred->mutex); + + return SLURM_SUCCESS; +} + +void +slurm_cred_pack(slurm_cred_t cred, Buf buffer) +{ + xassert(cred != NULL); + xassert(cred->magic == CRED_MAGIC); + + slurm_mutex_lock(&cred->mutex); + + _pack_cred(cred, buffer); + xassert(cred->siglen > 0); + packmem((char *) cred->signature, (uint16_t) cred->siglen, buffer); + + slurm_mutex_unlock(&cred->mutex); + + return; +} + +slurm_cred_t +slurm_cred_unpack(Buf buffer) +{ + uint16_t len; + uint32_t tmpint; + slurm_cred_t cred = NULL; + char **sigp; + + xassert(buffer != NULL); + + cred = _slurm_cred_alloc(); + slurm_mutex_lock(&cred->mutex); + + sigp = (char **) &cred->signature; + + safe_unpack32( &cred->jobid, buffer); + safe_unpack32( &cred->stepid, buffer); + safe_unpack32( &tmpint, buffer); + cred->uid = tmpint; + safe_unpackstr_xmalloc( &cred->nodes, &len, buffer); + safe_unpack32( &cred->alloc_lps_cnt, buffer); + if (cred->alloc_lps_cnt > 0) + safe_unpack32_array(&cred->alloc_lps, &tmpint, buffer); + safe_unpack_time( &cred->ctime, buffer); + safe_unpackmem_xmalloc( sigp, &len, buffer); + + xassert(len > 0); + + cred->siglen = len; + + slurm_mutex_unlock(&cred->mutex); + return cred; + + unpack_error: + slurm_mutex_unlock(&cred->mutex); + slurm_cred_destroy(cred); + return NULL; +} + +int +slurm_cred_ctx_pack(slurm_cred_ctx_t ctx, Buf buffer) +{ + slurm_mutex_lock(&ctx->mutex); + _job_state_pack(ctx, buffer); + _cred_state_pack(ctx, buffer); + slurm_mutex_unlock(&ctx->mutex); + + return SLURM_SUCCESS; +} + +int +slurm_cred_ctx_unpack(slurm_cred_ctx_t ctx, Buf buffer) +{ + xassert(ctx != NULL); + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_VERIFIER); + + slurm_mutex_lock(&ctx->mutex); + + /* + * Unpack job state list and cred state list from buffer + * appening them onto ctx->state_list and ctx->job_list. + */ + _job_state_unpack(ctx, buffer); + _cred_state_unpack(ctx, buffer); + + slurm_mutex_unlock(&ctx->mutex); + + return SLURM_SUCCESS; +} + +void +slurm_cred_print(slurm_cred_t cred) +{ + int i; + + if (cred == NULL) + return; + + slurm_mutex_lock(&cred->mutex); + + xassert(cred->magic == CRED_MAGIC); + + info("Cred: Jobid %u", cred->jobid ); + info("Cred: Stepid %u", cred->jobid ); + info("Cred: UID %lu", (u_long) cred->uid ); + info("Cred: Nodes %s", cred->nodes ); + info("Cred: alloc_lps_cnt %d", cred->alloc_lps_cnt ); + info("Cred: alloc_lps: "); + for (i=0; ialloc_lps_cnt; i++) + info("alloc_lps[%d] = %d ", i, cred->alloc_lps[i]); + info("Cred: ctime %s", ctime(&cred->ctime) ); + info("Cred: siglen %d", cred->siglen ); + slurm_mutex_unlock(&cred->mutex); + +} + + +static EVP_PKEY * +_read_private_key(const char *path) +{ + FILE *fp = NULL; + EVP_PKEY *pk = NULL; + + xassert(path != NULL); + + if (!(fp = fopen(path, "r"))) { + error ("can't open key file '%s' : %m", path); + return NULL; + } + + if (!PEM_read_PrivateKey(fp, &pk, NULL, NULL)) + error ("PEM_read_PrivateKey [%s]: %m", path); + + fclose(fp); + + return pk; +} + + +static EVP_PKEY * +_read_public_key(const char *path) +{ + FILE *fp = NULL; + EVP_PKEY *pk = NULL; + + xassert(path != NULL); + + if ((fp = fopen(path, "r")) == NULL) { + error ("can't open public key '%s' : %m ", path); + return NULL; + } + + if (!PEM_read_PUBKEY(fp, &pk, NULL, NULL)) + error("PEM_read_PUBKEY[%s]: %m", path); + + fclose(fp); + + return pk; +} + + +static void +_verifier_ctx_init(slurm_cred_ctx_t ctx) +{ + xassert(ctx != NULL); + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_VERIFIER); + + ctx->job_list = list_create((ListDelF) _job_state_destroy); + ctx->state_list = list_create((ListDelF) _cred_state_destroy); + + return; +} + + +static int +_ctx_update_private_key(slurm_cred_ctx_t ctx, const char *path) +{ + EVP_PKEY *pk = NULL; + EVP_PKEY *tmpk = NULL; + + xassert(ctx != NULL); + + if (!(pk = _read_private_key(path))) + return SLURM_ERROR; + + slurm_mutex_lock(&ctx->mutex); + + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_CREATOR); + + tmpk = ctx->key; + ctx->key = pk; + + slurm_mutex_unlock(&ctx->mutex); + + EVP_PKEY_free(tmpk); + + return SLURM_SUCCESS; +} + + +static int +_ctx_update_public_key(slurm_cred_ctx_t ctx, const char *path) +{ + EVP_PKEY *pk = NULL; + + xassert(ctx != NULL); + + if (!(pk = _read_public_key(path))) + return SLURM_ERROR; + + slurm_mutex_lock(&ctx->mutex); + + xassert(ctx->magic == CRED_CTX_MAGIC); + xassert(ctx->type == SLURM_CRED_VERIFIER); + + if (ctx->exkey) + EVP_PKEY_free(ctx->exkey); + + ctx->exkey = ctx->key; + ctx->key = pk; + + /* + * exkey expires in expiry_window seconds plus one minute. + * This should be long enough to capture any keys in-flight. + */ + ctx->exkey_exp = time(NULL) + ctx->expiry_window + 60; + + slurm_mutex_unlock(&ctx->mutex); + return SLURM_SUCCESS; +} + + +static bool +_exkey_is_valid(slurm_cred_ctx_t ctx) +{ + if (!ctx->exkey) return false; + + if (time(NULL) > ctx->exkey_exp) { + debug2("old job credential key slurmd expired"); + EVP_PKEY_free(ctx->exkey); + ctx->exkey = NULL; + return false; + } + + return true; +} + + +static slurm_cred_ctx_t +_slurm_cred_ctx_alloc(void) +{ + slurm_cred_ctx_t ctx = xmalloc(sizeof(*ctx)); + + slurm_mutex_init(&ctx->mutex); + slurm_mutex_lock(&ctx->mutex); + + ctx->key = NULL; + ctx->job_list = NULL; + ctx->state_list = NULL; + ctx->expiry_window = DEFAULT_EXPIRATION_WINDOW; + + ctx->exkey = NULL; + ctx->exkey_exp = (time_t) -1; + + xassert(ctx->magic = CRED_CTX_MAGIC); + + slurm_mutex_unlock(&ctx->mutex); + return ctx; +} + +static slurm_cred_t +_slurm_cred_alloc(void) +{ + slurm_cred_t cred = xmalloc(sizeof(*cred)); + + slurm_mutex_init(&cred->mutex); + + cred->jobid = 0; + cred->stepid = 0; + cred->uid = (uid_t) -1; + cred->nodes = NULL; + cred->alloc_lps_cnt = 0; + cred->alloc_lps = NULL; + cred->signature = NULL; + cred->siglen = 0; + + xassert(cred->magic = CRED_MAGIC); + + return cred; +} + +static const char * +_ssl_error(void) +{ + return ERR_reason_error_string(ERR_get_error()); +} + +#ifdef EXTREME_DEBUG +static void +_print_data(char *data, int datalen) +{ + char buf[1024]; + size_t len = 0; + int i; + + for (i = 0; i < datalen; i += sizeof(char)) + len += sprintf(buf+len, "%02x", data[i]); +} +#endif + +static int +_slurm_cred_sign(slurm_cred_ctx_t ctx, slurm_cred_t cred) +{ + EVP_MD_CTX ectx; + Buf buffer; + int rc = SLURM_SUCCESS; + unsigned int *lenp = &cred->siglen; + int ksize = EVP_PKEY_size(ctx->key); + + /* + * Allocate memory for signature: at most EVP_PKEY_size() bytes + */ + cred->signature = xmalloc(ksize * sizeof(unsigned char)); + + buffer = init_buf(4096); + _pack_cred(cred, buffer); + + EVP_SignInit(&ectx, EVP_sha1()); + EVP_SignUpdate(&ectx, get_buf_data(buffer), get_buf_offset(buffer)); + + if (!(EVP_SignFinal(&ectx, cred->signature, lenp, ctx->key))) { + ERR_print_errors_fp(log_fp()); + rc = SLURM_ERROR; + } + +#ifdef HAVE_EVP_MD_CTX_CLEANUP + /* Note: Likely memory leak if this function is absent */ + EVP_MD_CTX_cleanup(&ectx); +#endif + free_buf(buffer); + + return rc; +} + +static int +_slurm_cred_verify_signature(slurm_cred_ctx_t ctx, slurm_cred_t cred) +{ + EVP_MD_CTX ectx; + Buf buffer; + int rc; + unsigned char *sig = cred->signature; + int siglen = cred->siglen; + + buffer = init_buf(4096); + _pack_cred(cred, buffer); + + debug("Checking credential with %d bytes of sig data", siglen); + + EVP_VerifyInit(&ectx, EVP_sha1()); + EVP_VerifyUpdate(&ectx, get_buf_data(buffer), get_buf_offset(buffer)); + + if (!(rc = EVP_VerifyFinal(&ectx, sig, siglen, ctx->key))) { + /* + * Check against old key if one exists and is valid + */ + if (_exkey_is_valid(ctx)) + rc = EVP_VerifyFinal(&ectx, sig, siglen, ctx->exkey); + } + + if (!rc) { + ERR_load_crypto_strings(); + info("Credential signature check: %s", _ssl_error()); + rc = SLURM_ERROR; + } else + rc = SLURM_SUCCESS; + +#ifdef HAVE_EVP_MD_CTX_CLEANUP + /* Note: Likely memory leak if this function is absent */ + EVP_MD_CTX_cleanup(&ectx); +#endif + free_buf(buffer); + + return rc; +} + + +static void +_pack_cred(slurm_cred_t cred, Buf buffer) +{ + pack32( cred->jobid, buffer); + pack32( cred->stepid, buffer); + pack32((uint32_t) cred->uid, buffer); + packstr( cred->nodes, buffer); + pack32( cred->alloc_lps_cnt, buffer); + if (cred->alloc_lps_cnt > 0) + pack32_array( cred->alloc_lps, cred->alloc_lps_cnt, buffer); + pack_time( cred->ctime, buffer); +} + + +static bool +_credential_replayed(slurm_cred_ctx_t ctx, slurm_cred_t cred) +{ + ListIterator i = NULL; + cred_state_t *s = NULL; + + _clear_expired_credential_states(ctx); + + i = list_iterator_create(ctx->state_list); + + while ((s = list_next(i))) { + if ((s->jobid == cred->jobid) && (s->stepid == cred->stepid)) + break; + } + + list_iterator_destroy(i); + + /* + * If we found a match, this credential is being replayed. + */ + if (s) return true; + + /* + * Otherwise, save the credential state + */ + _insert_cred_state(ctx, cred); + return false; +} + +#ifdef DISABLE_LOCALTIME +extern char * timestr (const time_t *tp, char *buf, size_t n) +#else +static char * timestr (const time_t *tp, char *buf, size_t n) +#endif +{ + char fmt[] = "%y%m%d%H%M%S"; + struct tm tmval; +#ifdef DISABLE_LOCALTIME + static int disabled = 0; + if (buf == NULL) disabled=1; + if (disabled) return NULL; +#endif + if (!localtime_r (tp, &tmval)) + error ("localtime_r: %m"); + strftime (buf, n, fmt, &tmval); + return (buf); +} + +extern bool +slurm_cred_revoked(slurm_cred_ctx_t ctx, slurm_cred_t cred) +{ + job_state_t *j = _find_job_state(ctx, cred->jobid); + + if ((j == NULL) || (j->revoked == (time_t)0)) + return false; + + if (cred->ctime <= j->revoked) + return true; + + /* if we are re-running the job, the new job credential is newer + * than the revoke time (see "scontrol requeue"), purge the old + * job record so this looks like a new job */ + info("re-creating job credential records for job %u", j->jobid); + j->expiration = 0; + _clear_expired_job_states(ctx); + return false; +} + +static bool +_credential_revoked(slurm_cred_ctx_t ctx, slurm_cred_t cred) +{ + job_state_t *j = NULL; + + _clear_expired_job_states(ctx); + + if (!(j = _find_job_state(ctx, cred->jobid))) + (void) _insert_job_state(ctx, cred->jobid); + else if (j->revoked) { + char buf[64]; + debug ("cred for %d revoked. expires at %s", + j->jobid, timestr (&j->expiration, buf, 64)); + return true; + } + + return false; +} + + +static job_state_t * +_find_job_state(slurm_cred_ctx_t ctx, uint32_t jobid) +{ + ListIterator i = NULL; + job_state_t *j = NULL; + + i = list_iterator_create(ctx->job_list); + while ((j = list_next(i)) && (j->jobid != jobid)) {;} + list_iterator_destroy(i); + return j; +} + +static int +_find_cred_state(cred_state_t *c, slurm_cred_t cred) +{ + return ((c->jobid == cred->jobid) && (c->stepid == cred->stepid)); +} + +static job_state_t * +_insert_job_state(slurm_cred_ctx_t ctx, uint32_t jobid) +{ + job_state_t *j = _job_state_create(jobid); + list_append(ctx->job_list, j); + return j; +} + + +static job_state_t * +_job_state_create(uint32_t jobid) +{ + job_state_t *j = xmalloc(sizeof(*j)); + + j->jobid = jobid; + j->revoked = (time_t) 0; + j->ctime = time(NULL); + j->expiration = (time_t) MAX_TIME; + + return j; +} + +static void +_job_state_destroy(job_state_t *j) +{ + debug3 ("destroying job %u state", j->jobid); + xfree(j); +} + + +static void +_clear_expired_job_states(slurm_cred_ctx_t ctx) +{ + char t1[64], t2[64]; + time_t now = time(NULL); + ListIterator i = NULL; + job_state_t *j = NULL; + + i = list_iterator_create(ctx->job_list); + + while ((j = list_next(i))) { + debug3 ("job state %u: ctime:%s%s%s", + j->jobid, timestr (&j->ctime, t1, 64), + j->revoked ? " revoked:" : " expires:", + timestr (&j->ctime, t1, 64), + j->revoked ? timestr (&j->expiration, t2, 64) : ""); + + if (j->revoked && (now > j->expiration)) { + list_delete(i); + } + } + + list_iterator_destroy(i); +} + + +static void +_clear_expired_credential_states(slurm_cred_ctx_t ctx) +{ + time_t now = time(NULL); + ListIterator i = NULL; + cred_state_t *s = NULL; + + i = list_iterator_create(ctx->state_list); + + while ((s = list_next(i))) { + if (now > s->expiration) + list_delete(i); + } + + list_iterator_destroy(i); +} + + +static void +_insert_cred_state(slurm_cred_ctx_t ctx, slurm_cred_t cred) +{ + cred_state_t *s = _cred_state_create(ctx, cred); + list_append(ctx->state_list, s); +} + + +static cred_state_t * +_cred_state_create(slurm_cred_ctx_t ctx, slurm_cred_t cred) +{ + cred_state_t *s = xmalloc(sizeof(*s)); + + s->jobid = cred->jobid; + s->stepid = cred->stepid; + s->expiration = cred->ctime + ctx->expiry_window; + + return s; +} + +static void +_cred_state_destroy(cred_state_t *s) +{ + xfree(s); +} + + +static void +_cred_state_pack_one(cred_state_t *s, Buf buffer) +{ + pack32(s->jobid, buffer); + pack32(s->stepid, buffer); + pack_time(s->expiration, buffer); +} + + +static cred_state_t * +_cred_state_unpack_one(Buf buffer) +{ + cred_state_t *s = xmalloc(sizeof(*s)); + + safe_unpack32(&s->jobid, buffer); + safe_unpack32(&s->stepid, buffer); + safe_unpack_time(&s->expiration, buffer); + return s; + + unpack_error: + _cred_state_destroy(s); + return NULL; +} + + +static void +_job_state_pack_one(job_state_t *j, Buf buffer) +{ + pack32(j->jobid, buffer); + pack_time(j->revoked, buffer); + pack_time(j->ctime, buffer); + pack_time(j->expiration, buffer); +} + + +static job_state_t * +_job_state_unpack_one(Buf buffer) +{ + char buf1[64], buf2[64]; + job_state_t *j = xmalloc(sizeof(*j)); + + safe_unpack32( &j->jobid, buffer); + safe_unpack_time( &j->revoked, buffer); + safe_unpack_time( &j->ctime, buffer); + safe_unpack_time( &j->expiration, buffer); + + debug3("cred_unpack:job %d ctime:%s%s%s", + j->jobid, + timestr (&j->ctime, buf1, 64), + (j->revoked ? " revoked:" : " expires:"), + j->revoked ? timestr (&j->expiration, buf2, 64) : ""); + + if (j->revoked) { + if (j->expiration == (time_t) MAX_TIME) { + info ("Warning: revoke on job %d has no expiration", + j->jobid); + j->expiration = j->revoked + 600; + } + } + + return j; + + unpack_error: + _job_state_destroy(j); + return NULL; +} + + +static void +_cred_state_pack(slurm_cred_ctx_t ctx, Buf buffer) +{ + ListIterator i = NULL; + cred_state_t *s = NULL; + + pack32(list_count(ctx->state_list), buffer); + + i = list_iterator_create(ctx->state_list); + while ((s = list_next(i))) + _cred_state_pack_one(s, buffer); + list_iterator_destroy(i); +} + + +static void +_cred_state_unpack(slurm_cred_ctx_t ctx, Buf buffer) +{ + time_t now = time(NULL); + uint32_t n; + int i = 0; + cred_state_t *s = NULL; + + safe_unpack32(&n, buffer); + + for (i = 0; i < n; i++) { + if (!(s = _cred_state_unpack_one(buffer))) + goto unpack_error; + + if (now < s->expiration) + list_append(ctx->state_list, s); + } + + return; + + unpack_error: + error("Unable to unpack job credential state information"); + return; +} + + +static void +_job_state_pack(slurm_cred_ctx_t ctx, Buf buffer) +{ + ListIterator i = NULL; + job_state_t *j = NULL; + + pack32((uint32_t) list_count(ctx->job_list), buffer); + + + i = list_iterator_create(ctx->job_list); + while ((j = list_next(i))) + _job_state_pack_one(j, buffer); + list_iterator_destroy(i); +} + + +static void +_job_state_unpack(slurm_cred_ctx_t ctx, Buf buffer) +{ + time_t now = time(NULL); + uint32_t n = 0; + int i = 0; + job_state_t *j = NULL; + + safe_unpack32(&n, buffer); + + for (i = 0; i < n; i++) { + if (!(j = _job_state_unpack_one(buffer))) + goto unpack_error; + + if (!j->revoked || (j->revoked && (now < j->expiration))) + list_append(ctx->job_list, j); + else + debug3 ("not appending expired job %u state", j->jobid); + } + + return; + + unpack_error: + error("Unable to unpack job state information"); + return; +} + + diff --git a/executable_names/src/common/slurm_cred.h b/executable_names/src/common/slurm_cred.h new file mode 100644 index 0000000000000000000000000000000000000000..3077fbaec30794ff16f557e263148a3bf397fbc0 --- /dev/null +++ b/executable_names/src/common/slurm_cred.h @@ -0,0 +1,254 @@ +/*****************************************************************************\ + * src/common/slurm_cred.h - SLURM job credential operations + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _HAVE_SLURM_CRED_H +#define _HAVE_SLURM_CRED_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_UNISTD_H +# include +#endif + +#if HAVE_SYS_TYPES_H +# include +#endif + +#include "src/common/macros.h" +#include "src/common/pack.h" + +/* + * The incomplete slurm_cred_t type is also defined in slurm.h for + * users of the api, so check to ensure that this header has not been + * included after slurm.h: + */ +#ifndef __slurm_cred_t_defined +# define __slurm_cred_t_defined + typedef struct slurm_job_credential * slurm_cred_t; +#endif + +/* + * The slurm_cred_ctx_t incomplete type + */ +typedef struct slurm_cred_context * slurm_cred_ctx_t; + + +/* + * Initialize current process for slurm credential creation. + * + * `privkey' contains the absolute path to the slurmctld private + * key, which needs to be readable by the current process. + * + * Returns 0 for success, -1 on failure and sets errno to reason. + * + * + */ +slurm_cred_ctx_t slurm_cred_creator_ctx_create(const char *privkey); + +/* + * Initialize current process for slurm credential verification. + * `pubkey' contains the absolute path to the slurmctld public key. + * + * Returns 0 for success, -1 on failure. + */ +slurm_cred_ctx_t slurm_cred_verifier_ctx_create(const char *pubkey); + +/* + * Set and get credential context options + * + */ +typedef enum { + SLURM_CRED_OPT_EXPIRY_WINDOW /* expiration time of creds (int ); */ +} slurm_cred_opt_t; + +int slurm_cred_ctx_set(slurm_cred_ctx_t ctx, slurm_cred_opt_t opt, ...); +int slurm_cred_ctx_get(slurm_cred_ctx_t ctx, slurm_cred_opt_t opt, ...); + +/* + * Update the context's current key. + */ +int slurm_cred_ctx_key_update(slurm_cred_ctx_t ctx, const char *keypath); + + +/* + * Destroy a credential context, freeing associated memory. + */ +void slurm_cred_ctx_destroy(slurm_cred_ctx_t ctx); + +/* + * Pack and unpack slurm credential context. + * + * On pack() ctx is packed in machine-independent format into the + * buffer, on unpack() the contents of the buffer are used to + * intialize the state of the context ctx. + */ +int slurm_cred_ctx_pack(slurm_cred_ctx_t ctx, Buf buffer); +int slurm_cred_ctx_unpack(slurm_cred_ctx_t ctx, Buf buffer); + + +/* + * Container for SLURM credential create and verify arguments: + */ +typedef struct { + uint32_t jobid; + uint32_t stepid; + uid_t uid; + char *hostlist; + uint32_t alloc_lps_cnt; + uint32_t *alloc_lps; +} slurm_cred_arg_t; + +/* + * Create a slurm credential using the values in `arg.' + * The credential is signed using the creators public key. + * + * `arg' must be non-NULL and have valid values. The arguments + * will be copied as is into the slurm job credential. + * + * Returns NULL on failure. + */ +slurm_cred_t slurm_cred_create(slurm_cred_ctx_t ctx, slurm_cred_arg_t *arg); + +/* + * Copy a slurm credential. + * Returns NULL on failure. + */ +slurm_cred_t slurm_cred_copy(slurm_cred_t cred); + +/* + * Create a "fake" credential with bogus data in the signature. + * This function can be used for testing, or when srun would like + * to talk to slurmd directly, bypassing the controller + * (which normally signs creds) + */ +slurm_cred_t slurm_cred_faker(slurm_cred_arg_t *arg); + +/* + * Verify the signed credential `cred,' and return cred contents in + * the cred_arg structure. The credential is cached and cannot be reused. + * + */ +int slurm_cred_verify(slurm_cred_ctx_t ctx, slurm_cred_t cred, + slurm_cred_arg_t *arg); + +/* + * Rewind the last play of credential cred. This allows the credential + * be used again. Returns SLURM_FAILURE if no credential state is found + * to be rewound, SLURM_SUCCESS otherwise. + */ +int slurm_cred_rewind(slurm_cred_ctx_t ctx, slurm_cred_t cred); + +/* + * Revoke all credentials for job id jobid + * time IN - the time the job terminiation was requested by slurmctld + * (local time from slurmctld server) + */ +int slurm_cred_revoke(slurm_cred_ctx_t ctx, uint32_t jobid, time_t time); + +/* + * Report if a all credentials for a give job id have been + * revoked (i.e. has the job been killed) + * + * If we are re-running the job, the new job credential is newer + * than the revoke time, see "scontrol requeue", purge the old + * job record and make like it never existed + */ +bool slurm_cred_revoked(slurm_cred_ctx_t ctx, slurm_cred_t cred); + +/* + * Begin expiration period for the revocation of credentials + * for job id jobid. This should be run after slurm_cred_revoke() + * This function is used because we may want to revoke credentials + * for a jobid, but not purge the revocation from memory until after + * some other action has occurred, e.g. completion of a job epilog. + * + * Returns 0 for success, SLURM_ERROR for failure with errno set to: + * + * ESRCH if jobid is not cached + * EEXIST if expiration period has already begun for jobid. + * + */ +int slurm_cred_begin_expiration(slurm_cred_ctx_t ctx, uint32_t jobid); + + +/* + * Returns true if the credential context has a cached state for + * job id jobid. + */ +bool slurm_cred_jobid_cached(slurm_cred_ctx_t ctx, uint32_t jobid); + + +/* + * Add a jobid to the slurm credential context without inserting + * a credential state. This is used by the verifier to track job ids + * that it has seen, but not necessarily received a credential for. + */ +int slurm_cred_insert_jobid(slurm_cred_ctx_t ctx, uint32_t jobid); + +/* Free memory associated with slurm credential `cred.' + */ +void slurm_cred_destroy(slurm_cred_t cred); + +/* + * Pack a slurm credential for network transmission + */ +void slurm_cred_pack(slurm_cred_t cred, Buf buffer); + +/* + * Unpack a slurm job credential + */ +slurm_cred_t slurm_cred_unpack(Buf buffer); + +/* + * Get a pointer to the slurm credential signature + * (used by slurm IO connections to verify connecting agent) + */ +int slurm_cred_get_signature(slurm_cred_t cred, char **datap, int *len); + + +/* + * Print a slurm job credential using the info() call + */ +void slurm_cred_print(slurm_cred_t cred); + +#ifdef DISABLE_LOCALTIME +extern char * timestr (const time_t *tp, char *buf, size_t n); +#endif +#endif /* _HAVE_SLURM_CREDS_H */ diff --git a/executable_names/src/common/slurm_errno.c b/executable_names/src/common/slurm_errno.c new file mode 100644 index 0000000000000000000000000000000000000000..3bcd7d27dff018576b3315f8ceca17a87e8dc5ce --- /dev/null +++ b/executable_names/src/common/slurm_errno.c @@ -0,0 +1,362 @@ +/*****************************************************************************\ + * slurm_errno.c - error codes and functions for slurm + ****************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jim Garlick , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +/* This implementation relies on "overloading" the libc errno by + * partitioning its domain into system (<1000) and SLURM (>=1000) values. + * SLURM API functions should call slurm_seterrno() to set errno to a value. + * API users should call slurm_strerror() to convert all errno values to + * their description strings. + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include + +#include "src/common/slurm_jobcomp.h" +#include "src/common/switch.h" + +/* Type for error string table entries */ +typedef struct { + int xe_number; + char *xe_message; +} slurm_errtab_t; + +/* Add new error values to slurm/slurm_errno.h, and their descriptions to this table */ +static slurm_errtab_t slurm_errtab[] = { + {0, "No error"}, + {-1, "Unspecified error"}, + {EINPROGRESS, "Operation already in progress"}, + + /*General Message error codes */ + { SLURM_UNEXPECTED_MSG_ERROR, + "Unexpected message received" }, + { SLURM_COMMUNICATIONS_CONNECTION_ERROR, + "Communication connection failure" }, + { SLURM_COMMUNICATIONS_SEND_ERROR, + "Message send failure" }, + { SLURM_COMMUNICATIONS_RECEIVE_ERROR, + "Message receive failure" }, + { SLURM_COMMUNICATIONS_SHUTDOWN_ERROR, + "Communication shutdown failure" }, + { SLURM_PROTOCOL_VERSION_ERROR, + "Protocol version has changed, re-link your code" }, + { SLURM_PROTOCOL_IO_STREAM_VERSION_ERROR, + "I/O stream version number error" }, + { SLURM_PROTOCOL_AUTHENTICATION_ERROR, + "Protocol authentication error" }, + { SLURM_PROTOCOL_INSANE_MSG_LENGTH, + "Insane message length" }, + + /* communication failures to/from slurmctld */ + { SLURMCTLD_COMMUNICATIONS_CONNECTION_ERROR, + "Unable to contact slurm controller (connect failure)" }, + { SLURMCTLD_COMMUNICATIONS_SEND_ERROR, + "Unable to contact slurm controller (send failure)" }, + { SLURMCTLD_COMMUNICATIONS_RECEIVE_ERROR, + "Unable to contact slurm controller (receive failure)" }, + { SLURMCTLD_COMMUNICATIONS_SHUTDOWN_ERROR, + "Unable to contact slurm controller (shutdown failure)"}, + + /* _info.c/communcation layer RESPONSE_SLURM_RC message codes */ + + { SLURM_NO_CHANGE_IN_DATA, /* Not really an error */ + "Data has not changed since time specified" }, + + /* slurmctld error codes */ + + { ESLURM_INVALID_PARTITION_NAME, + "Invalid partition name specified" }, + { ESLURM_DEFAULT_PARTITION_NOT_SET, + "No partition specified or system default partition" }, + { ESLURM_ACCESS_DENIED, + "Access denied" }, + { ESLURM_JOB_MISSING_REQUIRED_PARTITION_GROUP, + "User's group not permitted to use this partition" }, + { ESLURM_REQUESTED_NODES_NOT_IN_PARTITION, + "Requested nodes not in this partition" }, + { ESLURM_TOO_MANY_REQUESTED_CPUS, + "More processors requested than permitted" }, + { ESLURM_TOO_MANY_REQUESTED_NODES, + "More nodes requested than permitted" }, + { ESLURM_ERROR_ON_DESC_TO_RECORD_COPY, + "Unable to create job record, try again" }, + { ESLURM_JOB_MISSING_SIZE_SPECIFICATION, + "Job size specification needs to be provided" }, + { ESLURM_JOB_SCRIPT_MISSING, + "Job script not specified" }, + { ESLURM_USER_ID_MISSING, + "Invalid user id" }, + { ESLURM_DUPLICATE_JOB_ID, + "Duplicate job id" }, + { ESLURM_PATHNAME_TOO_LONG, + "Pathname of a file or directory too long" }, + { ESLURM_NOT_TOP_PRIORITY, + "Immediate execution impossible, insufficient priority" }, + { ESLURM_REQUESTED_NODE_CONFIG_UNAVAILABLE, + "Requested node configuration is not available" }, + { ESLURM_REQUESTED_PART_CONFIG_UNAVAILABLE, + "Requested partition configuration not available now" }, + { ESLURM_NODES_BUSY, + "Requested nodes are busy" }, + { ESLURM_INVALID_JOB_ID, + "Invalid job id specified" }, + { ESLURM_INVALID_NODE_NAME, + "Invalid node name specified" }, + { ESLURM_WRITING_TO_FILE, + "I/O error writing script/environment to file" }, + { ESLURM_TRANSITION_STATE_NO_UPDATE, + "Job can not be altered now, try again later" }, + { ESLURM_ALREADY_DONE, + "Job/step already completed" }, + { ESLURM_INTERCONNECT_FAILURE, + "Error configuring interconnect" }, + { ESLURM_BAD_DIST, + "Task distribution specification invalid" }, + { ESLURM_JOB_PENDING, + "Job is pending execution" }, + { ESLURM_BAD_TASK_COUNT, + "Task count specification invalid" }, + { ESLURM_INVALID_JOB_CREDENTIAL, + "Error generating job credential" }, + { ESLURM_IN_STANDBY_MODE, + "Slurm backup controller in standby mode" }, + { ESLURM_INVALID_NODE_STATE, + "Invalid node state specified" }, + { ESLURM_INVALID_FEATURE, + "Invalid feature specification" }, + { ESLURM_INVALID_AUTHTYPE_CHANGE, + "AuthType change requires restart of all SLURM daemons and commands"}, + { ESLURM_INVALID_CHECKPOINT_TYPE_CHANGE, + "Invalid change in CheckpointType requested" }, + { ESLURM_INVALID_SCHEDTYPE_CHANGE, + "Invalid change in SchedulerType requested" }, + { ESLURM_INVALID_SELECTTYPE_CHANGE, + "Invalid change in SelectType requested" }, + { ESLURM_INVALID_SWITCHTYPE_CHANGE, + "SwitchType change requires restart of all SLURM daemons and jobs"}, + { ESLURM_FRAGMENTATION, + "Immediate execution impossible, " + "resources too fragmented for allocation" }, + { ESLURM_NOT_SUPPORTED, + "Requested operation not supported on this system" }, + { ESLURM_DISABLED, + "Requested operation is presently disabled" }, + { ESLURM_DEPENDENCY, + "Immediate execution impossible, job dependency problem"}, + { ESLURM_BATCH_ONLY, + "Only batch jobs are accepted or processed" }, + { ESLURM_TASKDIST_ARBITRARY_UNSUPPORTED, + "Current SwitchType does not permit arbitrary task distribution"}, + { ESLURM_TASKDIST_REQUIRES_OVERCOMMIT, + "Requested more tasks than available processors" }, + { ESLURM_JOB_HELD, + "Job is in held state, pending scheduler release" }, + + /* slurmd error codes */ + + { ESLRUMD_PIPE_ERROR_ON_TASK_SPAWN, + "Pipe error on task spawn" }, + { ESLURMD_KILL_TASK_FAILED, + "Kill task failed" }, + { ESLURMD_UID_NOT_FOUND, + "User not found on host" }, + { ESLURMD_GID_NOT_FOUND, + "Group ID not found on host" }, + { ESLURMD_INVALID_JOB_CREDENTIAL, + "Invalid job credential" }, + { ESLURMD_CREDENTIAL_REVOKED, + "Job credential revoked" }, + { ESLURMD_CREDENTIAL_EXPIRED, + "Job credential expired" }, + { ESLURMD_CREDENTIAL_REPLAYED, + "Job credential replayed" }, + { ESLURMD_CREATE_BATCH_DIR_ERROR, + "Slurmd could not create a batch directory" }, + { ESLURMD_MODIFY_BATCH_DIR_ERROR, + "Slurmd could not chown or chmod a batch directory" }, + { ESLURMD_CREATE_BATCH_SCRIPT_ERROR, + "Slurmd could not create a batch script" }, + { ESLURMD_MODIFY_BATCH_SCRIPT_ERROR, + "Slurmd could not chown or chmod a batch script" }, + { ESLURMD_SETUP_ENVIRONMENT_ERROR, + "Slurmd could not set up environment for batch job" }, + { ESLURMD_SHARED_MEMORY_ERROR, + "Slurmd shared memory error" }, + { ESLURMD_SET_UID_OR_GID_ERROR, + "Slurmd could not set UID or GID" }, + { ESLURMD_SET_SID_ERROR, + "Slurmd could not set session ID" }, + { ESLURMD_CANNOT_SPAWN_IO_THREAD, + "Slurmd could not spawn I/O thread" }, + { ESLURMD_FORK_FAILED, + "Slurmd could not fork job" }, + { ESLURMD_EXECVE_FAILED, + "Slurmd could not execve job" }, + { ESLURMD_IO_ERROR, + "Slurmd could not connect IO" }, + { ESLURMD_PROLOG_FAILED, + "Job prolog failed" }, + { ESLURMD_EPILOG_FAILED, + "Job epilog failed" }, + { ESLURMD_SESSION_KILLED, + "Session manager killed" }, + { ESLURMD_TOOMANYSTEPS, + "Too many job steps on node" }, + { ESLURMD_STEP_EXISTS, + "Job step already in shared memory" }, + { ESLURMD_JOB_NOTRUNNING, + "Job step not running" }, + { ESLURMD_STEP_SUSPENDED, + "Job step is suspended" }, + { ESLURMD_STEP_NOTSUSPENDED, + "Job step is not currently suspended" }, + + /* slurmd errors in user batch job */ + { ESCRIPT_CHDIR_FAILED, + "unable to change directory to work directory" }, + { ESCRIPT_OPEN_OUTPUT_FAILED, + "cound not open output file" }, + { ESCRIPT_NON_ZERO_RETURN, + "Script terminated with non-zero exit code" }, + + + /* socket specific SLURM communications error */ + + { SLURM_PROTOCOL_SOCKET_IMPL_ZERO_RECV_LENGTH, + "Received zero length message" }, + { SLURM_PROTOCOL_SOCKET_IMPL_NEGATIVE_RECV_LENGTH, + "Received message length < 0" }, + { SLURM_PROTOCOL_SOCKET_IMPL_NOT_ALL_DATA_SENT, + "Failed to send entire message" }, + { ESLURM_PROTOCOL_INCOMPLETE_PACKET, + "Header lengths are longer than data received" }, + { SLURM_PROTOCOL_SOCKET_IMPL_TIMEOUT, + "Socket timed out on send/recv operation" }, + { SLURM_PROTOCOL_SOCKET_ZERO_BYTES_SENT, + "Zero Bytes were transmitted or received" }, + + /* slurm_auth errors */ + + { ESLURM_AUTH_CRED_INVALID, + "Invalid authentication credential" }, + { ESLURM_AUTH_FOPEN_ERROR, + "Failed to open authentication public key" }, + { ESLURM_AUTH_NET_ERROR, + "Failed to connect to authentication agent" } +}; + +/* + * Linear search through table of errno values and strings, + * returns NULL on error, string on success. + */ +static char *_lookup_slurm_api_errtab(int errnum) +{ + char *res = NULL; + int i; + + for (i = 0; i < sizeof(slurm_errtab) / sizeof(slurm_errtab_t); i++) { + if (slurm_errtab[i].xe_number == errnum) { + res = slurm_errtab[i].xe_message; + break; + } + } + + if ((res == NULL) && + (errnum >= ESLURM_JOBCOMP_MIN) && + (errnum <= ESLURM_JOBCOMP_MAX)) + res = g_slurm_jobcomp_strerror(errnum); + +#if 0 + /* If needed, re-locate slurmctld/sched_plugin.[ch] into common */ + if ((res == NULL) && + (errnum >= ESLURM_SCHED_MIN) && + (errnum <= ESLURM_SCHED_MAX)) + res = sched_strerror(errnum); +#endif + + if ((res == NULL) && + (errnum >= ESLURM_SWITCH_MIN) && + (errnum <= ESLURM_SWITCH_MAX)) + res = switch_strerror(errnum); + + return res; +} + +/* + * Return string associated with error (SLURM or system). + * Always returns a valid string (because strerror always does). + */ +char *slurm_strerror(int errnum) +{ + char *res = _lookup_slurm_api_errtab(errnum); + return (res ? res : strerror(errnum)); +} + +/* + * Get errno + */ +int slurm_get_errno() +{ + return errno; +} + +/* + * Set errno to the specified value. + */ +void slurm_seterrno(int errnum) +{ +#ifdef __set_errno + __set_errno(errnum); +#else + errno = errnum; +#endif +} + +/* + * Print "message: error description" on stderr for current errno value. + */ +void slurm_perror(char *msg) +{ + fprintf(stderr, "%s: %s\n", msg, slurm_strerror(errno)); +} diff --git a/executable_names/src/common/slurm_jobacct.c b/executable_names/src/common/slurm_jobacct.c new file mode 100644 index 0000000000000000000000000000000000000000..e502b286bc7df910902efb4df316e6ca9e8f386d --- /dev/null +++ b/executable_names/src/common/slurm_jobacct.c @@ -0,0 +1,602 @@ +/*****************************************************************************\ + * slurm_jobacct.c - implementation-independent job accounting logging + * functions + ***************************************************************************** + * Copyright (C) 2003 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jay Windley , Morris Jette + * UCRL-CODE-217948. + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +/*****************************************************************************\ + * Modification history + * + * 19 Jan 2005 by Andy Riebs + * This file is derived from the file slurm_jobcomp.c, written by + * Morris Jette, et al. +\*****************************************************************************/ + +#include +#include +#include + +#include "src/common/macros.h" +#include "src/common/plugin.h" +#include "src/common/plugrack.h" +#include "src/common/slurm_jobacct.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" + + +/* + * The following global is used by the jobacct/log plugin; it must + * persist when the plugin is reloaded, so we define it here. + */ +extern FILE * JOBACCT_LOGFILE; + +/* + * WARNING: Do not change the order of these fields or add additional + * fields at the beginning of the structure. If you do, job accounting + * plugins will stop working. If you need to add fields, add them + * at the end of the structure. + */ +typedef struct slurm_jobacct_ops { + int (*jobacct_init_struct) (jobacctinfo_t *jobacct, + jobacct_id_t *jobacct_id); + jobacctinfo_t *(*jobacct_alloc)(jobacct_id_t *jobacct_id); + void (*jobacct_free) (jobacctinfo_t *jobacct); + int (*jobacct_setinfo) (jobacctinfo_t *jobacct, + enum jobacct_data_type type, + void *data); + int (*jobacct_getinfo) (jobacctinfo_t *jobacct, + enum jobacct_data_type type, + void *data); + void (*jobacct_aggregate) (jobacctinfo_t *dest, + jobacctinfo_t *from); + void (*jobacct_2_sacct) (sacct_t *sacct, + jobacctinfo_t *jobacct); + void (*jobacct_pack) (jobacctinfo_t *jobacct, Buf buffer); + int (*jobacct_unpack) (jobacctinfo_t **jobacct, Buf buffer); + int (*jobacct_init) (char *job_acct_log); + int (*jobacct_fini) (); + int (*jobacct_job_start) (struct job_record *job_ptr); + int (*jobacct_job_complete) (struct job_record *job_ptr); + int (*jobacct_step_start) (struct step_record *step); + int (*jobacct_step_complete) (struct step_record *step); + int (*jobacct_suspend) (struct job_record *job_ptr); + int (*jobacct_startpoll) (int frequency); + int (*jobacct_endpoll) (); + int (*jobacct_add_task) (pid_t pid, jobacct_id_t *jobacct_id); + jobacctinfo_t *(*jobacct_stat_task)(pid_t pid); + jobacctinfo_t *(*jobacct_remove_task)(pid_t pid); + void (*jobacct_suspendpoll) (); +} slurm_jobacct_ops_t; + +/* + * A global job accounting context. "Global" in the sense that there's + * only one, with static bindings. We don't export it. + */ + +typedef struct slurm_jobacct_context { + char *jobacct_type; + plugrack_t plugin_list; + plugin_handle_t cur_plugin; + int jobacct_errno; + slurm_jobacct_ops_t ops; +} slurm_jobacct_context_t; + +static slurm_jobacct_context_t *g_jobacct_context = NULL; +static pthread_mutex_t g_jobacct_context_lock = PTHREAD_MUTEX_INITIALIZER; + +static int _slurm_jobacct_init(void); +static int _slurm_jobacct_fini(void); + +static slurm_jobacct_context_t * +_slurm_jobacct_context_create( const char *jobacct_type) +{ + slurm_jobacct_context_t *c; + + if ( jobacct_type == NULL ) { + error( "_slurm_jobacct_context_create: no jobacct type" ); + return NULL; + } + + c = xmalloc( sizeof( struct slurm_jobacct_context ) ); + + c->jobacct_errno = SLURM_SUCCESS; + + /* Copy the job completion job completion type. */ + c->jobacct_type = xstrdup( jobacct_type ); + if ( c->jobacct_type == NULL ) { + error( "can't make local copy of jobacct type" ); + xfree( c ); + return NULL; + } + + /* Plugin rack is demand-loaded on first reference. */ + c->plugin_list = NULL; + c->cur_plugin = PLUGIN_INVALID_HANDLE; + c->jobacct_errno = SLURM_SUCCESS; + + return c; +} + +static int +_slurm_jobacct_context_destroy( slurm_jobacct_context_t *c ) +{ + /* + * Must check return code here because plugins might still + * be loaded and active. + */ + if ( c->plugin_list ) { + if ( plugrack_destroy( c->plugin_list ) != SLURM_SUCCESS ) { + return SLURM_ERROR; + } + } + + xfree( c->jobacct_type ); + xfree( c ); + + return SLURM_SUCCESS; +} + +/* + * Resolve the operations from the plugin. + */ +static slurm_jobacct_ops_t * +_slurm_jobacct_get_ops( slurm_jobacct_context_t *c ) +{ + /* + * These strings must be in the same order as the fields declared + * for slurm_jobacct_ops_t. + */ + static const char *syms[] = { + "jobacct_p_init_struct", + "jobacct_p_alloc", + "jobacct_p_free", + "jobacct_p_setinfo", + "jobacct_p_getinfo", + "jobacct_p_aggregate", + "jobacct_p_2_sacct", + "jobacct_p_pack", + "jobacct_p_unpack", + "jobacct_p_init_slurmctld", + "jobacct_p_fini_slurmctld", + "jobacct_p_job_start_slurmctld", + "jobacct_p_job_complete_slurmctld", + "jobacct_p_step_start_slurmctld", + "jobacct_p_step_complete_slurmctld", + "jobacct_p_suspend_slurmctld", + "jobacct_p_startpoll", + "jobacct_p_endpoll", + "jobacct_p_add_task", + "jobacct_p_stat_task", + "jobacct_p_remove_task", + "jobacct_p_suspendpoll" + }; + int n_syms = sizeof( syms ) / sizeof( char * ); + int rc = 0; + /* Get the plugin list, if needed. */ + if ( c->plugin_list == NULL ) { + char *plugin_dir; + c->plugin_list = plugrack_create(); + if ( c->plugin_list == NULL ) { + error( "Unable to create a plugin manager" ); + return NULL; + } + + plugrack_set_major_type( c->plugin_list, "jobacct" ); + plugrack_set_paranoia( c->plugin_list, + PLUGRACK_PARANOIA_NONE, + 0 ); + plugin_dir = slurm_get_plugin_dir(); + plugrack_read_dir( c->plugin_list, plugin_dir ); + xfree(plugin_dir); + } + + /* Find the correct plugin. */ + c->cur_plugin = + plugrack_use_by_type( c->plugin_list, c->jobacct_type ); + if ( c->cur_plugin == PLUGIN_INVALID_HANDLE ) { + error( "can't find a plugin for type %s", c->jobacct_type ); + return NULL; + } + + /* Dereference the API. */ + if ( (rc = plugin_get_syms( c->cur_plugin, + n_syms, + syms, + (void **) &c->ops )) < n_syms ) { + error( "incomplete jobacct plugin detected only " + "got %d out of %d", + rc, n_syms); + return NULL; + } + + return &c->ops; +} + +static int _slurm_jobacct_init(void) +{ + char *jobacct_type = NULL; + int retval=SLURM_SUCCESS; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + goto done; + + jobacct_type = slurm_get_jobacct_type(); + g_jobacct_context = _slurm_jobacct_context_create( jobacct_type ); + if ( g_jobacct_context == NULL ) { + error( "cannot create a context for %s", jobacct_type ); + retval = SLURM_ERROR; + goto done; + } + + if ( _slurm_jobacct_get_ops( g_jobacct_context ) == NULL ) { + error( "cannot resolve job accounting plugin operations" ); + _slurm_jobacct_context_destroy( g_jobacct_context ); + g_jobacct_context = NULL; + retval = SLURM_ERROR; + } + + done: + slurm_mutex_unlock( &g_jobacct_context_lock ); + xfree(jobacct_type); + + return(retval); +} + +static int _slurm_jobacct_fini(void) +{ + int rc; + + if (!g_jobacct_context) + return SLURM_SUCCESS; + + rc = _slurm_jobacct_context_destroy(g_jobacct_context); + g_jobacct_context = NULL; + return rc; +} + +extern int jobacct_g_init_struct(jobacctinfo_t *jobacct, + jobacct_id_t *jobacct_id) +{ + int retval = SLURM_SUCCESS; + + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_init_struct)) + (jobacct, jobacct_id); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern jobacctinfo_t *jobacct_g_alloc(jobacct_id_t *jobacct_id) +{ + jobacctinfo_t *jobacct = NULL; + + if (_slurm_jobacct_init() < 0) + return jobacct; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + jobacct = (*(g_jobacct_context->ops.jobacct_alloc)) + (jobacct_id); + + slurm_mutex_unlock( &g_jobacct_context_lock ); + return jobacct; +} + +extern void jobacct_g_free(jobacctinfo_t *jobacct) +{ + if (_slurm_jobacct_init() < 0) + return; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + (*(g_jobacct_context->ops.jobacct_free))(jobacct); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return; +} + +extern int jobacct_g_setinfo(jobacctinfo_t *jobacct, + enum jobacct_data_type type, void *data) +{ + int retval = SLURM_SUCCESS; + + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_setinfo)) + (jobacct, type, data); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_getinfo(jobacctinfo_t *jobacct, + enum jobacct_data_type type, void *data) +{ + int retval = SLURM_SUCCESS; + + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_getinfo)) + (jobacct, type, data); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern void jobacct_g_aggregate(jobacctinfo_t *dest, jobacctinfo_t *from) +{ + if (_slurm_jobacct_init() < 0) + return; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + (*(g_jobacct_context->ops.jobacct_aggregate))(dest, from); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return; +} + +extern void jobacct_g_2_sacct(sacct_t *sacct, jobacctinfo_t *jobacct) +{ + if (_slurm_jobacct_init() < 0) + return; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + (*(g_jobacct_context->ops.jobacct_2_sacct))(sacct, jobacct); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return; +} + +extern void jobacct_g_pack(jobacctinfo_t *jobacct, Buf buffer) +{ + if (_slurm_jobacct_init() < 0) + return; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + (*(g_jobacct_context->ops.jobacct_pack))(jobacct, buffer); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return; +} + +extern int jobacct_g_unpack(jobacctinfo_t **jobacct, Buf buffer) +{ + int retval = SLURM_SUCCESS; + + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_unpack)) + (jobacct, buffer); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_init_slurmctld(char *job_acct_log) +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_init)) + (job_acct_log); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_fini_slurmctld() +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_fini))(); + slurm_mutex_unlock( &g_jobacct_context_lock ); + + if (_slurm_jobacct_fini() < 0) + return SLURM_ERROR; + return retval; +} + +extern int jobacct_g_job_start_slurmctld(struct job_record *job_ptr) +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_job_start)) + (job_ptr); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_job_complete_slurmctld(struct job_record *job_ptr) +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_job_complete)) + (job_ptr); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_step_start_slurmctld(struct step_record *step_ptr) +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_step_start)) + (step_ptr); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_step_complete_slurmctld(struct step_record *step_ptr) +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_step_complete)) + (step_ptr); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_suspend_slurmctld(struct job_record *job_ptr) +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_suspend)) + (job_ptr); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_startpoll(int frequency) +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_startpoll)) + (frequency); + + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_endpoll() +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_endpoll))(); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern int jobacct_g_add_task(pid_t pid, jobacct_id_t *jobacct_id) +{ + int retval = SLURM_SUCCESS; + if (_slurm_jobacct_init() < 0) + return SLURM_ERROR; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + retval = (*(g_jobacct_context->ops.jobacct_add_task)) + (pid, jobacct_id); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return retval; +} + +extern jobacctinfo_t *jobacct_g_stat_task(pid_t pid) +{ + jobacctinfo_t *jobacct = NULL; + if (_slurm_jobacct_init() < 0) + return jobacct; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + jobacct = (*(g_jobacct_context->ops.jobacct_stat_task))(pid); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return jobacct; +} + +extern jobacctinfo_t *jobacct_g_remove_task(pid_t pid) +{ + jobacctinfo_t *jobacct = NULL; + if (_slurm_jobacct_init() < 0) + return jobacct; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + jobacct = (*(g_jobacct_context->ops.jobacct_remove_task))(pid); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return jobacct; +} + +extern void jobacct_g_suspendpoll() +{ + if (_slurm_jobacct_init() < 0) + return; + + slurm_mutex_lock( &g_jobacct_context_lock ); + if ( g_jobacct_context ) + (*(g_jobacct_context->ops.jobacct_suspendpoll))(); + slurm_mutex_unlock( &g_jobacct_context_lock ); + return; +} + diff --git a/executable_names/src/common/slurm_jobacct.h b/executable_names/src/common/slurm_jobacct.h new file mode 100644 index 0000000000000000000000000000000000000000..aee570c0943149b4227c5b9a7de70c4ce79e96f6 --- /dev/null +++ b/executable_names/src/common/slurm_jobacct.h @@ -0,0 +1,103 @@ +/*****************************************************************************\ + * slurm_jobacct.h - implementation-independent job completion logging + * API definitions + ***************************************************************************** + * Copyright (C) 2003 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +/*****************************************************************************\ + * Modification history + * + * 19 Jan 2005 by Andy Riebs + * This file is derived from the file slurm_JOBACCT.c, written by + * Morris Jette, et al. +\*****************************************************************************/ + + +#ifndef __SLURM_JOBACCT_H__ +#define __SLURM_JOBACCT_H__ + +#if HAVE_STDINT_H +# include /* for uint16_t, uint32_t definitions */ +#endif +#if HAVE_INTTYPES_H +# include /* for uint16_t, uint32_t definitions */ +#endif +#include +#include +#include +#include + +#include "src/slurmd/slurmstepd/slurmstepd_job.h" +#include "src/slurmctld/slurmctld.h" +#include "src/sacct/sacct_stat.h" + +/* common */ +extern int jobacct_g_init_struct(jobacctinfo_t *jobacct, + jobacct_id_t *jobacct_id); +/* must free jobacctinfo_t if not NULL */ +extern jobacctinfo_t *jobacct_g_alloc(jobacct_id_t *jobacct_id); +extern void jobacct_g_free(jobacctinfo_t *jobacct); +extern int jobacct_g_setinfo(jobacctinfo_t *jobacct, + enum jobacct_data_type type, void *data); +extern int jobacct_g_getinfo(jobacctinfo_t *jobacct, + enum jobacct_data_type type, void *data); +extern void jobacct_g_aggregate(jobacctinfo_t *dest, jobacctinfo_t *from); +extern void jobacct_g_2_sacct(sacct_t *sacct, jobacctinfo_t *jobacct); +extern void jobacct_g_pack(jobacctinfo_t *jobacct, Buf buffer); +extern int jobacct_g_unpack(jobacctinfo_t **jobacct, Buf buffer); + +/*functions used in slurmctld */ +extern int jobacct_g_init_slurmctld(char *job_acct_log); +extern int jobacct_g_fini_slurmctld(); +extern int jobacct_g_job_start_slurmctld(struct job_record *job_ptr); +extern int jobacct_g_job_complete_slurmctld(struct job_record *job_ptr); +extern int jobacct_g_step_start_slurmctld(struct step_record *step); +extern int jobacct_g_step_complete_slurmctld(struct step_record *step); +extern int jobacct_g_suspend_slurmctld(struct job_record *job_ptr); + +/*functions used in slurmstepd */ +extern int jobacct_g_startpoll(int frequency); +extern int jobacct_g_endpoll(); +extern int jobacct_g_add_task(pid_t pid, jobacct_id_t *jobacct_id); +/* must free jobacctinfo_t if not NULL */ +extern jobacctinfo_t *jobacct_g_stat_task(pid_t pid); +/* must free jobacctinfo_t if not NULL */ +extern jobacctinfo_t *jobacct_g_remove_task(pid_t pid); +extern void jobacct_g_suspendpoll(); + +#endif /*__SLURM_JOBACCT_H__*/ + diff --git a/executable_names/src/common/slurm_jobcomp.c b/executable_names/src/common/slurm_jobcomp.c new file mode 100644 index 0000000000000000000000000000000000000000..85f04808de1010ed083bdf57e5ea9b373c12061b --- /dev/null +++ b/executable_names/src/common/slurm_jobcomp.c @@ -0,0 +1,283 @@ +/*****************************************************************************\ + * slurm_jobcomp.c - implementation-independent job completion logging + * functions + ***************************************************************************** + * Copyright (C) 2003 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jay Windley , Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include "src/common/macros.h" +#include "src/common/plugin.h" +#include "src/common/plugrack.h" +#include "src/common/slurm_jobcomp.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/xmalloc.h" +#include "src/common/xassert.h" +#include "src/common/xstring.h" +#include "src/slurmctld/slurmctld.h" + +/* + * WARNING: Do not change the order of these fields or add additional + * fields at the beginning of the structure. If you do, job completion + * logging plugins will stop working. If you need to add fields, add them + * at the end of the structure. + */ +typedef struct slurm_jobcomp_ops { + int (*set_loc) ( char *loc ); + int (*job_write) ( struct job_record *job_ptr); + int (*sa_errno) ( void ); + char * (*job_strerror) ( int errnum ); +} slurm_jobcomp_ops_t; + + +/* + * A global job completion context. "Global" in the sense that there's + * only one, with static bindings. We don't export it. + */ + +struct slurm_jobcomp_context { + char * jobcomp_type; + plugrack_t plugin_list; + plugin_handle_t cur_plugin; + int jobcomp_errno; + slurm_jobcomp_ops_t ops; +}; + +static slurm_jobcomp_context_t g_context = NULL; +static pthread_mutex_t context_lock = PTHREAD_MUTEX_INITIALIZER; + +static slurm_jobcomp_context_t +_slurm_jobcomp_context_create( const char *jobcomp_type) +{ + slurm_jobcomp_context_t c; + + if ( jobcomp_type == NULL ) { + debug3( "_slurm_jobcomp_context_create: no jobcomp type" ); + return NULL; + } + + c = xmalloc( sizeof( struct slurm_jobcomp_context ) ); + + c->jobcomp_errno = SLURM_SUCCESS; + + /* Copy the job completion job completion type. */ + c->jobcomp_type = xstrdup( jobcomp_type ); + if ( c->jobcomp_type == NULL ) { + debug3( "can't make local copy of jobcomp type" ); + xfree( c ); + return NULL; + } + + /* Plugin rack is demand-loaded on first reference. */ + c->plugin_list = NULL; + c->cur_plugin = PLUGIN_INVALID_HANDLE; + + return c; +} + +static int +_slurm_jobcomp_context_destroy( slurm_jobcomp_context_t c ) +{ + /* + * Must check return code here because plugins might still + * be loaded and active. + */ + if ( c->plugin_list ) { + if ( plugrack_destroy( c->plugin_list ) != SLURM_SUCCESS ) { + return SLURM_ERROR; + } + } + + xfree( c->jobcomp_type ); + xfree( c ); + + return SLURM_SUCCESS; +} + +/* + * Resolve the operations from the plugin. + */ +static slurm_jobcomp_ops_t * +_slurm_jobcomp_get_ops( slurm_jobcomp_context_t c ) +{ + /* + * These strings must be kept in the same order as the fields + * declared for slurm_jobcomp_ops_t. + */ + static const char *syms[] = { + "slurm_jobcomp_set_location", + "slurm_jobcomp_log_record", + "slurm_jobcomp_get_errno", + "slurm_jobcomp_strerror" + }; + int n_syms = sizeof( syms ) / sizeof( char * ); + + /* Get the plugin list, if needed. */ + if ( c->plugin_list == NULL ) { + char *plugin_dir; + c->plugin_list = plugrack_create(); + if ( c->plugin_list == NULL ) { + error( "Unable to create a plugin manager" ); + return NULL; + } + + plugrack_set_major_type( c->plugin_list, "jobcomp" ); + plugrack_set_paranoia( c->plugin_list, + PLUGRACK_PARANOIA_NONE, + 0 ); + plugin_dir = slurm_get_plugin_dir(); + plugrack_read_dir( c->plugin_list, plugin_dir ); + xfree(plugin_dir); + } + + /* Find the correct plugin. */ + c->cur_plugin = + plugrack_use_by_type( c->plugin_list, c->jobcomp_type ); + if ( c->cur_plugin == PLUGIN_INVALID_HANDLE ) { + error( "can't find a plugin for type %s", c->jobcomp_type ); + return NULL; + } + + /* Dereference the API. */ + if ( plugin_get_syms( c->cur_plugin, + n_syms, + syms, + (void **) &c->ops ) < n_syms ) { + error( "incomplete jobcomp plugin detected" ); + return NULL; + } + + return &c->ops; +} + +extern int +g_slurm_jobcomp_init( char *jobcomp_loc ) +{ + int retval = SLURM_SUCCESS; + char *jobcomp_type; + + slurm_mutex_lock( &context_lock ); + + if ( g_context ) + _slurm_jobcomp_context_destroy(g_context); + + jobcomp_type = slurm_get_jobcomp_type(); + g_context = _slurm_jobcomp_context_create( jobcomp_type ); + if ( g_context == NULL ) { + error( "cannot create a context for %s", jobcomp_type ); + xfree(jobcomp_type); + retval = SLURM_ERROR; + goto done; + } + xfree(jobcomp_type); + + if ( _slurm_jobcomp_get_ops( g_context ) == NULL ) { + error( "cannot resolve job completion plugin operations" ); + _slurm_jobcomp_context_destroy( g_context ); + g_context = NULL; + retval = SLURM_ERROR; + } + + done: + if ( g_context ) + retval = (*(g_context->ops.set_loc))(jobcomp_loc); + slurm_mutex_unlock( &context_lock ); + return retval; +} + +extern int +g_slurm_jobcomp_fini(void) +{ + int rc; + + if ( !g_context) + return SLURM_SUCCESS; + + rc = _slurm_jobcomp_context_destroy ( g_context ); + g_context = NULL; + return SLURM_SUCCESS; +} + +extern int +g_slurm_jobcomp_write(struct job_record *job_ptr) +{ + int retval = SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + if ( g_context ) + retval = (*(g_context->ops.job_write))(job_ptr); + else { + error ("slurm_jobcomp plugin context not initialized"); + retval = ENOENT; + } + slurm_mutex_unlock( &context_lock ); + return retval; +} + +extern int +g_slurm_jobcomp_errno(void) +{ + int retval = SLURM_SUCCESS; + + slurm_mutex_lock( &context_lock ); + if ( g_context ) + retval = (*(g_context->ops.sa_errno))(); + else { + error ("slurm_jobcomp plugin context not initialized"); + retval = ENOENT; + } + slurm_mutex_unlock( &context_lock ); + return retval; +} + +extern char * +g_slurm_jobcomp_strerror(int errnum) +{ + char *retval = NULL; + + slurm_mutex_lock( &context_lock ); + if ( g_context ) + retval = (*(g_context->ops.job_strerror))(errnum); + else + error ("slurm_jobcomp plugin context not initialized"); + slurm_mutex_unlock( &context_lock ); + return retval; +} diff --git a/executable_names/src/common/slurm_jobcomp.h b/executable_names/src/common/slurm_jobcomp.h new file mode 100644 index 0000000000000000000000000000000000000000..9960538c0d1347febf2057fe5c7fd1e4f753a881 --- /dev/null +++ b/executable_names/src/common/slurm_jobcomp.h @@ -0,0 +1,75 @@ +/*****************************************************************************\ + * slurm_jobcomp.h - implementation-independent job completion logging + * API definitions + ***************************************************************************** + * Copyright (C) 2003 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef __SLURM_JOBCOMP_H__ +#define __SLURM_JOBCOMP_H__ + +#if HAVE_CONFIG_H +# include "config.h" +#endif +#if HAVE_STDINT_H +# include /* for uint16_t, uint32_t definitions */ +#endif +#if HAVE_INTTYPES_H +# include /* for uint16_t, uint32_t definitions */ +#endif +#include +#include +#include + +#include "src/slurmctld/slurmctld.h" + +typedef struct slurm_jobcomp_context * slurm_jobcomp_context_t; + +/* initialization of job completion logging */ +extern int g_slurm_jobcomp_init(char *jobcomp_loc); + +/* terminate pthreads and free, general clean-up for termination */ +extern int g_slurm_jobcomp_fini(void); + +/* write record of a job's completion */ +extern int g_slurm_jobcomp_write(struct job_record *job_ptr); + +/* return error code */ +extern int g_slurm_jobcomp_errno(void); + +/* convert job completion logger specific error code to a string */ +extern char *g_slurm_jobcomp_strerror(int errnum); + +#endif /*__SLURM_JOBCOMP_H__*/ + diff --git a/executable_names/src/common/slurm_protocol_api.c b/executable_names/src/common/slurm_protocol_api.c new file mode 100644 index 0000000000000000000000000000000000000000..67e597128c1f6f43a7f931b03555ef29204ee8cb --- /dev/null +++ b/executable_names/src/common/slurm_protocol_api.c @@ -0,0 +1,2313 @@ +/*****************************************************************************\ + * slurm_protocol_api.c - high-level slurm communication functions + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +/* GLOBAL INCLUDES */ + +#ifdef WITH_PTHREADS +# include +#endif /* WITH_PTHREADS */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* PROJECT INCLUDES */ +#include "src/common/macros.h" +#include "src/common/pack.h" +#include "src/common/parse_spec.h" +#include "src/common/read_config.h" +#include "src/common/slurm_auth.h" +#include "src/common/slurm_protocol_interface.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_protocol_common.h" +#include "src/common/slurm_protocol_pack.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/log.h" +#include "src/common/forward.h" + +/* EXTERNAL VARIABLES */ + +/* #DEFINES */ +#define _DEBUG 0 +#define MAX_SHUTDOWN_RETRY 5 +#define MAX_RETRIES 3 + +/* STATIC VARIABLES */ +/* static pthread_mutex_t config_lock = PTHREAD_MUTEX_INITIALIZER; */ +static slurm_protocol_config_t proto_conf_default; +static slurm_protocol_config_t *proto_conf = &proto_conf_default; +/* static slurm_ctl_conf_t slurmctld_conf; */ + +/* STATIC FUNCTIONS */ +static void _remap_slurmctld_errno(void); + +/**********************************************************************\ + * protocol configuration functions +\**********************************************************************/ +/* slurm_set_api_config + * sets the slurm_protocol_config object + * NOT THREAD SAFE + * IN protocol_conf - slurm_protocol_config object + * + * XXX: Why isn't the "config_lock" mutex used here? + */ +int slurm_set_api_config(slurm_protocol_config_t * protocol_conf) +{ + proto_conf = protocol_conf; + return SLURM_SUCCESS; +} + +/* slurm_get_api_config + * returns a pointer to the current slurm_protocol_config object + * RET slurm_protocol_config_t - current slurm_protocol_config object + */ +slurm_protocol_config_t *slurm_get_api_config() +{ + return proto_conf; +} + +/* slurm_api_set_conf_file + * set slurm configuration file to a non-default value + * pathname IN - pathname of slurm configuration file to be used + */ +extern void slurm_api_set_conf_file(char *pathname) +{ + slurm_conf_reinit(pathname); + return; +} + +/* slurm_api_set_default_config + * called by the send_controller_msg function to insure that at least + * the compiled in default slurm_protocol_config object is initialized + * RET int - return code + */ +int slurm_api_set_default_config() +{ + int rc = SLURM_SUCCESS; + slurm_ctl_conf_t *conf; + + /*slurm_conf_init(NULL);*/ + conf = slurm_conf_lock(); + + if (conf->control_addr == NULL) { + error("Unable to establish controller machine"); + rc = SLURM_ERROR; + goto cleanup; + } + if (conf->slurmctld_port == 0) { + error("Unable to establish controller port"); + rc = SLURM_ERROR; + goto cleanup; + } + + slurm_set_addr(&proto_conf_default.primary_controller, + conf->slurmctld_port, + conf->control_addr); + if (proto_conf_default.primary_controller.sin_port == 0) { + error("Unable to establish control machine address"); + rc = SLURM_ERROR; + goto cleanup; + } + + if (conf->backup_addr) { + slurm_set_addr(&proto_conf_default.secondary_controller, + conf->slurmctld_port, + conf->backup_addr); + } + proto_conf = &proto_conf_default; + + cleanup: + slurm_conf_unlock(); + return rc; +} + +/* slurm_api_clear_config + * execute this only at program termination to free all memory */ +void slurm_api_clear_config(void) +{ + slurm_conf_destroy(); +} + +/* update internal configuration data structure as needed. + * exit with lock set */ +/* static inline void _lock_update_config() */ +/* { */ +/* slurm_api_set_default_config(); */ +/* slurm_mutex_lock(&config_lock); */ +/* } */ + +/* slurm_get_mpi_default + * get default mpi value from slurmctld_conf object + * RET char * - mpi default value from slurm.conf, MUST be xfreed by caller + */ +char *slurm_get_mpi_default(void) +{ + char *mpi_default; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + mpi_default = xstrdup(conf->mpi_default); + slurm_conf_unlock(); + return mpi_default; +} + +/* slurm_get_msg_timeout + * get default message timeout value from slurmctld_conf object + */ +uint16_t slurm_get_msg_timeout(void) +{ + uint16_t msg_timeout; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + msg_timeout = conf->msg_timeout; + slurm_conf_unlock(); +#ifdef MEMORY_LEAK_DEBUG + msg_timeout *= 4; +#endif + return msg_timeout; +} + +/* slurm_get_plugin_dir + * get plugin directory from slurmctld_conf object + * RET char * - plugin directory, MUST be xfreed by caller + */ +char *slurm_get_plugin_dir(void) +{ + char *plugin_dir; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + plugin_dir = xstrdup(conf->plugindir); + slurm_conf_unlock(); + return plugin_dir; +} + +/* slurm_get_auth_type + * returns the authentication type from slurmctld_conf object + * RET char * - auth type, MUST be xfreed by caller + */ +char *slurm_get_auth_type(void) +{ + char *auth_type; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + auth_type = xstrdup(conf->authtype); + slurm_conf_unlock(); + return auth_type; +} + +/* slurm_get_propagate_prio_process + * return the PropagatePrioProcess flag from slurmctld_conf object + */ +extern uint16_t slurm_get_propagate_prio_process(void) +{ + uint16_t propagate_prio; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + propagate_prio = conf->propagate_prio_process; + slurm_conf_unlock(); + return propagate_prio; +} + +/* slurm_get_fast_schedule + * returns the value of fast_schedule in slurmctld_conf object + */ +extern uint16_t slurm_get_fast_schedule(void) +{ + uint16_t fast_val; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + fast_val = conf->fast_schedule; + slurm_conf_unlock(); + return fast_val; +} + +/* slurm_set_tree_width + * sets the value of tree_width in slurmctld_conf object + * RET 0 or error code + */ +extern int slurm_set_tree_width(uint16_t tree_width) +{ + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + if (tree_width == 0) { + error("can't have span count of 0"); + return SLURM_ERROR; + } + conf->tree_width = tree_width; + slurm_conf_unlock(); + return SLURM_SUCCESS; +} +/* slurm_get_tree_width + * returns the value of tree_width in slurmctld_conf object + */ +extern uint16_t slurm_get_tree_width(void) +{ + uint16_t tree_width; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + tree_width = conf->tree_width; + slurm_conf_unlock(); + return tree_width; +} + +/* slurm_set_auth_type + * set the authentication type in slurmctld_conf object + * used for security testing purposes + * RET 0 or error code + */ +extern int slurm_set_auth_type(char *auth_type) +{ + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + xfree(conf->authtype); + conf->authtype = xstrdup(auth_type); + slurm_conf_unlock(); + return 0; +} + +/* slurm_get_jobacct_loc + * returns the job accounting loc from the slurmctld_conf object + * RET char * - job accounting loc, MUST be xfreed by caller + */ +char *slurm_get_jobacct_loc(void) +{ + char *jobacct_logfile; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + jobacct_logfile = xstrdup(conf->job_acct_logfile); + slurm_conf_unlock(); + return jobacct_logfile; +} + +/* slurm_get_jobacct_freq + * returns the job accounting poll frequency from the slurmctld_conf object + * RET int - job accounting frequency + */ +uint16_t slurm_get_jobacct_freq(void) +{ + uint16_t freq; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + freq = conf->job_acct_freq; + slurm_conf_unlock(); + return freq; +} + +/* slurm_get_jobacct_type + * returns the job accounting type from the slurmctld_conf object + * RET char * - job accounting type, MUST be xfreed by caller + */ +char *slurm_get_jobacct_type(void) +{ + char *jobacct_type; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + jobacct_type = xstrdup(conf->job_acct_type); + slurm_conf_unlock(); + return jobacct_type; +} + +/* slurm_get_jobcomp_type + * returns the job completion logger type from slurmctld_conf object + * RET char * - job completion type, MUST be xfreed by caller + */ +char *slurm_get_jobcomp_type(void) +{ + char *jobcomp_type; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + jobcomp_type = xstrdup(conf->job_comp_type); + slurm_conf_unlock(); + return jobcomp_type; +} + +/* slurm_get_proctrack_type + * get ProctrackType from slurmctld_conf object + * RET char * - proctrack type, MUST be xfreed by caller + */ +char *slurm_get_proctrack_type(void) +{ + char *proctrack_type; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + proctrack_type = xstrdup(conf->proctrack_type); + slurm_conf_unlock(); + return proctrack_type; +} + +/* slurm_get_slurmd_port + * returns slurmd port from slurmctld_conf object + * RET uint16_t - slurmd port + */ +uint16_t slurm_get_slurmd_port(void) +{ + uint16_t slurmd_port; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + slurmd_port = conf->slurmd_port; + slurm_conf_unlock(); + return slurmd_port; +} + +/* slurm_get_slurm_user_id + * returns slurmd uid from slurmctld_conf object + * RET uint32_t - slurm user id + */ +uint32_t slurm_get_slurm_user_id(void) +{ + uint32_t slurm_uid; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + slurm_uid = conf->slurm_user_id; + slurm_conf_unlock(); + return slurm_uid; +} + +/* slurm_get_root_filter + * RET uint16_t - Value of SchedulerRootFilter */ +extern uint16_t slurm_get_root_filter(void) +{ + uint16_t root_filter; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + root_filter = conf->schedrootfltr; + slurm_conf_unlock(); + return root_filter; +} +/* slurm_get_sched_port + * RET uint16_t - Value of SchedulerPort */ +extern uint16_t slurm_get_sched_port(void) +{ + uint16_t port; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + port = conf->schedport; + slurm_conf_unlock(); + return port; +} + +/* slurm_get_sched_type + * get sched type from slurmctld_conf object + * RET char * - sched type, MUST be xfreed by caller + */ +char *slurm_get_sched_type(void) +{ + char *sched_type; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + sched_type = xstrdup(conf->schedtype); + slurm_conf_unlock(); + return sched_type; +} + +/* slurm_get_select_type + * get select_type from slurmctld_conf object + * RET char * - select_type, MUST be xfreed by caller + */ +char *slurm_get_select_type(void) +{ + char *select_type; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + select_type = xstrdup(conf->select_type); + slurm_conf_unlock(); + return select_type; +} + +/* slurm_get_switch_type + * get switch type from slurmctld_conf object + * RET char * - switch type, MUST be xfreed by caller + */ +char *slurm_get_switch_type(void) +{ + char *switch_type; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + switch_type = xstrdup(conf->switch_type); + slurm_conf_unlock(); + return switch_type; +} + +/* slurm_get_wait_time + * returns wait_time from slurmctld_conf object + * RET uint16_t - wait_time + */ +uint16_t slurm_get_wait_time(void) +{ + uint16_t wait_time; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + wait_time = conf->wait_time; + slurm_conf_unlock(); + return wait_time; +} + +/* slurm_get_srun_prolog + * return the name of the srun prolog program + * RET char * - name of prolog program, must be xfreed by caller + */ +char *slurm_get_srun_prolog(void) +{ + char *prolog; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + prolog = xstrdup(conf->srun_prolog); + slurm_conf_unlock(); + return prolog; +} + +/* slurm_get_srun_epilog + * return the name of the srun epilog program + * RET char * - name of epilog program, must be xfreed by caller + */ +char *slurm_get_srun_epilog(void) +{ + char *epilog; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + epilog = xstrdup(conf->srun_epilog); + slurm_conf_unlock(); + return epilog; +} + +/* slurm_get_task_epilog + * RET task_epilog name, must be xfreed by caller */ +char *slurm_get_task_epilog(void) +{ + char *task_epilog; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + task_epilog = xstrdup(conf->task_epilog); + slurm_conf_unlock(); + return task_epilog; +} + +/* slurm_get_task_prolog + * RET task_prolog name, must be xfreed by caller */ +char *slurm_get_task_prolog(void) +{ + char *task_prolog; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + task_prolog = xstrdup(conf->task_prolog); + slurm_conf_unlock(); + return task_prolog; +} + +/* slurm_get_task_plugin + * RET task_plugin name, must be xfreed by caller */ +char *slurm_get_task_plugin(void) +{ + char *task_plugin; + slurm_ctl_conf_t *conf; + + conf = slurm_conf_lock(); + task_plugin = xstrdup(conf->task_plugin); + slurm_conf_unlock(); + return task_plugin; +} +/* Change general slurm communication errors to slurmctld specific errors */ +static void _remap_slurmctld_errno(void) +{ + int err = slurm_get_errno(); + + if (err == SLURM_COMMUNICATIONS_CONNECTION_ERROR) + slurm_seterrno(SLURMCTLD_COMMUNICATIONS_CONNECTION_ERROR); + else if (err == SLURM_COMMUNICATIONS_SEND_ERROR) + slurm_seterrno(SLURMCTLD_COMMUNICATIONS_SEND_ERROR); + else if (err == SLURM_COMMUNICATIONS_RECEIVE_ERROR) + slurm_seterrno(SLURMCTLD_COMMUNICATIONS_RECEIVE_ERROR); + else if (err == SLURM_COMMUNICATIONS_SHUTDOWN_ERROR) + slurm_seterrno(SLURMCTLD_COMMUNICATIONS_SHUTDOWN_ERROR); +} + +/**********************************************************************\ + * general message management functions used by slurmctld, slurmd +\**********************************************************************/ + +/* + * Initialize a slurm server at port "port" + * + * IN port - port to bind the msg server to + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd slurm_init_msg_engine_port(uint16_t port) +{ + slurm_addr addr; + + slurm_set_addr_any(&addr, port); + return _slurm_init_msg_engine(&addr); +} + +/* + * Same as above, but initialize using a slurm address "addr" + * + * IN addr - slurm_addr to bind the msg server to + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd slurm_init_msg_engine(slurm_addr *addr) +{ + return _slurm_init_msg_engine(addr); +} + +/* + * Close an established message engine. + * Returns SLURM_SUCCESS or SLURM_FAILURE. + * + * IN fd - an open file descriptor to close + * RET int - the return code + */ +int slurm_shutdown_msg_engine(slurm_fd fd) +{ + int rc = _slurm_close(fd); + if (rc) + slurm_seterrno(SLURM_COMMUNICATIONS_SHUTDOWN_ERROR); + return rc; +} + +/* + * Close an established message connection. + * Returns SLURM_SUCCESS or SLURM_FAILURE. + * + * IN fd - an open file descriptor to close + * RET int - the return code + */ +int slurm_shutdown_msg_conn(slurm_fd fd) +{ + return _slurm_close(fd); +} + +/**********************************************************************\ + * msg connection establishment functions used by msg clients +\**********************************************************************/ + +/* In the bsd socket implementation it creates a SOCK_STREAM socket + * and calls connect on it a SOCK_DGRAM socket called with connect + * is defined to only receive messages from the address/port pair + * argument of the connect call slurm_address - for now it is + * really just a sockaddr_in + * IN slurm_address - slurm_addr of the connection destination + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd slurm_open_msg_conn(slurm_addr * slurm_address) +{ + return _slurm_open_msg_conn(slurm_address); +} + +/* calls connect to make a connection-less datagram connection to the + * primary or secondary slurmctld message engine + * OUT addr - address of controller contacted + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd slurm_open_controller_conn(slurm_addr *addr) +{ + slurm_fd fd; + slurm_ctl_conf_t *conf; + + if (slurm_api_set_default_config() < 0) + return SLURM_FAILURE; + addr = &proto_conf->primary_controller; + if ((fd = slurm_open_msg_conn(&proto_conf->primary_controller)) >= 0) + return fd; + + debug("Failed to contact primary controller: %m"); + + conf = slurm_conf_lock(); + if (!conf->backup_controller) { + slurm_conf_unlock(); + goto fail; + } + slurm_conf_unlock(); + + addr = &proto_conf->secondary_controller; + if ((fd = slurm_open_msg_conn(&proto_conf->secondary_controller)) >= 0) + return fd; + addr = NULL; + debug("Failed to contact secondary controller: %m"); + + fail: + slurm_seterrno_ret(SLURMCTLD_COMMUNICATIONS_CONNECTION_ERROR); +} + +/* calls connect to make a connection-less datagram connection to the + * primary or secondary slurmctld message engine + * RET slurm_fd - file descriptor of the connection created + * IN dest - controller to contact, primary or secondary + */ +slurm_fd slurm_open_controller_conn_spec(enum controller_id dest) +{ + slurm_addr *addr; + slurm_fd rc; + + if (slurm_api_set_default_config() < 0) { + debug3("Error: Unable to set default config"); + return SLURM_ERROR; + } + + addr = (dest == PRIMARY_CONTROLLER) ? + &proto_conf->primary_controller : + &proto_conf->secondary_controller; + + if (!addr) return SLURM_ERROR; + + rc = slurm_open_msg_conn(addr); + if (rc == -1) + _remap_slurmctld_errno(); + return rc; +} + +/* gets the slurm_addr of the specified controller + * primary or secondary slurmctld message engine + * IN dest - controller to contact, primary or secondary + * OUT addr - slurm_addr to the specified controller + */ +void slurm_get_controller_addr_spec(enum controller_id dest, slurm_addr *addr) +{ + addr = (dest == PRIMARY_CONTROLLER) ? + &proto_conf->primary_controller : + &proto_conf->secondary_controller; +} + +/* In the bsd implmentation maps directly to a accept call + * IN open_fd - file descriptor to accept connection on + * OUT slurm_address - slurm_addr of the accepted connection + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd slurm_accept_msg_conn(slurm_fd open_fd, + slurm_addr * slurm_address) +{ + return _slurm_accept_msg_conn(open_fd, slurm_address); +} + +/* In the bsd implmentation maps directly to a close call, to close + * the socket that was accepted + * IN open_fd - an open file descriptor to close + * RET int - the return code + */ +int slurm_close_accepted_conn(slurm_fd open_fd) +{ + return _slurm_close_accepted_conn(open_fd); +} + +/**********************************************************************\ + * receive message functions +\**********************************************************************/ + +/* + * NOTE: memory is allocated for the returned msg must be freed at + * some point using the slurm_free_functions. + * IN open_fd - file descriptor to receive msg on + * OUT msg - a slurm_msg struct to be filled in by the function + * IN timeout - how long to wait in milliseconds + * RET int - returns 0 on success, -1 on failure and sets errno + */ +int slurm_receive_msg(slurm_fd fd, slurm_msg_t *msg, int timeout) +{ + char *buf = NULL; + size_t buflen = 0; + header_t header; + int rc; + void *auth_cred = NULL; + Buf buffer; + + xassert(fd >= 0); + + slurm_msg_t_init(msg); + msg->conn_fd = fd; + + if (timeout <= 0) + /* convert secs to msec */ + timeout = slurm_get_msg_timeout() * 1000; + + if(timeout >= (slurm_get_msg_timeout() * 10000)) { + error("slurm_receive_msg: " + "You are sending a message with timeout's greater " + "than %d seconds, your's is %d seconds", + (slurm_get_msg_timeout() * 10), + (timeout/1000)); + } else if(timeout < 1000) { + debug("slurm_receive_msg: " + "You are sending a message with a very short timeout of " + "%d milliseconds", timeout); + } + + + /* + * Receive a msg. slurm_msg_recvfrom() will read the message + * length and allocate space on the heap for a buffer containing + * the message. + */ + if (_slurm_msg_recvfrom_timeout(fd, &buf, &buflen, 0, timeout) < 0) { + forward_init(&header.forward, NULL); + rc = errno; + goto total_return; + } + +#if _DEBUG + _print_data (buftemp, rc); +#endif + buffer = create_buf(buf, buflen); + + if(unpack_header(&header, buffer) == SLURM_ERROR) { + free_buf(buffer); + rc = SLURM_COMMUNICATIONS_RECEIVE_ERROR; + goto total_return; + } + + if (check_header_version(&header) < 0) { + free_buf(buffer); + rc = SLURM_PROTOCOL_VERSION_ERROR; + goto total_return; + } + //info("ret_cnt = %d",header.ret_cnt); + if(header.ret_cnt > 0) { + error("we recieved more than one message back use " + "slurm_receive_msgs instead"); + header.ret_cnt = 0; + list_destroy(header.ret_list); + header.ret_list = NULL; + } + + + /* Forward message to other nodes */ + if(header.forward.cnt > 0) { + error("We need to forward this to other nodes use " + "slurm_receive_msg_and_forward instead"); + } + + if ((auth_cred = g_slurm_auth_unpack(buffer)) == NULL) { + error( "authentication: %s ", + g_slurm_auth_errstr(g_slurm_auth_errno(NULL))); + free_buf(buffer); + rc = ESLURM_PROTOCOL_INCOMPLETE_PACKET; + goto total_return; + } + rc = g_slurm_auth_verify( auth_cred, NULL, 2 ); + + if (rc != SLURM_SUCCESS) { + error( "authentication: %s ", + g_slurm_auth_errstr(g_slurm_auth_errno(auth_cred))); + (void) g_slurm_auth_destroy(auth_cred); + free_buf(buffer); + rc = SLURM_PROTOCOL_AUTHENTICATION_ERROR; + goto total_return; + } + + /* + * Unpack message body + */ + msg->msg_type = header.msg_type; + + if ( (header.body_length > remaining_buf(buffer)) || + (unpack_msg(msg, buffer) != SLURM_SUCCESS) ) { + (void) g_slurm_auth_destroy(auth_cred); + free_buf(buffer); + rc = ESLURM_PROTOCOL_INCOMPLETE_PACKET; + goto total_return; + } + + msg->auth_cred = (void *)auth_cred; + + free_buf(buffer); + rc = SLURM_SUCCESS; + +total_return: + destroy_forward(&header.forward); + + slurm_seterrno(rc); + if(rc != SLURM_SUCCESS) { + msg->auth_cred = (void *) NULL; + error("slurm_receive_msg: %s", slurm_strerror(rc)); + rc = -1; + } else { + rc = 0; + } + return rc; + +} + +/* + * NOTE: memory is allocated for the returned list + * and must be freed at some point using the list_destroy function. + * IN open_fd - file descriptor to receive msg on + * IN steps - how many steps down the tree we have to wait for + * IN timeout - how long to wait in milliseconds + * RET List - List containing the responses of the childern (if any) we + * forwarded the message to. List containing type + * (ret_data_info_t). + */ +List slurm_receive_msgs(slurm_fd fd, int steps, int timeout) +{ + char *buf = NULL; + size_t buflen = 0; + header_t header; + int rc; + void *auth_cred = NULL; + slurm_msg_t msg; + Buf buffer; + ret_data_info_t *ret_data_info = NULL; + List ret_list = NULL; + int orig_timeout = timeout; + + xassert(fd >= 0); + + slurm_msg_t_init(&msg); + msg.conn_fd = fd; + + if (timeout <= 0) + /* convert secs to msec */ + timeout = slurm_get_msg_timeout() * 1000; + if(steps) { + orig_timeout = timeout/steps; + steps--; + orig_timeout -= (1000*steps); + } + debug4("orig_timeout was %d we have %d steps and a timeout of %d", + orig_timeout, steps, timeout); + if(orig_timeout >= (slurm_get_msg_timeout() * 10000)) { + error("slurm_receive_msgs: " + "You are sending a message with timeout's greater " + "than %d seconds, your's is %d seconds", + (slurm_get_msg_timeout() * 10), + (timeout/1000)); + } else if(orig_timeout < 1000) { + debug("slurm_receive_msgs: " + "You are sending a message with a very short timeout of " + "%d milliseconds", timeout); + } + + + /* + * Receive a msg. slurm_msg_recvfrom() will read the message + * length and allocate space on the heap for a buffer containing + * the message. + */ + if (_slurm_msg_recvfrom_timeout(fd, &buf, &buflen, 0, timeout) < 0) { + forward_init(&header.forward, NULL); + rc = errno; + goto total_return; + } + +#if _DEBUG + _print_data (buftemp, rc); +#endif + buffer = create_buf(buf, buflen); + + if(unpack_header(&header, buffer) == SLURM_ERROR) { + free_buf(buffer); + rc = SLURM_COMMUNICATIONS_RECEIVE_ERROR; + goto total_return; + } + + if (check_header_version(&header) < 0) { + free_buf(buffer); + rc = SLURM_PROTOCOL_VERSION_ERROR; + goto total_return; + } + //info("ret_cnt = %d",header.ret_cnt); + if(header.ret_cnt > 0) { + ret_list = list_create(destroy_data_info); + while((ret_data_info = list_pop(header.ret_list))) + list_push(ret_list, ret_data_info); + header.ret_cnt = 0; + list_destroy(header.ret_list); + header.ret_list = NULL; + } + + /* Forward message to other nodes */ + if(header.forward.cnt > 0) { + error("We need to forward this to other nodes use " + "slurm_receive_and_forward_msgs instead"); + } + + if ((auth_cred = g_slurm_auth_unpack(buffer)) == NULL) { + error( "authentication: %s ", + g_slurm_auth_errstr(g_slurm_auth_errno(NULL))); + free_buf(buffer); + rc = ESLURM_PROTOCOL_INCOMPLETE_PACKET; + goto total_return; + } + rc = g_slurm_auth_verify( auth_cred, NULL, 2 ); + + if (rc != SLURM_SUCCESS) { + error( "authentication: %s ", + g_slurm_auth_errstr(g_slurm_auth_errno(auth_cred))); + (void) g_slurm_auth_destroy(auth_cred); + free_buf(buffer); + rc = SLURM_PROTOCOL_AUTHENTICATION_ERROR; + goto total_return; + } + + /* + * Unpack message body + */ + msg.msg_type = header.msg_type; + + if((header.body_length > remaining_buf(buffer)) || + (unpack_msg(&msg, buffer) != SLURM_SUCCESS)) { + (void) g_slurm_auth_destroy(auth_cred); + free_buf(buffer); + rc = ESLURM_PROTOCOL_INCOMPLETE_PACKET; + goto total_return; + } + g_slurm_auth_destroy(auth_cred); + + free_buf(buffer); + rc = SLURM_SUCCESS; + +total_return: + destroy_forward(&header.forward); + + if(rc != SLURM_SUCCESS) { + if(ret_list) { + ret_data_info = xmalloc(sizeof(ret_data_info_t)); + ret_data_info->err = rc; + ret_data_info->type = RESPONSE_FORWARD_FAILED; + ret_data_info->data = NULL; + list_push(ret_list, ret_data_info); + } + error("slurm_receive_msgs: %s", slurm_strerror(rc)); + } else { + if(!ret_list) + ret_list = list_create(destroy_data_info); + ret_data_info = xmalloc(sizeof(ret_data_info_t)); + ret_data_info->err = rc; + ret_data_info->node_name = NULL; + ret_data_info->type = msg.msg_type; + ret_data_info->data = msg.data; + list_push(ret_list, ret_data_info); + } + + + errno = rc; + return ret_list; + +} + +/* + * NOTE: memory is allocated for the returned msg and the returned list + * both must be freed at some point using the slurm_free_functions + * and list_destroy function. + * IN open_fd - file descriptor to receive msg on + * IN/OUT msg - a slurm_msg struct to be filled in by the function + * we use the orig_addr from this var for forwarding. + * IN timeout - how long to wait in milliseconds + * RET int - returns 0 on success, -1 on failure and sets errno + */ +int slurm_receive_msg_and_forward(slurm_fd fd, slurm_addr *orig_addr, + slurm_msg_t *msg, int timeout) +{ + char *buf = NULL; + size_t buflen = 0; + header_t header; + int rc; + void *auth_cred = NULL; + Buf buffer; + + xassert(fd >= 0); + + if(msg->forward.init != FORWARD_INIT) + slurm_msg_t_init(msg); + /* set msg connection fd to accepted fd. This allows + * possibility for slurmd_req () to close accepted connection + */ + msg->conn_fd = fd; + /* this always is the connection */ + memcpy(&msg->address, orig_addr, sizeof(slurm_addr)); + + /* where the connection originated from, this + * might change based on the header we receive */ + memcpy(&msg->orig_addr, orig_addr, sizeof(slurm_addr)); + + msg->ret_list = list_create(destroy_data_info); + + if (timeout <= 0) + /* convert secs to msec */ + timeout = slurm_get_msg_timeout() * 1000; + + if(timeout >= (slurm_get_msg_timeout() * 10000)) { + error("slurm_receive_msg_and_forward: " + "You are sending a message with timeout's greater " + "than %d seconds, your's is %d seconds", + (slurm_get_msg_timeout() * 10), + (timeout/1000)); + } else if(timeout < 1000) { + debug("slurm_receive_msg_and_forward: " + "You are sending a message with a very short timeout of " + "%d milliseconds", timeout); + } + + /* + * Receive a msg. slurm_msg_recvfrom() will read the message + * length and allocate space on the heap for a buffer containing + * the message. + */ + if (_slurm_msg_recvfrom_timeout(fd, &buf, &buflen, 0, timeout) < 0) { + forward_init(&header.forward, NULL); + rc = errno; + goto total_return; + } + +#if _DEBUG + _print_data (buftemp, rc); +#endif + buffer = create_buf(buf, buflen); + + if(unpack_header(&header, buffer) == SLURM_ERROR) { + free_buf(buffer); + rc = SLURM_COMMUNICATIONS_RECEIVE_ERROR; + goto total_return; + } + + if (check_header_version(&header) < 0) { + free_buf(buffer); + rc = SLURM_PROTOCOL_VERSION_ERROR; + goto total_return; + } + if(header.ret_cnt > 0) { + error("we recieved more than one message back use " + "slurm_receive_msgs instead"); + header.ret_cnt = 0; + list_destroy(header.ret_list); + header.ret_list = NULL; + } + //info("ret_cnt = %d",header.ret_cnt); + /* if(header.ret_cnt > 0) { */ +/* while((ret_data_info = list_pop(header.ret_list))) */ +/* list_push(msg->ret_list, ret_data_info); */ +/* header.ret_cnt = 0; */ +/* list_destroy(header.ret_list); */ +/* header.ret_list = NULL; */ +/* } */ + /* + * header.orig_addr will be set to where the first message + * came from if this is a forward else we set the + * header.orig_addr to our addr just incase we need to send it off. + */ + if(header.orig_addr.sin_addr.s_addr != 0) { + memcpy(&msg->orig_addr, &header.orig_addr, sizeof(slurm_addr)); + } else { + memcpy(&header.orig_addr, orig_addr, sizeof(slurm_addr)); + } + + /* Forward message to other nodes */ + if(header.forward.cnt > 0) { + debug("forwarding to %u", header.forward.cnt); + msg->forward_struct = xmalloc(sizeof(forward_struct_t)); + msg->forward_struct->buf_len = remaining_buf(buffer); + msg->forward_struct->buf = + xmalloc(sizeof(char) * msg->forward_struct->buf_len); + memcpy(msg->forward_struct->buf, + &buffer->head[buffer->processed], + msg->forward_struct->buf_len); + + msg->forward_struct->ret_list = msg->ret_list; + /* take out the amount of timeout from this hop */ + msg->forward_struct->timeout = header.forward.timeout; + if(msg->forward_struct->timeout < 0) + msg->forward_struct->timeout = 0; + msg->forward_struct->fwd_cnt = header.forward.cnt; + + debug3("forwarding messages to %u nodes with timeout of %d", + msg->forward_struct->fwd_cnt, + msg->forward_struct->timeout); + + if(forward_msg(msg->forward_struct, &header) == SLURM_ERROR) { + error("problem with forward msg"); + } + } + + if ((auth_cred = g_slurm_auth_unpack(buffer)) == NULL) { + error( "authentication: %s ", + g_slurm_auth_errstr(g_slurm_auth_errno(NULL))); + free_buf(buffer); + rc = ESLURM_PROTOCOL_INCOMPLETE_PACKET; + goto total_return; + } + rc = g_slurm_auth_verify( auth_cred, NULL, 2 ); + + if (rc != SLURM_SUCCESS) { + error( "authentication: %s ", + g_slurm_auth_errstr(g_slurm_auth_errno(auth_cred))); + (void) g_slurm_auth_destroy(auth_cred); + free_buf(buffer); + rc = SLURM_PROTOCOL_AUTHENTICATION_ERROR; + goto total_return; + } + + /* + * Unpack message body + */ + msg->msg_type = header.msg_type; + + if ( (header.body_length > remaining_buf(buffer)) || + (unpack_msg(msg, buffer) != SLURM_SUCCESS) ) { + (void) g_slurm_auth_destroy(auth_cred); + free_buf(buffer); + rc = ESLURM_PROTOCOL_INCOMPLETE_PACKET; + goto total_return; + } + + msg->auth_cred = (void *) auth_cred; + + free_buf(buffer); + rc = SLURM_SUCCESS; + +total_return: + destroy_forward(&header.forward); + + slurm_seterrno(rc); + if(rc != SLURM_SUCCESS) { + msg->msg_type = RESPONSE_FORWARD_FAILED; + msg->auth_cred = (void *) NULL; + msg->data = NULL; + error("slurm_receive_and_forward_msgs: %s", + slurm_strerror(rc)); + } else { + rc = 0; + } + return rc; + +} + +/**********************************************************************\ + * send message functions +\**********************************************************************/ + +/* + * Do the wonderful stuff that needs be done to pack msg + * and hdr into buffer + */ +static void +_pack_msg(slurm_msg_t *msg, header_t *hdr, Buf buffer) +{ + unsigned int tmplen, msglen; + + tmplen = get_buf_offset(buffer); + pack_msg(msg, buffer); + msglen = get_buf_offset(buffer) - tmplen; + + /* update header with correct cred and msg lengths */ + update_header(hdr, msglen); + + /* repack updated header */ + tmplen = get_buf_offset(buffer); + set_buf_offset(buffer, 0); + pack_header(hdr, buffer); + set_buf_offset(buffer, tmplen); +} + +/* + * Send a slurm message over an open file descriptor `fd' + * Returns the size of the message sent in bytes, or -1 on failure. + */ +int slurm_send_node_msg(slurm_fd fd, slurm_msg_t * msg) +{ + header_t header; + Buf buffer; + int rc; + void * auth_cred; + + /* + * Initialize header with Auth credential and message type. + */ + auth_cred = g_slurm_auth_create(NULL, 2); + if (auth_cred == NULL) { + error("authentication: %s", + g_slurm_auth_errstr(g_slurm_auth_errno(NULL)) ); + slurm_seterrno_ret(SLURM_PROTOCOL_AUTHENTICATION_ERROR); + } + + if(msg->forward.init != FORWARD_INIT) { + forward_init(&msg->forward, NULL); + msg->ret_list = NULL; + } + forward_wait(msg); + + init_header(&header, msg, SLURM_PROTOCOL_NO_FLAGS); + + /* + * Pack header into buffer for transmission + */ + buffer = init_buf(BUF_SIZE); + pack_header(&header, buffer); + + /* + * Pack auth credential + */ + rc = g_slurm_auth_pack(auth_cred, buffer); + (void) g_slurm_auth_destroy(auth_cred); + if (rc) { + error("authentication: %s", + g_slurm_auth_errstr(g_slurm_auth_errno(auth_cred))); + free_buf(buffer); + slurm_seterrno_ret(SLURM_PROTOCOL_AUTHENTICATION_ERROR); + } + + /* + * Pack message into buffer + */ + _pack_msg(msg, &header, buffer); + +#if _DEBUG + _print_data (get_buf_data(buffer),get_buf_offset(buffer)); +#endif + /* + * Send message + */ + rc = _slurm_msg_sendto( fd, get_buf_data(buffer), + get_buf_offset(buffer), + SLURM_PROTOCOL_NO_SEND_RECV_FLAGS ); + + if (rc < 0) + error("slurm_msg_sendto: %m"); + + free_buf(buffer); + return rc; +} + +/**********************************************************************\ + * stream functions +\**********************************************************************/ + +/* slurm_listen_stream + * opens a stream server and listens on it + * IN slurm_address - slurm_addr to bind the server stream to + * RET slurm_fd - file descriptor of the stream created + */ +slurm_fd slurm_listen_stream(slurm_addr * slurm_address) +{ + return _slurm_listen_stream(slurm_address); +} + +/* slurm_accept_stream + * accepts a incomming stream connection on a stream server slurm_fd + * IN open_fd - file descriptor to accept connection on + * OUT slurm_address - slurm_addr of the accepted connection + * RET slurm_fd - file descriptor of the accepted connection + */ +slurm_fd slurm_accept_stream(slurm_fd open_fd, slurm_addr * slurm_address) +{ + return _slurm_accept_stream(open_fd, slurm_address); +} + +/* slurm_open_stream + * opens a client connection to stream server + * IN slurm_address - slurm_addr of the connection destination + * RET slurm_fd - file descriptor of the connection created + * NOTE: Retry with various ports as needed if connection is refused + */ +slurm_fd slurm_open_stream(slurm_addr * slurm_address) +{ + return _slurm_open_stream(slurm_address, true); +} + +/* slurm_write_stream + * writes a buffer out a stream file descriptor + * IN open_fd - file descriptor to write on + * IN buffer - buffer to send + * IN size - size of buffer send + * IN timeout - how long to wait in milliseconds + * RET size_t - bytes sent , or -1 on errror + */ +size_t slurm_write_stream(slurm_fd open_fd, char *buffer, size_t size) +{ + return _slurm_send_timeout(open_fd, buffer, size, + SLURM_PROTOCOL_NO_SEND_RECV_FLAGS, + (slurm_get_msg_timeout() * 1000)); +} +size_t slurm_write_stream_timeout(slurm_fd open_fd, char *buffer, + size_t size, int timeout) +{ + return _slurm_send_timeout(open_fd, buffer, size, + SLURM_PROTOCOL_NO_SEND_RECV_FLAGS, + timeout); +} + +/* slurm_read_stream + * read into buffer grom a stream file descriptor + * IN open_fd - file descriptor to read from + * OUT buffer - buffer to receive into + * IN size - size of buffer + * IN timeout - how long to wait in milliseconds + * RET size_t - bytes read , or -1 on errror + */ +size_t slurm_read_stream(slurm_fd open_fd, char *buffer, size_t size) +{ + return _slurm_recv_timeout(open_fd, buffer, size, + SLURM_PROTOCOL_NO_SEND_RECV_FLAGS, + (slurm_get_msg_timeout() * 1000)); +} +size_t slurm_read_stream_timeout(slurm_fd open_fd, char *buffer, + size_t size, int timeout) +{ + return _slurm_recv_timeout(open_fd, buffer, size, + SLURM_PROTOCOL_NO_SEND_RECV_FLAGS, + timeout); +} + +/* slurm_get_stream_addr + * esentially a encapsilated get_sockname + * IN open_fd - file descriptor to retreive slurm_addr for + * OUT address - address that open_fd to bound to + */ +int slurm_get_stream_addr(slurm_fd open_fd, slurm_addr * address) +{ + return _slurm_get_stream_addr(open_fd, address); +} + +/* slurm_close_stream + * closes either a server or client stream file_descriptor + * IN open_fd - an open file descriptor to close + * RET int - the return code + */ +int slurm_close_stream(slurm_fd open_fd) +{ + return _slurm_close_stream(open_fd); +} + +/* make an open slurm connection blocking or non-blocking + * (i.e. wait or do not wait for i/o completion ) + * IN open_fd - an open file descriptor to change the effect + * RET int - the return code + */ +int slurm_set_stream_non_blocking(slurm_fd open_fd) +{ + return _slurm_set_stream_non_blocking(open_fd); +} +int slurm_set_stream_blocking(slurm_fd open_fd) +{ + return _slurm_set_stream_blocking(open_fd); +} + +/**********************************************************************\ + * address conversion and management functions +\**********************************************************************/ + +/* slurm_set_addr_uint + * initializes the slurm_address with the supplied port and ip_address + * OUT slurm_address - slurm_addr to be filled in + * IN port - port in host order + * IN ip_address - ipv4 address in uint32 host order form + */ +void slurm_set_addr_uint(slurm_addr * slurm_address, uint16_t port, + uint32_t ip_address) +{ + _slurm_set_addr_uint(slurm_address, port, ip_address); +} + +/* slurm_set_addr_any + * initialized the slurm_address with the supplied port on INADDR_ANY + * OUT slurm_address - slurm_addr to be filled in + * IN port - port in host order + */ +void slurm_set_addr_any(slurm_addr * slurm_address, uint16_t port) +{ + _slurm_set_addr_uint(slurm_address, port, SLURM_INADDR_ANY); +} + +/* slurm_set_addr + * initializes the slurm_address with the supplied port and host name + * OUT slurm_address - slurm_addr to be filled in + * IN port - port in host order + * IN host - hostname or dns name + */ +void slurm_set_addr(slurm_addr * slurm_address, uint16_t port, char *host) +{ + _slurm_set_addr_char(slurm_address, port, host); +} + +/* reset_slurm_addr + * resets the address field of a slurm_addr, port and family unchanged + * OUT slurm_address - slurm_addr to be reset in + * IN new_address - source of address to write into slurm_address + */ +void reset_slurm_addr(slurm_addr * slurm_address, slurm_addr new_address) +{ + _reset_slurm_addr(slurm_address, new_address); +} + +/* slurm_set_addr_char + * initializes the slurm_address with the supplied port and host + * OUT slurm_address - slurm_addr to be filled in + * IN port - port in host order + * IN host - hostname or dns name + */ +void slurm_set_addr_char(slurm_addr * slurm_address, uint16_t port, + char *host) +{ + _slurm_set_addr_char(slurm_address, port, host); +} + +/* slurm_get_addr + * given a slurm_address it returns its port and hostname + * IN slurm_address - slurm_addr to be queried + * OUT port - port number + * OUT host - hostname + * IN buf_len - length of hostname buffer + */ +void slurm_get_addr(slurm_addr * slurm_address, uint16_t * port, + char *host, unsigned int buf_len) +{ + _slurm_get_addr(slurm_address, port, host, buf_len); +} + +/* slurm_get_ip_str + * given a slurm_address it returns its port and ip address string + * IN slurm_address - slurm_addr to be queried + * OUT port - port number + * OUT ip - ip address in dotted-quad string form + * IN buf_len - length of ip buffer + */ +void slurm_get_ip_str(slurm_addr * slurm_address, uint16_t * port, + char *ip, unsigned int buf_len) +{ + unsigned char *uc = (unsigned char *)&slurm_address->sin_addr.s_addr; + *port = slurm_address->sin_port; + snprintf(ip, buf_len, "%u.%u.%u.%u", uc[0], uc[1], uc[2], uc[3]); +} + +/* slurm_get_peer_addr + * get the slurm address of the peer connection, similar to getpeeraddr + * IN fd - an open connection + * OUT slurm_address - place to park the peer's slurm_addr + */ +int slurm_get_peer_addr(slurm_fd fd, slurm_addr * slurm_address) +{ + struct sockaddr name; + socklen_t namelen = (socklen_t) sizeof(struct sockaddr); + int rc; + + if ((rc = _slurm_getpeername((int) fd, &name, &namelen))) + return rc; + memcpy(slurm_address, &name, sizeof(slurm_addr)); + return 0; +} + +/* slurm_print_slurm_addr + * prints a slurm_addr into a buf + * IN address - slurm_addr to print + * IN buf - space for string representation of slurm_addr + * IN n - max number of bytes to write (including NUL) + */ +void slurm_print_slurm_addr(slurm_addr * address, char *buf, size_t n) +{ + _slurm_print_slurm_addr(address, buf, n); +} + +/**********************************************************************\ + * slurm_addr pack routines +\**********************************************************************/ + +/* + * Pack just the message with no header and send back the buffer. + */ +Buf slurm_pack_msg_no_header(slurm_msg_t * msg) +{ + Buf buffer = NULL; + + buffer = init_buf(0); + + /* + * Pack message into buffer + */ + pack_msg(msg, buffer); + + return buffer; +} + +/* slurm_pack_slurm_addr + * packs a slurm_addr into a buffer to serialization transport + * IN slurm_address - slurm_addr to pack + * IN/OUT buffer - buffer to pack the slurm_addr into + */ +void slurm_pack_slurm_addr(slurm_addr * slurm_address, Buf buffer) +{ + _slurm_pack_slurm_addr(slurm_address, buffer); +} + +/* slurm_unpack_slurm_addr + * unpacks a buffer into a slurm_addr after serialization transport + * OUT slurm_address - slurm_addr to unpack to + * IN/OUT buffer - buffer to unpack the slurm_addr from + * returns - SLURM error code + */ +int slurm_unpack_slurm_addr_no_alloc(slurm_addr * slurm_address, + Buf buffer) +{ + return _slurm_unpack_slurm_addr_no_alloc(slurm_address, buffer); +} + +/* slurm_pack_slurm_addr_array + * packs an array of slurm_addrs into a buffer + * OUT slurm_address - slurm_addr to pack + * IN size_val - how many to pack + * IN/OUT buffer - buffer to pack the slurm_addr from + * returns - SLURM error code + */ +void slurm_pack_slurm_addr_array(slurm_addr * slurm_address, + uint16_t size_val, Buf buffer) +{ + int i = 0; + uint16_t nl = htons(size_val); + pack16((uint16_t)nl, buffer); + + for (i = 0; i < size_val; i++) { + slurm_pack_slurm_addr(slurm_address + i, buffer); + } + +} + +/* slurm_unpack_slurm_addr_array + * unpacks an array of slurm_addrs from a buffer + * OUT slurm_address - slurm_addr to unpack to + * IN size_val - how many to unpack + * IN/OUT buffer - buffer to upack the slurm_addr from + * returns - SLURM error code + */ +int slurm_unpack_slurm_addr_array(slurm_addr ** slurm_address, + uint16_t * size_val, Buf buffer) +{ + int i = 0; + uint16_t nl; + + *slurm_address = NULL; + safe_unpack16(&nl, buffer); + *size_val = ntohs(nl); + *slurm_address = xmalloc((*size_val) * sizeof(slurm_addr)); + + for (i = 0; i < *size_val; i++) { + if (slurm_unpack_slurm_addr_no_alloc((*slurm_address) + i, + buffer)) + goto unpack_error; + + } + return SLURM_SUCCESS; + +unpack_error: + xfree(*slurm_address); + *slurm_address = NULL; + return SLURM_ERROR; +} + + +/**********************************************************************\ + * simplified communication routines + * They open a connection do work then close the connection all within + * the function +\**********************************************************************/ + +/* slurm_send_rc_msg + * given the original request message this function sends a + * slurm_return_code message back to the client that made the request + * IN request_msg - slurm_msg the request msg + * IN rc - the return_code to send back to the client + */ +int slurm_send_rc_msg(slurm_msg_t *msg, int rc) +{ + slurm_msg_t resp_msg; + return_code_msg_t rc_msg; + + if (msg->conn_fd < 0) + return (ENOTCONN); + rc_msg.return_code = rc; + + resp_msg.address = msg->address; + resp_msg.msg_type = RESPONSE_SLURM_RC; + resp_msg.data = &rc_msg; + resp_msg.forward = msg->forward; + resp_msg.forward_struct = msg->forward_struct; + resp_msg.ret_list = msg->ret_list; + resp_msg.orig_addr = msg->orig_addr; + + /* send message */ + return slurm_send_node_msg(msg->conn_fd, &resp_msg); +} + +/* + * Send and recv a slurm request and response on the open slurm descriptor + * IN fd - file descriptor to receive msg on + * IN req - a slurm_msg struct to be sent by the function + * OUT resp - a slurm_msg struct to be filled in by the function + * IN timeout - how long to wait in milliseconds + * RET int - returns 0 on success, -1 on failure and sets errno + */ +static int +_send_and_recv_msg(slurm_fd fd, slurm_msg_t *req, + slurm_msg_t *resp, int timeout) +{ + int retry = 0; + int rc = 0; + slurm_msg_t_init(resp); + + if(slurm_send_node_msg(fd, req) >= 0) { + /* no need to adjust and timeouts here since we are not + forwarding or expecting anything other than 1 message + and the regular timeout will be altered in + slurm_recieve_msg if it is 0 */ + rc = slurm_receive_msg(fd, resp, timeout); + } + + + /* + * Attempt to close an open connection + */ + while ((slurm_shutdown_msg_conn(fd) < 0) && (errno == EINTR) ) { + if (retry++ > MAX_SHUTDOWN_RETRY) { + break; + } + } + + return rc; +} + +/* + * Send and recv a slurm request and response on the open slurm descriptor + * with a list containing the responses of the children (if any) we + * forwarded the message to. List containing type (ret_data_info_t). + * IN fd - file descriptor to receive msg on + * IN req - a slurm_msg struct to be sent by the function + * IN timeout - how long to wait in milliseconds + * RET List - List containing the responses of the childern (if any) we + * forwarded the message to. List containing type + * (ret_data_info_t). + */ +static List +_send_and_recv_msgs(slurm_fd fd, slurm_msg_t *req, int timeout) +{ + int retry = 0; + List ret_list = NULL; + int steps = 0; + + if (!req->forward.timeout) { + if(!timeout) + timeout = slurm_get_msg_timeout() * 1000; + req->forward.timeout = timeout; + } + if(slurm_send_node_msg(fd, req) >= 0) { + if(req->forward.cnt>0) { + /* figure out where we are in the tree and set + the timeout for to wait for our childern + correctly (timeout+1 sec per step) + to let the child timeout */ + + steps = req->forward.cnt/slurm_get_tree_width(); + timeout = (1000*steps); + steps++; + + timeout += (req->forward.timeout*steps); + } + ret_list = slurm_receive_msgs(fd, steps, timeout); + } + + + /* + * Attempt to close an open connection + */ + while ((slurm_shutdown_msg_conn(fd) < 0) && (errno == EINTR) ) { + if (retry++ > MAX_SHUTDOWN_RETRY) { + break; + } + } + + return ret_list; +} + + +/* + * slurm_send_recv_controller_msg + * opens a connection to the controller, sends the controller a message, + * listens for the response, then closes the connection + * IN request_msg - slurm_msg request + * OUT response_msg - slurm_msg response + * RET int - returns 0 on success, -1 on failure and sets errno + */ +int slurm_send_recv_controller_msg(slurm_msg_t *req, slurm_msg_t *resp) +{ + slurm_fd fd = -1; + int rc = 0; + time_t start_time = time(NULL); + int retry = 1; + slurm_ctl_conf_t *conf; + bool backup_controller_flag; + uint16_t slurmctld_timeout; + slurm_addr ctrl_addr; + + /* Just in case the caller didn't initialize his slurm_msg_t, and + * since we KNOW that we are only sending to one node (the controller), + * we initialize some forwarding variables to disable forwarding. + */ + forward_init(&req->forward, NULL); + req->ret_list = NULL; + req->forward_struct = NULL; + + if ((fd = slurm_open_controller_conn(&ctrl_addr)) < 0) { + rc = -1; + goto cleanup; + } + + conf = slurm_conf_lock(); + backup_controller_flag = conf->backup_controller ? true : false; + slurmctld_timeout = conf->slurmctld_timeout; + slurm_conf_unlock(); + + while(retry) { + /* If the backup controller is in the process of assuming + * control, we sleep and retry later */ + retry = 0; + rc = _send_and_recv_msg(fd, req, resp, 0); + if (resp->auth_cred) + g_slurm_auth_destroy(resp->auth_cred); + else + rc = -1; + + if ((rc == 0) + && (resp->msg_type == RESPONSE_SLURM_RC) + && ((((return_code_msg_t *) resp->data)->return_code) + == ESLURM_IN_STANDBY_MODE) + && (req->msg_type != MESSAGE_NODE_REGISTRATION_STATUS) + && (backup_controller_flag) + && (difftime(time(NULL), start_time) + < (slurmctld_timeout + (slurmctld_timeout / 2)))) { + + debug("Neither primary nor backup controller " + "responding, sleep and retry"); + slurm_free_return_code_msg(resp->data); + sleep(30); + if ((fd = slurm_open_controller_conn(&ctrl_addr)) + < 0) { + rc = -1; + } else { + retry = 1; + } + } + + if (rc == -1) + break; + } + + cleanup: + if (rc != 0) + _remap_slurmctld_errno(); + + return rc; +} + +/* slurm_send_recv_node_msg + * opens a connection to node, sends the node a message, listens + * for the response, then closes the connection + * IN request_msg - slurm_msg request + * OUT response_msg - slurm_msg response + * IN timeout - how long to wait in milliseconds + * RET int - returns 0 on success, -1 on failure and sets errno + */ +int slurm_send_recv_node_msg(slurm_msg_t *req, slurm_msg_t *resp, int timeout) +{ + slurm_fd fd = -1; + + resp->auth_cred = NULL; + if ((fd = slurm_open_msg_conn(&req->address)) < 0) + return -1; + + return _send_and_recv_msg(fd, req, resp, timeout); + +} + +/* slurm_send_only_controller_msg + * opens a connection to the controller, sends the controller a + * message then, closes the connection + * IN request_msg - slurm_msg request + * RET int - return code + */ +int slurm_send_only_controller_msg(slurm_msg_t *req) +{ + int rc = SLURM_SUCCESS; + int retry = 0; + slurm_fd fd = -1; + slurm_addr ctrl_addr; + + /* + * Open connection to SLURM controller: + */ + if ((fd = slurm_open_controller_conn(&ctrl_addr)) < 0) { + rc = SLURM_SOCKET_ERROR; + goto cleanup; + } + + if((rc = slurm_send_node_msg(fd, req) < 0)) { + rc = SLURM_ERROR; + } else { + debug3("slurm_send_only_controller_msg: sent %d", rc); + rc = SLURM_SUCCESS; + } + + /* + * Attempt to close an open connection + */ + while ( (slurm_shutdown_msg_conn(fd) < 0) && (errno == EINTR) ) { + if (retry++ > MAX_SHUTDOWN_RETRY) { + rc = SLURM_SOCKET_ERROR; + goto cleanup; + } + } + + cleanup: + if (rc != SLURM_SUCCESS) + _remap_slurmctld_errno(); + return rc; +} + +/* + * Open a connection to the "address" specified in the slurm msg `req' + * Then, immediately close the connection w/out waiting for a reply. + * + * Returns SLURM_SUCCESS on success SLURM_FAILURE (< 0) for failure. + */ +int slurm_send_only_node_msg(slurm_msg_t *req) +{ + int rc = SLURM_SUCCESS; + int retry = 0; + slurm_fd fd = -1; + + if ((fd = slurm_open_msg_conn(&req->address)) < 0) { + return SLURM_SOCKET_ERROR; + } + + if((rc = slurm_send_node_msg(fd, req) < 0)) { + rc = SLURM_ERROR; + } else { + debug3("slurm_send_only_node_msg: sent %d", rc); + rc = SLURM_SUCCESS; + } + /* + * Attempt to close an open connection + */ + while ( (slurm_shutdown_msg_conn(fd) < 0) && (errno == EINTR) ) { + if (retry++ > MAX_SHUTDOWN_RETRY) + return SLURM_SOCKET_ERROR; + } + + return rc; +} + +/* + * Send a message to the nodelist specificed using fanout + * Then return List containing type (ret_data_info_t). + * IN nodelist - list of nodes to send to. + * IN msg - a slurm_msg struct to be sent by the function + * IN timeout - how long to wait in milliseconds + * RET List - List containing the responses of the childern + * (if any) we forwarded the message to. List + * containing type (ret_data_info_t). + */ +List slurm_send_recv_msgs(const char *nodelist, slurm_msg_t *msg, + int timeout) +{ + List ret_list = NULL; + List tmp_ret_list = NULL; + slurm_fd fd = -1; + char *name = NULL; + char buf[8192]; + hostlist_t hl = NULL; + ret_data_info_t *ret_data_info = NULL; + ListIterator itr; + + if(!nodelist || !strlen(nodelist)) { + error("slurm_send_recv_msgs: no nodelist given"); + return NULL; + } + +/* info("total sending to %s",nodelist); */ + hl = hostlist_create(nodelist); + + while((name = hostlist_shift(hl))) { + + if(slurm_conf_get_addr(name, &msg->address) == SLURM_ERROR) { + error("slurm_send_recv_msgs: can't get addr for " + "host %s", name); + mark_as_failed_forward(&tmp_ret_list, name, + SLURM_SOCKET_ERROR); + free(name); + continue; + } + + if ((fd = slurm_open_msg_conn(&msg->address)) < 0) { + error("slurm_send_recv_msgs to %s: %m", name); + + mark_as_failed_forward(&tmp_ret_list, name, + SLURM_SOCKET_ERROR); + free(name); + continue; + } + + debug3("sending to %s", name); + hostlist_ranged_string(hl, sizeof(buf), buf); + + forward_init(&msg->forward, NULL); + msg->forward.nodelist = xstrdup(buf); + msg->forward.timeout = timeout; + msg->forward.cnt = hostlist_count(hl); + debug3("along with to %s", msg->forward.nodelist); + + if(!(ret_list = _send_and_recv_msgs(fd, msg, timeout))) { + xfree(msg->forward.nodelist); + error("slurm_send_recv_msgs(_send_and_recv_msgs) " + "to %s: %m", name); + mark_as_failed_forward(&tmp_ret_list, name, errno); + free(name); + continue; + } else { + itr = list_iterator_create(ret_list); + while((ret_data_info = list_next(itr))) + if(!ret_data_info->node_name) { + ret_data_info->node_name = + xstrdup(name); + } + list_iterator_destroy(itr); + } + free(name); + break; + } + hostlist_destroy(hl); + + if(tmp_ret_list) { + if(!ret_list) + ret_list = tmp_ret_list; + else { + while((ret_data_info = list_pop(tmp_ret_list))) + list_push(ret_list, ret_data_info); + list_destroy(tmp_ret_list); + } + } + return ret_list; +} + +/* + * Send a message to msg->address + * Then return List containing type (ret_data_info_t). + * IN msg - a slurm_msg struct to be sent by the function + * IN timeout - how long to wait in milliseconds + * RET List - List containing the responses of the childern + * (if any) we forwarded the message to. List + * containing type (ret_types_t). + */ +List slurm_send_addr_recv_msgs(slurm_msg_t *msg, char *name, int timeout) +{ + List ret_list = NULL; + List tmp_ret_list = NULL; + slurm_fd fd = -1; + ret_data_info_t *ret_data_info = NULL; + ListIterator itr; + + if ((fd = slurm_open_msg_conn(&msg->address)) < 0) { + mark_as_failed_forward(&ret_list, name, + SLURM_SOCKET_ERROR); + return ret_list; + } + + /*just to make sure */ + forward_init(&msg->forward, NULL); + msg->ret_list = NULL; + msg->forward_struct = NULL; + if(!(ret_list = _send_and_recv_msgs(fd, msg, timeout))) { + mark_as_failed_forward(&tmp_ret_list, name, errno); + return ret_list; + } else { + itr = list_iterator_create(ret_list); + while((ret_data_info = list_next(itr))) + if(!ret_data_info->node_name) { + ret_data_info->node_name = xstrdup(name); + } + list_iterator_destroy(itr); + } + return ret_list; +} + + + +/* + * Open a connection to the "address" specified in the the slurm msg "req" + * Then read back an "rc" message returning the "return_code" specified + * in the response in the "rc" parameter. + * IN req - a slurm_msg struct to be sent by the function + * OUT rc - return code from the sent message + * IN timeout - how long to wait in milliseconds + * RET int either 0 for success or -1 for failure. + */ +int slurm_send_recv_rc_msg_only_one(slurm_msg_t *req, int *rc, int timeout) +{ + slurm_fd fd = -1; + int ret_c = 0; + slurm_msg_t resp; + + slurm_msg_t_init(&resp); + + /* Just in case the caller didn't initialize his slurm_msg_t, and + * since we KNOW that we are only sending to one node, + * we initialize some forwarding variables to disable forwarding. + */ + forward_init(&req->forward, NULL); + req->ret_list = NULL; + req->forward_struct = NULL; + + if ((fd = slurm_open_msg_conn(&req->address)) < 0) { + return -1; + } + + if(!_send_and_recv_msg(fd, req, &resp, timeout)) { + if(resp.auth_cred) + g_slurm_auth_destroy(resp.auth_cred); + *rc = slurm_get_return_code(resp.msg_type, resp.data); + ret_c = 0; + } else + ret_c = -1; + return ret_c; +} + +/* + * Same as above, but send message to controller + */ +int slurm_send_recv_controller_rc_msg(slurm_msg_t *req, int *rc) +{ + slurm_fd fd = -1; + int ret_c = 0; + slurm_addr ctrl_addr; + slurm_msg_t resp; + + slurm_msg_t_init(&resp); + + /* Just in case the caller didn't initialize his slurm_msg_t, and + * since we KNOW that we are only sending to one node (the controller), + * we initialize some forwarding variables to disable forwarding. + */ + forward_init(&req->forward, NULL); + req->ret_list = NULL; + req->forward_struct = NULL; + + if ((fd = slurm_open_controller_conn(&ctrl_addr)) < 0) + return -1; + + if(!_send_and_recv_msg(fd, req, &resp, 0)) { + if(resp.auth_cred) + g_slurm_auth_destroy(resp.auth_cred); + *rc = slurm_get_return_code(resp.msg_type, resp.data); + ret_c = 0; + } else + ret_c = -1; + return ret_c; +} + +/* this is used to set how many nodes are going to be on each branch + * of the tree. + * IN total - total number of nodes to send to + * IN tree_width - how wide the tree should be on each hop + * RET int * - int array tree_width in length each space + * containing the number of nodes to send to each hop + * on the span. + */ + +extern int *set_span(int total, uint16_t tree_width) +{ + int *span = NULL; + int left = total; + int i = 0; + + if (tree_width == 0) + tree_width = slurm_get_tree_width(); + + span = xmalloc(sizeof(int) * tree_width); + //info("span count = %d", tree_width); + if(total <= tree_width) { + return span; + } + + while(left > 0) { + for(i = 0; i < tree_width; i++) { + if((tree_width-i) >= left) { + if(span[i] == 0) { + left = 0; + break; + } else { + span[i] += left; + left = 0; + break; + } + } else if(left <= tree_width) { + span[i] += left; + left = 0; + break; + } + span[i] += tree_width; + left -= tree_width; + } + } + return span; +} + +/* + * Free a slurm message + */ +extern void slurm_free_msg(slurm_msg_t * msg) +{ + if(msg->auth_cred) + (void) g_slurm_auth_destroy(msg->auth_cred); + + if(msg->ret_list) { + list_destroy(msg->ret_list); + msg->ret_list = NULL; + } + xfree(msg); +} + +extern char *nodelist_nth_host(const char *nodelist, int inx) +{ + hostlist_t hl = hostlist_create(nodelist); + char *name = hostlist_nth(hl, inx); + hostlist_destroy(hl); + return name; +} + +extern int nodelist_find(const char *nodelist, const char *name) +{ + hostlist_t hl = hostlist_create(nodelist); + int id = hostlist_find(hl, name); + hostlist_destroy(hl); + return id; +} + +extern void convert_num_unit(float num, char *buf, int orig_type) +{ + char *unit = "\0KMGP?"; + int i = (int)num % 512; + + if(i > 0 || (int)num == 0) { + sprintf(buf, "%d", (int)num); + return; + } + + while(num>1024) { + num /= 1024; + orig_type++; + } + + if(orig_type < UNIT_NONE || orig_type > UNIT_PETA) + orig_type = UNIT_UNKNOWN; + i = (int)num; + if(i == num) + sprintf(buf, "%d%c", i, unit[orig_type]); + else + sprintf(buf, "%.2f%c", num, unit[orig_type]); +} + +extern int revert_num_unit(const char *buf) +{ + char *unit = "\0KMGP\0"; + int i = 1, j = 0, number = 0; + + if(!buf) + return -1; + j = strlen(buf) - 1; + while(unit[i]) { + if(toupper((int)buf[j]) == unit[i]) + break; + i++; + } + + number = atoi(buf); + if(unit[i]) + number *= (i*1024); + + return number; +} + +#if _DEBUG + +static void _print_data(char *data, int len) +{ + int i; + for (i = 0; i < len; i++) { + if ((i % 10 == 0) && (i != 0)) + printf("\n"); + printf("%2.2x ", ((int) data[i] & 0xff)); + if (i >= 200) + break; + } + printf("\n\n"); +} + +#endif + + +/* + * vi: shiftwidth=8 tabstop=8 expandtab + */ diff --git a/executable_names/src/common/slurm_protocol_api.h b/executable_names/src/common/slurm_protocol_api.h new file mode 100644 index 0000000000000000000000000000000000000000..5b1b8ad96fcc69200641c52de4c2bd63a647073a --- /dev/null +++ b/executable_names/src/common/slurm_protocol_api.h @@ -0,0 +1,712 @@ +/*****************************************************************************\ + * slurm_protocol_api.h - high-level slurm communication functions + * definitions + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PROTOCOL_API_H +#define _SLURM_PROTOCOL_API_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +#include +#include + +#include + +#include "src/common/pack.h" +#include "src/common/slurm_protocol_common.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/slurm_protocol_util.h" + +#define MIN_NOALLOC_JOBID ((uint32_t) 0xffff0000) +#define MAX_NOALLOC_JOBID ((uint32_t) 0xfffffffd) + +enum controller_id { + PRIMARY_CONTROLLER = 1, + SECONDARY_CONTROLLER = 2 +}; + +/* unit types */ +enum { + UNIT_NONE, + UNIT_KILO, + UNIT_MEGA, + UNIT_GIGA, + UNIT_PETA, + UNIT_UNKNOWN +}; + +/**********************************************************************\ + * protocol configuration functions +\**********************************************************************/ + +/* slurm_set_api_config + * sets the slurm_protocol_config object + * IN protocol_conf - slurm_protocol_config object + */ +int inline slurm_set_api_config(slurm_protocol_config_t * protocol_conf); + +/* slurm_get_api_config + * returns a pointer to the current slurm_protocol_config object + * RET slurm_protocol_config_t - current slurm_protocol_config object + */ +inline slurm_protocol_config_t *slurm_get_api_config(); + +/* slurm_get_mpi_default + * get default mpi value from slurmctld_conf object + * RET char * - mpi default value from slurm.conf, MUST be xfreed by caller + */ +char *slurm_get_mpi_default(void); + +/* slurm_get_msg_timeout + * get default message timeout value from slurmctld_conf object + */ +uint16_t inline slurm_get_msg_timeout(void); + +/* slurm_api_set_conf_file + * set slurm configuration file to a non-default value + * pathname IN - pathname of slurm configuration file to be used + */ +extern void slurm_api_set_conf_file(char *pathname); + +/* slurm_api_set_default_config + * called by the send_controller_msg function to insure that at least + * the compiled in default slurm_protocol_config object is initialized + * RET int - return code + */ +int inline slurm_api_set_default_config(); + +/* slurm_api_clear_config + * execute this only at program termination to free all memory */ +void inline slurm_api_clear_config(void); + +/* slurm_get_plugin_dir + * get plugin directory from slurmctld_conf object from slurmctld_conf object + * RET char * - plugin directory, MUST be xfreed by caller + */ +char *slurm_get_plugin_dir(void); + +/* slurm_get_auth_type + * returns the authentication type from slurmctld_conf object + * RET char * - auth type, MUST be xfreed by caller + */ +extern char *slurm_get_auth_type(void); + +/* slurm_set_auth_type + * set the authentication type in slurmctld_conf object + * used for security testing purposes + * RET 0 or error code + */ +extern int slurm_set_auth_type(char *auth_type); + +/* slurm_get_fast_schedule + * returns the value of fast_schedule in slurmctld_conf object + */ +extern uint16_t slurm_get_fast_schedule(void); + +/* slurm_set_tree_width + * sets the value of tree_width in slurmctld_conf object + * RET 0 or error code + */ +extern int slurm_set_tree_width(uint16_t tree_width); +/* slurm_get_tree_width + * returns the value of tree_width in slurmctld_conf object + */ +extern uint16_t slurm_get_tree_width(void); + +/* slurm_get_jobacct_loc + * returns the job accounting loc from slurmctld_conf object + * RET char * - job accounting location, MUST be xfreed by caller + */ +char *slurm_get_jobacct_loc(void); + +/* slurm_get_jobacct_freq + * returns the job accounting poll frequency from the slurmctld_conf object + * RET int - job accounting frequency + */ +uint16_t slurm_get_jobacct_freq(void); + +/* slurm_get_jobacct_type + * returns the job accounting type from slurmctld_conf object + * RET char * - job accounting type, MUST be xfreed by caller + */ +char *slurm_get_jobacct_type(void); + +/* slurm_get_jobcomp_type + * returns the job completion logger type from slurmctld_conf object + * RET char * - job completion type, MUST be xfreed by caller + */ +char *slurm_get_jobcomp_type(void); + +/* slurm_get_propagate_prio_process + * return the PropagatePrioProcess flag from slurmctld_conf object + */ +extern uint16_t slurm_get_propagate_prio_process(void); + +/* slurm_get_proctrack_type + * get ProctrackType from slurmctld_conf object + * RET char * - proctrack type, MUST be xfreed by caller + */ +char *slurm_get_proctrack_type(void); + +/* slurm_get_root_filter + * RET uint16_t - Value of SchedulerRootFilter */ +extern uint16_t slurm_get_root_filter(void); + +/* slurm_get_sched_port + * RET uint16_t - Value of SchedulerPort */ +extern uint16_t slurm_get_sched_port(void); + +/* slurm_get_slurmd_port + * returns slurmd port from slurmctld_conf object + * RET uint16_t - slurmd port + */ +uint16_t inline slurm_get_slurmd_port(void); + +/* slurm_get_slurm_user_id + * returns slurmd uid from slurmctld_conf object + * RET uint32_t - slurm user id + */ +uint32_t slurm_get_slurm_user_id(void); + +/* slurm_get_sched_type + * get sched type from slurmctld_conf object + * RET char * - sched type, MUST be xfreed by caller + */ +char *slurm_get_sched_type(void); + +/* slurm_get_select_type + * get select_type from slurmctld_conf object + * RET char * - select_type, MUST be xfreed by caller + */ +char *slurm_get_select_type(void); + +/* slurm_get_switch_type + * get switch type from slurmctld_conf object + * RET char * - switch type, MUST be xfreed by caller + */ +char *slurm_get_switch_type(void); + +/* slurm_get_wait_time + * returns wait_time from slurmctld_conf object + * RET uint16_t - wait_time + */ +uint16_t slurm_get_wait_time(void); + +/* slurm_get_srun_prolog + * return the name of the srun prolog program + * RET char * - name of prolog program, must be xfreed by caller + */ +char *slurm_get_srun_prolog(void); + +/* slurm_get_srun_epilog + * return the name of the srun epilog program + * RET char * - name of epilog program, must be xfreed by caller + */ +char *slurm_get_srun_epilog(void); + +/* slurm_get_task_epilog + * RET task_epilog name, must be xfreed by caller */ +char *slurm_get_task_epilog(void); + +/* slurm_get_task_prolog + * RET task_prolog name, must be xfreed by caller */ +char *slurm_get_task_prolog(void); + +/* slurm_get_task_plugin + * RET task_plugin name, must be xfreed by caller */ +char *slurm_get_task_plugin(void); + +/**********************************************************************\ + * general message management functions used by slurmctld, slurmd +\**********************************************************************/ + +/* In the socket implementation it creates a socket, binds to it, and + * listens for connections. + * IN port - port to bind the msg server to + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd inline slurm_init_msg_engine_port(uint16_t port); + +/* In the socket implementation it creates a socket, binds to it, and + * listens for connections. + * IN slurm_address - slurm_addr to bind the msg server to + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd inline slurm_init_msg_engine(slurm_addr * slurm_address); + +/* In the bsd implmentation maps directly to a accept call + * IN open_fd - file descriptor to accept connection on + * OUT slurm_address - slurm_addr of the accepted connection + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd inline slurm_accept_msg_conn(slurm_fd open_fd, + slurm_addr * slurm_address); + +/* In the bsd implmentation maps directly to a close call, to close + * the socket that was accepted + * IN open_fd - an open file descriptor to close + * RET int - the return code + */ +int inline slurm_close_accepted_conn(slurm_fd open_fd); + +/* just calls close on an established msg connection + * IN open_fd - an open file descriptor to close + * RET int - the return code + */ +int inline slurm_shutdown_msg_engine(slurm_fd open_fd); + +/**********************************************************************\ + * receive message functions +\**********************************************************************/ + +/* + * Receive a slurm message on the open slurm descriptor "fd" waiting + * at most "timeout" seconds for the message data. If timeout is + * zero, a default timeout is used. Memory for the message data + * (msg->data) is allocated from within this function, and must be + * freed at some point using one of the slurm_free* functions. + * Also a slurm_cred is allocated (msg->auth_cred) which must be + * freed with g_slurm_auth_destroy() if it exists. + * + * IN open_fd - file descriptor to receive msg on + * OUT msg - a slurm_msg struct to be filled in by the function + * IN timeout - how long to wait in milliseconds + * RET int - returns 0 on success, -1 on failure and sets errno + */ +int slurm_receive_msg(slurm_fd fd, slurm_msg_t *msg, int timeout); + +/* + * Receive a slurm message on the open slurm descriptor "fd" waiting + * at most "timeout" seconds for the message data. If timeout is + * zero, a default timeout is used. Memory is allocated for the + * returned list and must be freed at some point using the + * list_destroy function. + * + * IN open_fd - file descriptor to receive msg on + * IN steps - how many steps down the tree we have to wait for + * IN timeout - how long to wait in milliseconds + * RET List - List containing the responses of the childern (if any) we + * forwarded the message to. List containing type + * (ret_data_info_t). NULL is returned on failure. and + * errno set. + */ +List slurm_receive_msgs(slurm_fd fd, int steps, int timeout); + +/* + * Receive a slurm message on the open slurm descriptor "fd" waiting + * at most "timeout" seconds for the message data. This will also + * forward the message to the nodes contained in the forward_t + * structure inside the header of the message. If timeout is + * zero, a default timeout is used. The 'resp' is the actual message + * received and contains the ret_list of it's childern and the + * forward_structure_t containing information about it's childern + * also. Memory is allocated for the returned msg and the returned + * list both must be freed at some point using the + * slurm_free_functions and list_destroy function. + * + * IN open_fd - file descriptor to receive msg on + * OUT resp - a slurm_msg struct to be filled in by the function + * IN timeout - how long to wait in milliseconds + * RET int - returns 0 on success, -1 on failure and sets errno + */ +int slurm_receive_msg_and_forward(slurm_fd fd, slurm_addr *orig_addr, + slurm_msg_t *resp, int timeout); + +/**********************************************************************\ + * send message functions +\**********************************************************************/ + +/* sends a message to an arbitrary node + * + * IN open_fd - file descriptor to send msg on + * IN msg - a slurm msg struct to be sent + * RET int - size of msg sent in bytes + */ +int slurm_send_node_msg(slurm_fd open_fd, slurm_msg_t *msg); + +/**********************************************************************\ + * msg connection establishment functions used by msg clients +\**********************************************************************/ + +/* calls connect to make a connection-less datagram connection to the + * primary or secondary slurmctld message engine + * OUT addr - address of controller contacted + * RET slurm_fd - file descriptor of the connection created + * IN dest - controller to contact, primary or secondary + */ +slurm_fd inline slurm_open_controller_conn(slurm_addr *addr); +slurm_fd inline slurm_open_controller_conn_spec(enum controller_id dest); +/* gets the slurm_addr of the specified controller + * primary or secondary slurmctld message engine + * IN dest - controller to contact, primary or secondary + * OUT addr - slurm_addr to the specified controller + */ +void slurm_get_controller_addr_spec(enum controller_id dest, slurm_addr *addr); + +/* In the bsd socket implementation it creates a SOCK_STREAM socket + * and calls connect on it a SOCK_DGRAM socket called with connect + * is defined to only receive messages from the address/port pair + * argument of the connect call slurm_address - for now it is + * really just a sockaddr_in + * IN slurm_address - slurm_addr of the connection destination + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd inline slurm_open_msg_conn(slurm_addr * slurm_address); + +/* just calls close on an established msg connection to close + * IN open_fd - an open file descriptor to close + * RET int - the return code + */ +int inline slurm_shutdown_msg_conn(slurm_fd open_fd); + + +/**********************************************************************\ + * stream functions +\**********************************************************************/ + +/* slurm_listen_stream + * opens a stream server and listens on it + * IN slurm_address - slurm_addr to bind the server stream to + * RET slurm_fd - file descriptor of the stream created + */ +slurm_fd inline slurm_listen_stream(slurm_addr * slurm_address); + +/* slurm_accept_stream + * accepts a incomming stream connection on a stream server slurm_fd + * IN open_fd - file descriptor to accept connection on + * OUT slurm_address - slurm_addr of the accepted connection + * RET slurm_fd - file descriptor of the accepted connection + */ +slurm_fd inline slurm_accept_stream(slurm_fd open_fd, + slurm_addr * slurm_address); + +/* slurm_open_stream + * opens a client connection to stream server + * IN slurm_address - slurm_addr of the connection destination + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd inline slurm_open_stream(slurm_addr * slurm_address); + +/* slurm_close_stream + * closes either a server or client stream file_descriptor + * IN open_fd - an open file descriptor to close + * RET int - the return code + */ +int inline slurm_close_stream(slurm_fd open_fd); + +/* slurm_write_stream + * writes a buffer out a stream file descriptor + * IN open_fd - file descriptor to write on + * IN buffer - buffer to send + * IN size - size of buffer send + * IN timeout - how long to wait in milliseconds + * RET size_t - bytes sent , or -1 on errror + */ +size_t inline slurm_write_stream(slurm_fd open_fd, char *buffer, + size_t size); +size_t inline slurm_write_stream_timeout(slurm_fd open_fd, + char *buffer, size_t size, + int timeout); + +/* slurm_read_stream + * read into buffer grom a stream file descriptor + * IN open_fd - file descriptor to read from + * OUT buffer - buffer to receive into + * IN size - size of buffer + * IN timeout - how long to wait in milliseconds + * RET size_t - bytes read , or -1 on errror + */ +size_t inline slurm_read_stream(slurm_fd open_fd, char *buffer, + size_t size); +size_t inline slurm_read_stream_timeout(slurm_fd open_fd, + char *buffer, size_t size, + int timeout); + +/* slurm_get_stream_addr + * esentially a encapsilated get_sockname + * IN open_fd - file descriptor to retreive slurm_addr for + * OUT address - address that open_fd to bound to + */ +int inline slurm_get_stream_addr(slurm_fd open_fd, slurm_addr * address); + +/* make an open slurm connection blocking or non-blocking + * (i.e. wait or do not wait for i/o completion ) + * IN open_fd - an open file descriptor to change the effect + * RET int - the return code + */ +int inline slurm_set_stream_non_blocking(slurm_fd open_fd); +int inline slurm_set_stream_blocking(slurm_fd open_fd); + +/**********************************************************************\ + * address conversion and management functions +\**********************************************************************/ + +/* slurm_set_addr_uint + * initializes the slurm_address with the supplied port and ip_address + * OUT slurm_address - slurm_addr to be filled in + * IN port - port in host order + * IN ip_address - ipv4 address in uint32 host order form + */ +void inline slurm_set_addr_uint(slurm_addr * slurm_address, + uint16_t port, uint32_t ip_address); + +/* reset_slurm_addr + * resets the address field of a slurm_addr, port and family unchanged + * OUT slurm_address - slurm_addr to be reset in + * IN new_address - source of address to write into slurm_address + */ +void reset_slurm_addr(slurm_addr * slurm_address, slurm_addr new_address); + +/* slurm_set_addr + * initializes the slurm_address with the supplied port and ip_address + * OUT slurm_address - slurm_addr to be filled in + * IN port - port in host order + * IN host - hostname or dns name + */ +void inline slurm_set_addr(slurm_addr * slurm_address, + uint16_t port, char *host); + +/* slurm_set_addr_any + * initialized the slurm_address with the supplied port on INADDR_ANY + * OUT slurm_address - slurm_addr to be filled in + * IN port - port in host order + */ +void inline slurm_set_addr_any(slurm_addr * slurm_address, uint16_t port); + +/* slurm_set_addr_char + * initializes the slurm_address with the supplied port and host + * OUT slurm_address - slurm_addr to be filled in + * IN port - port in host order + * IN host - hostname or dns name + */ +void inline slurm_set_addr_char(slurm_addr * slurm_address, + uint16_t port, char *host); + +/* slurm_get_addr + * given a slurm_address it returns to port and hostname + * IN slurm_address - slurm_addr to be queried + * OUT port - port number + * OUT host - hostname + * IN buf_len - length of hostname buffer + */ +void inline slurm_get_addr(slurm_addr * slurm_address, + uint16_t * port, char *host, uint32_t buf_len); + +/* slurm_get_ip_str + * given a slurm_address it returns its port and ip address string + * IN slurm_address - slurm_addr to be queried + * OUT port - port number + * OUT ip - ip address in dotted-quad string form + * IN buf_len - length of ip buffer + */ +void inline slurm_get_ip_str(slurm_addr * slurm_address, uint16_t * port, + char *ip, unsigned int buf_len); + +/* slurm_get_peer_addr + * get the slurm address of the peer connection, similar to getpeeraddr + * IN fd - an open connection + * OUT slurm_address - place to park the peer's slurm_addr + */ +int inline slurm_get_peer_addr(slurm_fd fd, slurm_addr * slurm_address); + +/* slurm_print_slurm_addr + * prints a slurm_addr into a buf + * IN address - slurm_addr to print + * IN buf - space for string representation of slurm_addr + * IN n - max number of bytes to write (including NUL) + */ +void inline slurm_print_slurm_addr(slurm_addr * address, + char *buf, size_t n); + +/**********************************************************************\ + * slurm_addr pack routines +\**********************************************************************/ + +Buf slurm_pack_msg_no_header(slurm_msg_t * msg); + +/* slurm_pack_slurm_addr + * packs a slurm_addr into a buffer to serialization transport + * IN slurm_address - slurm_addr to pack + * IN/OUT buffer - buffer to pack the slurm_addr into + */ +void inline slurm_pack_slurm_addr(slurm_addr * slurm_address, Buf buffer); + +/* slurm_pack_slurm_addr + * unpacks a buffer into a slurm_addr after serialization transport + * OUT slurm_address - slurm_addr to unpack to + * IN/OUT buffer - buffer to upack the slurm_addr from + * returns - SLURM error code + */ +int inline slurm_unpack_slurm_addr_no_alloc(slurm_addr * slurm_address, + Buf buffer); + +/* slurm_pack_slurm_addr_array + * packs an array of slurm_addrs into a buffer + * OUT slurm_address - slurm_addr to pack + * IN size_val - how many to pack + * IN/OUT buffer - buffer to pack the slurm_addr from + * returns - SLURM error code + */ +void inline slurm_pack_slurm_addr_array(slurm_addr * slurm_address, + uint16_t size_val, Buf buffer); +/* slurm_unpack_slurm_addr_array + * unpacks an array of slurm_addrs from a buffer + * OUT slurm_address - slurm_addr to unpack to + * IN size_val - how many to unpack + * IN/OUT buffer - buffer to upack the slurm_addr from + * returns - SLURM error code + */ +int inline slurm_unpack_slurm_addr_array(slurm_addr ** slurm_address, + uint16_t * size_val, Buf buffer); + +/**********************************************************************\ + * simplified communication routines + * They open a connection do work then close the connection all within + * the function +\**********************************************************************/ + +/* slurm_send_rc_msg + * given the original request message this function sends a + * slurm_return_code message back to the client that made the request + * IN request_msg - slurm_msg the request msg + * IN rc - the return_code to send back to the client + */ +int slurm_send_rc_msg(slurm_msg_t * request_msg, int rc); + +/* slurm_send_recv_controller_msg + * opens a connection to the controller, sends the controller a message, + * listens for the response, then closes the connection + * IN request_msg - slurm_msg request + * OUT response_msg - slurm_msg response + * RET int - returns 0 on success, -1 on failure and sets errno + */ +int slurm_send_recv_controller_msg(slurm_msg_t * request_msg, + slurm_msg_t * response_msg); + +/* slurm_send_recv_node_msg + * opens a connection to node, + * and sends the nodes a message, listens + * for the response, then closes the connections + * IN request_msg - slurm_msg request + * OUT response_msg - slurm_msg response + * RET int - returns 0 on success, -1 on failure and sets errno + */ +int slurm_send_recv_node_msg(slurm_msg_t * request_msg, + slurm_msg_t * response_msg, + int timeout); + +/* + * Send a message to the nodelist specificed using fanout + * Then return List containing type (ret_data_info_t). + * IN nodelist - list of nodes to send to. + * IN msg - a slurm_msg struct to be sent by the function + * IN timeout - how long to wait in milliseconds + * RET List - List containing the responses of the childern + * (if any) we forwarded the message to. List + * containing type (ret_types_t). + */ +List slurm_send_recv_msgs(const char *nodelist, slurm_msg_t *msg, int timeout); + +/* + * Send a message to msg->address + * Then return List containing type (ret_data_info_t). + * IN msg - a slurm_msg struct to be sent by the function + * IN name - the name of the node the message is being sent to + * IN timeout - how long to wait in milliseconds + * RET List - List containing the responses of the childern + * (if any) we forwarded the message to. List + * containing type (ret_types_t). + */ +List slurm_send_addr_recv_msgs(slurm_msg_t *msg, char *name, int timeout); + +/* + * Same as above, but only to one node + * returns 0 on success, -1 on failure and sets errno + */ + +int slurm_send_recv_rc_msg_only_one(slurm_msg_t *req, int *rc, int timeout); + +/* + * Same as above, but send to controller + * returns 0 on success, -1 on failure and sets errno + */ +int slurm_send_recv_controller_rc_msg(slurm_msg_t *req, int *rc); + +/* slurm_send_only_controller_msg + * opens a connection to the controller, sends the node a message then, + * closes the connection + * IN request_msg - slurm_msg request + * RET int - return code + */ +int slurm_send_only_controller_msg(slurm_msg_t * request_msg); + +/* slurm_send_only_node_msg + * opens a connection to node, sends the node a message then, + * closes the connection + * IN request_msg - slurm_msg request + * RET int - return code + */ +int slurm_send_only_node_msg(slurm_msg_t * request_msg); + +/* Slurm message functions */ + +/* set_span + * build an array indicating how message fanout should occur + * IN total - total number of nodes to communicate with + * IN tree_width - message fanout, use system default if zero + * NOTE: Returned array MUST be release by caller using xfree */ +extern int *set_span(int total, uint16_t tree_width); + +extern void slurm_free_msg(slurm_msg_t * msg); + +/* must free this memory with free not xfree */ +extern char *nodelist_nth_host(const char *nodelist, int inx); +extern int nodelist_find(const char *nodelist, const char *name); +extern void convert_num_unit(float num, char *buf, int orig_type); +extern int revert_num_unit(const char *buf); +#endif diff --git a/executable_names/src/common/slurm_protocol_common.h b/executable_names/src/common/slurm_protocol_common.h new file mode 100644 index 0000000000000000000000000000000000000000..accebe22c9e362252a646687647eea9c4087b9c4 --- /dev/null +++ b/executable_names/src/common/slurm_protocol_common.h @@ -0,0 +1,76 @@ +/*****************************************************************************\ + * slurm_protocol_common.h - slurm communications definitions common to + * all protocols + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PROTOCOL_COMMON_H +#define _SLURM_PROTOCOL_COMMON_H + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include + +/* for sendto and recvfrom commands */ +#define SLURM_PROTOCOL_NO_SEND_RECV_FLAGS 0 + +/* for accpet commands */ +#define SLURM_PROTOCOL_DEFAULT_LISTEN_BACKLOG 128 + +/* used in interface methods */ +#define SLURM_PROTOCOL_FUNCTION_NOT_IMPLEMENTED -2 + +/* max slurm message send and receive buffer size + * this may need to be increased to 350k-512k */ +#define SLURM_PROTOCOL_MAX_MESSAGE_BUFFER_SIZE (512*1024) + +/* slurm protocol header defines, based upon config.h, 16 bits */ +#define SLURM_PROTOCOL_VERSION ((SLURM_API_MAJOR << 8) | SLURM_API_AGE) + +/* used to set flags to empty */ +#define SLURM_PROTOCOL_NO_FLAGS 0 + +#if MONGO_IMPLEMENTATION +# include +#else +# include +#endif + +#endif diff --git a/executable_names/src/common/slurm_protocol_defs.c b/executable_names/src/common/slurm_protocol_defs.c new file mode 100644 index 0000000000000000000000000000000000000000..5c9a54bc8ba903c8d504737068d45f3641bc453c --- /dev/null +++ b/executable_names/src/common/slurm_protocol_defs.c @@ -0,0 +1,1169 @@ +/*****************************************************************************\ + * slurm_protocol_defs.c - functions for initializing and releasing + * storage for RPC data structures. these are the functions used by + * the slurm daemons directly, not for user client use. + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDLIB_H +# include +#endif + +#include + +#include "src/common/log.h" +#include "src/common/slurm_jobacct.h" +#include "src/common/node_select.h" +#include "src/common/slurm_cred.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/switch.h" +#include "src/common/xmalloc.h" +#include "src/common/job_options.h" +#include "src/common/forward.h" + +static void _free_all_job_info (job_info_msg_t *msg); + +static void _free_all_node_info (node_info_msg_t *msg); +static void _slurm_free_node_info_members (node_info_t * node); + +static void _free_all_partitions (partition_info_msg_t *msg); +static void _slurm_free_partition_info_members (partition_info_t * part); + +static void _free_all_step_info (job_step_info_response_msg_t *msg); +static void _slurm_free_job_step_info_members (job_step_info_t * msg); + +/* + * slurm_msg_t_init - initialize a slurm message + * OUT msg - pointer to the slurm_msg_t structure which will be initialized + */ +extern void slurm_msg_t_init(slurm_msg_t *msg) +{ + memset(msg, 0, sizeof(slurm_msg_t)); + + msg->msg_type = (slurm_msg_type_t)NO_VAL; + msg->conn_fd = -1; + + forward_init(&msg->forward, NULL); + + return; +} + +/* + * slurm_msg_t_copy - initialize a slurm_msg_t structure "dest" with + * values from the "src" slurm_msg_t structure. + * IN src - Pointer to the initialized message from which "dest" will + * be initialized. + * OUT dest - Pointer to the slurm_msg_t which will be intialized. + * NOTE: the "dest" structure will contain pointers into the contents of "src". + */ +extern void slurm_msg_t_copy(slurm_msg_t *dest, slurm_msg_t *src) +{ + slurm_msg_t_init(dest); + dest->forward = src->forward; + dest->ret_list = src->ret_list; + dest->forward_struct = src->forward_struct; + dest->orig_addr.sin_addr.s_addr = 0; + return; +} + + +void slurm_free_last_update_msg(last_update_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_shutdown_msg(shutdown_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_job_alloc_info_msg(job_alloc_info_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_return_code_msg(return_code_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_job_id_msg(job_id_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_job_step_id_msg(job_step_id_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_job_id_request_msg(job_id_request_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_job_id_response_msg(job_id_response_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_job_step_kill_msg(job_step_kill_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_job_info_request_msg(job_info_request_msg_t *msg) +{ + xfree(msg); +} + +void slurm_free_job_step_info_request_msg( + job_step_info_request_msg_t *msg) +{ + xfree(msg); +} + +void inline slurm_free_node_info_request_msg( + node_info_request_msg_t *msg) +{ + xfree(msg); +} + +void inline slurm_free_part_info_request_msg( + part_info_request_msg_t *msg) +{ + xfree(msg); +} + +void slurm_free_job_desc_msg(job_desc_msg_t * msg) +{ + int i; + + if (msg) { + select_g_free_jobinfo(&msg->select_jobinfo); + xfree(msg->alloc_node); + for (i = 0; i < msg->env_size; i++) + xfree(msg->environment[i]); + xfree(msg->environment); + xfree(msg->features); + xfree(msg->mail_user); + xfree(msg->name); + xfree(msg->partition); + xfree(msg->req_nodes); + xfree(msg->exc_nodes); + xfree(msg->script); + for (i = 0; i < msg->argc; i++) + xfree(msg->argv[i]); + xfree(msg->argv); + xfree(msg->err); + xfree(msg->in); + xfree(msg->out); + xfree(msg->work_dir); + xfree(msg->alloc_resp_hostname); + xfree(msg->other_hostname); + xfree(msg->account); + xfree(msg->network); + xfree(msg->comment); + xfree(msg); + } +} + +void slurm_free_job_launch_msg(batch_job_launch_msg_t * msg) +{ + int i; + + if (msg) { + xfree(msg->nodes); + xfree(msg->cpus_per_node); + xfree(msg->cpu_count_reps); + xfree(msg->script); + xfree(msg->err); + xfree(msg->in); + xfree(msg->out); + xfree(msg->work_dir); + + for (i = 0; i < msg->argc; i++) + xfree(msg->argv[i]); + xfree(msg->argv); + + if (msg->environment) { + for (i = 0; i < msg->envc; i++) + xfree(msg->environment[i]); + xfree(msg->environment); + } + + select_g_free_jobinfo(&msg->select_jobinfo); + slurm_cred_destroy(msg->cred); + + xfree(msg); + } +} + +void slurm_free_job_info(job_info_t * job) +{ + if (job) { + slurm_free_job_info_members(job); + xfree(job); + } +} + +void slurm_free_job_info_members(job_info_t * job) +{ + if (job) { + xfree(job->nodes); + xfree(job->partition); + xfree(job->account); + xfree(job->name); + xfree(job->alloc_node); + xfree(job->node_inx); + xfree(job->cpus_per_node); + xfree(job->cpu_count_reps); + select_g_free_jobinfo(&job->select_jobinfo); + xfree(job->features); + xfree(job->req_nodes); + xfree(job->req_node_inx); + xfree(job->exc_nodes); + xfree(job->exc_node_inx); + xfree(job->network); + xfree(job->comment); + } +} + +void slurm_free_node_registration_status_msg( + slurm_node_registration_status_msg_t * msg) +{ + if (msg) { + xfree(msg->node_name); + xfree(msg->job_id); + xfree(msg->step_id); + if (msg->startup) + switch_g_free_node_info(&msg->switch_nodeinfo); + xfree(msg); + } +} + + +void slurm_free_update_node_msg(update_node_msg_t * msg) +{ + if (msg) { + xfree(msg->node_names); + xfree(msg->reason); + xfree(msg); + } +} + +void slurm_free_update_part_msg(update_part_msg_t * msg) +{ + if (msg) { + xfree(msg->name); + xfree(msg->nodes); + xfree(msg->allow_groups); + xfree(msg); + } +} + +void slurm_free_delete_part_msg(delete_part_msg_t * msg) +{ + if (msg) { + xfree(msg->name); + xfree(msg); + } +} + +void slurm_free_job_step_create_request_msg(job_step_create_request_msg_t * + msg) +{ + if (msg) { + xfree(msg->host); + xfree(msg->name); + xfree(msg->network); + xfree(msg->node_list); + xfree(msg); + } +} + +void slurm_free_complete_job_allocation_msg( + complete_job_allocation_msg_t * msg) +{ + if (msg) { + xfree(msg); + } +} + +void slurm_free_complete_batch_script_msg(complete_batch_script_msg_t * msg) +{ + if (msg) { + xfree(msg->node_name); + xfree(msg); + } +} + + +void slurm_free_launch_tasks_response_msg(launch_tasks_response_msg_t * + msg) +{ + if (msg) { + xfree(msg->node_name); + xfree(msg->local_pids); + xfree(msg->task_ids); + xfree(msg); + } +} + +void slurm_free_kill_job_msg(kill_job_msg_t * msg) +{ + if (msg) { + xfree(msg->nodes); + select_g_free_jobinfo(&msg->select_jobinfo); + xfree(msg); + } +} + +void slurm_free_signal_job_msg(signal_job_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_update_job_time_msg(job_time_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_task_exit_msg(task_exit_msg_t * msg) +{ + if (msg) { + xfree(msg->task_id_list); + xfree(msg); + } +} + +void slurm_free_launch_tasks_request_msg(launch_tasks_request_msg_t * msg) +{ + int i; + + if (msg == NULL) + return; + + slurm_cred_destroy(msg->cred); + + if (msg->env) { + for (i = 0; i < msg->envc; i++) { + xfree(msg->env[i]); + } + xfree(msg->env); + } + xfree(msg->cwd); + xfree(msg->cpu_bind); + xfree(msg->mem_bind); + if (msg->argv) { + for (i = 0; i < msg->argc; i++) { + xfree(msg->argv[i]); + } + xfree(msg->argv); + } + if(msg->nnodes && msg->global_task_ids) + for(i=0; innodes; i++) { + xfree(msg->global_task_ids[i]); + } + xfree(msg->tasks_to_launch); + xfree(msg->cpus_allocated); + xfree(msg->resp_port); + xfree(msg->io_port); + xfree(msg->global_task_ids); + xfree(msg->ifname); + xfree(msg->ofname); + xfree(msg->efname); + + xfree(msg->task_prolog); + xfree(msg->task_epilog); + xfree(msg->complete_nodelist); + + if (msg->switch_job) + switch_free_jobinfo(msg->switch_job); + + if (msg->options) + job_options_destroy(msg->options); + + xfree(msg); +} + +void slurm_free_task_user_managed_io_stream_msg(task_user_managed_io_msg_t *msg) +{ + if (msg == NULL) + return; + + xfree(msg); +} + +void slurm_free_reattach_tasks_request_msg(reattach_tasks_request_msg_t *msg) +{ + if (msg) { + xfree(msg->resp_port); + xfree(msg->io_port); + slurm_cred_destroy(msg->cred); + xfree(msg); + } +} + +void slurm_free_reattach_tasks_response_msg(reattach_tasks_response_msg_t *msg) +{ + if (msg) { + xfree(msg->node_name); + xfree(msg->executable_name); + xfree(msg->local_pids); + xfree(msg->gtids); + xfree(msg); + } +} + +void slurm_free_kill_tasks_msg(kill_tasks_msg_t * msg) +{ + xfree(msg); +} + +void slurm_free_epilog_complete_msg(epilog_complete_msg_t * msg) +{ + if (msg) { + xfree(msg->node_name); + switch_g_free_node_info(&msg->switch_nodeinfo); + xfree(msg); + } +} + +void inline slurm_free_srun_job_complete_msg(srun_job_complete_msg_t * msg) +{ + xfree(msg); +} + +void inline slurm_free_srun_ping_msg(srun_ping_msg_t * msg) +{ + xfree(msg); +} + +void inline slurm_free_srun_node_fail_msg(srun_node_fail_msg_t * msg) +{ + if (msg) { + xfree(msg->nodelist); + xfree(msg); + } +} + +void inline slurm_free_srun_timeout_msg(srun_timeout_msg_t * msg) +{ + xfree(msg); +} + +void inline slurm_free_checkpoint_msg(checkpoint_msg_t *msg) +{ + xfree(msg); +} + +void inline slurm_free_checkpoint_comp_msg(checkpoint_comp_msg_t *msg) +{ + if (msg) { + xfree(msg->error_msg); + xfree(msg); + } +} + +void inline slurm_free_checkpoint_resp_msg(checkpoint_resp_msg_t *msg) +{ + if (msg) { + xfree(msg->error_msg); + xfree(msg); + } +} +void inline slurm_free_suspend_msg(suspend_msg_t *msg) +{ + xfree(msg); +} + +/* Given a job's reason for waiting, return a descriptive string */ +extern char *job_reason_string(enum job_wait_reason inx) +{ + switch (inx) { + case WAIT_NO_REASON: + return "None"; + case WAIT_PRIORITY: + return "Priority"; + case WAIT_DEPENDENCY: + return "Dependency"; + case WAIT_RESOURCES: + return "Resources"; + case WAIT_PART_NODE_LIMIT: + return "PartitionNodeLimit"; + case WAIT_PART_TIME_LIMIT: + return "PartitionTimeLimit"; + case WAIT_PART_STATE: + return "PartitionDown"; + case WAIT_HELD: + return "JobHeld"; + case WAIT_TIME: + return "BeginTime"; + default: + return "?"; + } +} + +void inline slurm_free_get_kvs_msg(kvs_get_msg_t *msg) +{ + if (msg) { + xfree(msg->hostname); + xfree(msg); + } +} + +char *job_state_string(enum job_states inx) +{ + if (inx & JOB_COMPLETING) + return "COMPLETING"; + + switch (inx) { + case JOB_PENDING: + return "PENDING"; + case JOB_RUNNING: + return "RUNNING"; + case JOB_SUSPENDED: + return "SUSPENDED"; + case JOB_COMPLETE: + return "COMPLETED"; + case JOB_CANCELLED: + return "CANCELLED"; + case JOB_FAILED: + return "FAILED"; + case JOB_TIMEOUT: + return "TIMEOUT"; + case JOB_NODE_FAIL: + return "NODE_FAIL"; + default: + return "?"; + } +} + +char *job_state_string_compact(enum job_states inx) +{ + if (inx & JOB_COMPLETING) + return "CG"; + + switch (inx) { + case JOB_PENDING: + return "PD"; + case JOB_RUNNING: + return "R"; + case JOB_SUSPENDED: + return "S"; + case JOB_COMPLETE: + return "CD"; + case JOB_CANCELLED: + return "CA"; + case JOB_FAILED: + return "F"; + case JOB_TIMEOUT: + return "TO"; + case JOB_NODE_FAIL: + return "NF"; + default: + return "?"; + } +} + +char *node_state_string(enum node_states inx) +{ + bool drain_flag = (inx & NODE_STATE_DRAIN); + bool comp_flag = (inx & NODE_STATE_COMPLETING); + bool no_resp_flag = (inx & NODE_STATE_NO_RESPOND); + + inx = (uint16_t) (inx & NODE_STATE_BASE); + + if (drain_flag) { + if (comp_flag || (inx == NODE_STATE_ALLOCATED)) { + if (no_resp_flag) + return "DRAINING*"; + return "DRAINING"; + } else { + if (no_resp_flag) + return "DRAINED*"; + return "DRAINED"; + } + } + if (inx == NODE_STATE_DOWN) { + if (no_resp_flag) + return "DOWN*"; + return "DOWN"; + } + if (inx == NODE_STATE_ALLOCATED) { + if (no_resp_flag) + return "ALLOCATED*"; + if (comp_flag) + return "ALLOCATED+"; + return "ALLOCATED"; + } + if (comp_flag) { + if (no_resp_flag) + return "COMPLETING*"; + return "COMPLETING"; + } + if (inx == NODE_STATE_IDLE) { + if (no_resp_flag) + return "IDLE*"; + return "IDLE"; + } + if (inx == NODE_STATE_UNKNOWN) { + if (no_resp_flag) + return "UNKNOWN*"; + return "UNKNOWN"; + } + return "?"; +} + +char *node_state_string_compact(enum node_states inx) +{ + bool drain_flag = (inx & NODE_STATE_DRAIN); + bool comp_flag = (inx & NODE_STATE_COMPLETING); + bool no_resp_flag = (inx & NODE_STATE_NO_RESPOND); + + inx = (uint16_t) (inx & NODE_STATE_BASE); + + if (drain_flag) { + if (comp_flag || (inx == NODE_STATE_ALLOCATED)) { + if (no_resp_flag) + return "DRNG*"; + return "DRNG"; + } else { + if (no_resp_flag) + return "DRAIN*"; + return "DRAIN"; + } + } + if (inx == NODE_STATE_DOWN) { + if (no_resp_flag) + return "DOWN*"; + return "DOWN"; + } + if (inx == NODE_STATE_ALLOCATED) { + if (no_resp_flag) + return "ALLOC*"; + if (comp_flag) + return "ALLOC+"; + return "ALLOC"; + } + if (comp_flag) { + if (no_resp_flag) + return "COMP*"; + return "COMP"; + } + if (inx == NODE_STATE_IDLE) { + if (no_resp_flag) + return "IDLE*"; + return "IDLE"; + } + if (inx == NODE_STATE_UNKNOWN) { + if (no_resp_flag) + return "UNK*"; + return "UNK"; + } + return "?"; +} + +/* + * slurm_free_resource_allocation_response_msg - free slurm resource + * allocation response message + * IN msg - pointer to allocation response message + * NOTE: buffer is loaded by slurm_allocate_resources + */ +void slurm_free_resource_allocation_response_msg ( + resource_allocation_response_msg_t * msg) +{ + if (msg) { + select_g_free_jobinfo(&msg->select_jobinfo); + xfree(msg->node_list); + xfree(msg->cpus_per_node); + xfree(msg->cpu_count_reps); + xfree(msg); + } +} + +/* + * slurm_free_job_alloc_info_response_msg - free slurm job allocation + * info response message + * IN msg - pointer to job allocation info response message + * NOTE: buffer is loaded by slurm_allocate_resources + */ +void slurm_free_job_alloc_info_response_msg(job_alloc_info_response_msg_t *msg) +{ + if (msg) { + select_g_free_jobinfo(&msg->select_jobinfo); + xfree(msg->node_list); + xfree(msg->cpus_per_node); + xfree(msg->cpu_count_reps); + xfree(msg->node_addr); + xfree(msg); + } +} + + +/* + * slurm_free_job_step_create_response_msg - free slurm + * job step create response message + * IN msg - pointer to job step create response message + * NOTE: buffer is loaded by slurm_job_step_create + */ +void slurm_free_job_step_create_response_msg( + job_step_create_response_msg_t * msg) +{ + if (msg) { + slurm_step_layout_destroy(msg->step_layout); + slurm_cred_destroy(msg->cred); + if (msg->switch_job) + switch_free_jobinfo(msg->switch_job); + + xfree(msg); + } + +} + + +/* + * slurm_free_submit_response_response_msg - free slurm + * job submit response message + * IN msg - pointer to job submit response message + * NOTE: buffer is loaded by slurm_submit_batch_job + */ +void slurm_free_submit_response_response_msg(submit_response_msg_t * msg) +{ + if (msg) + xfree(msg); +} + + +/* + * slurm_free_ctl_conf - free slurm control information response message + * IN msg - pointer to slurm control information response message + * NOTE: buffer is loaded by slurm_load_jobs + */ +void slurm_free_ctl_conf(slurm_ctl_conf_info_msg_t * config_ptr) +{ + if (config_ptr) { + xfree(config_ptr->authtype); + xfree(config_ptr->backup_addr); + xfree(config_ptr->backup_controller); + xfree(config_ptr->control_addr); + xfree(config_ptr->control_machine); + xfree(config_ptr->epilog); + xfree(config_ptr->job_acct_logfile); + xfree(config_ptr->job_acct_type); + xfree(config_ptr->job_comp_loc); + xfree(config_ptr->job_comp_type); + xfree(config_ptr->job_credential_private_key); + xfree(config_ptr->job_credential_public_certificate); + xfree(config_ptr->mail_prog); + xfree(config_ptr->mpi_default); + xfree(config_ptr->plugindir); + xfree(config_ptr->proctrack_type); + xfree(config_ptr->prolog); + xfree(config_ptr->slurm_user_name); + xfree(config_ptr->slurmctld_pidfile); + xfree(config_ptr->slurmctld_logfile); + xfree(config_ptr->slurmd_logfile); + xfree(config_ptr->slurmd_pidfile); + xfree(config_ptr->slurmd_spooldir); + xfree(config_ptr->slurm_conf); + xfree(config_ptr->state_save_location); + xfree(config_ptr->srun_epilog); + xfree(config_ptr->srun_prolog); + xfree(config_ptr->task_epilog); + xfree(config_ptr->task_prolog); + xfree(config_ptr->task_plugin); + xfree(config_ptr->tmp_fs); + xfree(config_ptr); + } +} + + +/* + * slurm_free_job_info - free the job information response message + * IN msg - pointer to job information response message + * NOTE: buffer is loaded by slurm_load_job. + */ +void slurm_free_job_info_msg(job_info_msg_t * job_buffer_ptr) +{ + if (job_buffer_ptr) { + if (job_buffer_ptr->job_array) { + _free_all_job_info(job_buffer_ptr); + xfree(job_buffer_ptr->job_array); + } + xfree(job_buffer_ptr); + } +} + +static void _free_all_job_info(job_info_msg_t *msg) +{ + int i; + + if ((msg == NULL) || + (msg->job_array == NULL)) + return; + + for (i = 0; i < msg->record_count; i++) + slurm_free_job_info_members (&msg->job_array[i]); +} + +/* + * slurm_free_job_step_info_response_msg - free the job step + * information response message + * IN msg - pointer to job step information response message + * NOTE: buffer is loaded by slurm_get_job_steps. + */ +void slurm_free_job_step_info_response_msg(job_step_info_response_msg_t * + msg) +{ + if (msg != NULL) { + if (msg->job_steps != NULL) { + _free_all_step_info(msg); + xfree(msg->job_steps); + } + xfree(msg); + } +} + +static void _free_all_step_info (job_step_info_response_msg_t *msg) +{ + int i; + + if ((msg == NULL) || + (msg->job_steps == NULL)) + return; + + for (i = 0; i < msg->job_step_count; i++) + _slurm_free_job_step_info_members (&msg->job_steps[i]); +} + +static void _slurm_free_job_step_info_members (job_step_info_t * msg) +{ + if (msg != NULL) { + xfree(msg->partition); + xfree(msg->nodes); + } +} + + +/* + * slurm_free_node_info - free the node information response message + * IN msg - pointer to node information response message + * NOTE: buffer is loaded by slurm_load_node. + */ +void slurm_free_node_info_msg(node_info_msg_t * msg) +{ + if (msg) { + if (msg->node_array) { + _free_all_node_info(msg); + xfree(msg->node_array); + } + xfree(msg); + } +} + +static void _free_all_node_info(node_info_msg_t *msg) +{ + int i; + + if ((msg == NULL) || + (msg->node_array == NULL)) + return; + + for (i = 0; i < msg->record_count; i++) + _slurm_free_node_info_members(&msg->node_array[i]); +} + +static void _slurm_free_node_info_members(node_info_t * node) +{ + if (node) { + xfree(node->name); + xfree(node->features); + xfree(node->reason); + } +} + + +/* + * slurm_free_partition_info_msg - free the partition information + * response message + * IN msg - pointer to partition information response message + * NOTE: buffer is loaded by slurm_load_partitions + */ +void slurm_free_partition_info_msg(partition_info_msg_t * msg) +{ + if (msg) { + if (msg->partition_array) { + _free_all_partitions(msg); + xfree(msg->partition_array); + } + xfree(msg); + } +} + +static void _free_all_partitions(partition_info_msg_t *msg) +{ + int i; + + if ((msg == NULL) || + (msg->partition_array == NULL)) + return; + + for (i = 0; i < msg->record_count; i++) + _slurm_free_partition_info_members( + &msg->partition_array[i]); + +} + +static void _slurm_free_partition_info_members(partition_info_t * part) +{ + if (part) { + xfree(part->name); + xfree(part->allow_groups); + xfree(part->nodes); + xfree(part->node_inx); + } +} + +extern void slurm_free_file_bcast_msg(file_bcast_msg_t *msg) +{ + int i; + + if (msg) { + xfree(msg->fname); + for (i=0; iblock[i]); + xfree(msg); + } +} + +extern void slurm_free_step_complete_msg(step_complete_msg_t *msg) +{ + if (msg) { + jobacct_g_free(msg->jobacct); + xfree(msg); + } +} + +extern void slurm_free_stat_jobacct_msg(stat_jobacct_msg_t *msg) +{ + if (msg) { + jobacct_g_free(msg->jobacct); + xfree(msg); + } +} + +void inline slurm_free_node_select_msg( + node_info_select_request_msg_t *msg) +{ + xfree(msg); +} + + +extern int slurm_free_msg_data(slurm_msg_type_t type, void *data) +{ + switch(type) { + case REQUEST_BUILD_INFO: + slurm_free_last_update_msg(data); + break; + case REQUEST_JOB_INFO: + slurm_free_job_info_request_msg(data); + break; + case REQUEST_NODE_INFO: + slurm_free_node_info_request_msg(data); + break; + case REQUEST_PARTITION_INFO: + slurm_free_part_info_request_msg(data); + break; + case MESSAGE_EPILOG_COMPLETE: + slurm_free_epilog_complete_msg(data); + break; + case REQUEST_CANCEL_JOB_STEP: + slurm_free_job_step_kill_msg(data); + break; + case REQUEST_COMPLETE_JOB_ALLOCATION: + slurm_free_complete_job_allocation_msg(data); + break; + case REQUEST_COMPLETE_BATCH_SCRIPT: + slurm_free_complete_batch_script_msg(data); + break; + case REQUEST_JOB_STEP_CREATE: + slurm_free_job_step_create_request_msg(data); + break; + case REQUEST_JOB_STEP_INFO: + slurm_free_job_step_info_request_msg(data); + break; + case REQUEST_RESOURCE_ALLOCATION: + case REQUEST_JOB_WILL_RUN: + case REQUEST_SUBMIT_BATCH_JOB: + case REQUEST_UPDATE_JOB: + slurm_free_job_desc_msg(data); + break; + case MESSAGE_NODE_REGISTRATION_STATUS: + slurm_free_node_registration_status_msg(data); + break; + case REQUEST_JOB_END_TIME: + case REQUEST_JOB_ALLOCATION_INFO: + slurm_free_job_alloc_info_msg(data); + break; + case SLURM_SUCCESS: + case REQUEST_PING: + case REQUEST_RECONFIGURE: + case REQUEST_CONTROL: + case REQUEST_SHUTDOWN_IMMEDIATE: + /* No body to free */ + break; + case REQUEST_SHUTDOWN: + slurm_free_shutdown_msg(data); + break; + case REQUEST_UPDATE_NODE: + slurm_free_update_node_msg(data); + break; + case REQUEST_UPDATE_PARTITION: + slurm_free_update_part_msg(data); + break; + case REQUEST_DELETE_PARTITION: + slurm_free_delete_part_msg(data); + break; + case REQUEST_NODE_REGISTRATION_STATUS: + slurm_free_node_registration_status_msg(data); + break; + case REQUEST_CHECKPOINT: + slurm_free_checkpoint_msg(data); + break; + case REQUEST_CHECKPOINT_COMP: + slurm_free_checkpoint_comp_msg(data); + break; + case REQUEST_SUSPEND: + slurm_free_suspend_msg(data); + break; + case REQUEST_JOB_READY: + slurm_free_job_id_msg(data); + break; + case REQUEST_NODE_SELECT_INFO: + slurm_free_node_select_msg(data); + break; + case REQUEST_STEP_COMPLETE: + slurm_free_step_complete_msg(data); + break; + case MESSAGE_STAT_JOBACCT: + slurm_free_stat_jobacct_msg(data); + break; + case REQUEST_BATCH_JOB_LAUNCH: + slurm_free_job_launch_msg(data); + break; + case REQUEST_LAUNCH_TASKS: + slurm_free_launch_tasks_request_msg(data); + break; + case TASK_USER_MANAGED_IO_STREAM: + slurm_free_task_user_managed_io_stream_msg(data); + break; + case REQUEST_SIGNAL_TASKS: + case REQUEST_TERMINATE_TASKS: + slurm_free_kill_tasks_msg(data); + break; + case REQUEST_KILL_TIMELIMIT: + slurm_free_timelimit_msg(data); + break; + case REQUEST_REATTACH_TASKS: + slurm_free_reattach_tasks_request_msg(data); + break; + case RESPONSE_REATTACH_TASKS: + slurm_free_reattach_tasks_response_msg(data); + break; + case REQUEST_SIGNAL_JOB: + slurm_free_signal_job_msg(data); + break; + case REQUEST_TERMINATE_JOB: + slurm_free_kill_job_msg(data); + break; + case REQUEST_UPDATE_JOB_TIME: + slurm_free_update_job_time_msg(data); + break; + case REQUEST_JOB_ID: + slurm_free_job_id_request_msg(data); + break; + case REQUEST_FILE_BCAST: + slurm_free_file_bcast_msg(data); + break; + case RESPONSE_SLURM_RC: + slurm_free_return_code_msg(data); + break; + case RESPONSE_FORWARD_FAILED: + break; + default: + error("invalid type trying to be freed %u", type); + break; + } + return SLURM_SUCCESS; +} + +extern uint32_t slurm_get_return_code(slurm_msg_type_t type, void *data) +{ + uint32_t rc = 0; + + switch(type) { + case MESSAGE_EPILOG_COMPLETE: + rc = ((epilog_complete_msg_t *)data)->return_code; + break; + case MESSAGE_STAT_JOBACCT: + rc = ((stat_jobacct_msg_t *)data)->return_code; + break; + case RESPONSE_REATTACH_TASKS: + rc = ((reattach_tasks_response_msg_t *)data)->return_code; + break; + case RESPONSE_JOB_ID: + rc = ((job_id_response_msg_t *)data)->return_code; + break; + case RESPONSE_SLURM_RC: + rc = ((return_code_msg_t *)data)->return_code; + break; + case RESPONSE_FORWARD_FAILED: + rc = SLURM_ERROR; + break; + default: + error("don't know the rc for type %u returning %u", type, rc); + break; + } + return rc; +} + diff --git a/executable_names/src/common/slurm_protocol_defs.h b/executable_names/src/common/slurm_protocol_defs.h new file mode 100644 index 0000000000000000000000000000000000000000..fdc500cb90df8a23f1d7d59680ce0f550cc468b0 --- /dev/null +++ b/executable_names/src/common/slurm_protocol_defs.h @@ -0,0 +1,777 @@ +/****************************************************************************\ + * slurm_protocol_defs.h - definitions used for RPCs + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PROTOCOL_DEFS_H +#define _SLURM_PROTOCOL_DEFS_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +#include +#include + +#include "src/common/bitstring.h" +#include "src/common/list.h" +#include "src/common/macros.h" +#include "src/common/slurm_protocol_common.h" +#include "src/common/switch.h" +#include "src/common/job_options.h" +#include "src/common/slurm_step_layout.h" +#include "src/common/xassert.h" + +#define MAX_SLURM_NAME 64 +#define FORWARD_INIT 0xfffe + +/* used to define flags of the launch_tasks_request_msg_t.and + * spawn task_request_msg_t task_flags + */ +enum task_flag_vals { + TASK_PARALLEL_DEBUG = 0x1, + TASK_UNUSED1 = 0x2, + TASK_UNUSED2 = 0x4 +}; + +enum part_shared { + SHARED_NO, /* Nodes never shared in partition */ + SHARED_YES, /* Nodes possible to share in partition */ + SHARED_FORCE /* Nodes always shares in partition */ +}; + +enum suspend_opts { + SUSPEND_JOB, /* Suspend a job now */ + RESUME_JOB /* Resume a job now */ +}; + +/* SLURM Message types */ +typedef enum { + REQUEST_NODE_REGISTRATION_STATUS = 1001, + MESSAGE_NODE_REGISTRATION_STATUS, + REQUEST_RECONFIGURE, + RESPONSE_RECONFIGURE, + REQUEST_SHUTDOWN, + REQUEST_SHUTDOWN_IMMEDIATE, + RESPONSE_SHUTDOWN, + REQUEST_PING, + REQUEST_CONTROL, + + REQUEST_BUILD_INFO = 2001, + RESPONSE_BUILD_INFO, + REQUEST_JOB_INFO, + RESPONSE_JOB_INFO, + REQUEST_JOB_STEP_INFO, + RESPONSE_JOB_STEP_INFO, + REQUEST_NODE_INFO, + RESPONSE_NODE_INFO, + REQUEST_PARTITION_INFO, + RESPONSE_PARTITION_INFO, + REQUEST_ACCTING_INFO, + RESPONSE_ACCOUNTING_INFO, + REQUEST_JOB_ID, + RESPONSE_JOB_ID, + REQUEST_NODE_SELECT_INFO, + RESPONSE_NODE_SELECT_INFO, + + REQUEST_UPDATE_JOB = 3001, + REQUEST_UPDATE_NODE, + REQUEST_UPDATE_PARTITION, + REQUEST_DELETE_PARTITION, + + REQUEST_RESOURCE_ALLOCATION = 4001, + RESPONSE_RESOURCE_ALLOCATION, + REQUEST_SUBMIT_BATCH_JOB, + RESPONSE_SUBMIT_BATCH_JOB, + REQUEST_BATCH_JOB_LAUNCH, + REQUEST_CANCEL_JOB, + RESPONSE_CANCEL_JOB, + REQUEST_JOB_RESOURCE, + RESPONSE_JOB_RESOURCE, + REQUEST_JOB_ATTACH, + RESPONSE_JOB_ATTACH, + REQUEST_JOB_WILL_RUN, + RESPONSE_JOB_WILL_RUN, + REQUEST_JOB_ALLOCATION_INFO, + RESPONSE_JOB_ALLOCATION_INFO, + REQUEST_JOB_ALLOCATION_INFO_LITE, + RESPONSE_JOB_ALLOCATION_INFO_LITE, + REQUEST_UPDATE_JOB_TIME, + REQUEST_JOB_READY, + RESPONSE_JOB_READY, + REQUEST_JOB_END_TIME, + + REQUEST_JOB_STEP_CREATE = 5001, + RESPONSE_JOB_STEP_CREATE, + REQUEST_RUN_JOB_STEP, + RESPONSE_RUN_JOB_STEP, + REQUEST_CANCEL_JOB_STEP, + RESPONSE_CANCEL_JOB_STEP, + DEFUNCT_REQUEST_COMPLETE_JOB_STEP, /* DEFUNCT */ + DEFUNCT_RESPONSE_COMPLETE_JOB_STEP, /* DEFUNCT */ + REQUEST_CHECKPOINT, + RESPONSE_CHECKPOINT, + REQUEST_CHECKPOINT_COMP, + RESPONSE_CHECKPOINT_COMP, + REQUEST_SUSPEND, + RESPONSE_SUSPEND, + REQUEST_STEP_COMPLETE, + REQUEST_COMPLETE_JOB_ALLOCATION, + REQUEST_COMPLETE_BATCH_SCRIPT, + MESSAGE_STAT_JOBACCT, + REQUEST_STEP_LAYOUT, + RESPONSE_STEP_LAYOUT, + REQUEST_JOB_REQUEUE, + + REQUEST_LAUNCH_TASKS = 6001, + RESPONSE_LAUNCH_TASKS, + MESSAGE_TASK_EXIT, + REQUEST_SIGNAL_TASKS, + REQUEST_TERMINATE_TASKS, + REQUEST_REATTACH_TASKS, + RESPONSE_REATTACH_TASKS, + REQUEST_KILL_TIMELIMIT, + REQUEST_SIGNAL_JOB, + REQUEST_TERMINATE_JOB, + MESSAGE_EPILOG_COMPLETE, + DEFUNCT_REQUEST_SPAWN_TASK, /* DEFUNCT */ + REQUEST_FILE_BCAST, + TASK_USER_MANAGED_IO_STREAM, + + SRUN_PING = 7001, + SRUN_TIMEOUT, + SRUN_NODE_FAIL, + SRUN_JOB_COMPLETE, + + PMI_KVS_PUT_REQ = 7201, + PMI_KVS_PUT_RESP, + PMI_KVS_GET_REQ, + PMI_KVS_GET_RESP, + + RESPONSE_SLURM_RC = 8001, + + RESPONSE_FORWARD_FAILED = 9001 +} slurm_msg_type_t; + +typedef enum { + CREDENTIAL1 +} slurm_credential_type_t; + +/*****************************************************************************\ + * core api configuration struct +\*****************************************************************************/ +typedef struct forward { + char *nodelist; /*ranged string of who to forward the + message to */ + uint16_t cnt; /* number of nodes to forward to */ + uint32_t timeout; /* original timeout increments */ + uint16_t init; /* tell me it has been set (FORWARD_INIT) */ +} forward_t; + +/*core api protocol message structures */ +typedef struct slurm_protocol_header { + uint16_t version; + uint16_t flags; + slurm_msg_type_t msg_type; + uint32_t body_length; + uint16_t ret_cnt; + forward_t forward; + slurm_addr orig_addr; + List ret_list; +} header_t; + +typedef struct forward_message { + header_t header; + char *buf; + int buf_len; + int timeout; + List ret_list; + pthread_mutex_t *forward_mutex; + pthread_cond_t *notify; +} forward_msg_t; + +typedef struct forward_struct { + int timeout; + uint16_t fwd_cnt; + pthread_mutex_t forward_mutex; + pthread_cond_t notify; + forward_msg_t *forward_msg; + char *buf; + int buf_len; + List ret_list; +} forward_struct_t; + +typedef struct slurm_protocol_config { + slurm_addr primary_controller; + slurm_addr secondary_controller; +} slurm_protocol_config_t; + +typedef struct slurm_msg { + slurm_msg_type_t msg_type; + slurm_addr address; + slurm_fd conn_fd; + void *auth_cred; + void *data; + uint32_t data_size; + + /* The following were all added for the forward.c code */ + forward_t forward; + forward_struct_t *forward_struct; + slurm_addr orig_addr; + List ret_list; +} slurm_msg_t; + +typedef struct ret_data_info { + slurm_msg_type_t type; /* message type */ + uint32_t err; + char *node_name; + void *data; /* used to hold the return message data (i.e. + return_code_msg_t */ +} ret_data_info_t; + +/*****************************************************************************\ + * Slurm Protocol Data Structures +\*****************************************************************************/ + +typedef struct job_step_kill_msg { + uint32_t job_id; + uint32_t job_step_id; + uint16_t signal; + uint16_t batch_flag; +} job_step_kill_msg_t; + +typedef struct job_id_msg { + uint32_t job_id; +} job_id_msg_t; + +typedef struct job_step_id_msg { + uint32_t job_id; + uint32_t step_id; +} job_step_id_msg_t; + +typedef struct job_info_request_msg { + time_t last_update; + uint16_t show_flags; +} job_info_request_msg_t; + +typedef struct job_step_info_request_msg { + time_t last_update; + uint32_t job_id; + uint32_t step_id; + uint16_t show_flags; +} job_step_info_request_msg_t; + +typedef struct node_info_request_msg { + time_t last_update; + uint16_t show_flags; +} node_info_request_msg_t; + +typedef struct node_info_select_request_msg { + time_t last_update; +} node_info_select_request_msg_t; + +typedef struct part_info_request_msg { + time_t last_update; + uint16_t show_flags; +} part_info_request_msg_t; + +typedef struct complete_job_allocation { + uint32_t job_id; + uint32_t job_rc; +} complete_job_allocation_msg_t; + +typedef struct complete_batch_script { + uint32_t job_id; + uint32_t job_rc; + uint32_t slurm_rc; + char *node_name; +} complete_batch_script_msg_t; + +typedef struct step_complete_msg { + uint32_t job_id; + uint32_t job_step_id; + uint32_t range_first; + uint32_t range_last; + uint32_t step_rc; /* largest task return code */ + jobacctinfo_t *jobacct; +} step_complete_msg_t; + +typedef struct stat_jobacct_msg { + uint32_t job_id; + uint32_t return_code; + uint32_t step_id; + uint32_t num_tasks; + jobacctinfo_t *jobacct; +} stat_jobacct_msg_t; + +typedef struct kill_tasks_msg { + uint32_t job_id; + uint32_t job_step_id; + uint32_t signal; +} kill_tasks_msg_t; + +typedef struct epilog_complete_msg { + uint32_t job_id; + uint32_t return_code; + char *node_name; + switch_node_info_t switch_nodeinfo; +} epilog_complete_msg_t; + +typedef struct shutdown_msg { + uint16_t core; +} shutdown_msg_t; + +typedef struct last_update_msg { + time_t last_update; +} last_update_msg_t; + +typedef struct launch_tasks_request_msg { + uint32_t job_id; + uint32_t job_step_id; + uint32_t nnodes; /* number of nodes in this job step */ + uint32_t nprocs; /* number of processes in this job step */ + uint32_t uid; + uint32_t gid; + uint32_t *tasks_to_launch; + uint16_t envc; + uint16_t argc; + uint16_t multi_prog; + uint32_t *cpus_allocated; + uint32_t max_sockets; + uint32_t max_cores; + uint32_t max_threads; + uint32_t cpus_per_task; + uint32_t ntasks_per_node; + uint32_t ntasks_per_socket; + uint32_t ntasks_per_core; + char **env; + char **argv; + char *cwd; + uint16_t cpu_bind_type; /* --cpu_bind= */ + char *cpu_bind; /* binding map for map/mask_cpu */ + uint16_t mem_bind_type; /* --mem_bind= */ + char *mem_bind; /* binding map for tasks to memory */ + uint16_t num_resp_port; + uint16_t *resp_port; /* array of available response ports */ + + /* Distribution at the lowest level of logical processor (lllp) */ + uint16_t task_dist; /* --distribution=, -m dist */ + uint32_t plane_size; /* lllp distribution -> plane_size for + * when -m plane=<# of lllp per plane> */ + uint16_t task_flags; + uint32_t **global_task_ids; + slurm_addr orig_addr; /* where message really came from for io */ + + uint16_t user_managed_io; /* 0 for "normal" IO, + 1 for "user manged" IO */ + + /********** START "normal" IO only options **********/ + /* These options are ignored if user_managed_io is 1 */ + char *ofname; /* stdout filename pattern */ + char *efname; /* stderr filename pattern */ + char *ifname; /* stdin filename pattern */ + uint8_t buffered_stdio; /* 1 for line-buffered, 0 for unbuffered */ + uint16_t num_io_port; + uint16_t *io_port; /* array of available client IO listen ports */ + /********** END "normal" IO only options **********/ + + char *task_prolog; + char *task_epilog; + + uint32_t slurmd_debug; /* remote slurmd debug level */ + + slurm_cred_t cred; /* job credential */ + switch_jobinfo_t switch_job; /* switch credential for the job */ + job_options_t options; /* Arbitrary job options */ + char *complete_nodelist; +} launch_tasks_request_msg_t; + +typedef struct task_user_managed_io_msg { + uint32_t task_id; +} task_user_managed_io_msg_t; + +typedef struct partition_info partition_desc_msg_t; + +typedef struct return_code_msg { + uint32_t return_code; +} return_code_msg_t; + +/* Note: We include the node list here for reliable cleanup on XCPU systems. + * + * Note: We include select_jobinfo here in addition to the job launch + * RPC in order to insure reliable clean-up of a BlueGene partition in + * the event of some launch failure or race condition preventing slurmd + * from getting the MPIRUN_PARTITION at that time. It is needed for + * the job epilog. */ +typedef struct kill_job_msg { + uint32_t job_id; + uint32_t job_uid; + time_t time; /* slurmctld's time of request */ + char *nodes; + select_jobinfo_t select_jobinfo; /* opaque data type */ +} kill_job_msg_t; + +typedef struct signal_job_msg { + uint32_t job_id; + uint32_t signal; +} signal_job_msg_t; + +typedef struct job_time_msg { + uint32_t job_id; + time_t expiration_time; +} job_time_msg_t; + +typedef struct reattach_tasks_request_msg { + uint32_t job_id; + uint32_t job_step_id; + uint16_t num_resp_port; + uint16_t *resp_port; /* array of available response ports */ + uint16_t num_io_port; + uint16_t *io_port; /* array of available client IO ports */ + slurm_cred_t cred; /* used only a weak authentication mechanism + for the slurmstepd to use when connecting + back to the client */ +} reattach_tasks_request_msg_t; + +typedef struct reattach_tasks_response_msg { + char *node_name; + char *executable_name; + uint32_t return_code; + uint32_t ntasks; /* number of tasks on this node */ + uint32_t *gtids; /* Global task id assignments */ + uint32_t *local_pids; /* list of process ids on this node */ +} reattach_tasks_response_msg_t; + +typedef struct batch_job_launch_msg { + uint32_t job_id; + uint32_t step_id; + uint32_t uid; + uint32_t gid; + uint32_t nprocs; /* number of tasks in this job */ + uint16_t num_cpu_groups;/* elements in below cpu arrays */ + uint32_t *cpus_per_node;/* cpus per node */ + uint32_t *cpu_count_reps;/* how many nodes have same cpu count */ + char *nodes; /* list of nodes allocated to job_step */ + char *script; /* the actual job script, default NONE */ + char *err; /* pathname of stderr */ + char *in; /* pathname of stdin */ + char *out; /* pathname of stdout */ + char *work_dir; /* full pathname of working directory */ + uint16_t argc; + char **argv; + uint16_t envc; /* element count in environment */ + char **environment; /* environment variables to set for job, + * name=value pairs, one per line */ + select_jobinfo_t select_jobinfo; /* opaque data type */ + slurm_cred_t cred; + uint16_t overcommit; /* if resources being over subscribed */ +} batch_job_launch_msg_t; + +typedef struct job_id_request_msg { + uint32_t job_pid; /* local process_id of a job */ +} job_id_request_msg_t; + +typedef struct job_id_response_msg { + uint32_t job_id; /* slurm job_id */ + uint32_t return_code; /* slurm return code */ +} job_id_response_msg_t; + +typedef struct srun_ping_msg { + uint32_t job_id; /* slurm job_id */ + uint32_t step_id; /* step_id or NO_VAL */ +} srun_ping_msg_t; + +typedef struct srun_job_complete_msg { + uint32_t job_id; /* slurm job_id */ + uint32_t step_id; /* step_id or NO_VAL */ +} srun_job_complete_msg_t; + +typedef struct srun_node_fail_msg { + uint32_t job_id; /* slurm job_id */ + uint32_t step_id; /* step_id or NO_VAL */ + char *nodelist; /* name of failed node(s) */ +} srun_node_fail_msg_t; + +typedef struct srun_timeout_msg { + uint32_t job_id; /* slurm job_id */ + uint32_t step_id; /* step_id or NO_VAL */ + time_t timeout; /* when job scheduled to be killed */ +} srun_timeout_msg_t; + +typedef struct checkpoint_msg { + uint16_t op; /* checkpoint operation, see enum check_opts */ + uint16_t data; /* operation specific data */ + uint32_t job_id; /* slurm job_id */ + uint32_t step_id; /* slurm step_id */ +} checkpoint_msg_t; + +typedef struct checkpoint_comp_msg { + uint32_t job_id; /* slurm job_id */ + uint32_t step_id; /* slurm step_id */ + time_t begin_time; /* time checkpoint began */ + uint32_t error_code; /* error code on failure */ + char * error_msg; /* error message on failure */ +} checkpoint_comp_msg_t; + +typedef struct checkpoint_resp_msg { + time_t event_time; /* time of checkpoint start/finish */ + uint32_t error_code; /* error code on failure */ + char * error_msg; /* error message on failure */ +} checkpoint_resp_msg_t; + +typedef struct suspend_msg { + uint16_t op; /* suspend operation, see enum suspend_opts */ + uint32_t job_id; /* slurm job_id */ +} suspend_msg_t; + +typedef struct kvs_get_msg { + uint16_t task_id; /* job step's task id */ + uint16_t size; /* count of tasks in job */ + uint16_t port; /* port to be sent the kvs data */ + char * hostname; /* hostname to be sent the kvs data */ +} kvs_get_msg_t; + +#define FILE_BLOCKS 8 +typedef struct file_bcast_msg { + char *fname; /* name of the destination file */ + uint16_t block_no; /* block number of this data */ + uint16_t last_block; /* last block of bcast if set */ + uint16_t force; /* replace existing file if set */ + uint16_t modes; /* access rights for destination file */ + uint32_t uid; /* owner for destination file */ + uint32_t gid; /* group for destination file */ + time_t atime; /* last access time for destination file */ + time_t mtime; /* last modification time for dest file */ + uint32_t block_len[FILE_BLOCKS];/* length of this data block */ + char *block[FILE_BLOCKS]; /* data for this block, 64k max */ +} file_bcast_msg_t; + + +/*****************************************************************************\ + * Slurm API Message Types +\*****************************************************************************/ +typedef struct slurm_node_registration_status_msg { + time_t timestamp; + char *node_name; + uint16_t cpus; + uint16_t sockets; + uint16_t cores; + uint16_t threads; + uint32_t real_memory_size; + uint32_t temporary_disk_space; + uint32_t job_count; /* number of associate job_id's */ + uint32_t *job_id; /* IDs of running job (if any) */ + uint16_t *step_id; /* IDs of running job steps (if any) */ + uint32_t status; /* node status code, same as return codes */ + uint16_t startup; /* slurmd just restarted */ + switch_node_info_t switch_nodeinfo; /* set only if startup != 0 */ +} slurm_node_registration_status_msg_t; + +typedef struct slurm_ctl_conf slurm_ctl_conf_info_msg_t; +/*****************************************************************************\ + * SLURM MESSAGE INITIALIZATION +\*****************************************************************************/ + +/* + * slurm_msg_t_init - initialize a slurm message + * OUT msg - pointer to the slurm_msg_t structure which will be initialized + */ +extern void slurm_msg_t_init (slurm_msg_t *msg); + +/* + * slurm_msg_t_copy - initialize a slurm_msg_t structure "dest" with + * values from the "src" slurm_msg_t structure. + * IN src - Pointer to the initialized message from which "dest" will + * be initialized. + * OUT dest - Pointer to the slurm_msg_t which will be intialized. + * NOTE: the "dest" structure will contain pointers into the contents of "src". + */ +extern void slurm_msg_t_copy(slurm_msg_t *dest, slurm_msg_t *src); + +/* free message functions */ +void inline slurm_free_last_update_msg(last_update_msg_t * msg); +void inline slurm_free_return_code_msg(return_code_msg_t * msg); +void inline slurm_free_job_alloc_info_msg(job_alloc_info_msg_t * msg); +void inline slurm_free_job_info_request_msg(job_info_request_msg_t *msg); +void inline slurm_free_job_step_info_request_msg( + job_step_info_request_msg_t *msg); +void inline slurm_free_node_info_request_msg(node_info_request_msg_t *msg); +void inline slurm_free_part_info_request_msg(part_info_request_msg_t *msg); + +#define slurm_free_timelimit_msg(msg) \ + slurm_free_kill_job_msg(msg) + +void inline slurm_free_shutdown_msg(shutdown_msg_t * msg); + +void inline slurm_free_job_desc_msg(job_desc_msg_t * msg); + +void inline +slurm_free_node_registration_status_msg(slurm_node_registration_status_msg_t * + msg); + +void inline slurm_free_job_info(job_info_t * job); +void inline slurm_free_job_info_members(job_info_t * job); + +void inline slurm_free_job_id_msg(job_id_msg_t * msg); +void inline slurm_free_job_id_request_msg(job_id_request_msg_t * msg); +void inline slurm_free_job_id_response_msg(job_id_response_msg_t * msg); + +void inline slurm_free_job_step_id_msg(job_step_id_msg_t *msg); + +void inline slurm_free_job_launch_msg(batch_job_launch_msg_t * msg); + +void inline slurm_free_update_node_msg(update_node_msg_t * msg); +void inline slurm_free_update_part_msg(update_part_msg_t * msg); +void inline slurm_free_delete_part_msg(delete_part_msg_t * msg); +void inline +slurm_free_job_step_create_request_msg(job_step_create_request_msg_t * msg); +void inline +slurm_free_complete_job_allocation_msg(complete_job_allocation_msg_t * msg); +void inline +slurm_free_complete_batch_script_msg(complete_batch_script_msg_t * msg); +void inline +slurm_free_launch_tasks_request_msg(launch_tasks_request_msg_t * msg); +void inline +slurm_free_launch_tasks_response_msg(launch_tasks_response_msg_t * msg); +void inline slurm_free_task_user_managed_io_stream_msg( + task_user_managed_io_msg_t *msg); +void inline slurm_free_task_exit_msg(task_exit_msg_t * msg); +void inline slurm_free_kill_tasks_msg(kill_tasks_msg_t * msg); +void inline +slurm_free_reattach_tasks_request_msg(reattach_tasks_request_msg_t * msg); +void inline +slurm_free_reattach_tasks_response_msg(reattach_tasks_response_msg_t * msg); +void inline slurm_free_kill_job_msg(kill_job_msg_t * msg); +void inline slurm_free_signal_job_msg(signal_job_msg_t * msg); +void inline slurm_free_update_job_time_msg(job_time_msg_t * msg); +void inline slurm_free_job_step_kill_msg(job_step_kill_msg_t * msg); +void inline slurm_free_epilog_complete_msg(epilog_complete_msg_t * msg); +void inline slurm_free_srun_job_complete_msg(srun_job_complete_msg_t * msg); +void inline slurm_free_srun_ping_msg(srun_ping_msg_t * msg); +void inline slurm_free_srun_node_fail_msg(srun_node_fail_msg_t * msg); +void inline slurm_free_srun_timeout_msg(srun_timeout_msg_t * msg); +void inline slurm_free_checkpoint_msg(checkpoint_msg_t *msg); +void inline slurm_free_checkpoint_comp_msg(checkpoint_comp_msg_t *msg); +void inline slurm_free_checkpoint_resp_msg(checkpoint_resp_msg_t *msg); +void inline slurm_free_suspend_msg(suspend_msg_t *msg); +void slurm_free_resource_allocation_response_msg ( + resource_allocation_response_msg_t * msg); +void slurm_free_job_alloc_info_response_msg ( + job_alloc_info_response_msg_t * msg); +void slurm_free_job_step_create_response_msg( + job_step_create_response_msg_t * msg); +void slurm_free_submit_response_response_msg(submit_response_msg_t * msg); +void slurm_free_ctl_conf(slurm_ctl_conf_info_msg_t * config_ptr); +void slurm_free_job_info_msg(job_info_msg_t * job_buffer_ptr); +void slurm_free_job_step_info_response_msg( + job_step_info_response_msg_t * msg); +void slurm_free_node_info_msg(node_info_msg_t * msg); +void slurm_free_partition_info_msg(partition_info_msg_t * msg); +void slurm_free_get_kvs_msg(kvs_get_msg_t *msg); +void inline slurm_free_file_bcast_msg(file_bcast_msg_t *msg); +void inline slurm_free_step_complete_msg(step_complete_msg_t *msg); +void inline slurm_free_stat_jobacct_msg(stat_jobacct_msg_t *msg); +void inline slurm_free_node_select_msg( + node_info_select_request_msg_t *msg); +extern int slurm_free_msg_data(slurm_msg_type_t type, void *data); +extern uint32_t slurm_get_return_code(slurm_msg_type_t type, void *data); + +extern char *job_reason_string(enum job_wait_reason inx); +extern char *job_state_string(enum job_states inx); +extern char *job_state_string_compact(enum job_states inx); +extern char *node_state_string(enum node_states inx); +extern char *node_state_string_compact(enum node_states inx); + +#define safe_read(fd, buf, size) do { \ + int remaining = size; \ + void *ptr = buf; \ + int rc; \ + while (remaining > 0) { \ + rc = read(fd, ptr, remaining); \ + if (rc == 0) { \ + debug("%s:%d: %s: safe_read (%d of %d) EOF", \ + __FILE__, __LINE__, __CURRENT_FUNC__, \ + remaining, (int)size); \ + goto rwfail; \ + } else if (rc < 0) { \ + debug("%s:%d: %s: safe_read (%d of %d) failed: %m", \ + __FILE__, __LINE__, __CURRENT_FUNC__, \ + remaining, (int)size); \ + goto rwfail; \ + } else { \ + ptr += rc; \ + remaining -= rc; \ + if (remaining > 0) \ + debug3("%s:%d: %s: safe_read (%d of %d) partial read", \ + __FILE__, __LINE__, __CURRENT_FUNC__, \ + remaining, (int)size); \ + } \ + } \ + } while (0) + +#define safe_write(fd, buf, size) do { \ + int remaining = size; \ + void *ptr = buf; \ + int rc; \ + while(remaining > 0) { \ + rc = write(fd, ptr, remaining); \ + if (rc < 0) { \ + debug("%s:%d: %s: safe_write (%d of %d) failed: %m", \ + __FILE__, __LINE__, __CURRENT_FUNC__, \ + remaining, (int)size); \ + goto rwfail; \ + } else { \ + ptr += rc; \ + remaining -= rc; \ + if (remaining > 0) \ + debug3("%s:%d: %s: safe_write (%d of %d) partial write", \ + __FILE__, __LINE__, __CURRENT_FUNC__, \ + remaining, (int)size); \ + } \ + } \ + } while (0) + +#endif diff --git a/executable_names/src/common/slurm_protocol_interface.h b/executable_names/src/common/slurm_protocol_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..13fb9f666112bfe17faac0331fc34a54b177f63b --- /dev/null +++ b/executable_names/src/common/slurm_protocol_interface.h @@ -0,0 +1,403 @@ +/*****************************************************************************\ + * slurm_protocol_interface.h - mid-level slurm communication definitions + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Chris Dunlap , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PROTOCOL_INTERFACE_H +#define _SLURM_PROTOCOL_INTERFACE_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +/* WHAT ABOUT THESE INCLUDES */ +#include +#include +#include + + +#if HAVE_SYS_SOCKET_H +# include +#else +# if HAVE_SOCKET_H +# include +# endif +#endif + + +#include +#include +#include +#include +#include + +#include "src/common/macros.h" +#include "src/common/pack.h" +#include "src/common/slurm_protocol_common.h" + +/****************\ + ** Data Types ** + \****************/ + +typedef enum slurm_socket_type { + SLURM_MESSAGE , + SLURM_STREAM +} slurm_socket_type_t; + +/*******************************\ + ** MIDDLE LAYER FUNCTIONS ** + \*******************************/ + +/* The must have funtions are required to implement a low level plugin + * for the slurm protocol the general purpose functions just wrap + * standard socket calls, so if the underlying layer implements a + * socket like interface, it can be used as a low level transport + * plugin with slurm the _slurm_recv and _slurm_send functions are + * also needed + */ + + +/*****************************/ +/* socket creation functions */ +/*****************************/ + +/* Create a socket of the specified type + * IN type - SLURM_STREAM or SLURM_MESSAGE + */ +slurm_fd _slurm_create_socket (slurm_socket_type_t type) ; + +/*****************/ +/* msg functions */ +/*****************/ + +/* _slurm_init_msg_engine + * In the socket implementation it creates a socket, binds to it, and + * listens for connections. + * IN slurm_address - address to bind to + * RET file descriptor + */ +slurm_fd _slurm_init_msg_engine ( slurm_addr * slurm_address ) ; + +/* _slurm_open_msg_conn + * In the bsd socket implementation it creates a SOCK_STREAM socket + * and calls connect on it a SOCK_DGRAM socket called with connect + * is defined to only receive messages from the address/port pair + * argument of the connect call slurm_address - for now it is + * really just a sockaddr_in + * IN slurm_address - address to bind to + * RET file descriptor + */ + +slurm_fd _slurm_open_msg_conn ( slurm_addr * slurm_address ) ; + +/* _slurm_msg_recvfrom + * Get message over the given connection, default timeout value + * IN fd - an open file descriptor + * OUT pbuf - xmalloc'd buffer, loaded with message data + * OUT buflen - size of allocated buffer in bytes + * IN flags - communication specific flags + * + * RET number of bytes read + */ +ssize_t _slurm_msg_recvfrom(slurm_fd fd, char **pbuf, size_t *buflen, + uint32_t flags); + +/* _slurm_msg_recvfrom_timeout reads len bytes from file descriptor fd + * timing out after `timeout' milliseconds. + * + */ +ssize_t _slurm_msg_recvfrom_timeout(slurm_fd fd, char **buf, size_t *len, + uint32_t flags, int timeout); + +/* _slurm_msg_sendto + * Send message over the given connection, default timeout value + * IN open_fd - an open file descriptor + * IN buffer - data to transmit + * IN size - size of buffer in bytes + * IN flags - communication specific flags + * RET number of bytes written + */ +ssize_t _slurm_msg_sendto ( slurm_fd open_fd, char *buffer , + size_t size , uint32_t flags ) ; +/* _slurm_msg_sendto_timeout is identical to _slurm_msg_sendto except + * IN timeout - maximum time to wait for a message in milliseconds */ +ssize_t _slurm_msg_sendto_timeout ( slurm_fd open_fd, char *buffer , + size_t size , uint32_t flags, int timeout ) ; + +/* _slurm_accept_msg_conn + * In the bsd implmentation maps directly to a accept call + * IN open_fd - file descriptor to accept connection on + * OUT slurm_address - slurm_addr of the accepted connection + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd _slurm_accept_msg_conn ( slurm_fd open_fd , + slurm_addr * slurm_address ) ; + + +/* _slurm_close_accepted_conn + * In the bsd implmentation maps directly to a close call, to close + * the socket that was accepted + * IN open_fd - an open file descriptor to close + * RET int - the return code + */ +int _slurm_close_accepted_conn ( slurm_fd open_fd ) ; + +/********************/ +/* stream functions */ +/********************/ + +/* _slurm_listen_stream + * opens a stream server and listens on it + * IN slurm_address - slurm_addr to bind the server stream to + * RET slurm_fd - file descriptor of the stream created + */ +slurm_fd _slurm_listen_stream ( slurm_addr * slurm_address ) ; + +/* _slurm_accept_stream + * accepts a incomming stream connection on a stream server slurm_fd + * IN open_fd - file descriptor to accept connection on + * OUT slurm_address - slurm_addr of the accepted connection + * RET slurm_fd - file descriptor of the accepted connection + */ +slurm_fd _slurm_accept_stream ( slurm_fd open_fd , + slurm_addr * slurm_address ) ; + +/* _slurm_open_stream + * opens a client connection to stream server + * IN slurm_address - slurm_addr of the connection destination + * IN retry - if true, retry as needed with various ports + * to avoid socket address collision + * RET slurm_fd - file descriptor of the connection created + */ +slurm_fd _slurm_open_stream ( slurm_addr * slurm_address, bool retry ) ; + +/* _slurm_get_stream_addr + * esentially a encapsilated get_sockname + * IN open_fd - file descriptor to retreive slurm_addr for + * OUT address - address that open_fd to bound to + */ +extern int _slurm_get_stream_addr ( slurm_fd open_fd , + slurm_addr * address ) ; + +/* _slurm_close_stream + * closes either a server or client stream file_descriptor + * IN open_fd - an open file descriptor to close + * RET int - the return code + */ +extern int _slurm_close_stream ( slurm_fd open_fd ) ; + +/* make an open slurm connection blocking or non-blocking + * (i.e. wait or do not wait for i/o completion ) + * IN open_fd - an open file descriptor to change the effect + * RET int - the return code + */ +extern inline int _slurm_set_stream_non_blocking ( slurm_fd open_fd ) ; +extern inline int _slurm_set_stream_blocking ( slurm_fd open_fd ) ; + +int _slurm_send_timeout ( slurm_fd open_fd, char *buffer , + size_t size , uint32_t flags, int timeout ) ; +int _slurm_recv_timeout ( slurm_fd open_fd, char *buffer , + size_t size , uint32_t flags, int timeout ) ; + +/***************************/ +/* slurm address functions */ +/***************************/ +/* build a slurm address bassed upon ip address and port number + * OUT slurm_address - the constructed slurm_address + * IN port - port to be used + * IN ip_address - the IP address to connect with + */ +extern void _slurm_set_addr_uint ( slurm_addr * slurm_address , + uint16_t port , uint32_t ip_address ) ; + +/* resets the address field of a slurm_addr, port and family are unchanged */ +extern void _reset_slurm_addr ( slurm_addr * slurm_address , + slurm_addr new_address ); + + +/* build a slurm address bassed upon host name and port number + * OUT slurm_address - the constructed slurm_address + * IN port - port to be used + * IN host - name of host to connect with + */ +extern void _slurm_set_addr_char ( slurm_addr * slurm_address , + uint16_t port , char * host ) ; + +/* given a slurm_address it returns its port and hostname + * IN slurm_address - slurm_addr to be queried + * OUT port - port number + * OUT host - hostname + * IN buf_len - length of hostname buffer + */ +extern void _slurm_get_addr ( slurm_addr * slurm_address , + uint16_t * port , char * host , + uint32_t buf_len ) ; + +/* prints a slurm_addr into a buf + * IN address - slurm_addr to print + * IN buf - space for string representation of slurm_addr + * IN n - max number of bytes to write (including NUL) + */ +extern void _slurm_print_slurm_addr ( slurm_addr * address, + char *buf, size_t n ) ; + +/*****************************/ +/* slurm addr pack functions */ +/*****************************/ +extern void _slurm_pack_slurm_addr ( slurm_addr * slurm_address , + Buf buffer ) ; +extern int _slurm_unpack_slurm_addr_no_alloc ( + slurm_addr * slurm_address , Buf buffer ) ; + + +/*******************************\ + ** BSD LINUX SOCKET FUNCTIONS ** + \*******************************/ + +/* Create a new socket of type TYPE in domain DOMAIN, using + * protocol PROTOCOL. If PROTOCOL is zero, one is chosen automatically. + * Returns a file descriptor for the new socket, or -1 for errors. */ +extern int _slurm_socket (int __domain, int __type, int __protocol) ; + +/* Create two new sockets, of type TYPE in domain DOMAIN and using + * protocol PROTOCOL, which are connected to each other, and put file + * descriptors for them in FDS[0] and FDS[1]. If PROTOCOL is zero, + * one will be chosen automatically. Returns 0 on success, -1 for errors. */ +extern int _slurm_socketpair (int __domain, int __type, int __protocol, + int __fds[2]) ; + +/* Give the socket FD the local address ADDR (which is LEN bytes long). */ +extern int _slurm_bind (int __fd, struct sockaddr const * __addr, + socklen_t __len) ; + +/* Open a connection on socket FD to peer at ADDR (which LEN bytes long). + * For connectionless socket types, just set the default address to send to + * and the only address from which to accept transmissions. + * Return 0 on success, -1 for errors. */ +extern int _slurm_connect (int __fd, struct sockaddr const * __addr, + socklen_t __len) ; + +/* Prepare to accept connections on socket FD. + * N connection requests will be queued before further requests are refused. + * Returns 0 on success, -1 for errors. */ +extern int _slurm_listen (int __fd, int __n) ; + +/* Await a connection on socket FD. + * When a connection arrives, open a new socket to communicate with it, + * set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting + * peer and *ADDR_LEN to the address's actual length, and return the + * new socket's descriptor, or -1 for errors. */ +extern int _slurm_accept (int __fd, struct sockaddr * __addr, + socklen_t *__restrict __addr_len) ; + +/* Put the local address of FD into *ADDR and its length in *LEN. */ +extern int _slurm_getsockname (int __fd, struct sockaddr * __addr, + socklen_t *__restrict __len) ; + +/* Put the address of the peer connected to socket FD into *ADDR + * (which is *LEN bytes long), and its actual length into *LEN. */ +extern int _slurm_getpeername (int __fd, struct sockaddr * __addr, + socklen_t *__restrict __len) ; + +/* Send N bytes of BUF to socket FD. Returns the number sent or -1. */ +extern ssize_t _slurm_send (int __fd, __const void *__buf, + size_t __n, int __flags) ; +extern ssize_t _slurm_write (int __fd, __const void *__buf, size_t __n) ; + +/* Read N bytes into BUF from socket FD. + * Returns the number read or -1 for errors. */ +extern ssize_t _slurm_recv (int __fd, void *__buf, size_t __n, int __flags) ; +extern ssize_t _slurm_read (int __fd, void *__buf, size_t __n) ; + +/* Send N bytes of BUF on socket FD to peer at address ADDR (which is + * ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */ +extern ssize_t _slurm_sendto (int __fd, __const void *__buf, size_t __n, + int __flags, struct sockaddr const * __addr, + socklen_t __addr_len) ; + +/* Send a msg described MESSAGE on socket FD. + * Returns the number of bytes sent, or -1 for errors. */ +extern ssize_t _slurm_sendmsg (int __fd, __const struct msghdr *__msg, + int __flags) ; + +/* Read N bytes into BUF through socket FD. + * If ADDR is not NULL, fill in *ADDR_LEN bytes of it with tha address of + * the sender, and store the actual size of the address in *ADDR_LEN. + * Returns the number of bytes read or -1 for errors. */ +extern ssize_t _slurm_recvfrom (int __fd, void *__restrict __buf, + size_t __n, int __flags, struct sockaddr * __addr, + socklen_t *__restrict __addr_len) ; + +/* Send a msg described MESSAGE on socket FD. + * Returns the number of bytes read or -1 for errors. */ +extern ssize_t _slurm_recvmsg (int __fd, struct msghdr *__msg, + int __flags) ; + +/* Put the current value for socket FD's option OPTNAME at protocol level LEVEL + * into OPTVAL (which is *OPTLEN bytes long), and set *OPTLEN to the value's + * actual length. Returns 0 on success, -1 for errors. */ +extern int _slurm_getsockopt (int __fd, int __level, int __optname, + void *__restrict __optval, + socklen_t *__restrict __optlen) ; + +/* Set socket FD's option OPTNAME at protocol level LEVEL + * to *OPTVAL (which is OPTLEN bytes long). + * Returns 0 on success, -1 for errors. */ +extern int _slurm_setsockopt (int __fd, int __level, int __optname, + __const void *__optval, socklen_t __optlen) ; + +/* Shut down all or part of the connection open on socket FD. + * HOW determines what to shut down: + * SHUT_RD = No more receptions; + * SHUT_WR = No more transmissions; + * SHUT_RDWR = No more receptions or transmissions. + * Returns 0 on success, -1 for errors. */ +extern int _slurm_shutdown (int __fd, int __how) ; +extern int _slurm_close (int __fd ) ; + +extern int _slurm_fcntl(int fd, int cmd, ... ); +extern int _slurm_vfcntl(int fd, int cmd, va_list va ); + +extern int _slurm_ioctl(int d, int request, ...); +#endif /* !_SLURM_PROTOCOL_INTERFACE_H */ diff --git a/executable_names/src/common/slurm_protocol_mongo_common.h b/executable_names/src/common/slurm_protocol_mongo_common.h new file mode 100644 index 0000000000000000000000000000000000000000..98997ef6bb2c069043e6946fefb9d772c5ab35ec --- /dev/null +++ b/executable_names/src/common/slurm_protocol_mongo_common.h @@ -0,0 +1,87 @@ +/*****************************************************************************\ + * slurm_protocol_mongo_common.h - alternative communications protocol to + * TCP sockets. As of 11/18/2002 it is unclear that this communications + * protocol will be fully developed. + **************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PROTOCOL_MONGO_COMMON_H +#define _SLURM_PROTOCOL_MONGO_COMMON_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +#include + +#define AF_SLURM AF_INET +#define SLURM_INADDR_ANY 0x00000000 + +/* LINUX SPECIFIC */ +/* this is the slurm equivalent of the operating system file descriptor, + * which in linux is just an int */ +typedef uint32_t slurm_fd ; + +/* this is the slurm equivalent of the BSD sockets sockaddr */ +typedef struct mongo_addr_t slurm_addr ; +/* this is the slurm equivalent of the BSD sockets fd_set */ +typedef fd_set slurm_fd_set ; +/*struct kevin { + int16_t family ; + uint16_t port ; + uint32_t address ; + char pad[16 - sizeof ( int16_t ) - + sizeof (uint16_t) - sizeof (uint32_t) ] ; +} ; +*/ + +/* SLURM datatypes */ +/* this is a custom data type to describe the slurm msg type type + * that is placed in the slurm protocol header + * while just an short now, it may change in the future */ +/* Now defined in ../../src/common/slurm_protocol_defs.h + * typedef uint16_t slurm_msg_type_t ; + */ + +#endif diff --git a/executable_names/src/common/slurm_protocol_pack.c b/executable_names/src/common/slurm_protocol_pack.c new file mode 100644 index 0000000000000000000000000000000000000000..934d5e2ffcd41ed8e9054365bbb3469c1a2a3cfb --- /dev/null +++ b/executable_names/src/common/slurm_protocol_pack.c @@ -0,0 +1,3967 @@ +/****************************************************************************\ + * slurm_protocol_pack.c - functions to pack and unpack structures for RPCs + * + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#include "src/api/slurm_pmi.h" +#include "src/common/bitstring.h" +#include "src/common/log.h" +#include "src/common/node_select.h" +#include "src/common/slurm_jobacct.h" +#include "src/common/pack.h" +#include "src/common/slurm_auth.h" +#include "src/common/slurm_cred.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/slurm_protocol_pack.h" +#include "src/common/switch.h" +#include "src/common/xmalloc.h" +#include "src/common/xassert.h" +#include "src/common/forward.h" +#include "src/common/job_options.h" + +#define _pack_job_info_msg(msg,buf) _pack_buffer_msg(msg,buf) +#define _pack_job_step_info_msg(msg,buf) _pack_buffer_msg(msg,buf) +#define _pack_node_select_info_msg(msg,buf) _pack_buffer_msg(msg,buf) +#define _pack_node_info_msg(msg,buf) _pack_buffer_msg(msg,buf) + +static void _pack_update_node_msg(update_node_msg_t * msg, Buf buffer); +static int _unpack_update_node_msg(update_node_msg_t ** msg, Buf buffer); + +static void +_pack_node_registration_status_msg(slurm_node_registration_status_msg_t * + msg, Buf buffer); +static int +_unpack_node_registration_status_msg(slurm_node_registration_status_msg_t + ** msg, Buf buffer); + +static void _pack_job_ready_msg(job_id_msg_t * msg, Buf buffer); +static int _unpack_job_ready_msg(job_id_msg_t ** msg_ptr, Buf buffer); + +static void +_pack_resource_allocation_response_msg(resource_allocation_response_msg_t * + msg, Buf buffer); +static int +_unpack_resource_allocation_response_msg(resource_allocation_response_msg_t + ** msg, Buf buffer); + +static void +_pack_job_alloc_info_response_msg(job_alloc_info_response_msg_t * msg, + Buf buffer); +static int +_unpack_job_alloc_info_response_msg(job_alloc_info_response_msg_t ** msg, + Buf buffer); + +static void _pack_submit_response_msg(submit_response_msg_t * msg, + Buf buffer); +static int _unpack_submit_response_msg(submit_response_msg_t ** msg, + Buf buffer); + +static void _pack_node_info_request_msg( + node_info_request_msg_t * msg, Buf buffer); + +static int _unpack_node_info_request_msg( + node_info_request_msg_t ** msg, Buf bufer); + +static int _unpack_node_info_msg(node_info_msg_t ** msg, Buf buffer); +static int _unpack_node_info_members(node_info_t * node, Buf buffer); +static int _unpack_node_select_info_msg(node_select_info_msg_t ** msg, + Buf buffer); + +static void _pack_update_partition_msg(update_part_msg_t * msg, Buf buffer); +static int _unpack_update_partition_msg(update_part_msg_t ** msg, Buf buffer); + +static void _pack_delete_partition_msg(delete_part_msg_t * msg, Buf buffer); +static int _unpack_delete_partition_msg(delete_part_msg_t ** msg, Buf buffer); + +static void _pack_job_step_create_request_msg(job_step_create_request_msg_t + * msg, Buf buffer); +static int _unpack_job_step_create_request_msg( + job_step_create_request_msg_t ** msg, Buf buffer); + +static void _pack_kill_job_msg(kill_job_msg_t * msg, Buf buffer); +static int _unpack_kill_job_msg(kill_job_msg_t ** msg, Buf buffer); + +static void _pack_signal_job_msg(signal_job_msg_t * msg, Buf buffer); +static int _unpack_signal_job_msg(signal_job_msg_t ** msg, Buf buffer); + +static void _pack_epilog_comp_msg(epilog_complete_msg_t * msg, Buf buffer); +static int _unpack_epilog_comp_msg(epilog_complete_msg_t ** msg, Buf buffer); + +static void _pack_update_job_time_msg(job_time_msg_t * msg, Buf buffer); +static int _unpack_update_job_time_msg(job_time_msg_t ** msg, Buf buffer); + +static void _pack_job_step_create_response_msg( + job_step_create_response_msg_t * msg, Buf buffer); +static int _unpack_job_step_create_response_msg( + job_step_create_response_msg_t ** msg, Buf buffer); + +static void _pack_part_info_request_msg(part_info_request_msg_t * msg, + Buf buffer); + +static int _unpack_part_info_request_msg(part_info_request_msg_t ** + msg, Buf buffer); + +static void _pack_partition_info_msg(slurm_msg_t * msg, Buf buffer); +static int _unpack_partition_info_msg(partition_info_msg_t ** msg, + Buf buffer); +static int _unpack_partition_info_members(partition_info_t * part, + Buf buffer); + +static void _pack_launch_tasks_request_msg(launch_tasks_request_msg_t * + msg, Buf buffer); +static int _unpack_launch_tasks_request_msg(launch_tasks_request_msg_t ** + msg_ptr, Buf buffer); + + +static void _pack_task_user_managed_io_stream_msg(task_user_managed_io_msg_t * + msg, Buf buffer); +static int _unpack_task_user_managed_io_stream_msg(task_user_managed_io_msg_t ** + msg_ptr, Buf buffer); + +static void _pack_cancel_tasks_msg(kill_tasks_msg_t * msg, Buf buffer); +static int _unpack_cancel_tasks_msg(kill_tasks_msg_t ** msg_ptr, Buf buffer); + +static void _pack_launch_tasks_response_msg(launch_tasks_response_msg_t * + msg, Buf buffer); +static int _unpack_launch_tasks_response_msg(launch_tasks_response_msg_t ** + msg_ptr, Buf buffer); + +static void _pack_shutdown_msg(shutdown_msg_t * msg, Buf buffer); +static int _unpack_shutdown_msg(shutdown_msg_t ** msg_ptr, Buf buffer); + +static void _pack_reattach_tasks_request_msg(reattach_tasks_request_msg_t *, + Buf); +static int _unpack_reattach_tasks_request_msg(reattach_tasks_request_msg_t **, + Buf); + +static void +_pack_reattach_tasks_response_msg(reattach_tasks_response_msg_t *, Buf); +static int +_unpack_reattach_tasks_response_msg(reattach_tasks_response_msg_t **, Buf); + +static void _pack_task_exit_msg(task_exit_msg_t * msg, Buf buffer); +static int _unpack_task_exit_msg(task_exit_msg_t ** msg_ptr, Buf buffer); + +static void _pack_job_alloc_info_msg(job_alloc_info_msg_t * job_desc_ptr, + Buf buffer); +static int +_unpack_job_alloc_info_msg(job_alloc_info_msg_t **job_desc_buffer_ptr, + Buf buffer); + +static void _pack_return_code_msg(return_code_msg_t * msg, Buf buffer); +static int _unpack_return_code_msg(return_code_msg_t ** msg, Buf buffer); + +static void _pack_slurm_ctl_conf_msg(slurm_ctl_conf_info_msg_t * build_ptr, + Buf buffer); +static int _unpack_slurm_ctl_conf_msg(slurm_ctl_conf_info_msg_t ** + build_buffer_ptr, Buf buffer); + +static void _pack_job_info_request_msg(job_info_request_msg_t * + msg, Buf buffer); +static int _unpack_job_info_request_msg(job_info_request_msg_t** + msg, Buf buffer); + +static void _pack_node_select_info_req_msg(node_info_select_request_msg_t * + msg, Buf buffer); +static int _unpack_node_select_info_req_msg(node_info_select_request_msg_t ** + msg, Buf buffer); + +static void _pack_job_step_info_req_msg(job_step_info_request_msg_t * msg, + Buf buffer); +static int _unpack_job_step_info_req_msg(job_step_info_request_msg_t ** + msg, Buf buffer); +static int _unpack_job_step_info_response_msg(job_step_info_response_msg_t + ** msg, Buf buffer); +static int _unpack_job_step_info_members(job_step_info_t * step, Buf buffer); + +static void _pack_complete_job_allocation_msg( + complete_job_allocation_msg_t * msg, Buf buffer); +static int _unpack_complete_job_allocation_msg( + complete_job_allocation_msg_t ** msg_ptr, Buf buffer); +static void _pack_complete_batch_script_msg( + complete_batch_script_msg_t * msg, Buf buffer); +static int _unpack_complete_batch_script_msg( + complete_batch_script_msg_t ** msg_ptr, Buf buffer); + +static void _pack_stat_jobacct_msg(stat_jobacct_msg_t * msg, Buf buffer); +static int _unpack_stat_jobacct_msg(stat_jobacct_msg_t ** msg_ptr, Buf buffer); + +static void _pack_job_step_id_msg(job_step_id_msg_t * msg, Buf buffer); +static int _unpack_job_step_id_msg(job_step_id_msg_t ** msg_ptr, Buf buffer); + +static void _pack_step_complete_msg(step_complete_msg_t * msg, + Buf buffer); +static int _unpack_step_complete_msg(step_complete_msg_t ** + msg_ptr, Buf buffer); +static int _unpack_job_info_members(job_info_t * job, Buf buffer); + +static void _pack_batch_job_launch_msg(batch_job_launch_msg_t * msg, + Buf buffer); +static int _unpack_batch_job_launch_msg(batch_job_launch_msg_t ** msg, + Buf buffer); + +static void _pack_job_desc_msg(job_desc_msg_t * job_desc_ptr, Buf buffer); +static int _unpack_job_desc_msg(job_desc_msg_t ** job_desc_buffer_ptr, + Buf buffer); +static int _unpack_job_info_msg(job_info_msg_t ** msg, Buf buffer); + +static void _pack_last_update_msg(last_update_msg_t * msg, Buf buffer); +static int _unpack_last_update_msg(last_update_msg_t ** msg, Buf buffer); + +static void _pack_slurm_addr_array(slurm_addr * slurm_address, + uint16_t size_val, Buf buffer); +static int _unpack_slurm_addr_array(slurm_addr ** slurm_address, + uint16_t * size_val, Buf buffer); + +static void _pack_ret_list(List ret_list, uint16_t size_val, Buf buffer); +static int _unpack_ret_list(List *ret_list, uint16_t size_val, Buf buffer); + +static void _pack_job_id_request_msg(job_id_request_msg_t * msg, Buf buffer); +static int +_unpack_job_id_request_msg(job_id_request_msg_t ** msg, Buf buffer); + +static void _pack_job_id_response_msg(job_id_response_msg_t * msg, Buf buffer); +static int _unpack_job_id_response_msg(job_id_response_msg_t ** msg, + Buf buffer); + +static void _pack_job_step_kill_msg(job_step_kill_msg_t * msg, Buf buffer); +static int _unpack_job_step_kill_msg(job_step_kill_msg_t ** msg_ptr, + Buf buffer); + +static void _pack_srun_ping_msg(srun_ping_msg_t * msg, Buf buffer); +static int _unpack_srun_ping_msg(srun_ping_msg_t ** msg_ptr, Buf buffer); + +static void _pack_srun_node_fail_msg(srun_node_fail_msg_t * msg, Buf buffer); +static int _unpack_srun_node_fail_msg(srun_node_fail_msg_t ** msg_ptr, + Buf buffer); + +static void _pack_srun_timeout_msg(srun_timeout_msg_t * msg, Buf buffer); +static int +_unpack_srun_timeout_msg(srun_timeout_msg_t ** msg_ptr, Buf buffer); + +static void _pack_checkpoint_msg(checkpoint_msg_t *msg, Buf buffer); +static int _unpack_checkpoint_msg(checkpoint_msg_t **msg_ptr, Buf buffer); + +static void _pack_checkpoint_resp_msg(checkpoint_resp_msg_t *msg, Buf buffer); +static int _unpack_checkpoint_resp_msg(checkpoint_resp_msg_t **msg_ptr, + Buf buffer); + +static void _pack_checkpoint_comp(checkpoint_comp_msg_t *msg, Buf buffer); +static int _unpack_checkpoint_comp(checkpoint_comp_msg_t **msg_ptr, + Buf buffer); + +static void _pack_suspend_msg(suspend_msg_t *msg, Buf buffer); +static int _unpack_suspend_msg(suspend_msg_t **msg_ptr, Buf buffer); + +static void _pack_buffer_msg(slurm_msg_t * msg, Buf buffer); + +static void _pack_kvs_rec(struct kvs_comm *msg_ptr, Buf buffer); +static int _unpack_kvs_rec(struct kvs_comm **msg_ptr, Buf buffer); +static void _pack_kvs_data(struct kvs_comm_set *msg_ptr, Buf buffer); +static int _unpack_kvs_data(struct kvs_comm_set **msg_ptr, Buf buffer); +static void _pack_kvs_get(kvs_get_msg_t *msg_ptr, Buf buffer); +static int _unpack_kvs_get(kvs_get_msg_t **msg_ptr, Buf buffer); + +static void _pack_file_bcast(file_bcast_msg_t * msg , Buf buffer ); + +static int _unpack_file_bcast(file_bcast_msg_t ** msg_ptr , Buf buffer ); + +/* pack_header + * packs a slurm protocol header that proceeds every slurm message + * IN header - the header structure to pack + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + */ +void +pack_header(header_t * header, Buf buffer) +{ + + pack16((uint16_t)header->version, buffer); + pack16((uint16_t)header->flags, buffer); + pack16((uint16_t) header->msg_type, buffer); + pack32((uint32_t)header->body_length, buffer); + pack16((uint16_t)header->forward.cnt, buffer); + if (header->forward.cnt > 0) { + packstr(header->forward.nodelist, buffer); + pack32((uint32_t)header->forward.timeout, buffer); + } + pack16((uint16_t)header->ret_cnt, buffer); + if(header->ret_cnt > 0) { + _pack_ret_list(header->ret_list, + header->ret_cnt, buffer); + } + slurm_pack_slurm_addr(&header->orig_addr, buffer); +} + +/* unpack_header + * unpacks a slurm protocol header that proceeds every slurm message + * OUT header - the header structure to unpack + * IN/OUT buffer - source of the unpack data, contains pointers that are + * automatically updated + * RET 0 or error code + */ +int +unpack_header(header_t * header, Buf buffer) +{ + uint16_t uint16_tmp = 0; + + memset(header, 0, sizeof(header_t)); + forward_init(&header->forward, NULL); + header->ret_list = NULL; + safe_unpack16(&header->version, buffer); + safe_unpack16(&header->flags, buffer); + safe_unpack16(&uint16_tmp, buffer); + header->msg_type = (slurm_msg_type_t) uint16_tmp; + safe_unpack32(&header->body_length, buffer); + safe_unpack16(&header->forward.cnt, buffer); + if (header->forward.cnt > 0) { + safe_unpackstr_xmalloc(&header->forward.nodelist, + &uint16_tmp, buffer); + safe_unpack32(&header->forward.timeout, buffer); + } + + safe_unpack16(&header->ret_cnt, buffer); + if(header->ret_cnt > 0) { + if(_unpack_ret_list(&(header->ret_list), + header->ret_cnt, buffer)) + goto unpack_error; + } else { + header->ret_list = NULL; + } + slurm_unpack_slurm_addr_no_alloc(&header->orig_addr, buffer); + + return SLURM_SUCCESS; + +unpack_error: + error("unpacking header"); + destroy_forward(&header->forward); + if(header->ret_list) + list_destroy(header->ret_list); + return SLURM_ERROR; +} + + +/* pack_msg + * packs a generic slurm protocol message body + * IN msg - the body structure to pack (note: includes message type) + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + * RET 0 or error code + */ +int +pack_msg(slurm_msg_t const *msg, Buf buffer) +{ + switch (msg->msg_type) { + case REQUEST_NODE_INFO: + _pack_node_info_request_msg((node_info_request_msg_t *) + msg->data, buffer); + break; + case REQUEST_PARTITION_INFO: + _pack_part_info_request_msg((part_info_request_msg_t *) + msg->data, buffer); + break; + case REQUEST_BUILD_INFO: + case REQUEST_ACCTING_INFO: + _pack_last_update_msg((last_update_msg_t *) + msg->data, buffer); + break; + case RESPONSE_BUILD_INFO: + _pack_slurm_ctl_conf_msg((slurm_ctl_conf_info_msg_t *) + msg->data, buffer); + break; + case RESPONSE_JOB_INFO: + _pack_job_info_msg((slurm_msg_t *) msg, buffer); + break; + case RESPONSE_PARTITION_INFO: + _pack_partition_info_msg((slurm_msg_t *) msg, buffer); + break; + case RESPONSE_NODE_INFO: + _pack_node_info_msg((slurm_msg_t *) msg, buffer); + break; + case MESSAGE_NODE_REGISTRATION_STATUS: + _pack_node_registration_status_msg( + (slurm_node_registration_status_msg_t *) msg->data, + buffer); + break; + case REQUEST_RESOURCE_ALLOCATION: + case REQUEST_SUBMIT_BATCH_JOB: + case REQUEST_JOB_WILL_RUN: + case REQUEST_UPDATE_JOB: + _pack_job_desc_msg((job_desc_msg_t *) + msg->data, buffer); + break; + case REQUEST_JOB_END_TIME: + case REQUEST_JOB_ALLOCATION_INFO: + case REQUEST_JOB_ALLOCATION_INFO_LITE: + _pack_job_alloc_info_msg((job_alloc_info_msg_t *) msg->data, + buffer); + break; + case REQUEST_NODE_REGISTRATION_STATUS: + case REQUEST_RECONFIGURE: + case REQUEST_SHUTDOWN_IMMEDIATE: + case REQUEST_PING: + case REQUEST_CONTROL: + /* Message contains no body/information */ + break; + case REQUEST_SHUTDOWN: + _pack_shutdown_msg((shutdown_msg_t *) msg->data, buffer); + break; + case RESPONSE_SUBMIT_BATCH_JOB: + _pack_submit_response_msg((submit_response_msg_t *) + msg->data, buffer); + break; + case RESPONSE_JOB_ALLOCATION_INFO_LITE: + case RESPONSE_RESOURCE_ALLOCATION: + case RESPONSE_JOB_WILL_RUN: + _pack_resource_allocation_response_msg + ((resource_allocation_response_msg_t *) msg->data, + buffer); + break; + case RESPONSE_JOB_ALLOCATION_INFO: + _pack_job_alloc_info_response_msg( + (job_alloc_info_response_msg_t *) + msg->data, buffer); + break; + case REQUEST_UPDATE_NODE: + _pack_update_node_msg((update_node_msg_t *) msg->data, + buffer); + break; + case REQUEST_UPDATE_PARTITION: + _pack_update_partition_msg((update_part_msg_t *) msg-> + data, buffer); + break; + case REQUEST_DELETE_PARTITION: + _pack_delete_partition_msg((delete_part_msg_t *) msg-> + data, buffer); + break; + case REQUEST_REATTACH_TASKS: + _pack_reattach_tasks_request_msg( + (reattach_tasks_request_msg_t *) msg->data, buffer); + break; + case RESPONSE_REATTACH_TASKS: + _pack_reattach_tasks_response_msg( + (reattach_tasks_response_msg_t *) msg->data, buffer); + break; + case REQUEST_LAUNCH_TASKS: + _pack_launch_tasks_request_msg( + (launch_tasks_request_msg_t *) msg->data, + buffer); + break; + case RESPONSE_LAUNCH_TASKS: + _pack_launch_tasks_response_msg((launch_tasks_response_msg_t + *) msg->data, buffer); + break; + case TASK_USER_MANAGED_IO_STREAM: + _pack_task_user_managed_io_stream_msg( + (task_user_managed_io_msg_t *) msg->data, buffer); + break; + case REQUEST_SIGNAL_TASKS: + case REQUEST_TERMINATE_TASKS: + _pack_cancel_tasks_msg((kill_tasks_msg_t *) msg->data, + buffer); + break; + case REQUEST_JOB_STEP_INFO: + _pack_job_step_info_req_msg((job_step_info_request_msg_t + *) msg->data, buffer); + break; + case REQUEST_JOB_INFO: + _pack_job_info_request_msg((job_info_request_msg_t *) + msg->data, buffer); + break; + case REQUEST_CANCEL_JOB_STEP: + _pack_job_step_kill_msg((job_step_kill_msg_t *) + msg->data, buffer); + break; + case REQUEST_COMPLETE_JOB_ALLOCATION: + _pack_complete_job_allocation_msg( + (complete_job_allocation_msg_t *)msg->data, buffer); + break; + case REQUEST_COMPLETE_BATCH_SCRIPT: + _pack_complete_batch_script_msg( + (complete_batch_script_msg_t *)msg->data, buffer); + break; + case REQUEST_STEP_COMPLETE: + _pack_step_complete_msg((step_complete_msg_t *)msg->data, + buffer); + break; + case MESSAGE_STAT_JOBACCT: + _pack_stat_jobacct_msg((stat_jobacct_msg_t *) msg->data, + buffer); + break; + case REQUEST_STEP_LAYOUT: + _pack_job_step_id_msg((job_step_id_msg_t *)msg->data, buffer); + break; + case RESPONSE_STEP_LAYOUT: + pack_slurm_step_layout((slurm_step_layout_t *)msg->data, + buffer); + break; + case REQUEST_SIGNAL_JOB: + _pack_signal_job_msg((signal_job_msg_t *) msg->data, buffer); + break; + case REQUEST_KILL_TIMELIMIT: + case REQUEST_TERMINATE_JOB: + _pack_kill_job_msg((kill_job_msg_t *) msg->data, buffer); + break; + case MESSAGE_EPILOG_COMPLETE: + _pack_epilog_comp_msg((epilog_complete_msg_t *) msg->data, buffer); + break; + case REQUEST_UPDATE_JOB_TIME: + _pack_update_job_time_msg((job_time_msg_t *) + msg->data, buffer); + break; + case RESPONSE_RECONFIGURE: + case RESPONSE_SHUTDOWN: + case RESPONSE_CANCEL_JOB_STEP: + break; + case REQUEST_JOB_ATTACH: + break; + case RESPONSE_JOB_ATTACH: + break; + case RESPONSE_JOB_STEP_INFO: + _pack_job_step_info_msg((slurm_msg_t *) msg, buffer); + break; + case REQUEST_JOB_RESOURCE: + break; + case RESPONSE_JOB_RESOURCE: + break; + case REQUEST_RUN_JOB_STEP: + break; + case RESPONSE_RUN_JOB_STEP: + break; + case MESSAGE_TASK_EXIT: + _pack_task_exit_msg((task_exit_msg_t *) msg->data, buffer); + break; + case REQUEST_BATCH_JOB_LAUNCH: + _pack_batch_job_launch_msg((batch_job_launch_msg_t *) + msg->data, buffer); + break; + case RESPONSE_JOB_READY: + case RESPONSE_SLURM_RC: + _pack_return_code_msg((return_code_msg_t *) msg->data, + buffer); + break; + case RESPONSE_JOB_STEP_CREATE: + _pack_job_step_create_response_msg( + (job_step_create_response_msg_t *) + msg->data, buffer); + break; + case REQUEST_JOB_STEP_CREATE: + _pack_job_step_create_request_msg( + (job_step_create_request_msg_t *) + msg->data, buffer); + break; + case REQUEST_JOB_ID: + _pack_job_id_request_msg( + (job_id_request_msg_t *)msg->data, + buffer); + break; + case RESPONSE_JOB_ID: + _pack_job_id_response_msg( + (job_id_response_msg_t *)msg->data, + buffer); + break; + case SRUN_JOB_COMPLETE: + case SRUN_PING: + _pack_srun_ping_msg((srun_ping_msg_t *)msg->data, buffer); + break; + case SRUN_NODE_FAIL: + _pack_srun_node_fail_msg((srun_node_fail_msg_t *)msg->data, + buffer); + break; + case SRUN_TIMEOUT: + _pack_srun_timeout_msg((srun_timeout_msg_t *)msg->data, buffer); + break; + case REQUEST_CHECKPOINT: + _pack_checkpoint_msg((checkpoint_msg_t *)msg->data, buffer); + break; + case REQUEST_CHECKPOINT_COMP: + _pack_checkpoint_comp((checkpoint_comp_msg_t *)msg->data, + buffer); + break; + case RESPONSE_CHECKPOINT: + case RESPONSE_CHECKPOINT_COMP: + _pack_checkpoint_resp_msg((checkpoint_resp_msg_t *)msg->data, + buffer); + break; + case REQUEST_SUSPEND: + _pack_suspend_msg((suspend_msg_t *)msg->data, buffer); + break; + + case REQUEST_JOB_READY: + case REQUEST_JOB_REQUEUE: + _pack_job_ready_msg((job_id_msg_t *)msg->data, buffer); + break; + + case REQUEST_NODE_SELECT_INFO: + _pack_node_select_info_req_msg( + (node_info_select_request_msg_t *) msg->data, buffer); + break; + case RESPONSE_NODE_SELECT_INFO: + _pack_node_select_info_msg((slurm_msg_t *) msg, buffer); + break; + case REQUEST_FILE_BCAST: + _pack_file_bcast((file_bcast_msg_t *) msg->data, buffer); + break; + case PMI_KVS_PUT_REQ: + case PMI_KVS_GET_RESP: + _pack_kvs_data((struct kvs_comm_set *) msg->data, buffer); + break; + case PMI_KVS_GET_REQ: + _pack_kvs_get((kvs_get_msg_t *) msg->data, buffer); + break; + case PMI_KVS_PUT_RESP: + break; /* no data in message */ + case RESPONSE_FORWARD_FAILED: + break; + default: + debug("No pack method for msg type %u", msg->msg_type); + return EINVAL; + break; + + } + return SLURM_SUCCESS; +} + +/* unpack_msg + * unpacks a generic slurm protocol message body + * OUT msg - the body structure to unpack (note: includes message type) + * IN/OUT buffer - source of the unpack, contains pointers that are + * automatically updated + * RET 0 or error code + */ +int +unpack_msg(slurm_msg_t * msg, Buf buffer) +{ + int rc = SLURM_SUCCESS; + msg->data = NULL; /* Initialize to no data for now */ + + switch (msg->msg_type) { + case REQUEST_NODE_INFO: + rc = _unpack_node_info_request_msg((node_info_request_msg_t **) + & (msg->data), buffer); + break; + case REQUEST_PARTITION_INFO: + rc = _unpack_part_info_request_msg((part_info_request_msg_t **) + & (msg->data), buffer); + break; + case REQUEST_BUILD_INFO: + case REQUEST_ACCTING_INFO: + rc = _unpack_last_update_msg((last_update_msg_t **) & + (msg->data), buffer); + break; + case RESPONSE_BUILD_INFO: + rc = _unpack_slurm_ctl_conf_msg((slurm_ctl_conf_info_msg_t + **) + & (msg->data), buffer); + break; + case RESPONSE_JOB_INFO: + rc = _unpack_job_info_msg((job_info_msg_t **) & (msg->data), + buffer); + break; + case RESPONSE_PARTITION_INFO: + rc = _unpack_partition_info_msg((partition_info_msg_t **) & + (msg->data), buffer); + break; + case RESPONSE_NODE_INFO: + rc = _unpack_node_info_msg((node_info_msg_t **) & + (msg->data), buffer); + break; + case MESSAGE_NODE_REGISTRATION_STATUS: + rc = _unpack_node_registration_status_msg( + (slurm_node_registration_status_msg_t **) + & (msg->data), buffer); + break; + case REQUEST_RESOURCE_ALLOCATION: + case REQUEST_SUBMIT_BATCH_JOB: + case REQUEST_JOB_WILL_RUN: + case REQUEST_UPDATE_JOB: + rc = _unpack_job_desc_msg((job_desc_msg_t **) & (msg->data), + buffer); + break; + case REQUEST_JOB_END_TIME: + case REQUEST_JOB_ALLOCATION_INFO: + case REQUEST_JOB_ALLOCATION_INFO_LITE: + rc = _unpack_job_alloc_info_msg((job_alloc_info_msg_t **) & + (msg->data), buffer); + break; + case REQUEST_NODE_REGISTRATION_STATUS: + case REQUEST_RECONFIGURE: + case REQUEST_SHUTDOWN_IMMEDIATE: + case REQUEST_PING: + case REQUEST_CONTROL: + /* Message contains no body/information */ + break; + case REQUEST_SHUTDOWN: + rc = _unpack_shutdown_msg((shutdown_msg_t **) & (msg->data), + buffer); + break; + case RESPONSE_SUBMIT_BATCH_JOB: + rc = _unpack_submit_response_msg((submit_response_msg_t **) + & (msg->data), buffer); + break; + case RESPONSE_JOB_ALLOCATION_INFO_LITE: + case RESPONSE_RESOURCE_ALLOCATION: + case RESPONSE_JOB_WILL_RUN: + rc = _unpack_resource_allocation_response_msg( + (resource_allocation_response_msg_t **) + & (msg->data), buffer); + break; + case RESPONSE_JOB_ALLOCATION_INFO: + rc = _unpack_job_alloc_info_response_msg( + (job_alloc_info_response_msg_t **) + & (msg->data), buffer); + break; + case REQUEST_UPDATE_NODE: + rc = _unpack_update_node_msg((update_node_msg_t **) & + (msg->data), buffer); + break; + case REQUEST_UPDATE_PARTITION: + rc = _unpack_update_partition_msg((update_part_msg_t **) & + (msg->data), buffer); + break; + case REQUEST_DELETE_PARTITION: + rc = _unpack_delete_partition_msg((delete_part_msg_t **) & + (msg->data), buffer); + break; + case REQUEST_LAUNCH_TASKS: + rc = _unpack_launch_tasks_request_msg( + (launch_tasks_request_msg_t **) + & (msg->data), buffer); + break; + case RESPONSE_LAUNCH_TASKS: + rc = _unpack_launch_tasks_response_msg( + (launch_tasks_response_msg_t **) + & (msg->data), buffer); + break; + case TASK_USER_MANAGED_IO_STREAM: + _unpack_task_user_managed_io_stream_msg( + (task_user_managed_io_msg_t **) &msg->data, buffer); + break; + case REQUEST_REATTACH_TASKS: + rc = _unpack_reattach_tasks_request_msg( + (reattach_tasks_request_msg_t **) & msg->data, + buffer); + break; + case RESPONSE_REATTACH_TASKS: + rc = _unpack_reattach_tasks_response_msg( + (reattach_tasks_response_msg_t **) + & msg->data, buffer); + break; + case REQUEST_SIGNAL_TASKS: + case REQUEST_TERMINATE_TASKS: + rc = _unpack_cancel_tasks_msg((kill_tasks_msg_t **) & + (msg->data), buffer); + break; + case REQUEST_JOB_STEP_INFO: + rc = _unpack_job_step_info_req_msg( + (job_step_info_request_msg_t **) + & (msg->data), buffer); + break; + /******** job_step_id_t Messages ********/ + case REQUEST_JOB_INFO: + rc = _unpack_job_info_request_msg((job_info_request_msg_t**) + & (msg->data), buffer); + break; + case REQUEST_CANCEL_JOB_STEP: + rc = _unpack_job_step_kill_msg((job_step_kill_msg_t **) + & (msg->data), buffer); + break; + case REQUEST_COMPLETE_JOB_ALLOCATION: + rc = _unpack_complete_job_allocation_msg( + (complete_job_allocation_msg_t **)&msg->data, buffer); + break; + case REQUEST_COMPLETE_BATCH_SCRIPT: + rc = _unpack_complete_batch_script_msg( + (complete_batch_script_msg_t **)&msg->data, buffer); + break; + case REQUEST_STEP_COMPLETE: + rc = _unpack_step_complete_msg((step_complete_msg_t + **) & (msg->data), + buffer); + break; + case MESSAGE_STAT_JOBACCT: + rc = _unpack_stat_jobacct_msg( + (stat_jobacct_msg_t **) &(msg->data), buffer); + break; + case REQUEST_STEP_LAYOUT: + _unpack_job_step_id_msg((job_step_id_msg_t **)&msg->data, + buffer); + break; + case RESPONSE_STEP_LAYOUT: + unpack_slurm_step_layout((slurm_step_layout_t **)&msg->data, + buffer); + break; + case REQUEST_SIGNAL_JOB: + rc = _unpack_signal_job_msg((signal_job_msg_t **)&(msg->data), + buffer); + break; + case REQUEST_KILL_TIMELIMIT: + case REQUEST_TERMINATE_JOB: + rc = _unpack_kill_job_msg((kill_job_msg_t **) & (msg->data), + buffer); + break; + case MESSAGE_EPILOG_COMPLETE: + rc = _unpack_epilog_comp_msg((epilog_complete_msg_t **) + & (msg->data), buffer); + break; + case REQUEST_UPDATE_JOB_TIME: + rc = _unpack_update_job_time_msg( + (job_time_msg_t **) + & (msg->data), buffer); + break; + case RESPONSE_RECONFIGURE: + case RESPONSE_SHUTDOWN: + case RESPONSE_CANCEL_JOB_STEP: + break; + case REQUEST_JOB_ATTACH: + break; + case RESPONSE_JOB_ATTACH: + break; + case RESPONSE_JOB_STEP_INFO: + rc = _unpack_job_step_info_response_msg( + (job_step_info_response_msg_t **) + & (msg->data), buffer); + break; + case REQUEST_JOB_RESOURCE: + break; + case RESPONSE_JOB_RESOURCE: + break; + case REQUEST_RUN_JOB_STEP: + break; + case RESPONSE_RUN_JOB_STEP: + break; + case MESSAGE_TASK_EXIT: + rc = _unpack_task_exit_msg((task_exit_msg_t **) + & (msg->data), buffer); + break; + case REQUEST_BATCH_JOB_LAUNCH: + rc = _unpack_batch_job_launch_msg((batch_job_launch_msg_t **) + & (msg->data), buffer); + break; + case RESPONSE_JOB_READY: + case RESPONSE_SLURM_RC: + rc = _unpack_return_code_msg((return_code_msg_t **) + & (msg->data), buffer); + break; + case RESPONSE_JOB_STEP_CREATE: + rc = _unpack_job_step_create_response_msg( + (job_step_create_response_msg_t **) + & msg->data, buffer); + break; + case REQUEST_JOB_STEP_CREATE: + rc = _unpack_job_step_create_request_msg( + (job_step_create_request_msg_t **) + & msg->data, buffer); + break; + case REQUEST_JOB_ID: + rc = _unpack_job_id_request_msg( + (job_id_request_msg_t **) & msg->data, + buffer); + break; + case RESPONSE_JOB_ID: + rc = _unpack_job_id_response_msg( + (job_id_response_msg_t **) & msg->data, + buffer); + break; + case SRUN_JOB_COMPLETE: + case SRUN_PING: + rc = _unpack_srun_ping_msg((srun_ping_msg_t **) & msg->data, + buffer); + break; + case SRUN_NODE_FAIL: + rc = _unpack_srun_node_fail_msg((srun_node_fail_msg_t **) + & msg->data, buffer); + break; + case SRUN_TIMEOUT: + rc = _unpack_srun_timeout_msg((srun_timeout_msg_t **) + & msg->data, buffer); + break; + case REQUEST_CHECKPOINT: + rc = _unpack_checkpoint_msg((checkpoint_msg_t **) + & msg->data, buffer); + break; + case REQUEST_CHECKPOINT_COMP: + rc = _unpack_checkpoint_comp((checkpoint_comp_msg_t **) + & msg->data, buffer); + break; + case RESPONSE_CHECKPOINT: + case RESPONSE_CHECKPOINT_COMP: + rc = _unpack_checkpoint_resp_msg((checkpoint_resp_msg_t **) + & msg->data, buffer); + break; + case REQUEST_SUSPEND: + rc = _unpack_suspend_msg((suspend_msg_t **) &msg->data, + buffer); + break; + + case REQUEST_JOB_READY: + case REQUEST_JOB_REQUEUE: + rc = _unpack_job_ready_msg((job_id_msg_t **) + & msg->data, buffer); + break; + case REQUEST_NODE_SELECT_INFO: + rc = _unpack_node_select_info_req_msg( + (node_info_select_request_msg_t **) &msg->data, + buffer); + break; + case RESPONSE_NODE_SELECT_INFO: + rc = _unpack_node_select_info_msg((node_select_info_msg_t **) & + (msg->data), buffer); + break; + case REQUEST_FILE_BCAST: + rc = _unpack_file_bcast( (file_bcast_msg_t **) + & msg->data, buffer); + break; + case PMI_KVS_PUT_REQ: + case PMI_KVS_GET_RESP: + rc = _unpack_kvs_data((struct kvs_comm_set **) &msg->data, + buffer); + break; + case PMI_KVS_GET_REQ: + rc = _unpack_kvs_get((kvs_get_msg_t **) &msg->data, buffer); + break; + case PMI_KVS_PUT_RESP: + break; /* no data */ + case RESPONSE_FORWARD_FAILED: + break; + default: + debug("No unpack method for msg type %u", msg->msg_type); + return EINVAL; + break; + } + + if (rc) + error("Malformed RPC of type %u received", msg->msg_type); + return rc; +} + +static void +_pack_update_node_msg(update_node_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + packstr(msg->node_names, buffer); + pack16((uint16_t)msg->node_state, buffer); + packstr(msg->reason, buffer); +} + +static int +_unpack_update_node_msg(update_node_msg_t ** msg, Buf buffer) +{ + uint16_t uint16_tmp; + update_node_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg != NULL); + tmp_ptr = xmalloc(sizeof(update_node_msg_t)); + *msg = tmp_ptr; + + safe_unpackstr_xmalloc(&tmp_ptr->node_names, &uint16_tmp, buffer); + safe_unpack16(&tmp_ptr->node_state, buffer); + safe_unpackstr_xmalloc(&tmp_ptr->reason, &uint16_tmp, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr->node_names); + xfree(tmp_ptr->reason); + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_node_registration_status_msg(slurm_node_registration_status_msg_t * + msg, Buf buffer) +{ + int i; + xassert(msg != NULL); + + pack_time(msg->timestamp, buffer); + pack32((uint32_t)msg->status, buffer); + packstr(msg->node_name, buffer); + pack16((uint32_t)msg->cpus, buffer); + pack16((uint32_t)msg->sockets, buffer); + pack16((uint32_t)msg->cores, buffer); + pack16((uint32_t)msg->threads, buffer); + pack32((uint32_t)msg->real_memory_size, buffer); + pack32((uint32_t)msg->temporary_disk_space, buffer); + pack32((uint32_t)msg->job_count, buffer); + for (i = 0; i < msg->job_count; i++) { + pack32((uint32_t)msg->job_id[i], buffer); + } + for (i = 0; i < msg->job_count; i++) { + pack16((uint16_t)msg->step_id[i], buffer); + } + pack16((uint16_t)msg->startup, buffer); + if (msg->startup) + switch_g_pack_node_info(msg->switch_nodeinfo, buffer); +} + +static int +_unpack_node_registration_status_msg(slurm_node_registration_status_msg_t + ** msg, Buf buffer) +{ + uint16_t uint16_tmp; + int i; + slurm_node_registration_status_msg_t *node_reg_ptr; + + /* alloc memory for structure */ + xassert(msg != NULL); + node_reg_ptr = xmalloc(sizeof(slurm_node_registration_status_msg_t)); + *msg = node_reg_ptr; + + /* unpack timestamp of snapshot */ + safe_unpack_time(&node_reg_ptr->timestamp, buffer); + /* load the data values */ + safe_unpack32(&node_reg_ptr->status, buffer); + safe_unpackstr_xmalloc(&node_reg_ptr->node_name, &uint16_tmp, buffer); + safe_unpack16(&node_reg_ptr->cpus, buffer); + safe_unpack16(&node_reg_ptr->sockets, buffer); + safe_unpack16(&node_reg_ptr->cores, buffer); + safe_unpack16(&node_reg_ptr->threads, buffer); + safe_unpack32(&node_reg_ptr->real_memory_size, buffer); + safe_unpack32(&node_reg_ptr->temporary_disk_space, buffer); + safe_unpack32(&node_reg_ptr->job_count, buffer); + node_reg_ptr->job_id = + xmalloc(sizeof(uint32_t) * node_reg_ptr->job_count); + for (i = 0; i < node_reg_ptr->job_count; i++) { + safe_unpack32(&node_reg_ptr->job_id[i], buffer); + } + node_reg_ptr->step_id = + xmalloc(sizeof(uint16_t) * node_reg_ptr->job_count); + for (i = 0; i < node_reg_ptr->job_count; i++) { + safe_unpack16(&node_reg_ptr->step_id[i], buffer); + } + + safe_unpack16(&node_reg_ptr->startup, buffer); + if (node_reg_ptr->startup + && (switch_g_alloc_node_info(&node_reg_ptr->switch_nodeinfo) + || switch_g_unpack_node_info(node_reg_ptr->switch_nodeinfo, buffer))) + goto unpack_error; + + return SLURM_SUCCESS; + +unpack_error: + xfree(node_reg_ptr->node_name); + xfree(node_reg_ptr->job_id); + xfree(node_reg_ptr->step_id); + switch_g_free_node_info(&node_reg_ptr->switch_nodeinfo); + xfree(node_reg_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_resource_allocation_response_msg(resource_allocation_response_msg_t * + msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->error_code, buffer); + pack32((uint32_t)msg->job_id, buffer); + packstr(msg->node_list, buffer); + + pack16((uint16_t)msg->num_cpu_groups, buffer); + if (msg->num_cpu_groups) { + pack32_array(msg->cpus_per_node, msg->num_cpu_groups, buffer); + pack32_array(msg->cpu_count_reps, msg->num_cpu_groups, buffer); + } + + pack16((uint16_t)msg->node_cnt, buffer); + + select_g_pack_jobinfo(msg->select_jobinfo, buffer); +} + +static int +_unpack_resource_allocation_response_msg(resource_allocation_response_msg_t + ** msg, Buf buffer) +{ + uint16_t uint16_tmp; + uint32_t uint32_tmp; + resource_allocation_response_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg != NULL); + tmp_ptr = xmalloc(sizeof(resource_allocation_response_msg_t)); + *msg = tmp_ptr; + + /* load the data values */ + safe_unpack32(&tmp_ptr->error_code, buffer); + safe_unpack32(&tmp_ptr->job_id, buffer); + safe_unpackstr_xmalloc(&tmp_ptr->node_list, &uint16_tmp, buffer); + + safe_unpack16(&tmp_ptr->num_cpu_groups, buffer); + if (tmp_ptr->num_cpu_groups > 0) { + safe_unpack32_array((uint32_t **) & + (tmp_ptr->cpus_per_node), &uint32_tmp, + buffer); + if (tmp_ptr->num_cpu_groups != uint32_tmp) + goto unpack_error; + safe_unpack32_array((uint32_t **) & + (tmp_ptr->cpu_count_reps), &uint32_tmp, + buffer); + if (tmp_ptr->num_cpu_groups != uint32_tmp) + goto unpack_error; + } else { + tmp_ptr->cpus_per_node = NULL; + tmp_ptr->cpu_count_reps = NULL; + } + + safe_unpack16(&tmp_ptr->node_cnt, buffer); + + if (select_g_alloc_jobinfo (&tmp_ptr->select_jobinfo) + || select_g_unpack_jobinfo(tmp_ptr->select_jobinfo, buffer)) + goto unpack_error; + + return SLURM_SUCCESS; + +unpack_error: + select_g_free_jobinfo(&tmp_ptr->select_jobinfo); + xfree(tmp_ptr->node_list); + xfree(tmp_ptr->cpus_per_node); + xfree(tmp_ptr->cpu_count_reps); + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_job_alloc_info_response_msg(job_alloc_info_response_msg_t * msg, + Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->error_code, buffer); + pack32((uint32_t)msg->job_id, buffer); + packstr(msg->node_list, buffer); + + pack16((uint16_t)msg->num_cpu_groups, buffer); + if (msg->num_cpu_groups) { + pack32_array(msg->cpus_per_node, msg->num_cpu_groups, buffer); + pack32_array(msg->cpu_count_reps, msg->num_cpu_groups, buffer); + } + + pack16((uint16_t)msg->node_cnt, buffer); + if (msg->node_cnt > 0) + _pack_slurm_addr_array(msg->node_addr, msg->node_cnt, buffer); + + select_g_pack_jobinfo(msg->select_jobinfo, buffer); +} + +static int +_unpack_job_alloc_info_response_msg(job_alloc_info_response_msg_t ** msg, + Buf buffer) +{ + uint16_t uint16_tmp; + uint32_t uint32_tmp; + job_alloc_info_response_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg != NULL); + tmp_ptr = xmalloc(sizeof(job_alloc_info_response_msg_t)); + *msg = tmp_ptr; + + /* load the data values */ + safe_unpack32(&tmp_ptr->error_code, buffer); + safe_unpack32(&tmp_ptr->job_id, buffer); + safe_unpackstr_xmalloc(&tmp_ptr->node_list, &uint16_tmp, buffer); + + safe_unpack16(&tmp_ptr->num_cpu_groups, buffer); + if (tmp_ptr->num_cpu_groups > 0) { + safe_unpack32_array((uint32_t **) & + (tmp_ptr->cpus_per_node), &uint32_tmp, + buffer); + if (tmp_ptr->num_cpu_groups != uint32_tmp) + goto unpack_error; + safe_unpack32_array((uint32_t **) & + (tmp_ptr->cpu_count_reps), &uint32_tmp, + buffer); + if (tmp_ptr->num_cpu_groups != uint32_tmp) + goto unpack_error; + } else { + tmp_ptr->cpus_per_node = NULL; + tmp_ptr->cpu_count_reps = NULL; + } + + safe_unpack16(&tmp_ptr->node_cnt, buffer); + if (tmp_ptr->node_cnt > 0) { + if (_unpack_slurm_addr_array(&(tmp_ptr->node_addr), + &uint16_tmp, buffer)) + goto unpack_error; + if (uint16_tmp != tmp_ptr->node_cnt) + goto unpack_error; + } else + tmp_ptr->node_addr = NULL; + + if (select_g_alloc_jobinfo (&tmp_ptr->select_jobinfo) + || select_g_unpack_jobinfo(tmp_ptr->select_jobinfo, buffer)) + goto unpack_error; + + return SLURM_SUCCESS; + +unpack_error: + select_g_free_jobinfo(&tmp_ptr->select_jobinfo); + xfree(tmp_ptr->node_list); + xfree(tmp_ptr->cpus_per_node); + xfree(tmp_ptr->cpu_count_reps); + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_submit_response_msg(submit_response_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->step_id, buffer); + pack32((uint32_t)msg->error_code, buffer); +} + +static int +_unpack_submit_response_msg(submit_response_msg_t ** msg, Buf buffer) +{ + submit_response_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg != NULL); + tmp_ptr = xmalloc(sizeof(submit_response_msg_t)); + *msg = tmp_ptr; + + /* load the data values */ + safe_unpack32(&tmp_ptr->job_id, buffer); + safe_unpack32(&tmp_ptr->step_id, buffer); + safe_unpack32(&tmp_ptr->error_code, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static int +_unpack_node_info_msg(node_info_msg_t ** msg, Buf buffer) +{ + int i; + node_info_t *node = NULL; + + xassert(msg != NULL); + *msg = xmalloc(sizeof(node_info_msg_t)); + + /* load buffer's header (data structure version and time) */ + safe_unpack32(&((*msg)->record_count), buffer); + safe_unpack_time(&((*msg)->last_update), buffer); + + node = (*msg)->node_array = + xmalloc(sizeof(node_info_t) * (*msg)->record_count); + + /* load individual job info */ + for (i = 0; i < (*msg)->record_count; i++) { + if (_unpack_node_info_members(&node[i], buffer)) + goto unpack_error; + + } + return SLURM_SUCCESS; + +unpack_error: + xfree(node); + xfree(*msg); + *msg = NULL; + return SLURM_ERROR; +} + +static int +_unpack_node_info_members(node_info_t * node, Buf buffer) +{ + uint16_t uint16_tmp; + + xassert(node != NULL); + + safe_unpackstr_xmalloc(&node->name, &uint16_tmp, buffer); + safe_unpack16(&node->node_state, buffer); + safe_unpack16(&node->cpus, buffer); + safe_unpack16(&node->sockets, buffer); + safe_unpack16(&node->cores, buffer); + safe_unpack16(&node->threads, buffer); + safe_unpack32(&node->real_memory, buffer); + safe_unpack32(&node->tmp_disk, buffer); + safe_unpack32(&node->weight, buffer); + safe_unpackstr_xmalloc(&node->features, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&node->reason, &uint16_tmp, buffer); + + return SLURM_SUCCESS; + +unpack_error: + xfree(node->name); + xfree(node->features); + xfree(node->reason); + return SLURM_ERROR; +} + +static int _unpack_node_select_info_msg(node_select_info_msg_t ** msg, + Buf buffer) +{ + xassert(msg != NULL); + + return select_g_unpack_node_info(msg, buffer); +} + +static void +_pack_update_partition_msg(update_part_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + packstr(msg->allow_groups, buffer); + pack16((uint16_t)msg-> default_part, buffer); + pack32((uint32_t)msg-> max_time, buffer); + pack32((uint32_t)msg-> max_nodes, buffer); + pack32((uint32_t)msg-> min_nodes, buffer); + packstr(msg->name, buffer); + packstr(msg->nodes, buffer); + + pack16((uint16_t)msg-> hidden, buffer); + pack16((uint16_t)msg-> root_only, buffer); + pack16((uint16_t)msg-> shared, buffer); + pack16((uint16_t)msg-> state_up, buffer); +} + +static int +_unpack_update_partition_msg(update_part_msg_t ** msg, Buf buffer) +{ + uint16_t uint16_tmp; + update_part_msg_t *tmp_ptr; + + xassert(msg != NULL); + + /* alloc memory for structure */ + tmp_ptr = xmalloc(sizeof(update_part_msg_t)); + *msg = tmp_ptr; + + safe_unpackstr_xmalloc(&tmp_ptr->allow_groups, &uint16_tmp, buffer); + safe_unpack16(&tmp_ptr->default_part, buffer); + safe_unpack32(&tmp_ptr->max_time, buffer); + safe_unpack32(&tmp_ptr->max_nodes, buffer); + safe_unpack32(&tmp_ptr->min_nodes, buffer); + safe_unpackstr_xmalloc(&tmp_ptr->name, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&tmp_ptr->nodes, &uint16_tmp, buffer); + + safe_unpack16(&tmp_ptr->hidden, buffer); + safe_unpack16(&tmp_ptr->root_only, buffer); + safe_unpack16(&tmp_ptr->shared, buffer); + safe_unpack16(&tmp_ptr->state_up, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr->name); + xfree(tmp_ptr->nodes); + xfree(tmp_ptr->allow_groups); + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_delete_partition_msg(delete_part_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + packstr(msg->name, buffer); +} + +static int +_unpack_delete_partition_msg(delete_part_msg_t ** msg, Buf buffer) +{ + uint16_t uint16_tmp; + delete_part_msg_t *tmp_ptr; + + xassert(msg != NULL); + + /* alloc memory for structure */ + tmp_ptr = xmalloc(sizeof(delete_part_msg_t)); + *msg = tmp_ptr; + + safe_unpackstr_xmalloc(&tmp_ptr->name, &uint16_tmp, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr->name); + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_job_step_create_request_msg(job_step_create_request_msg_t + * msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->user_id, buffer); + pack32((uint32_t)msg->node_count, buffer); + pack32((uint32_t)msg->cpu_count, buffer); + pack32((uint32_t)msg->num_tasks, buffer); + + pack16((uint16_t)msg->relative, buffer); + pack16((uint16_t)msg->task_dist, buffer); + pack32((uint32_t)msg->plane_size, buffer); + pack16((uint16_t)msg->port, buffer); + packstr(msg->host, buffer); + packstr(msg->name, buffer); + packstr(msg->network, buffer); + packstr(msg->node_list, buffer); + pack8((uint8_t)msg->overcommit, buffer); +} + +static int +_unpack_job_step_create_request_msg(job_step_create_request_msg_t ** msg, + Buf buffer) +{ + uint16_t uint16_tmp; + job_step_create_request_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg != NULL); + tmp_ptr = xmalloc(sizeof(job_step_create_request_msg_t)); + *msg = tmp_ptr; + + safe_unpack32(&(tmp_ptr->job_id), buffer); + safe_unpack32(&(tmp_ptr->user_id), buffer); + safe_unpack32(&(tmp_ptr->node_count), buffer); + safe_unpack32(&(tmp_ptr->cpu_count), buffer); + safe_unpack32(&(tmp_ptr->num_tasks), buffer); + + safe_unpack16(&(tmp_ptr->relative), buffer); + safe_unpack16(&(tmp_ptr->task_dist), buffer); + safe_unpack32(&(tmp_ptr->plane_size), buffer); + safe_unpack16(&(tmp_ptr->port), buffer); + safe_unpackstr_xmalloc(&(tmp_ptr->host), &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&(tmp_ptr->name), &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&(tmp_ptr->network), &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&(tmp_ptr->node_list), &uint16_tmp, buffer); + safe_unpack8(&(tmp_ptr->overcommit), buffer); + + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr->host); + xfree(tmp_ptr->name); + xfree(tmp_ptr->network); + xfree(tmp_ptr->node_list); + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_kill_job_msg(kill_job_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->job_uid, buffer); + pack_time(msg->time, buffer); + packstr(msg->nodes, buffer); + select_g_pack_jobinfo(msg->select_jobinfo, buffer); +} + +static int +_unpack_kill_job_msg(kill_job_msg_t ** msg, Buf buffer) +{ + uint16_t uint16_tmp; + kill_job_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg); + tmp_ptr = xmalloc(sizeof(kill_job_msg_t)); + *msg = tmp_ptr; + + safe_unpack32(&(tmp_ptr->job_id), buffer); + safe_unpack32(&(tmp_ptr->job_uid), buffer); + safe_unpack_time(&(tmp_ptr->time), buffer); + safe_unpackstr_xmalloc(&(tmp_ptr->nodes), &uint16_tmp, buffer); + if (select_g_alloc_jobinfo (&tmp_ptr->select_jobinfo) + || select_g_unpack_jobinfo(tmp_ptr->select_jobinfo, buffer)) + goto unpack_error; + + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr->nodes); + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_signal_job_msg(signal_job_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->signal, buffer); + debug("_pack_signal_job_msg signal = %d", msg->signal); +} + +static int +_unpack_signal_job_msg(signal_job_msg_t ** msg, Buf buffer) +{ + signal_job_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg); + tmp_ptr = xmalloc(sizeof(signal_job_msg_t)); + *msg = tmp_ptr; + + safe_unpack32(&(tmp_ptr->job_id), buffer); + safe_unpack32(&(tmp_ptr->signal), buffer); + debug("_unpack_signal_job_msg signal = %d", tmp_ptr->signal); + + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_epilog_comp_msg(epilog_complete_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->return_code, buffer); + packstr(msg->node_name, buffer); + switch_g_pack_node_info(msg->switch_nodeinfo, buffer); +} + +static int +_unpack_epilog_comp_msg(epilog_complete_msg_t ** msg, Buf buffer) +{ + epilog_complete_msg_t *tmp_ptr; + uint16_t uint16_tmp; + + /* alloc memory for structure */ + xassert(msg); + tmp_ptr = xmalloc(sizeof(epilog_complete_msg_t)); + *msg = tmp_ptr; + + safe_unpack32(&(tmp_ptr->job_id), buffer); + safe_unpack32(&(tmp_ptr->return_code), buffer); + safe_unpackstr_xmalloc(& (tmp_ptr->node_name), &uint16_tmp, buffer); + if (switch_g_alloc_node_info(&tmp_ptr->switch_nodeinfo) + || switch_g_unpack_node_info(tmp_ptr->switch_nodeinfo, buffer)) + goto unpack_error; + + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr->node_name); + switch_g_free_node_info(&tmp_ptr->switch_nodeinfo); + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_update_job_time_msg(job_time_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_id, buffer); + pack_time(msg->expiration_time, buffer); +} + +static int +_unpack_update_job_time_msg(job_time_msg_t ** msg, Buf buffer) +{ + job_time_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg); + tmp_ptr = xmalloc(sizeof(job_time_msg_t)); + *msg = tmp_ptr; + + safe_unpack32(&(tmp_ptr->job_id), buffer); + safe_unpack_time(& (tmp_ptr->expiration_time), buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_job_step_create_response_msg(job_step_create_response_msg_t * msg, + Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_step_id, buffer); + pack_slurm_step_layout(msg->step_layout, buffer); + slurm_cred_pack(msg->cred, buffer); + switch_pack_jobinfo(msg->switch_job, buffer); + +} + +static int +_unpack_job_step_create_response_msg(job_step_create_response_msg_t ** msg, + Buf buffer) +{ + job_step_create_response_msg_t *tmp_ptr = NULL; + + /* alloc memory for structure */ + xassert(msg != NULL); + tmp_ptr = xmalloc(sizeof(job_step_create_response_msg_t)); + *msg = tmp_ptr; + + safe_unpack32(&tmp_ptr->job_step_id, buffer); + if (unpack_slurm_step_layout(&tmp_ptr->step_layout, buffer)) + goto unpack_error; + + if (!(tmp_ptr->cred = slurm_cred_unpack(buffer))) + goto unpack_error; + + switch_alloc_jobinfo(&tmp_ptr->switch_job); + if (switch_unpack_jobinfo(tmp_ptr->switch_job, buffer)) { + error("switch_unpack_jobinfo: %m"); + switch_free_jobinfo(tmp_ptr->switch_job); + goto unpack_error; + } + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + + +static void +_pack_partition_info_msg(slurm_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + packmem_array(msg->data, msg->data_size, buffer); +} + +static int +_unpack_partition_info_msg(partition_info_msg_t ** msg, Buf buffer) +{ + int i; + partition_info_t *partition = NULL; + + xassert(msg != NULL); + *msg = xmalloc(sizeof(partition_info_msg_t)); + + /* load buffer's header (data structure version and time) */ + safe_unpack32(&((*msg)->record_count), buffer); + safe_unpack_time(&((*msg)->last_update), buffer); + + partition = (*msg)->partition_array = + xmalloc(sizeof(partition_info_t) * (*msg)->record_count); + + /* load individual job info */ + for (i = 0; i < (*msg)->record_count; i++) { + if (_unpack_partition_info_members(&partition[i], buffer)) + goto unpack_error; + } + return SLURM_SUCCESS; + +unpack_error: + xfree(partition); + xfree(*msg); + *msg = NULL; + return SLURM_ERROR; +} + + +static int +_unpack_partition_info_members(partition_info_t * part, Buf buffer) +{ + uint16_t uint16_tmp; + char *node_inx_str = NULL; + + safe_unpackstr_xmalloc(&part->name, &uint16_tmp, buffer); + if (part->name == NULL) + part->name = xmalloc(1); /* part->name = "" implicit */ + safe_unpack32(&part->max_time, buffer); + safe_unpack32(&part->max_nodes, buffer); + safe_unpack32(&part->min_nodes, buffer); + safe_unpack32(&part->total_nodes, buffer); + safe_unpack32(&part->node_scaling, buffer); + + safe_unpack32(&part->total_cpus, buffer); + safe_unpack16(&part->default_part, buffer); + safe_unpack16(&part->hidden, buffer); + safe_unpack16(&part->root_only, buffer); + safe_unpack16(&part->shared, buffer); + + safe_unpack16(&part->state_up, buffer); + safe_unpackstr_xmalloc(&part->allow_groups, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&part->nodes, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&node_inx_str, &uint16_tmp, buffer); + if (node_inx_str == NULL) + part->node_inx = bitfmt2int(""); + else { + part->node_inx = bitfmt2int(node_inx_str); + xfree(node_inx_str); + node_inx_str = NULL; + } + return SLURM_SUCCESS; + +unpack_error: + xfree(part->name); + xfree(part->allow_groups); + xfree(part->nodes); + xfree(node_inx_str); + return SLURM_ERROR; +} + +/* pack_job_step_info_members + * pack selected fields of the description of a job into a buffer + * IN job_id, step_id, user_id, start_time, partition, nodes - job info + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + */ +/* void */ +/* pack_job_step_info_members(uint32_t job_id, uint16_t step_id, */ +/* uint32_t user_id, uint32_t num_tasks, */ +/* time_t start_time, char *partition, */ +/* char *nodes, char *name, char *network, */ +/* Buf buffer) */ +/* { */ +/* pack32((uint32_t)job_id, buffer); */ +/* pack16((uint16_t)step_id, buffer); */ +/* pack32((uint32_t)user_id, buffer); */ +/* pack32((uint32_t)num_tasks, buffer); */ + +/* pack_time(start_time, buffer); */ +/* packstr(partition, buffer); */ +/* packstr(nodes, buffer); */ +/* packstr(name, buffer); */ +/* packstr(network, buffer); */ +/* } */ + +/* pack_job_step_info + * packs a slurm job steps info + * IN step - pointer to the job step info + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + */ +/* void */ +/* pack_job_step_info(job_step_info_t * step, Buf buffer) */ +/* { */ +/* pack_job_step_info_members(step->job_id, */ +/* step->step_id, */ +/* step->user_id, */ +/* step->num_tasks, */ +/* step->start_time, */ +/* step->partition, step->nodes, */ +/* step->name, step->network, buffer); */ +/* } */ + +/* _unpack_job_step_info_members + * unpacks a set of slurm job step info for one job step + * OUT step - pointer to the job step info buffer + * IN/OUT buffer - source of the unpack, contains pointers that are + * automatically updated + */ +static int +_unpack_job_step_info_members(job_step_info_t * step, Buf buffer) +{ + uint16_t uint16_tmp = 0; + char *node_inx_str; + + safe_unpack32(&step->job_id, buffer); + safe_unpack16(&step->step_id, buffer); + safe_unpack32(&step->user_id, buffer); + safe_unpack32(&step->num_tasks, buffer); + + safe_unpack_time(&step->start_time, buffer); + safe_unpack_time(&step->run_time, buffer); + safe_unpackstr_xmalloc(&step->partition, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&step->nodes, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&step->name, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&step->network, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&node_inx_str, &uint16_tmp, buffer); + if (node_inx_str == NULL) + step->node_inx = bitfmt2int(""); + else { + step->node_inx = bitfmt2int(node_inx_str); + xfree(node_inx_str); + } + + return SLURM_SUCCESS; + +unpack_error: + xfree(step->partition); + xfree(step->nodes); + xfree(step->name); + xfree(step->network); + xfree(step->node_inx); + return SLURM_ERROR; +} + +static int +_unpack_job_step_info_response_msg(job_step_info_response_msg_t + ** msg, Buf buffer) +{ + int i = 0; + job_step_info_t *step; + + xassert(msg != NULL); + *msg = xmalloc(sizeof(job_step_info_response_msg_t)); + + safe_unpack_time(&(*msg)->last_update, buffer); + safe_unpack32(&(*msg)->job_step_count, buffer); + + step = (*msg)->job_steps = + xmalloc(sizeof(job_step_info_t) * (*msg)->job_step_count); + + for (i = 0; i < (*msg)->job_step_count; i++) + if (_unpack_job_step_info_members(&step[i], buffer)) + goto unpack_error; + + return SLURM_SUCCESS; + +unpack_error: + xfree(step); + xfree(*msg); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_buffer_msg(slurm_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + packmem_array(msg->data, msg->data_size, buffer); +} + +static int +_unpack_job_info_msg(job_info_msg_t ** msg, Buf buffer) +{ + int i; + job_info_t *job = NULL; + + xassert(msg != NULL); + *msg = xmalloc(sizeof(job_info_msg_t)); + + /* load buffer's header (data structure version and time) */ + safe_unpack32(&((*msg)->record_count), buffer); + safe_unpack_time(&((*msg)->last_update), buffer); + job = (*msg)->job_array = + xmalloc(sizeof(job_info_t) * (*msg)->record_count); + + /* load individual job info */ + for (i = 0; i < (*msg)->record_count; i++) { + if (_unpack_job_info_members(&job[i], buffer)) + goto unpack_error; + } + return SLURM_SUCCESS; + +unpack_error: + xfree(job); + xfree(*msg); + *msg = NULL; + return SLURM_ERROR; +} + +/* _unpack_job_info_members + * unpacks a set of slurm job info for one job + * OUT job - pointer to the job info buffer + * IN/OUT buffer - source of the unpack, contains pointers that are + * automatically updated + */ +static int +_unpack_job_info_members(job_info_t * job, Buf buffer) +{ + uint16_t uint16_tmp; + uint32_t uint32_tmp; + char *node_inx_str; + + safe_unpack32(&job->job_id, buffer); + safe_unpack32(&job->user_id, buffer); + safe_unpack32(&job->group_id, buffer); + + safe_unpack16(&job->job_state, buffer); + safe_unpack16(&job->batch_flag, buffer); + safe_unpack32(&job->alloc_sid, buffer); + safe_unpack32(&job->time_limit, buffer); + + safe_unpack_time(&job->submit_time, buffer); + safe_unpack_time(&job->start_time, buffer); + safe_unpack_time(&job->end_time, buffer); + safe_unpack_time(&job->suspend_time, buffer); + safe_unpack_time(&job->pre_sus_time, buffer); + safe_unpack32(&job->priority, buffer); + + safe_unpackstr_xmalloc(&job->nodes, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job->partition, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job->account, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job->network, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job->comment, &uint16_tmp, buffer); + safe_unpack32(&job->dependency, buffer); + safe_unpack32(&job->exit_code, buffer); + + safe_unpack16(&job->num_cpu_groups, buffer); + safe_unpack32_array(&job->cpus_per_node, &uint32_tmp, buffer); + safe_unpack32_array(&job->cpu_count_reps, &uint32_tmp, buffer); + + safe_unpackstr_xmalloc(&job->name, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job->alloc_node, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&node_inx_str, &uint16_tmp, buffer); + if (node_inx_str == NULL) + job->node_inx = bitfmt2int(""); + else { + job->node_inx = bitfmt2int(node_inx_str); + xfree(node_inx_str); + } + safe_unpack32(&job->num_procs, buffer); + + if (select_g_alloc_jobinfo(&job->select_jobinfo) + || select_g_unpack_jobinfo(job->select_jobinfo, buffer)) + goto unpack_error; + + /*** unpack default job details ***/ + safe_unpackstr_xmalloc(&job->features, &uint16_tmp, buffer); + safe_unpack32(&job->num_nodes, buffer); + safe_unpack32(&job->max_nodes, buffer); + safe_unpack32(&job->min_sockets, buffer); + safe_unpack32(&job->max_sockets, buffer); + safe_unpack32(&job->min_cores, buffer); + safe_unpack32(&job->max_cores, buffer); + safe_unpack32(&job->min_threads, buffer); + safe_unpack32(&job->max_threads, buffer); + + /*** unpack pending job details ***/ + safe_unpack16(&job->shared, buffer); + safe_unpack16(&job->contiguous, buffer); + safe_unpack16(&job->cpus_per_task, buffer); + safe_unpack16(&job->ntasks_per_node, buffer); + safe_unpack16(&job->ntasks_per_socket, buffer); + safe_unpack16(&job->ntasks_per_core, buffer); + + safe_unpack32(&job->job_min_procs, buffer); + safe_unpack32(&job->job_min_sockets, buffer); + safe_unpack32(&job->job_min_cores, buffer); + safe_unpack32(&job->job_min_threads, buffer); + safe_unpack32(&job->job_min_memory, buffer); + safe_unpack32(&job->job_max_memory, buffer); + safe_unpack32(&job->job_min_tmp_disk, buffer); + safe_unpack16(&job->wait_reason, buffer); + + safe_unpackstr_xmalloc(&job->req_nodes, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&node_inx_str, &uint16_tmp, buffer); + if (node_inx_str == NULL) + job->req_node_inx = bitfmt2int(""); + else { + job->req_node_inx = bitfmt2int(node_inx_str); + xfree(node_inx_str); + } + safe_unpackstr_xmalloc(&job->exc_nodes, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&node_inx_str, &uint16_tmp, buffer); + if (node_inx_str == NULL) + job->exc_node_inx = bitfmt2int(""); + else { + job->exc_node_inx = bitfmt2int(node_inx_str); + xfree(node_inx_str); + } + + return SLURM_SUCCESS; + +unpack_error: + xfree(job->nodes); + xfree(job->partition); + xfree(job->account); + xfree(job->name); + xfree(job->alloc_node); + xfree(job->node_inx); + select_g_free_jobinfo(&job->select_jobinfo); + xfree(job->features); + xfree(job->req_nodes); + xfree(job->req_node_inx); + xfree(job->exc_nodes); + xfree(job->exc_node_inx); + xfree(job->network); + xfree(job->comment); + return SLURM_ERROR; +} + +static void +_pack_slurm_ctl_conf_msg(slurm_ctl_conf_info_msg_t * build_ptr, Buf buffer) +{ + pack_time(build_ptr->last_update, buffer); + packstr(build_ptr->authtype, buffer); + packstr(build_ptr->backup_addr, buffer); + packstr(build_ptr->backup_controller, buffer); + pack16((uint16_t)build_ptr->cache_groups, buffer); + packstr(build_ptr->checkpoint_type, buffer); + packstr(build_ptr->control_addr, buffer); + packstr(build_ptr->control_machine, buffer); + packstr(build_ptr->epilog, buffer); + pack16((uint16_t)build_ptr->fast_schedule, buffer); + pack32((uint32_t)build_ptr->first_job_id, buffer); + pack16((uint16_t)build_ptr->inactive_limit, buffer); + packstr(build_ptr->job_acct_logfile, buffer); + pack16(build_ptr->job_acct_freq, buffer); + packstr(build_ptr->job_acct_type, buffer); + packstr(build_ptr->job_comp_loc, buffer); + packstr(build_ptr->job_comp_type, buffer); + pack16((uint16_t)build_ptr->kill_wait, buffer); + packstr(build_ptr->mail_prog, buffer); + pack16((uint16_t)build_ptr->max_job_cnt, buffer); + pack16((uint16_t)build_ptr->min_job_age, buffer); + packstr(build_ptr->mpi_default, buffer); + pack16((uint16_t)build_ptr->msg_timeout, buffer); + pack32((uint32_t)build_ptr->next_job_id, buffer); + packstr(build_ptr->plugindir, buffer); + packstr(build_ptr->plugstack, buffer); + packstr(build_ptr->proctrack_type, buffer); + packstr(build_ptr->prolog, buffer); + pack16(build_ptr->propagate_prio_process, buffer); + packstr(build_ptr->propagate_rlimits, buffer); + packstr(build_ptr->propagate_rlimits_except, buffer); + pack16((uint16_t)build_ptr->ret2service, buffer); + pack16((uint16_t)build_ptr->schedport, buffer); + pack16((uint16_t)build_ptr->schedrootfltr, buffer); + packstr(build_ptr->schedtype, buffer); + packstr(build_ptr->select_type, buffer); + pack16((uint16_t)build_ptr->select_type_param, buffer); + pack32((uint32_t)build_ptr->slurm_user_id, buffer); + packstr(build_ptr->slurm_user_name, buffer); + pack16((uint16_t)build_ptr->slurmctld_debug, buffer); + packstr(build_ptr->slurmctld_logfile, buffer); + packstr(build_ptr->slurmctld_pidfile, buffer); + pack32((uint32_t)build_ptr->slurmctld_port, buffer); + pack16((uint16_t)build_ptr->slurmctld_timeout, buffer); + pack16((uint16_t)build_ptr->slurmd_debug, buffer); + packstr(build_ptr->slurmd_logfile, buffer); + packstr(build_ptr->slurmd_pidfile, buffer); +#ifndef MULTIPLE_SLURMD + pack32((uint32_t)build_ptr->slurmd_port, buffer); +#endif + packstr(build_ptr->slurmd_spooldir, buffer); + pack16((uint16_t)build_ptr->slurmd_timeout, buffer); + packstr(build_ptr->slurm_conf, buffer); + packstr(build_ptr->state_save_location, buffer); + packstr(build_ptr->switch_type, buffer); + packstr(build_ptr->task_epilog, buffer); + packstr(build_ptr->task_prolog, buffer); + packstr(build_ptr->task_plugin, buffer); + packstr(build_ptr->tmp_fs, buffer); + pack16((uint16_t)build_ptr->wait_time, buffer); + packstr(build_ptr->job_credential_private_key, buffer); + packstr(build_ptr->job_credential_public_certificate, buffer); + packstr(build_ptr->srun_prolog, buffer); + packstr(build_ptr->srun_epilog, buffer); + packstr(build_ptr->node_prefix, buffer); + pack16((uint16_t)build_ptr->tree_width, buffer); + pack16(build_ptr->use_pam, buffer); +} + +static int +_unpack_slurm_ctl_conf_msg(slurm_ctl_conf_info_msg_t ** + build_buffer_ptr, Buf buffer) +{ + uint16_t uint16_tmp; + slurm_ctl_conf_info_msg_t *build_ptr; + + /* alloc memory for structure */ + build_ptr = xmalloc(sizeof(slurm_ctl_conf_t)); + *build_buffer_ptr = build_ptr; + + /* load the data values */ + /* unpack timestamp of snapshot */ + safe_unpack_time(&build_ptr->last_update, buffer); + safe_unpackstr_xmalloc(&build_ptr->authtype, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->backup_addr, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->backup_controller, &uint16_tmp, + buffer); + safe_unpack16(&build_ptr->cache_groups, buffer); + safe_unpackstr_xmalloc(&build_ptr->checkpoint_type, &uint16_tmp, + buffer); + safe_unpackstr_xmalloc(&build_ptr->control_addr, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->control_machine, &uint16_tmp, + buffer); + safe_unpackstr_xmalloc(&build_ptr->epilog, &uint16_tmp, buffer); + safe_unpack16(&build_ptr->fast_schedule, buffer); + safe_unpack32(&build_ptr->first_job_id, buffer); + safe_unpack16(&build_ptr->inactive_limit, buffer); + safe_unpackstr_xmalloc(&build_ptr->job_acct_logfile, &uint16_tmp, + buffer); + safe_unpack16(&build_ptr->job_acct_freq, buffer); + safe_unpackstr_xmalloc(&build_ptr->job_acct_type, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->job_comp_loc, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->job_comp_type, &uint16_tmp, buffer); + safe_unpack16(&build_ptr->kill_wait, buffer); + safe_unpackstr_xmalloc(&build_ptr->mail_prog, &uint16_tmp, buffer); + safe_unpack16(&build_ptr->max_job_cnt, buffer); + safe_unpack16(&build_ptr->min_job_age, buffer); + safe_unpackstr_xmalloc(&build_ptr->mpi_default, &uint16_tmp, buffer); + safe_unpack16(&build_ptr->msg_timeout, buffer); + safe_unpack32(&build_ptr->next_job_id, buffer); + safe_unpackstr_xmalloc(&build_ptr->plugindir, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->plugstack, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->proctrack_type, &uint16_tmp, + buffer); + safe_unpackstr_xmalloc(&build_ptr->prolog, &uint16_tmp, buffer); + safe_unpack16(&build_ptr->propagate_prio_process, buffer); + safe_unpackstr_xmalloc(&build_ptr->propagate_rlimits, + &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->propagate_rlimits_except, + &uint16_tmp, buffer); + safe_unpack16(&build_ptr->ret2service, buffer); + safe_unpack16(&build_ptr->schedport, buffer); + safe_unpack16(&build_ptr->schedrootfltr, buffer); + safe_unpackstr_xmalloc(&build_ptr->schedtype, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->select_type, &uint16_tmp, buffer); + safe_unpack16(&build_ptr->select_type_param, buffer); + safe_unpack32(&build_ptr->slurm_user_id, buffer); + safe_unpackstr_xmalloc(&build_ptr->slurm_user_name, + &uint16_tmp, buffer); + safe_unpack16(&build_ptr->slurmctld_debug, buffer); + safe_unpackstr_xmalloc(&build_ptr->slurmctld_logfile, + &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->slurmctld_pidfile, + &uint16_tmp, buffer); + safe_unpack32(&build_ptr->slurmctld_port, buffer); + safe_unpack16(&build_ptr->slurmctld_timeout, buffer); + safe_unpack16(&build_ptr->slurmd_debug, buffer); + safe_unpackstr_xmalloc(&build_ptr->slurmd_logfile, &uint16_tmp, + buffer); + safe_unpackstr_xmalloc(&build_ptr->slurmd_pidfile, &uint16_tmp, + buffer); +#ifndef MULTIPLE_SLURMD + safe_unpack32(&build_ptr->slurmd_port, buffer); +#endif + safe_unpackstr_xmalloc(&build_ptr->slurmd_spooldir, &uint16_tmp, + buffer); + safe_unpack16(&build_ptr->slurmd_timeout, buffer); + safe_unpackstr_xmalloc(&build_ptr->slurm_conf, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->state_save_location, + &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->switch_type, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->task_epilog, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->task_prolog, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->task_plugin, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->tmp_fs, &uint16_tmp, buffer); + safe_unpack16(&build_ptr->wait_time, buffer); + safe_unpackstr_xmalloc(&build_ptr->job_credential_private_key, + &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr-> + job_credential_public_certificate, + &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->srun_prolog, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->srun_epilog, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&build_ptr->node_prefix, &uint16_tmp, buffer); + safe_unpack16(&build_ptr->tree_width, buffer); + safe_unpack16(&build_ptr->use_pam, buffer); + + return SLURM_SUCCESS; + +unpack_error: + xfree(build_ptr->authtype); + xfree(build_ptr->backup_addr); + xfree(build_ptr->backup_controller); + xfree(build_ptr->checkpoint_type); + xfree(build_ptr->control_addr); + xfree(build_ptr->control_machine); + xfree(build_ptr->epilog); + xfree(build_ptr->job_acct_logfile); + xfree(build_ptr->job_acct_type); + xfree(build_ptr->job_comp_loc); + xfree(build_ptr->job_comp_type); + xfree(build_ptr->job_credential_private_key); + xfree(build_ptr->job_credential_public_certificate); + xfree(build_ptr->mail_prog); + xfree(build_ptr->mpi_default); + xfree(build_ptr->plugindir); + xfree(build_ptr->plugstack); + xfree(build_ptr->proctrack_type); + xfree(build_ptr->prolog); + xfree(build_ptr->propagate_rlimits); + xfree(build_ptr->propagate_rlimits_except); + xfree(build_ptr->schedtype); + xfree(build_ptr->select_type); + xfree(build_ptr->slurm_conf); + xfree(build_ptr->slurm_user_name); + xfree(build_ptr->slurmctld_logfile); + xfree(build_ptr->slurmctld_pidfile); + xfree(build_ptr->slurmd_logfile); + xfree(build_ptr->slurmd_pidfile); + xfree(build_ptr->slurmd_spooldir); + xfree(build_ptr->state_save_location); + xfree(build_ptr->switch_type); + xfree(build_ptr->task_epilog); + xfree(build_ptr->task_prolog); + xfree(build_ptr->task_plugin); + xfree(build_ptr->tmp_fs); + xfree(build_ptr->srun_prolog); + xfree(build_ptr->srun_epilog); + xfree(build_ptr->node_prefix); + xfree(build_ptr); + *build_buffer_ptr = NULL; + return SLURM_ERROR; +} + +/* _pack_job_desc_msg + * packs a job_desc struct + * IN job_desc_ptr - pointer to the job descriptor to pack + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + */ +static void +_pack_job_desc_msg(job_desc_msg_t * job_desc_ptr, Buf buffer) +{ + /* load the data values */ + pack16((uint16_t)job_desc_ptr->contiguous, buffer); + pack16((uint16_t)job_desc_ptr->task_dist, buffer); + pack32((uint32_t)job_desc_ptr->plane_size, buffer); + pack16((uint16_t)job_desc_ptr->kill_on_node_fail, buffer); + packstr(job_desc_ptr->features, buffer); + pack32((uint32_t)job_desc_ptr->job_id, buffer); + packstr(job_desc_ptr->name, buffer); + + packstr(job_desc_ptr->alloc_node, buffer); + pack32((uint32_t)job_desc_ptr->alloc_sid, buffer); + pack32((uint32_t)job_desc_ptr->job_min_procs, buffer); + pack32((uint32_t)job_desc_ptr->job_min_sockets, buffer); + pack32((uint32_t)job_desc_ptr->job_min_cores, buffer); + pack32((uint32_t)job_desc_ptr->job_min_threads, buffer); + pack32((uint32_t)job_desc_ptr->job_min_memory, buffer); + pack32((uint32_t)job_desc_ptr->job_max_memory, buffer); + pack32((uint32_t)job_desc_ptr->job_min_tmp_disk, buffer); + + packstr(job_desc_ptr->partition, buffer); + pack32((uint32_t)job_desc_ptr->priority, buffer); + pack32((uint32_t)job_desc_ptr->dependency, buffer); + packstr(job_desc_ptr->account, buffer); + packstr(job_desc_ptr->comment, buffer); + pack16((uint16_t)job_desc_ptr->nice, buffer); + pack16((uint16_t)job_desc_ptr->overcommit, buffer); + pack32((uint32_t)job_desc_ptr->num_tasks, buffer); + + packstr(job_desc_ptr->req_nodes, buffer); + packstr(job_desc_ptr->exc_nodes, buffer); + packstr_array(job_desc_ptr->environment, job_desc_ptr->env_size, + buffer); + packstr(job_desc_ptr->script, buffer); + packstr_array(job_desc_ptr->argv, job_desc_ptr->argc, buffer); + + packstr(job_desc_ptr->err, buffer); + packstr(job_desc_ptr->in, buffer); + packstr(job_desc_ptr->out, buffer); + packstr(job_desc_ptr->work_dir, buffer); + + pack16((uint16_t)job_desc_ptr->immediate, buffer); + pack16((uint16_t)job_desc_ptr->no_requeue, buffer); + pack16((uint16_t)job_desc_ptr->shared, buffer); + pack16((uint16_t)job_desc_ptr->cpus_per_task, buffer); + pack16((uint16_t)job_desc_ptr->ntasks_per_node, buffer); + pack16((uint16_t)job_desc_ptr->ntasks_per_socket, buffer); + pack16((uint16_t)job_desc_ptr->ntasks_per_core, buffer); + pack32((uint32_t)job_desc_ptr->time_limit, buffer); + + pack32((uint32_t)job_desc_ptr->num_procs, buffer); + pack32((uint32_t)job_desc_ptr->min_nodes, buffer); + pack32((uint32_t)job_desc_ptr->max_nodes, buffer); + pack32((uint32_t)job_desc_ptr->min_sockets, buffer); + pack32((uint32_t)job_desc_ptr->max_sockets, buffer); + pack32((uint32_t)job_desc_ptr->min_cores, buffer); + pack32((uint32_t)job_desc_ptr->max_cores, buffer); + pack32((uint32_t)job_desc_ptr->min_threads, buffer); + pack32((uint32_t)job_desc_ptr->max_threads, buffer); + pack32((uint32_t)job_desc_ptr->user_id, buffer); + pack32((uint32_t)job_desc_ptr->group_id, buffer); + + pack16((uint16_t)job_desc_ptr->alloc_resp_port, buffer); + packstr(job_desc_ptr->alloc_resp_hostname, buffer); + pack16((uint16_t)job_desc_ptr->other_port, buffer); + packstr(job_desc_ptr->other_hostname, buffer); + packstr(job_desc_ptr->network, buffer); + pack_time(job_desc_ptr->begin_time, buffer); + + pack16((uint16_t)job_desc_ptr->mail_type, buffer); + packstr(job_desc_ptr->mail_user, buffer); + if(job_desc_ptr->select_jobinfo) + select_g_pack_jobinfo(job_desc_ptr->select_jobinfo, buffer); + else if (select_g_alloc_jobinfo(&job_desc_ptr->select_jobinfo) + == SLURM_SUCCESS) { +#if SYSTEM_DIMENSIONS + if(job_desc_ptr->geometry[0] != (uint16_t) NO_VAL) + select_g_set_jobinfo(job_desc_ptr->select_jobinfo, + SELECT_DATA_GEOMETRY, + job_desc_ptr->geometry); +#endif + + if (job_desc_ptr->conn_type != (uint16_t) NO_VAL) + select_g_set_jobinfo(job_desc_ptr->select_jobinfo, + SELECT_DATA_CONN_TYPE, + &(job_desc_ptr->conn_type)); + if (job_desc_ptr->rotate != (uint16_t) NO_VAL) + select_g_set_jobinfo(job_desc_ptr->select_jobinfo, + SELECT_DATA_ROTATE, + &(job_desc_ptr->rotate)); + select_g_pack_jobinfo(job_desc_ptr->select_jobinfo, buffer); + select_g_free_jobinfo(&job_desc_ptr->select_jobinfo); + } +} + +/* _unpack_job_desc_msg + * unpacks a job_desc struct + * OUT job_desc_buffer_ptr - place to put pointer to allocated job desc struct + * IN/OUT buffer - source of the unpack, contains pointers that are + * automatically updated + */ +static int +_unpack_job_desc_msg(job_desc_msg_t ** job_desc_buffer_ptr, Buf buffer) +{ + uint16_t uint16_tmp; + job_desc_msg_t *job_desc_ptr; + + /* alloc memory for structure */ + job_desc_ptr = xmalloc(sizeof(job_desc_msg_t)); + *job_desc_buffer_ptr = job_desc_ptr; + + /* load the data values */ + safe_unpack16(&job_desc_ptr->contiguous, buffer); + safe_unpack16(&job_desc_ptr->task_dist, buffer); + safe_unpack32(&job_desc_ptr->plane_size, buffer); + safe_unpack16(&job_desc_ptr->kill_on_node_fail, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->features, &uint16_tmp, buffer); + safe_unpack32(&job_desc_ptr->job_id, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->name, &uint16_tmp, buffer); + + safe_unpackstr_xmalloc(&job_desc_ptr->alloc_node, &uint16_tmp, buffer); + safe_unpack32(&job_desc_ptr->alloc_sid, buffer); + safe_unpack32(&job_desc_ptr->job_min_procs, buffer); + safe_unpack32(&job_desc_ptr->job_min_sockets, buffer); + safe_unpack32(&job_desc_ptr->job_min_cores, buffer); + safe_unpack32(&job_desc_ptr->job_min_threads, buffer); + safe_unpack32(&job_desc_ptr->job_min_memory, buffer); + safe_unpack32(&job_desc_ptr->job_max_memory, buffer); + safe_unpack32(&job_desc_ptr->job_min_tmp_disk, buffer); + + safe_unpackstr_xmalloc(&job_desc_ptr->partition, &uint16_tmp, buffer); + safe_unpack32(&job_desc_ptr->priority, buffer); + safe_unpack32(&job_desc_ptr->dependency, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->account, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->comment, &uint16_tmp, buffer); + safe_unpack16(&job_desc_ptr->nice, buffer); + safe_unpack16(&job_desc_ptr->overcommit, buffer); + safe_unpack32(&job_desc_ptr->num_tasks, buffer); + + safe_unpackstr_xmalloc(&job_desc_ptr->req_nodes, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->exc_nodes, &uint16_tmp, buffer); + safe_unpackstr_array(&job_desc_ptr->environment, + &job_desc_ptr->env_size, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->script, &uint16_tmp, buffer); + safe_unpackstr_array(&job_desc_ptr->argv, &job_desc_ptr->argc, buffer); + + safe_unpackstr_xmalloc(&job_desc_ptr->err, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->in, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->out, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->work_dir, &uint16_tmp, buffer); + + safe_unpack16(&job_desc_ptr->immediate, buffer); + safe_unpack16(&job_desc_ptr->no_requeue, buffer); + safe_unpack16(&job_desc_ptr->shared, buffer); + safe_unpack16(&job_desc_ptr->cpus_per_task, buffer); + safe_unpack16(&job_desc_ptr->ntasks_per_node, buffer); + safe_unpack16(&job_desc_ptr->ntasks_per_socket, buffer); + safe_unpack16(&job_desc_ptr->ntasks_per_core, buffer); + safe_unpack32(&job_desc_ptr->time_limit, buffer); + + safe_unpack32(&job_desc_ptr->num_procs, buffer); + safe_unpack32(&job_desc_ptr->min_nodes, buffer); + safe_unpack32(&job_desc_ptr->max_nodes, buffer); + safe_unpack32(&job_desc_ptr->min_sockets, buffer); + safe_unpack32(&job_desc_ptr->max_sockets, buffer); + safe_unpack32(&job_desc_ptr->min_cores, buffer); + safe_unpack32(&job_desc_ptr->max_cores, buffer); + safe_unpack32(&job_desc_ptr->min_threads, buffer); + safe_unpack32(&job_desc_ptr->max_threads, buffer); + safe_unpack32(&job_desc_ptr->user_id, buffer); + safe_unpack32(&job_desc_ptr->group_id, buffer); + + safe_unpack16(&job_desc_ptr->alloc_resp_port, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->alloc_resp_hostname, + &uint16_tmp, buffer); + safe_unpack16(&job_desc_ptr->other_port, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->other_hostname, + &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->network, &uint16_tmp, buffer); + safe_unpack_time(&job_desc_ptr->begin_time, buffer); + + safe_unpack16(&job_desc_ptr->mail_type, buffer); + safe_unpackstr_xmalloc(&job_desc_ptr->mail_user, &uint16_tmp, buffer); + + if (select_g_alloc_jobinfo (&job_desc_ptr->select_jobinfo) + || select_g_unpack_jobinfo(job_desc_ptr->select_jobinfo, buffer)) + goto unpack_error; +#if SYSTEM_DIMENSIONS + job_desc_ptr->geometry[0] = (uint16_t)NO_VAL; +#endif + job_desc_ptr->conn_type = (uint16_t)NO_VAL; + job_desc_ptr->rotate = (uint16_t)NO_VAL; + return SLURM_SUCCESS; + +unpack_error: + select_g_free_jobinfo(&job_desc_ptr->select_jobinfo); + xfree(job_desc_ptr->features); + xfree(job_desc_ptr->name); + xfree(job_desc_ptr->partition); + xfree(job_desc_ptr->req_nodes); + xfree(job_desc_ptr->environment); + xfree(job_desc_ptr->script); + xfree(job_desc_ptr->argv); + xfree(job_desc_ptr->err); + xfree(job_desc_ptr->in); + xfree(job_desc_ptr->out); + xfree(job_desc_ptr->work_dir); + xfree(job_desc_ptr->alloc_resp_hostname); + xfree(job_desc_ptr->other_hostname); + xfree(job_desc_ptr->network); + xfree(job_desc_ptr->mail_user); + xfree(job_desc_ptr); + *job_desc_buffer_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_job_alloc_info_msg(job_alloc_info_msg_t * job_desc_ptr, Buf buffer) +{ + /* load the data values */ + pack32((uint32_t)job_desc_ptr->job_id, buffer); +} + +static int +_unpack_job_alloc_info_msg(job_alloc_info_msg_t ** + job_desc_buffer_ptr, Buf buffer) +{ + job_alloc_info_msg_t *job_desc_ptr; + + /* alloc memory for structure */ + assert(job_desc_buffer_ptr != NULL); + job_desc_ptr = xmalloc(sizeof(job_alloc_info_msg_t)); + *job_desc_buffer_ptr = job_desc_ptr; + + /* load the data values */ + safe_unpack32(&job_desc_ptr->job_id, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(job_desc_ptr); + *job_desc_buffer_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_last_update_msg(last_update_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + pack_time(msg->last_update, buffer); +} + +static int +_unpack_last_update_msg(last_update_msg_t ** msg, Buf buffer) +{ + last_update_msg_t *last_update_msg; + + xassert(msg != NULL); + last_update_msg = xmalloc(sizeof(last_update_msg_t)); + *msg = last_update_msg; + + safe_unpack_time(&last_update_msg->last_update, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(last_update_msg); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_return_code_msg(return_code_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + pack32((uint32_t)msg->return_code, buffer); +} + +static int +_unpack_return_code_msg(return_code_msg_t ** msg, Buf buffer) +{ + return_code_msg_t *return_code_msg; + + xassert(msg != NULL); + return_code_msg = xmalloc(sizeof(return_code_msg_t)); + *msg = return_code_msg; + + safe_unpack32(&return_code_msg->return_code, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(return_code_msg); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_reattach_tasks_request_msg(reattach_tasks_request_msg_t * msg, + Buf buffer) +{ + int i; + + xassert(msg != NULL); + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->job_step_id, buffer); + pack16((uint16_t)msg->num_resp_port, buffer); + for(i = 0; i < msg->num_resp_port; i++) + pack16((uint16_t)msg->resp_port[i], buffer); + pack16((uint16_t)msg->num_io_port, buffer); + for(i = 0; i < msg->num_io_port; i++) + pack16((uint16_t)msg->io_port[i], buffer); + + slurm_cred_pack(msg->cred, buffer); +} + +static int +_unpack_reattach_tasks_request_msg(reattach_tasks_request_msg_t ** msg_ptr, + Buf buffer) +{ + reattach_tasks_request_msg_t *msg; + int i; + + xassert(msg_ptr != NULL); + msg = xmalloc(sizeof(*msg)); + *msg_ptr = msg; + + safe_unpack32(&msg->job_id, buffer); + safe_unpack32(&msg->job_step_id, buffer); + safe_unpack16(&msg->num_resp_port, buffer); + if (msg->num_resp_port > 0) { + msg->resp_port = xmalloc(sizeof(uint16_t)*msg->num_resp_port); + for (i = 0; i < msg->num_resp_port; i++) + safe_unpack16(&msg->resp_port[i], buffer); + } + safe_unpack16(&msg->num_io_port, buffer); + if (msg->num_io_port > 0) { + msg->io_port = xmalloc(sizeof(uint16_t)*msg->num_io_port); + for (i = 0; i < msg->num_io_port; i++) + safe_unpack16(&msg->io_port[i], buffer); + } + + if (!(msg->cred = slurm_cred_unpack(buffer))) + goto unpack_error; + + return SLURM_SUCCESS; + +unpack_error: + slurm_free_reattach_tasks_request_msg(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_reattach_tasks_response_msg(reattach_tasks_response_msg_t * msg, + Buf buffer) +{ + xassert(msg != NULL); + packstr(msg->node_name, buffer); + packstr(msg->executable_name, buffer); + pack32((uint32_t)msg->return_code, buffer); + pack32((uint32_t)msg->ntasks, buffer); + pack32_array(msg->gtids, msg->ntasks, buffer); + pack32_array(msg->local_pids, msg->ntasks, buffer); +} + +static int +_unpack_reattach_tasks_response_msg(reattach_tasks_response_msg_t ** msg_ptr, + Buf buffer) +{ + uint32_t ntasks; + uint16_t uint16_tmp; + reattach_tasks_response_msg_t *msg = xmalloc(sizeof(*msg)); + + xassert(msg_ptr != NULL); + *msg_ptr = msg; + + safe_unpackstr_xmalloc(&msg->node_name, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&msg->executable_name, &uint16_tmp, buffer); + safe_unpack32(&msg->return_code, buffer); + safe_unpack32(&msg->ntasks, buffer); + safe_unpack32_array(&msg->gtids, &ntasks, buffer); + safe_unpack32_array(&msg->local_pids, &ntasks, buffer); + if (msg->ntasks != ntasks) + goto unpack_error; + return SLURM_SUCCESS; + +unpack_error: + slurm_free_reattach_tasks_response_msg(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + + +static void +_pack_task_exit_msg(task_exit_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + pack32((uint32_t)msg->return_code, buffer); + pack32((uint32_t)msg->num_tasks, buffer); + pack32_array(msg->task_id_list, + msg->num_tasks, buffer); +} + +static int +_unpack_task_exit_msg(task_exit_msg_t ** msg_ptr, Buf buffer) +{ + task_exit_msg_t *msg; + uint32_t uint32_tmp; + + xassert(msg_ptr != NULL); + msg = xmalloc(sizeof(task_exit_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->return_code, buffer); + safe_unpack32(&msg->num_tasks, buffer); + safe_unpack32_array(&msg->task_id_list, &uint32_tmp, buffer); + if (msg->num_tasks != uint32_tmp) + goto unpack_error; + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + + +static void +_pack_launch_tasks_response_msg(launch_tasks_response_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + pack32((uint32_t)msg->return_code, buffer); + packstr(msg->node_name, buffer); + pack32((uint32_t)msg->count_of_pids, buffer); + pack32_array(msg->local_pids, msg->count_of_pids, buffer); + pack32_array(msg->task_ids, msg->count_of_pids, buffer); +} + +static int +_unpack_launch_tasks_response_msg(launch_tasks_response_msg_t ** + msg_ptr, Buf buffer) +{ + uint16_t uint16_tmp; + uint32_t uint32_tmp; + launch_tasks_response_msg_t *msg; + + xassert(msg_ptr != NULL); + msg = xmalloc(sizeof(launch_tasks_response_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->return_code, buffer); + safe_unpackstr_xmalloc(&msg->node_name, &uint16_tmp, buffer); + safe_unpack32(&msg->count_of_pids, buffer); + safe_unpack32_array(&msg->local_pids, &uint32_tmp, buffer); + if (msg->count_of_pids != uint32_tmp) + goto unpack_error; + safe_unpack32_array(&msg->task_ids, &uint32_tmp, buffer); + if (msg->count_of_pids != uint32_tmp) + goto unpack_error2; + + return SLURM_SUCCESS; + +unpack_error2: + xfree(msg->count_of_pids); +unpack_error: + xfree(msg->node_name); + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_launch_tasks_request_msg(launch_tasks_request_msg_t * msg, Buf buffer) +{ + int i=0; + xassert(msg != NULL); + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->job_step_id, buffer); + pack32((uint32_t)msg->nnodes, buffer); + pack32((uint32_t)msg->nprocs, buffer); + pack32((uint32_t)msg->uid, buffer); + pack32((uint32_t)msg->gid, buffer); + pack32((uint32_t)msg->max_sockets, buffer); + pack32((uint32_t)msg->max_cores, buffer); + pack32((uint32_t)msg->max_threads, buffer); + pack32((uint32_t)msg->cpus_per_task, buffer); + pack32((uint32_t)msg->ntasks_per_node, buffer); + pack32((uint32_t)msg->ntasks_per_socket, buffer); + pack32((uint32_t)msg->ntasks_per_core, buffer); + slurm_cred_pack(msg->cred, buffer); + for(i=0; innodes; i++) { + pack32((uint32_t)msg->tasks_to_launch[i], buffer); + pack32((uint32_t)msg->cpus_allocated[i], buffer); + pack32_array(msg->global_task_ids[i], + msg->tasks_to_launch[i], + buffer); + } + pack16((uint16_t)msg->num_resp_port, buffer); + for(i = 0; i < msg->num_resp_port; i++) + pack16((uint16_t)msg->resp_port[i], buffer); + slurm_pack_slurm_addr(&msg->orig_addr, buffer); + packstr_array(msg->env, msg->envc, buffer); + packstr(msg->cwd, buffer); + pack16((uint16_t)msg->cpu_bind_type, buffer); + packstr(msg->cpu_bind, buffer); + pack16((uint16_t)msg->mem_bind_type, buffer); + packstr(msg->mem_bind, buffer); + packstr_array(msg->argv, msg->argc, buffer); + pack16((uint16_t)msg->task_dist, buffer); + pack32((uint32_t)msg->plane_size, buffer); + pack16((uint16_t)msg->task_flags, buffer); + pack16((uint16_t)msg->multi_prog, buffer); + pack16((uint16_t)msg->user_managed_io, buffer); + if (msg->user_managed_io == 0) { + packstr(msg->ofname, buffer); + packstr(msg->efname, buffer); + packstr(msg->ifname, buffer); + pack8(msg->buffered_stdio, buffer); + pack16((uint16_t)msg->num_io_port, buffer); + for(i = 0; i < msg->num_io_port; i++) + pack16((uint16_t)msg->io_port[i], buffer); + } + packstr(msg->task_prolog, buffer); + packstr(msg->task_epilog, buffer); + pack32((uint32_t)msg->slurmd_debug, buffer); + switch_pack_jobinfo(msg->switch_job, buffer); + job_options_pack(msg->options, buffer); + packstr(msg->complete_nodelist, buffer); +} + +static int +_unpack_launch_tasks_request_msg(launch_tasks_request_msg_t ** + msg_ptr, Buf buffer) +{ + uint16_t uint16_tmp; + uint32_t uint32_tmp; + launch_tasks_request_msg_t *msg; + int i=0; + + xassert(msg_ptr != NULL); + msg = xmalloc(sizeof(launch_tasks_request_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->job_id, buffer); + safe_unpack32(&msg->job_step_id, buffer); + safe_unpack32(&msg->nnodes, buffer); + safe_unpack32(&msg->nprocs, buffer); + safe_unpack32(&msg->uid, buffer); + safe_unpack32(&msg->gid, buffer); + safe_unpack32(&msg->max_sockets, buffer); + safe_unpack32(&msg->max_cores, buffer); + safe_unpack32(&msg->max_threads, buffer); + safe_unpack32(&msg->cpus_per_task, buffer); + safe_unpack32(&msg->ntasks_per_node, buffer); + safe_unpack32(&msg->ntasks_per_socket, buffer); + safe_unpack32(&msg->ntasks_per_core, buffer); + if (!(msg->cred = slurm_cred_unpack(buffer))) + goto unpack_error; + msg->tasks_to_launch = xmalloc(sizeof(uint32_t) * msg->nnodes); + msg->cpus_allocated = xmalloc(sizeof(uint32_t) * msg->nnodes); + msg->global_task_ids = xmalloc(sizeof(uint32_t *) * msg->nnodes); + for(i=0; innodes; i++) { + safe_unpack32(&msg->tasks_to_launch[i], buffer); + safe_unpack32(&msg->cpus_allocated[i], buffer); + safe_unpack32_array(&msg->global_task_ids[i], + &uint32_tmp, + buffer); + if (msg->tasks_to_launch[i] != uint32_tmp) + goto unpack_error; + + } + safe_unpack16(&msg->num_resp_port, buffer); + if (msg->num_resp_port > 0) { + msg->resp_port = xmalloc(sizeof(uint16_t)*msg->num_resp_port); + for (i = 0; i < msg->num_resp_port; i++) + safe_unpack16(&msg->resp_port[i], buffer); + } + slurm_unpack_slurm_addr_no_alloc(&msg->orig_addr, buffer); + safe_unpackstr_array(&msg->env, &msg->envc, buffer); + safe_unpackstr_xmalloc(&msg->cwd, &uint16_tmp, buffer); + safe_unpack16(&msg->cpu_bind_type, buffer); + safe_unpackstr_xmalloc(&msg->cpu_bind, &uint16_tmp, buffer); + safe_unpack16(&msg->mem_bind_type, buffer); + safe_unpackstr_xmalloc(&msg->mem_bind, &uint16_tmp, buffer); + safe_unpackstr_array(&msg->argv, &msg->argc, buffer); + safe_unpack16(&msg->task_dist, buffer); + safe_unpack32(&msg->plane_size, buffer); + safe_unpack16(&msg->task_flags, buffer); + safe_unpack16(&msg->multi_prog, buffer); + safe_unpack16(&msg->user_managed_io, buffer); + if (msg->user_managed_io == 0) { + safe_unpackstr_xmalloc(&msg->ofname, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&msg->efname, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&msg->ifname, &uint16_tmp, buffer); + safe_unpack8(&msg->buffered_stdio, buffer); + safe_unpack16(&msg->num_io_port, buffer); + if (msg->num_io_port > 0) { + msg->io_port = + xmalloc(sizeof(uint16_t) * msg->num_io_port); + for (i = 0; i < msg->num_io_port; i++) + safe_unpack16(&msg->io_port[i], buffer); + } + } + safe_unpackstr_xmalloc(&msg->task_prolog, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&msg->task_epilog, &uint16_tmp, buffer); + safe_unpack32(&msg->slurmd_debug, buffer); + + switch_alloc_jobinfo(&msg->switch_job); + if (switch_unpack_jobinfo(msg->switch_job, buffer) < 0) { + error("switch_unpack_jobinfo: %m"); + switch_free_jobinfo(msg->switch_job); + goto unpack_error; + } + msg->options = job_options_create(); + if (job_options_unpack(msg->options, buffer) < 0) { + error("Unable to unpack extra job options: %m"); + goto unpack_error; + } + safe_unpackstr_xmalloc(&msg->complete_nodelist, &uint16_tmp, buffer); + return SLURM_SUCCESS; + +unpack_error: + slurm_free_launch_tasks_request_msg(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_task_user_managed_io_stream_msg(task_user_managed_io_msg_t * msg, + Buf buffer) +{ + xassert(msg != NULL); + pack32(msg->task_id, buffer); +} + +static int +_unpack_task_user_managed_io_stream_msg(task_user_managed_io_msg_t **msg_ptr, + Buf buffer) +{ + task_user_managed_io_msg_t *msg; + + xassert(msg_ptr != NULL); + msg = xmalloc(sizeof(task_user_managed_io_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->task_id, buffer); + + return SLURM_SUCCESS; + +unpack_error: + slurm_free_task_user_managed_io_stream_msg(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_cancel_tasks_msg(kill_tasks_msg_t * msg, Buf buffer) +{ + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->job_step_id, buffer); + pack32((uint32_t)msg->signal, buffer); +} + +static int +_unpack_cancel_tasks_msg(kill_tasks_msg_t ** msg_ptr, Buf buffer) +{ + kill_tasks_msg_t *msg; + + msg = xmalloc(sizeof(kill_tasks_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->job_id, buffer); + safe_unpack32(&msg->job_step_id, buffer); + safe_unpack32(&msg->signal, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_shutdown_msg(shutdown_msg_t * msg, Buf buffer) +{ + pack16((uint16_t)msg->core, buffer); +} + +static int +_unpack_shutdown_msg(shutdown_msg_t ** msg_ptr, Buf buffer) +{ + shutdown_msg_t *msg; + + msg = xmalloc(sizeof(shutdown_msg_t)); + *msg_ptr = msg; + + safe_unpack16(&msg->core, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +/* _pack_job_step_kill_msg + * packs a slurm job step signal message + * IN msg - pointer to the job step signal message + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + */ +static void +_pack_job_step_kill_msg(job_step_kill_msg_t * msg, Buf buffer) +{ + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->job_step_id, buffer); + pack16((uint16_t)msg->signal, buffer); + pack16((uint16_t)msg->batch_flag, buffer); +} + +/* _unpack_job_step_kill_msg + * unpacks a slurm job step signal message + * OUT msg_ptr - pointer to the job step signal message buffer + * IN/OUT buffer - source of the unpack, contains pointers that are + * automatically updated + */ +static int +_unpack_job_step_kill_msg(job_step_kill_msg_t ** msg_ptr, Buf buffer) +{ + job_step_kill_msg_t *msg; + + msg = xmalloc(sizeof(job_step_kill_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->job_id, buffer); + safe_unpack32(&msg->job_step_id, buffer); + safe_unpack16(&msg->signal, buffer); + safe_unpack16(&msg->batch_flag, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_complete_job_allocation_msg( + complete_job_allocation_msg_t * msg, Buf buffer) +{ + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->job_rc, buffer); +} + +static int +_unpack_complete_job_allocation_msg( + complete_job_allocation_msg_t ** msg_ptr, Buf buffer) +{ + complete_job_allocation_msg_t *msg; + + msg = xmalloc(sizeof(complete_job_allocation_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->job_id, buffer); + safe_unpack32(&msg->job_rc, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_complete_batch_script_msg( + complete_batch_script_msg_t * msg, Buf buffer) +{ + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->job_rc, buffer); + pack32((uint32_t)msg->slurm_rc, buffer); + packstr(msg->node_name, buffer); +} + +static int +_unpack_complete_batch_script_msg( + complete_batch_script_msg_t ** msg_ptr, Buf buffer) +{ + complete_batch_script_msg_t *msg; + uint16_t uint16_tmp; + + msg = xmalloc(sizeof(complete_batch_script_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->job_id, buffer); + safe_unpack32(&msg->job_rc, buffer); + safe_unpack32(&msg->slurm_rc, buffer); + safe_unpackstr_xmalloc(&msg->node_name, &uint16_tmp, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_stat_jobacct_msg(stat_jobacct_msg_t * msg, Buf buffer) +{ + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->return_code, buffer); + pack32((uint32_t)msg->step_id, buffer); + pack32((uint32_t)msg->num_tasks, buffer); + jobacct_g_pack(msg->jobacct, buffer); +} + + +static int +_unpack_stat_jobacct_msg(stat_jobacct_msg_t ** msg_ptr, Buf buffer) +{ + stat_jobacct_msg_t *msg; + + msg = xmalloc(sizeof(stat_jobacct_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->job_id, buffer); + safe_unpack32(&msg->return_code, buffer); + safe_unpack32(&msg->step_id, buffer); + safe_unpack32(&msg->num_tasks, buffer); + jobacct_g_unpack(&msg->jobacct, buffer); + + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; + +} + +static void +_pack_job_step_id_msg(job_step_id_msg_t * msg, Buf buffer) +{ + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->step_id, buffer); +} + + +static int +_unpack_job_step_id_msg(job_step_id_msg_t ** msg_ptr, Buf buffer) +{ + job_step_id_msg_t *msg; + + msg = xmalloc(sizeof(job_step_id_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->job_id, buffer); + safe_unpack32(&msg->step_id, buffer); + + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; + +} + + +static void +_pack_step_complete_msg(step_complete_msg_t * msg, Buf buffer) +{ + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->job_step_id, buffer); + pack32((uint32_t)msg->range_first, buffer); + pack32((uint32_t)msg->range_last, buffer); + pack32((uint32_t)msg->step_rc, buffer); + jobacct_g_pack(msg->jobacct, buffer); +} + +static int +_unpack_step_complete_msg(step_complete_msg_t ** msg_ptr, Buf buffer) +{ + step_complete_msg_t *msg; + + msg = xmalloc(sizeof(step_complete_msg_t)); + *msg_ptr = msg; + + safe_unpack32(&msg->job_id, buffer); + safe_unpack32(&msg->job_step_id, buffer); + safe_unpack32(&msg->range_first, buffer); + safe_unpack32(&msg->range_last, buffer); + safe_unpack32(&msg->step_rc, buffer); + jobacct_g_unpack(&msg->jobacct, buffer); + + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void +_pack_job_info_request_msg(job_info_request_msg_t * msg, Buf buffer) +{ + pack_time(msg->last_update, buffer); + pack16((uint16_t)msg->show_flags, buffer); +} + +static int +_unpack_job_info_request_msg(job_info_request_msg_t** msg, + Buf buffer) +{ + job_info_request_msg_t*job_info; + + job_info = xmalloc(sizeof(job_step_info_request_msg_t)); + *msg = job_info; + + safe_unpack_time(&job_info->last_update, buffer); + safe_unpack16(&job_info->show_flags, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(job_info); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_node_select_info_req_msg(node_info_select_request_msg_t *msg, Buf buffer) +{ + pack_time(msg->last_update, buffer); +} + +static int +_unpack_node_select_info_req_msg(node_info_select_request_msg_t **msg, + Buf buffer) +{ + node_info_select_request_msg_t *node_sel_info; + + node_sel_info = xmalloc(sizeof(node_info_select_request_msg_t)); + *msg = node_sel_info; + + safe_unpack_time(&node_sel_info->last_update, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(node_sel_info); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_job_step_info_req_msg(job_step_info_request_msg_t * msg, Buf buffer) +{ + pack_time(msg->last_update, buffer); + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->step_id, buffer); + pack16((uint16_t)msg->show_flags, buffer); +} + +static int +_unpack_job_step_info_req_msg(job_step_info_request_msg_t ** msg, Buf buffer) +{ + job_step_info_request_msg_t *job_step_info; + + job_step_info = xmalloc(sizeof(job_step_info_request_msg_t)); + *msg = job_step_info; + + safe_unpack_time(&job_step_info->last_update, buffer); + safe_unpack32(&job_step_info->job_id, buffer); + safe_unpack32(&job_step_info->step_id, buffer); + safe_unpack16(&job_step_info->show_flags, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(job_step_info); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_node_info_request_msg(node_info_request_msg_t * msg, Buf buffer) +{ + pack_time(msg->last_update, buffer); + pack16((uint16_t)msg->show_flags, buffer); +} + +static int +_unpack_node_info_request_msg(node_info_request_msg_t ** msg, Buf buffer) +{ + node_info_request_msg_t* node_info; + + node_info = xmalloc(sizeof(node_info_request_msg_t)); + *msg = node_info; + + safe_unpack_time(&node_info->last_update, buffer); + safe_unpack16(&node_info->show_flags, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(node_info); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_part_info_request_msg(part_info_request_msg_t * msg, Buf buffer) +{ + pack_time(msg->last_update, buffer); + pack16((uint16_t)msg->show_flags, buffer); +} + +static int +_unpack_part_info_request_msg(part_info_request_msg_t ** msg, Buf buffer) +{ + part_info_request_msg_t* part_info; + + part_info = xmalloc(sizeof(part_info_request_msg_t)); + *msg = part_info; + + safe_unpack_time(&part_info->last_update, buffer); + safe_unpack16(&part_info->show_flags, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(part_info); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_slurm_addr_array(slurm_addr * slurm_address, + uint16_t size_val, Buf buffer) +{ + slurm_pack_slurm_addr_array(slurm_address, size_val, buffer); +} + +static int +_unpack_slurm_addr_array(slurm_addr ** slurm_address, + uint16_t * size_val, Buf buffer) +{ + return slurm_unpack_slurm_addr_array(slurm_address, size_val, buffer); +} + + +static void +_pack_ret_list(List ret_list, + uint16_t size_val, Buf buffer) +{ + ListIterator itr; + ret_data_info_t *ret_data_info = NULL; + slurm_msg_t msg; + + itr = list_iterator_create(ret_list); + while((ret_data_info = list_next(itr))) { + pack32((uint32_t)ret_data_info->err, buffer); + pack16((uint16_t)ret_data_info->type, buffer); + packstr(ret_data_info->node_name, buffer); + + msg.msg_type = ret_data_info->type; + msg.data = ret_data_info->data; + pack_msg(&msg, buffer); + } + list_iterator_destroy(itr); +} + +static int +_unpack_ret_list(List *ret_list, + uint16_t size_val, Buf buffer) +{ + int i = 0, j = 0; + uint16_t nl = 0, uint16_tmp; + ret_data_info_t *ret_data_info = NULL; + slurm_msg_t msg; + *ret_list = list_create(destroy_data_info); + + for (i=0; ierr, buffer); + safe_unpack16(&uint16_tmp, buffer); + ret_data_info->type = (slurm_msg_type_t)uint16_tmp; + safe_unpackstr_xmalloc(&ret_data_info->node_name, + &uint16_tmp, buffer); + msg.msg_type = ret_data_info->type; + if (unpack_msg(&msg, buffer) != SLURM_SUCCESS) + goto unpack_error; + ret_data_info->data = msg.data; + } + + return SLURM_SUCCESS; + +unpack_error: + if (ret_data_info && ret_data_info->type) { + error("_unpack_ret_list: message type %u, record %d of %u", + ret_data_info->type, j, nl); + } + list_destroy(*ret_list); + *ret_list = NULL; + return SLURM_ERROR; +} + +static void +_pack_batch_job_launch_msg(batch_job_launch_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->step_id, buffer); + pack32((uint32_t)msg->uid, buffer); + pack32((uint32_t)msg->gid, buffer); + pack32((uint32_t)msg->nprocs, buffer); + + pack16((uint16_t)msg->overcommit, buffer); + pack16((uint16_t)msg->num_cpu_groups, buffer); + pack32_array(msg->cpus_per_node, msg->num_cpu_groups, buffer); + pack32_array(msg->cpu_count_reps, msg->num_cpu_groups, buffer); + + packstr(msg->nodes, buffer); + packstr(msg->script, buffer); + packstr(msg->work_dir, buffer); + + packstr(msg->err, buffer); + packstr(msg->in, buffer); + packstr(msg->out, buffer); + + pack16((uint16_t)msg->argc, buffer); + packstr_array(msg->argv, msg->argc, buffer); + + pack16((uint16_t)msg->envc, buffer); + packstr_array(msg->environment, msg->envc, buffer); + + slurm_cred_pack(msg->cred, buffer); + + select_g_pack_jobinfo(msg->select_jobinfo, buffer); +} + +static int +_unpack_batch_job_launch_msg(batch_job_launch_msg_t ** msg, Buf buffer) +{ + uint16_t uint16_tmp; + uint32_t uint32_tmp; + batch_job_launch_msg_t *launch_msg_ptr; + + xassert(msg != NULL); + launch_msg_ptr = xmalloc(sizeof(batch_job_launch_msg_t)); + *msg = launch_msg_ptr; + + safe_unpack32(&launch_msg_ptr->job_id, buffer); + safe_unpack32(&launch_msg_ptr->step_id, buffer); + safe_unpack32(&launch_msg_ptr->uid, buffer); + safe_unpack32(&launch_msg_ptr->gid, buffer); + safe_unpack32(&launch_msg_ptr->nprocs, buffer); + + safe_unpack16(&launch_msg_ptr->overcommit, buffer); + safe_unpack16(&launch_msg_ptr->num_cpu_groups, buffer); + safe_unpack32_array((uint32_t **) &(launch_msg_ptr->cpus_per_node), + &uint32_tmp, + buffer); + if (launch_msg_ptr->num_cpu_groups != uint32_tmp) + goto unpack_error; + safe_unpack32_array((uint32_t **) &(launch_msg_ptr->cpu_count_reps), + &uint32_tmp, + buffer); + if (launch_msg_ptr->num_cpu_groups != uint32_tmp) + goto unpack_error; + + safe_unpackstr_xmalloc(&launch_msg_ptr->nodes, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&launch_msg_ptr->script, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&launch_msg_ptr->work_dir, &uint16_tmp, + buffer); + + safe_unpackstr_xmalloc(&launch_msg_ptr->err, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&launch_msg_ptr->in, &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&launch_msg_ptr->out, &uint16_tmp, buffer); + + safe_unpack16(&launch_msg_ptr->argc, buffer); + safe_unpackstr_array(&launch_msg_ptr->argv, + &launch_msg_ptr->argc, buffer); + + safe_unpack16(&launch_msg_ptr->envc, buffer); + safe_unpackstr_array(&launch_msg_ptr->environment, + &launch_msg_ptr->envc, buffer); + + if (!(launch_msg_ptr->cred = slurm_cred_unpack(buffer))) + goto unpack_error; + + if (select_g_alloc_jobinfo (&launch_msg_ptr->select_jobinfo) + || select_g_unpack_jobinfo(launch_msg_ptr->select_jobinfo, buffer)) + goto unpack_error; + + return SLURM_SUCCESS; + +unpack_error: + slurm_free_job_launch_msg(launch_msg_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_job_id_request_msg(job_id_request_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_pid, buffer); +} + +static int +_unpack_job_id_request_msg(job_id_request_msg_t ** msg, Buf buffer) +{ + job_id_request_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg != NULL); + tmp_ptr = xmalloc(sizeof(job_id_request_msg_t)); + *msg = tmp_ptr; + + /* load the data values */ + safe_unpack32(&tmp_ptr->job_pid, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_job_id_response_msg(job_id_response_msg_t * msg, Buf buffer) +{ + xassert(msg != NULL); + + pack32((uint32_t)msg->job_id, buffer); + pack32((uint32_t)msg->return_code, buffer); +} + +static int +_unpack_job_id_response_msg(job_id_response_msg_t ** msg, Buf buffer) +{ + job_id_response_msg_t *tmp_ptr; + + /* alloc memory for structure */ + xassert(msg != NULL); + tmp_ptr = xmalloc(sizeof(job_id_response_msg_t)); + *msg = tmp_ptr; + + /* load the data values */ + safe_unpack32(&tmp_ptr->job_id, buffer); + safe_unpack32(&tmp_ptr->return_code, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(tmp_ptr); + *msg = NULL; + return SLURM_ERROR; +} + +static void +_pack_srun_ping_msg(srun_ping_msg_t * msg, Buf buffer) +{ + xassert ( msg != NULL ); + + pack32((uint32_t)msg ->job_id , buffer ) ; + pack32((uint32_t)msg ->step_id , buffer ) ; +} + +static int +_unpack_srun_ping_msg(srun_ping_msg_t ** msg_ptr, Buf buffer) +{ + srun_ping_msg_t * msg; + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof (srun_ping_msg_t) ) ; + *msg_ptr = msg; + + safe_unpack32(&msg->job_id , buffer ) ; + safe_unpack32(&msg->step_id , buffer ) ; + return SLURM_SUCCESS; + +unpack_error: + *msg_ptr = NULL; + xfree(msg); + return SLURM_ERROR; +} + +static void +_pack_srun_node_fail_msg(srun_node_fail_msg_t * msg, Buf buffer) +{ + xassert ( msg != NULL ); + + pack32((uint32_t)msg->job_id , buffer ) ; + pack32((uint32_t)msg->step_id , buffer ) ; + packstr(msg->nodelist, buffer ) ; +} + +static int +_unpack_srun_node_fail_msg(srun_node_fail_msg_t ** msg_ptr, Buf buffer) +{ + uint16_t uint16_tmp; + srun_node_fail_msg_t * msg; + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof (srun_node_fail_msg_t) ) ; + *msg_ptr = msg; + + safe_unpack32(&msg->job_id , buffer ) ; + safe_unpack32(&msg->step_id , buffer ) ; + safe_unpackstr_xmalloc ( & msg->nodelist, &uint16_tmp, buffer); + + return SLURM_SUCCESS; + +unpack_error: + *msg_ptr = NULL; + xfree( msg->nodelist ); + xfree( msg ); + return SLURM_ERROR; +} + +static void +_pack_job_ready_msg(job_id_msg_t * msg, Buf buffer) +{ + xassert ( msg != NULL ); + + pack32((uint32_t)msg->job_id , buffer ) ; +} + +static int +_unpack_job_ready_msg(job_id_msg_t ** msg_ptr, Buf buffer) +{ + job_id_msg_t * msg; + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof (job_id_msg_t) ); + *msg_ptr = msg ; + + safe_unpack32(&msg->job_id , buffer ) ; + return SLURM_SUCCESS; + +unpack_error: + *msg_ptr = NULL; + xfree(msg); + return SLURM_ERROR; +} + +static void +_pack_srun_timeout_msg(srun_timeout_msg_t * msg, Buf buffer) +{ + xassert ( msg != NULL ); + + pack32((uint32_t)msg->job_id, buffer ) ; + pack32((uint32_t)msg->step_id , buffer ) ; + pack_time ( msg -> timeout, buffer ); +} + +static int +_unpack_srun_timeout_msg(srun_timeout_msg_t ** msg_ptr, Buf buffer) +{ + srun_timeout_msg_t * msg; + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof (srun_timeout_msg_t) ) ; + *msg_ptr = msg ; + + safe_unpack32(&msg->job_id, buffer ) ; + safe_unpack32(&msg->step_id, buffer ) ; + safe_unpack_time (&msg->timeout, buffer ); + return SLURM_SUCCESS; + +unpack_error: + *msg_ptr = NULL; + xfree(msg); + return SLURM_ERROR; +} + +static void _pack_suspend_msg(suspend_msg_t *msg, Buf buffer) +{ + xassert ( msg != NULL ); + + pack16((uint16_t)msg -> op, buffer ) ; + pack32((uint32_t)msg->job_id, buffer ) ; +} + +static int _unpack_suspend_msg(suspend_msg_t **msg_ptr, Buf buffer) +{ + suspend_msg_t * msg; + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof (suspend_msg_t) ); + *msg_ptr = msg ; + + safe_unpack16(&msg->op , buffer ) ; + safe_unpack32(&msg->job_id , buffer ) ; + return SLURM_SUCCESS; + +unpack_error: + *msg_ptr = NULL; + xfree(msg); + return SLURM_ERROR; +} + + +static void +_pack_checkpoint_msg(checkpoint_msg_t *msg, Buf buffer) +{ + xassert ( msg != NULL ); + + pack16((uint16_t)msg->op, buffer ) ; + pack16((uint16_t)msg->data, buffer ) ; + pack32((uint32_t)msg->job_id, buffer ) ; + pack32((uint32_t)msg->step_id, buffer ) ; +} + +static int +_unpack_checkpoint_msg(checkpoint_msg_t **msg_ptr, Buf buffer) +{ + checkpoint_msg_t * msg; + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof (checkpoint_msg_t) ) ; + *msg_ptr = msg ; + + safe_unpack16(&msg->op, buffer ) ; + safe_unpack16(&msg->data, buffer ) ; + safe_unpack32(&msg->job_id, buffer ) ; + safe_unpack32(&msg->step_id, buffer ) ; + return SLURM_SUCCESS; + +unpack_error: + *msg_ptr = NULL; + xfree(msg); + return SLURM_ERROR; +} + +static void +_pack_checkpoint_comp(checkpoint_comp_msg_t *msg, Buf buffer) +{ + xassert ( msg != NULL ); + + pack32((uint32_t)msg -> job_id, buffer ) ; + pack32((uint32_t)msg -> step_id, buffer ) ; + pack32((uint32_t)msg -> error_code, buffer ) ; + packstr ( msg -> error_msg, buffer ) ; + pack_time ( msg -> begin_time, buffer ) ; +} + +static int +_unpack_checkpoint_comp(checkpoint_comp_msg_t **msg_ptr, Buf buffer) +{ + uint16_t uint16_tmp; + checkpoint_comp_msg_t * msg; + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof (checkpoint_comp_msg_t) ); + *msg_ptr = msg ; + + safe_unpack32(& msg -> job_id , buffer ) ; + safe_unpack32(& msg -> step_id , buffer ) ; + safe_unpack32(& msg -> error_code , buffer ) ; + safe_unpackstr_xmalloc ( & msg -> error_msg, & uint16_tmp , buffer ) ; + safe_unpack_time ( & msg -> begin_time , buffer ) ; + return SLURM_SUCCESS; + +unpack_error: + *msg_ptr = NULL; + xfree (msg->error_msg); + xfree (msg); + return SLURM_ERROR; +} + +static void +_pack_checkpoint_resp_msg(checkpoint_resp_msg_t *msg, Buf buffer) +{ + xassert ( msg != NULL ); + + pack_time ( msg -> event_time, buffer ) ; + pack32((uint32_t)msg -> error_code, buffer ) ; + packstr ( msg -> error_msg, buffer ) ; +} + +static int +_unpack_checkpoint_resp_msg(checkpoint_resp_msg_t **msg_ptr, Buf buffer) +{ + checkpoint_resp_msg_t * msg; + uint16_t uint16_tmp; + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof (checkpoint_resp_msg_t) ) ; + *msg_ptr = msg ; + + safe_unpack_time ( & msg -> event_time, buffer ) ; + safe_unpack32(& msg -> error_code , buffer ) ; + safe_unpackstr_xmalloc ( & msg -> error_msg, & uint16_tmp , buffer ) ; + return SLURM_SUCCESS; + +unpack_error: + *msg_ptr = NULL; + xfree(msg); + return SLURM_ERROR; +} + +static void _pack_file_bcast(file_bcast_msg_t * msg , Buf buffer ) +{ + int buf_size = 1024, i; + xassert ( msg != NULL ); + + for (i=0; iblock_len[i]; + grow_buf(buffer, buf_size); + + pack16 ( msg->block_no, buffer ); + pack16 ( msg->last_block, buffer ); + pack16 ( msg->force, buffer ); + pack16 ( msg->modes, buffer ); + + pack32 ( msg->uid, buffer ); + pack32 ( msg->gid, buffer ); + + pack_time ( msg->atime, buffer ); + pack_time ( msg->mtime, buffer ); + + packstr ( msg->fname, buffer ); + for (i=0; iblock_len[i], buffer ); + packmem ( msg->block[i], msg->block_len[i], buffer ); + } +} + +static int _unpack_file_bcast(file_bcast_msg_t ** msg_ptr , Buf buffer ) +{ + int i; + uint16_t uint16_tmp; + file_bcast_msg_t *msg ; + + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof (file_bcast_msg_t) ) ; + *msg_ptr = msg; + + safe_unpack16 ( & msg->block_no, buffer ); + safe_unpack16 ( & msg->last_block, buffer ); + safe_unpack16 ( & msg->force, buffer ); + safe_unpack16 ( & msg->modes, buffer ); + + safe_unpack32 ( & msg->uid, buffer ); + safe_unpack32 ( & msg->gid, buffer ); + + safe_unpack_time ( & msg->atime, buffer ); + safe_unpack_time ( & msg->mtime, buffer ); + + safe_unpackstr_xmalloc ( & msg->fname, &uint16_tmp, buffer ); + for (i=0; iblock_len[i], buffer ); + safe_unpackmem_xmalloc ( & msg->block[i], &uint16_tmp , buffer ) ; + if ( uint16_tmp != msg->block_len[i] ) + goto unpack_error; + } + return SLURM_SUCCESS; + +unpack_error: + xfree( msg -> fname ); + for (i=0; i block[i] ); + xfree( msg ); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void _pack_kvs_rec(struct kvs_comm *msg_ptr, Buf buffer) +{ + int i; + xassert(msg_ptr != NULL); + + packstr(msg_ptr->kvs_name, buffer); + pack16((uint16_t)msg_ptr->kvs_cnt, buffer); + for (i=0; ikvs_cnt; i++) { + packstr(msg_ptr->kvs_keys[i], buffer); + packstr(msg_ptr->kvs_values[i], buffer); + } +} +static int _unpack_kvs_rec(struct kvs_comm **msg_ptr, Buf buffer) +{ + uint16_t uint16_tmp; + int i; + struct kvs_comm *msg; + + msg = xmalloc(sizeof(struct kvs_comm)); + *msg_ptr = msg; + safe_unpackstr_xmalloc(&msg->kvs_name, &uint16_tmp, buffer); + safe_unpack16(&msg->kvs_cnt, buffer); + msg->kvs_keys = xmalloc(sizeof(char *) * msg->kvs_cnt); + msg->kvs_values = xmalloc(sizeof(char *) * msg->kvs_cnt); + for (i=0; ikvs_cnt; i++) { + safe_unpackstr_xmalloc(&msg->kvs_keys[i], + &uint16_tmp, buffer); + safe_unpackstr_xmalloc(&msg->kvs_values[i], + &uint16_tmp, buffer); + } + return SLURM_SUCCESS; + +unpack_error: + return SLURM_ERROR; +} +static void _pack_kvs_data(struct kvs_comm_set *msg_ptr, Buf buffer) +{ + int i; + xassert(msg_ptr != NULL); + + pack16((uint16_t)msg_ptr->task_id, buffer); + pack16((uint16_t)msg_ptr->kvs_comm_recs, buffer); + for (i=0; ikvs_comm_recs; i++) + _pack_kvs_rec(msg_ptr->kvs_comm_ptr[i], buffer); +} + +static int _unpack_kvs_data(struct kvs_comm_set **msg_ptr, Buf buffer) +{ + struct kvs_comm_set *msg; + int i, j; + + msg = xmalloc(sizeof(struct kvs_comm_set)); + *msg_ptr = msg; + safe_unpack16(&msg->task_id, buffer); + safe_unpack16(&msg->kvs_comm_recs, buffer); + msg->kvs_comm_ptr = xmalloc(sizeof(struct kvs_comm) * + msg->kvs_comm_recs); + for (i=0; ikvs_comm_recs; i++) { + if (_unpack_kvs_rec(&msg->kvs_comm_ptr[i], buffer)) + goto unpack_error; + } + return SLURM_SUCCESS; + +unpack_error: + for (i=0; ikvs_comm_recs; i++) { + xfree(msg->kvs_comm_ptr[i]->kvs_name); + for (j=0; jkvs_comm_ptr[i]->kvs_cnt; j++) { + xfree(msg->kvs_comm_ptr[i]->kvs_keys[j]); + xfree(msg->kvs_comm_ptr[i]->kvs_values[j]); + } + } + xfree(msg->kvs_comm_ptr); + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +static void _pack_kvs_get(kvs_get_msg_t *msg_ptr, Buf buffer) +{ + pack16((uint16_t)msg_ptr->task_id, buffer); + pack16((uint16_t)msg_ptr->size, buffer); + pack16((uint16_t)msg_ptr->port, buffer); + packstr(msg_ptr->hostname, buffer); +} + +static int _unpack_kvs_get(kvs_get_msg_t **msg_ptr, Buf buffer) +{ + uint16_t uint16_tmp; + kvs_get_msg_t *msg; + + msg = xmalloc(sizeof(struct kvs_get_msg)); + *msg_ptr = msg; + safe_unpack16(&msg->task_id, buffer); + safe_unpack16(&msg->size, buffer); + safe_unpack16(&msg->port, buffer); + safe_unpackstr_xmalloc(&msg->hostname, &uint16_tmp, buffer); + return SLURM_SUCCESS; + +unpack_error: + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; +} + +/* template + void pack_ ( * msg , Buf buffer ) + { + xassert ( msg != NULL ); + + pack16( msg -> , buffer ) ; + pack32((uint32_t)msg -> , buffer ) ; + packstr ( msg -> , buffer ) ; + } + + int unpack_ ( ** msg_ptr , Buf buffer ) + { + uint16_t uint16_tmp; + * msg ; + + xassert ( msg_ptr != NULL ); + + msg = xmalloc ( sizeof ( ) ) ; + *msg_ptr = msg; + + safe_unpack16( & msg -> , buffer ) ; + safe_unpack32(& msg -> , buffer ) ; + safe_unpackstr_xmalloc ( & msg -> x, & uint16_tmp , buffer ) ; + return SLURM_SUCCESS; + + unpack_error: + xfree(msg -> x); + xfree(msg); + *msg_ptr = NULL; + return SLURM_ERROR; + } +*/ diff --git a/executable_names/src/common/slurm_protocol_pack.h b/executable_names/src/common/slurm_protocol_pack.h new file mode 100644 index 0000000000000000000000000000000000000000..f8315942dbf115305ab54f8371b5a96d7d158565 --- /dev/null +++ b/executable_names/src/common/slurm_protocol_pack.h @@ -0,0 +1,141 @@ +/****************************************************************************\ + * slurm_protocol_pack.h - definitions for all pack and unpack functions + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PROTOCOL_PACK_H +#define _SLURM_PROTOCOL_PACK_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +#include "src/common/pack.h" +#include "src/common/slurm_protocol_defs.h" + +/****************************/ +/* Message header functions */ +/****************************/ + +/* pack_header + * packs a slurm protocol header that proceeds every slurm message + * IN header - the header structure to pack + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + */ +extern void pack_header ( header_t * header , Buf buffer ); + +/* unpack_header + * unpacks a slurm protocol header that proceeds every slurm message + * OUT header - the header structure to unpack + * IN/OUT buffer - source of the unpack data, contains pointers that are + * automatically updated + * RET 0 or error code + */ +extern int unpack_header ( header_t * header , Buf buffer ); + + +/**************************************************************************/ +/* generic case statement Pack / Unpack methods for slurm protocol bodies */ +/**************************************************************************/ + +/* pack_msg + * packs a generic slurm protocol message body + * IN msg - the body structure to pack (note: includes message type) + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + * RET 0 or error code + */ +extern int pack_msg ( slurm_msg_t const * msg , Buf buffer ); + +/* unpack_msg + * unpacks a generic slurm protocol message body + * OUT msg - the body structure to unpack (note: includes message type) + * IN/OUT buffer - source of the unpack, contains pointers that are + * automatically updated + * RET 0 or error code + */ +extern int unpack_msg ( slurm_msg_t * msgi , Buf buffer ); + +/***************************************************************************/ +/* specific case statement Pack / Unpack methods for slurm protocol bodies */ +/***************************************************************************/ + +/* pack_job_credential + * packs a slurm job credential + * IN cred - pointer to the credential + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + */ +/* void pack_job_credential ( slurm_job_credential_t* cred , Buf buffer ) ;*/ + +/* unpack_job_credential + * unpacks a slurm job credential + * OUT cred - pointer to the credential pointer + * IN/OUT buffer - source of the unpack, contains pointers that are + * automatically updated + * RET 0 or error code + */ +/* int unpack_job_credential( slurm_job_credential_t** cred , Buf buffer ) ;*/ + +/* pack_job_step_info + * packs a slurm job steps info + * IN step - pointer to the job step info + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + */ +/* void pack_job_step_info ( job_step_info_t* step, Buf buffer ); */ + +/* pack_job_step_info_members + * pack selected fields of the description of a job into a buffer + * IN job_id, step_id, user_id, start_time, partition, nodes - job info + * IN/OUT buffer - destination of the pack, contains pointers that are + * automatically updated + */ +/* void pack_job_step_info_members( uint32_t job_id, uint16_t step_id, */ +/* uint32_t user_id, uint32_t num_tasks, time_t start_time, */ +/* char *partition, char *nodes, char *name, char *network, */ +/* Buf buffer ); */ + +#endif diff --git a/executable_names/src/common/slurm_protocol_socket_common.h b/executable_names/src/common/slurm_protocol_socket_common.h new file mode 100644 index 0000000000000000000000000000000000000000..cdb6794f2224ef3f40d3d5d4baa51344b440f384 --- /dev/null +++ b/executable_names/src/common/slurm_protocol_socket_common.h @@ -0,0 +1,84 @@ +/*****************************************************************************\ + * slurm_protocol_socket_common.h - slurm communications interface + * definitions based upon sockets + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PROTOCOL_SOCKET_COMMON_H +#define _SLURM_PROTOCOL_SOCKET_COMMON_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +#include + +#define AF_SLURM AF_INET +#define SLURM_INADDR_ANY 0x00000000 + +/* LINUX SPECIFIC */ +/* this is the slurm equivalent of the operating system file descriptor, + * which in linux is just an int */ +typedef int32_t slurm_fd ; + +/* this is the slurm equivalent of the BSD sockets sockaddr + * also defined in slurm/slurm.h for users */ +#ifndef __slurm_addr_defined +# define __slurm_addr_defined + typedef struct sockaddr_in slurm_addr ; +#endif + +/* this is the slurm equivalent of the BSD sockets fd_set */ +typedef fd_set slurm_fd_set ; +typedef fd_set _slurm_fd_set ; +/*{ + int16_t family ; + uint16_t port ; + uint32_t address ; + char pad[16 - sizeof ( int16_t ) - sizeof (uint16_t) - + sizeof (uint32_t) ] ; +} ; +*/ + +#endif diff --git a/executable_names/src/common/slurm_protocol_socket_implementation.c b/executable_names/src/common/slurm_protocol_socket_implementation.c new file mode 100644 index 0000000000000000000000000000000000000000..d5586eb277e6193b245bb5915c59729646a3a60b --- /dev/null +++ b/executable_names/src/common/slurm_protocol_socket_implementation.c @@ -0,0 +1,834 @@ +/*****************************************************************************\ + * slurm_protocol_socket_implementation.c - slurm communications interfaces + * based upon sockets. + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#define _USE_IRS 1 /* Required for AIX and hstrerror() */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if HAVE_SYS_SOCKET_H +# include +#else +# if HAVE_SOCKET_H +# include +# endif +#endif + +#include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_protocol_interface.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/log.h" +#include "src/common/fd.h" +#include "src/common/xsignal.h" +#include "src/common/xmalloc.h" +#include "src/common/util-net.h" + +#define PORT_RETRIES 2 +#define MIN_USER_PORT (IPPORT_RESERVED + 1) +#define MAX_USER_PORT 0xffff +#define RANDOM_USER_PORT ((uint16_t) ((lrand48() % \ + (MAX_USER_PORT - MIN_USER_PORT + 1)) + MIN_USER_PORT)) + +/* + * Maximum message size. Messages larger than this value (in bytes) + * will not be received. + */ +#define MAX_MSG_SIZE (1024*1024) + +/**************************************************************** + * MIDDLE LAYER MSG FUNCTIONS + ****************************************************************/ + +/* + * Return time in msec since "start time" + */ +static int _tot_wait (struct timeval *start_time) +{ + struct timeval end_time; + int msec_delay; + + gettimeofday(&end_time, NULL); + msec_delay = (end_time.tv_sec - start_time->tv_sec ) * 1000; + msec_delay += ((end_time.tv_usec - start_time->tv_usec + 500) / 1000); + return msec_delay; +} + +slurm_fd _slurm_init_msg_engine ( slurm_addr * slurm_address ) +{ + return _slurm_listen_stream ( slurm_address ) ; +} + +slurm_fd _slurm_open_msg_conn ( slurm_addr * slurm_address ) +{ + return _slurm_open_stream ( slurm_address, false ) ; +} + +slurm_fd _slurm_accept_msg_conn (slurm_fd fd, slurm_addr *addr) +{ + return _slurm_accept_stream(fd, addr); +} + +/* + * Pick a random port number to use. Use this if the system + * selected port can't connect. This may indicate that the + * port/address of both the client and server match a defunct + * socket record in TIME_WAIT state. + */ +static void _sock_bind_wild(int sockfd) +{ + int rc, retry; + slurm_addr sin; + static bool seeded = false; + + if (!seeded) { + seeded = true; + srand48((long int) (time(NULL) + getpid())); + } + + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(INADDR_ANY); + sin.sin_port = htons(RANDOM_USER_PORT); + + for (retry=0; retry < PORT_RETRIES ; retry++) { + rc = bind(sockfd, (struct sockaddr *) &sin, sizeof(sin)); + if (rc >= 0) + break; + sin.sin_port = htons(RANDOM_USER_PORT); + } + return; +} + +/* + * This would be a no-op in a message implementation + */ +int _slurm_close_accepted_conn (slurm_fd fd) +{ + return _slurm_close (fd); +} + +ssize_t _slurm_msg_recvfrom(slurm_fd fd, char **pbuf, size_t *lenp, + uint32_t flags) +{ + return _slurm_msg_recvfrom_timeout(fd, pbuf, lenp, flags, + (slurm_get_msg_timeout() * 1000)); +} + +ssize_t _slurm_msg_recvfrom_timeout(slurm_fd fd, char **pbuf, size_t *lenp, + uint32_t flags, int tmout) +{ + ssize_t len; + uint32_t msglen; + + len = _slurm_recv_timeout( fd, (char *)&msglen, + sizeof(msglen), 0, tmout ); + + if (len < ((ssize_t) sizeof(msglen))) + return SLURM_ERROR; + + msglen = ntohl(msglen); + + if (msglen > MAX_MSG_SIZE) + slurm_seterrno_ret(SLURM_PROTOCOL_INSANE_MSG_LENGTH); + + /* + * Allocate memory on heap for message + */ + *pbuf = xmalloc(msglen); + + if (_slurm_recv_timeout(fd, *pbuf, msglen, 0, tmout) != msglen) { + xfree(*pbuf); + *pbuf = NULL; + return SLURM_ERROR; + } + + *lenp = msglen; + + return (ssize_t) msglen; +} + +ssize_t _slurm_msg_sendto(slurm_fd fd, char *buffer, size_t size, + uint32_t flags) +{ + return _slurm_msg_sendto_timeout( fd, buffer, size, flags, + (slurm_get_msg_timeout() * 1000)); +} + +ssize_t _slurm_msg_sendto_timeout(slurm_fd fd, char *buffer, size_t size, + uint32_t flags, int timeout) +{ + size_t len; + uint32_t usize; + SigFunc *ohandler; + + /* + * Ignore SIGPIPE so that send can return a error code if the + * other side closes the socket + */ + ohandler = xsignal(SIGPIPE, SIG_IGN); + + usize = htonl(size); + + if ((len = _slurm_send_timeout( + fd, (char *)&usize, sizeof(usize), 0, + timeout)) < 0) + goto done; + + if ((len = _slurm_send_timeout(fd, buffer, size, 0, timeout)) < 0) + goto done; + + + done: + xsignal(SIGPIPE, ohandler); + return len; +} + +/* Send slurm message with timeout + * RET message size (as specified in argument) or SLURM_ERROR on error */ +int _slurm_send_timeout(slurm_fd fd, char *buf, size_t size, + uint32_t flags, int timeout) +{ + int rc; + int sent = 0; + int fd_flags; + struct pollfd ufds; + struct timeval tstart; + int timeleft = timeout; + + ufds.fd = fd; + ufds.events = POLLOUT; + + fd_flags = _slurm_fcntl(fd, F_GETFL); + fd_set_nonblocking(fd); + + gettimeofday(&tstart, NULL); + + while (sent < size) { + + timeleft = timeout - _tot_wait(&tstart); + if (timeleft <= 0) { + debug("_slurm_send_timeout at %d of %d, timeout", + sent, size); + slurm_seterrno(SLURM_PROTOCOL_SOCKET_IMPL_TIMEOUT); + sent = SLURM_ERROR; + goto done; + } + if ((rc = poll(&ufds, 1, timeleft)) <= 0) { + if ((rc == 0) || (errno == EINTR) || (errno == EAGAIN)) + continue; + else { + debug("_slurm_send_timeout at %d of %d, " + "poll error: %s", + sent, size, strerror(errno)); + slurm_seterrno(SLURM_COMMUNICATIONS_SEND_ERROR); + sent = SLURM_ERROR; + goto done; + } + } + rc = _slurm_send(fd, &buf[sent], (size - sent), flags); + if (rc < 0) { + if (errno == EINTR) + continue; + else { + debug("_slurm_send_timeout at %d of %d, " + "send error: %s", + sent, size, strerror(errno)); + slurm_seterrno(SLURM_COMMUNICATIONS_SEND_ERROR); + sent = SLURM_ERROR; + goto done; + } + } + if (rc == 0) { + debug("_slurm_send_timeout at %d of %d, " + "sent zero bytes", sent, size); + slurm_seterrno(SLURM_PROTOCOL_SOCKET_ZERO_BYTES_SENT); + sent = SLURM_ERROR; + goto done; + } + + sent += rc; + } + + done: + /* Reset fd flags to prior state, preserve errno */ + if (fd_flags != SLURM_PROTOCOL_ERROR) { + int slurm_err = slurm_get_errno(); + _slurm_fcntl(fd , F_SETFL , fd_flags); + slurm_seterrno(slurm_err); + } + + return sent; + +} + +/* Get slurm message with timeout + * RET message size (as specified in argument) or SLURM_ERROR on error */ +int _slurm_recv_timeout(slurm_fd fd, char *buffer, size_t size, + uint32_t flags, int timeout ) +{ + int rc; + int recvlen = 0; + int fd_flags; + struct pollfd ufds; + struct timeval tstart; + int timeleft = timeout; + + ufds.fd = fd; + ufds.events = POLLIN; + + fd_flags = _slurm_fcntl(fd, F_GETFL); + fd_set_nonblocking(fd); + + gettimeofday(&tstart, NULL); + + while (recvlen < size) { + + timeleft = timeout - _tot_wait(&tstart); + if (timeleft <= 0) { + debug("_slurm_recv_timeout at %d of %d, timeout", + recvlen, size); + slurm_seterrno(SLURM_PROTOCOL_SOCKET_IMPL_TIMEOUT); + recvlen = SLURM_ERROR; + goto done; + } + + if ((rc = poll(&ufds, 1, timeleft)) <= 0) { + if ((errno == EINTR) || (errno == EAGAIN) || (rc == 0)) + continue; + else { + debug("_slurm_recv_timeout at %d of %d, " + "poll error: %s", + recvlen, size, strerror(errno)); + slurm_seterrno( + SLURM_COMMUNICATIONS_RECEIVE_ERROR); + recvlen = SLURM_ERROR; + goto done; + } + } + rc = _slurm_recv(fd, &buffer[recvlen], (size - recvlen), flags); + if (rc < 0) { + if (errno == EINTR) + continue; + else { + debug("_slurm_recv_timeout at %d of %d, " + "recv error: %s", + recvlen, size, strerror(errno)); + slurm_seterrno( + SLURM_COMMUNICATIONS_RECEIVE_ERROR); + recvlen = SLURM_ERROR; + goto done; + } + } + if (rc == 0) { + debug("_slurm_recv_timeout at %d of %d, " + "recv zero bytes", recvlen, size); + slurm_seterrno(SLURM_PROTOCOL_SOCKET_ZERO_BYTES_SENT); + recvlen = SLURM_ERROR; + goto done; + } + recvlen += rc; + } + + + done: + /* Reset fd flags to prior state, preserve errno */ + if (fd_flags != SLURM_PROTOCOL_ERROR) { + int slurm_err = slurm_get_errno(); + _slurm_fcntl(fd , F_SETFL , fd_flags); + slurm_seterrno(slurm_err); + } + + return recvlen; +} + +int _slurm_shutdown_msg_engine ( slurm_fd open_fd ) +{ + return _slurm_close ( open_fd ) ; +} + +slurm_fd _slurm_listen_stream(slurm_addr *addr) +{ + int rc; + slurm_fd fd; + const int one = 1; + const size_t sz1 = sizeof(one); + + if ((fd = _slurm_create_socket(SLURM_STREAM)) < 0) { + error("Error creating slurm stream socket: %m"); + return fd; + } + + rc = _slurm_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sz1); + if (rc < 0) { + error("setsockopt SO_REUSEADDR failed: %m"); + goto error; + } + + rc = _slurm_bind(fd, (struct sockaddr const *) addr, sizeof(*addr)); + if (rc < 0) { + error("Error binding slurm stream socket: %m"); + goto error; + } + + if (_slurm_listen(fd, SLURM_PROTOCOL_DEFAULT_LISTEN_BACKLOG) < 0) { + error( "Error listening on slurm stream socket: %m" ) ; + rc = SLURM_ERROR; + goto error; + } + + return fd; + + error: + if ((_slurm_close_stream(fd) < 0) && (errno == EINTR)) + _slurm_close_stream(fd); /* try again */ + return rc; + +} + +slurm_fd _slurm_accept_stream(slurm_fd fd, slurm_addr *addr) +{ + socklen_t len = sizeof(slurm_addr); + return _slurm_accept(fd, (struct sockaddr *)addr, &len); +} + +slurm_fd _slurm_open_stream(slurm_addr *addr, bool retry) +{ + int retry_cnt; + slurm_fd fd; + + if ( (addr->sin_family == 0) || (addr->sin_port == 0) ) + return SLURM_SOCKET_ERROR; + + for (retry_cnt=0; ; retry_cnt++) { + int rc; + if ((fd =_slurm_create_socket(SLURM_STREAM)) < 0) { + error("Error creating slurm stream socket: %m"); + slurm_seterrno(errno); + return SLURM_SOCKET_ERROR; + } + + if (retry_cnt) { + if (retry_cnt == 1) + debug3("Error connecting, picking new stream port"); + _sock_bind_wild(fd); + } + + rc = _slurm_connect(fd, (struct sockaddr const *)addr, sizeof(*addr)); + if (rc >= 0) /* success */ + break; + if ((errno != ECONNREFUSED) || + (!retry) || (retry_cnt >= PORT_RETRIES)) { + slurm_seterrno(errno); + goto error; + } + + if ((_slurm_close_stream(fd) < 0) && (errno == EINTR)) + _slurm_close_stream(fd); /* try again */ + } + + return fd; + + error: + debug2("Error connecting slurm stream socket: %m"); + if ((_slurm_close_stream(fd) < 0) && (errno == EINTR)) + _slurm_close_stream(fd); /* try again */ + return SLURM_SOCKET_ERROR; +} + +int _slurm_get_stream_addr(slurm_fd fd, slurm_addr *addr ) +{ + socklen_t size = sizeof(addr); + return _slurm_getsockname(fd, (struct sockaddr *)addr, &size); +} + +int _slurm_close_stream ( slurm_fd open_fd ) +{ + return _slurm_close ( open_fd ) ; +} + + +int _slurm_set_stream_non_blocking(slurm_fd fd) +{ + fd_set_nonblocking(fd); + return SLURM_SUCCESS; +} + +int _slurm_set_stream_blocking(slurm_fd fd) +{ + fd_set_blocking(fd); + return SLURM_SUCCESS; +} + +extern int _slurm_socket (int __domain, int __type, int __protocol) +{ + return socket ( __domain, __type, __protocol ) ; +} + +extern slurm_fd _slurm_create_socket ( slurm_socket_type_t type ) +{ + switch ( type ) + { + case SLURM_STREAM : + return _slurm_socket ( AF_INET, SOCK_STREAM, + IPPROTO_TCP) ; + break; + case SLURM_MESSAGE : + return _slurm_socket ( AF_INET, SOCK_DGRAM, + IPPROTO_UDP ) ; + break; + default : + return SLURM_SOCKET_ERROR; + } +} + +/* Create two new sockets, of type TYPE in domain DOMAIN and using + * protocol PROTOCOL, which are connected to each other, and put file + * descriptors for them in FDS[0] and FDS[1]. If PROTOCOL is zero, + * one will be chosen automatically. Returns 0 on success, -1 for errors. */ +extern int _slurm_socketpair (int __domain, int __type, + int __protocol, int __fds[2]) +{ + return SLURM_PROTOCOL_FUNCTION_NOT_IMPLEMENTED ; +} + +/* Give the socket FD the local address ADDR (which is LEN bytes long). */ +extern int _slurm_bind (int __fd, struct sockaddr const * __addr, + socklen_t __len) +{ + return bind ( __fd , __addr , __len ) ; +} + +/* Put the local address of FD into *ADDR and its length in *LEN. */ +extern int _slurm_getsockname (int __fd, struct sockaddr * __addr, + socklen_t *__restrict __len) +{ + return getsockname ( __fd , __addr , __len ) ; +} + +/* Open a connection on socket FD to peer at ADDR (which LEN bytes long). + * For connectionless socket types, just set the default address to send to + * and the only address from which to accept transmissions. + * Return 0 on success, -1 for errors. */ +extern int _slurm_connect (int __fd, struct sockaddr const * __addr, + socklen_t __len) +{ +#if 0 + return connect ( __fd , __addr , __len ) ; +#else + /* From "man connect": Note that for IP sockets the timeout + * may be very long when syncookies are enabled on the server. + * + * Timeouts in excess of 3 minutes have been observed, resulting + * in serious problems for slurmctld. Making the connect call + * non-blocking and polling seems to fix the problem. */ + int rc = -1, flags; + + flags = fcntl(__fd, F_GETFL); + fcntl(__fd, F_SETFL, flags | O_NONBLOCK); + rc = connect(__fd , __addr , __len); + if ((rc == -1) && (errno == EINPROGRESS)) { + int poll_rc; + struct pollfd ufds; + ufds.fd = __fd; + ufds.events = POLLIN | POLLOUT; + ufds.revents = 0; + poll_rc = poll(&ufds, 1, 5000); + if (poll_rc == 0) + errno = ETIMEDOUT; + else if (poll_rc == 1) + rc = 0; + } + fcntl(__fd, F_SETFL, flags); + return rc; +#endif +} + +/* Put the address of the peer connected to socket FD into *ADDR + * (which is *LEN bytes long), and its actual length into *LEN. */ +extern int _slurm_getpeername (int __fd, struct sockaddr * __addr, + socklen_t *__restrict __len) +{ + return getpeername ( __fd , __addr , __len ) ; +} + +/* Send N bytes of BUF to socket FD. Returns the number sent or -1. */ +extern ssize_t _slurm_send (int __fd, __const void *__buf, size_t __n, + int __flags) +{ + return send ( __fd , __buf , __n , __flags ) ; +} + +/* Read N bytes into BUF from socket FD. + * Returns the number read or -1 for errors. */ +extern ssize_t _slurm_recv (int __fd, void *__buf, size_t __n, int __flags) +{ + return recv ( __fd , __buf , __n , __flags ) ; +} + +/* Send N bytes of BUF on socket FD to peer at address ADDR (which is + * ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */ +extern ssize_t _slurm_sendto (int __fd, __const void *__buf, size_t __n, int __flags, struct sockaddr const * __addr, + socklen_t __addr_len) +{ + return sendto ( __fd , __buf , __n , __flags , __addr, __addr_len) ; +} +/* Read N bytes into BUF through socket FD. + * If ADDR is not NULL, fill in *ADDR_LEN bytes of it with tha address of + * the sender, and store the actual size of the address in *ADDR_LEN. + * Returns the number of bytes read or -1 for errors. */ +extern ssize_t _slurm_recvfrom (int __fd, void *__restrict __buf, + size_t __n, int __flags, + struct sockaddr * __addr, + socklen_t *__restrict __addr_len) +{ + return recvfrom ( __fd , __buf , __n , __flags , __addr, __addr_len) ; +} + +/* Send a msg described MESSAGE on socket FD. + * Returns the number of bytes sent, or -1 for errors. */ +extern ssize_t _slurm_sendmsg (int __fd, __const struct msghdr *__msg, + int __flags) +{ + return sendmsg ( __fd , __msg , __flags ) ; +} + +/* Send a msg described MESSAGE on socket FD. + * Returns the number of bytes read or -1 for errors. */ +extern ssize_t _slurm_recvmsg (int __fd, struct msghdr *__msg, int __flags) +{ + return recvmsg ( __fd , __msg , __flags ); +} + +/* Put the current value for socket FD's option OPTNAME at protocol level LEVEL + * into OPTVAL (which is *OPTLEN bytes long), and set *OPTLEN to the value's + * actual length. Returns 0 on success, -1 for errors. */ +extern int _slurm_getsockopt (int __fd, int __level, int __optname, + void *__restrict __optval, + socklen_t *__restrict __optlen) +{ + return getsockopt ( __fd , __level , __optname , __optval , __optlen ) ; +} + +/* Set socket FD's option OPTNAME at protocol level LEVEL + * to *OPTVAL (which is OPTLEN bytes long). + * Returns 0 on success, -1 for errors. */ +extern int _slurm_setsockopt (int __fd, int __level, int __optname, + __const void *__optval, socklen_t __optlen) +{ + return setsockopt ( __fd , __level , __optname , __optval , __optlen ) ; +} + + +/* Prepare to accept connections on socket FD. + * N connection requests will be queued before further requests are refused. + * Returns 0 on success, -1 for errors. */ +extern int _slurm_listen (int __fd, int __n) +{ + return listen ( __fd , __n ) ; +} + +/* Await a connection on socket FD. + * When a connection arrives, open a new socket to communicate with it, + * set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting + * peer and *ADDR_LEN to the address's actual length, and return the + * new socket's descriptor, or -1 for errors. */ +extern int _slurm_accept (int __fd, struct sockaddr * __addr, + socklen_t *__restrict __addr_len) +{ + return accept ( __fd , __addr , __addr_len ) ; +} + +/* Shut down all or part of the connection open on socket FD. + * HOW determines what to shut down: + * SHUT_RD = No more receptions; + * SHUT_WR = No more transmissions; + * SHUT_RDWR = No more receptions or transmissions. + * Returns 0 on success, -1 for errors. */ +extern int _slurm_shutdown (int __fd, int __how) +{ + return shutdown ( __fd , __how ); +} + +extern int _slurm_close (int __fd ) +{ + return close ( __fd ) ; +} + +extern int _slurm_fcntl(int fd, int cmd, ... ) +{ + int rc ; + va_list va ; + + va_start ( va , cmd ) ; + rc =_slurm_vfcntl ( fd , cmd , va ) ; + va_end ( va ) ; + return rc ; +} + +extern int _slurm_vfcntl(int fd, int cmd, va_list va ) +{ + long arg ; + + switch ( cmd ) + { + case F_GETFL : + return fcntl ( fd , cmd ) ; + break ; + case F_SETFL : + arg = va_arg ( va , long ) ; + return fcntl ( fd , cmd , arg) ; + break ; + default : + return SLURM_PROTOCOL_ERROR ; + break ; + } +} + +/* sets the fields of a slurm_addr */ +void _slurm_set_addr_uint (slurm_addr *addr, uint16_t port, uint32_t ipaddr) +{ + addr->sin_family = AF_SLURM ; + addr->sin_port = htons(port); + addr->sin_addr.s_addr = htonl(ipaddr); +} + +/* resets the address field of a slurm_addr, port and family are unchanged */ +void _reset_slurm_addr (slurm_addr *addr, slurm_addr new_addr) +{ + addr->sin_addr.s_addr = new_addr.sin_addr.s_addr; +} + +void _slurm_set_addr_char (slurm_addr * addr, uint16_t port, char *host) +{ + struct hostent * he = NULL; + int h_err = 0; + char * h_buf[4096]; + + /* + * If NULL hostname passed in, we only update the port + * of addr + */ + addr->sin_family = AF_SLURM; + addr->sin_port = htons(port); + if (host == NULL) + return; + + he = get_host_by_name(host, (void *)&h_buf, sizeof(h_buf), &h_err); + + if (he != NULL) + memcpy (&addr->sin_addr.s_addr, he->h_addr, he->h_length); + else { + error("Unable to resolve \"%s\": %s", host, hstrerror(h_err)); + addr->sin_family = 0; + addr->sin_port = 0; + } + return; +} + +void _slurm_get_addr (slurm_addr *addr, uint16_t *port, char *host, + unsigned int buflen ) +{ + struct hostent *he; + char h_buf[4096]; + int h_err = 0; + char * s_addr = (char *) &addr->sin_addr.s_addr; + int len = sizeof(addr->sin_addr.s_addr); + + he = get_host_by_addr( s_addr, len, AF_SLURM, + (void *) &h_buf, sizeof(h_buf), &h_err ); + + if (he != NULL) { + *port = ntohs(addr->sin_port); + strncpy(host, he->h_name, buflen); + } else { + error("Lookup failed: %s", host_strerror(h_err)); + *port = 0; + strncpy(host, "", buflen); + } + return; +} + +void _slurm_print_slurm_addr ( slurm_addr * address, char *buf, size_t n ) +{ + char addrbuf[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &address->sin_addr, addrbuf, INET_ADDRSTRLEN); + /* warning: silently truncates */ + snprintf(buf, n, "%s:%d", addrbuf, ntohs(address->sin_port)); +} + +void _slurm_pack_slurm_addr(slurm_addr *addr, Buf buffer) +{ + pack32( ntohl( addr->sin_addr.s_addr ), buffer ); + pack16( ntohs( addr->sin_port ), buffer ); +} + +int _slurm_unpack_slurm_addr_no_alloc(slurm_addr *addr, Buf buffer) +{ + addr->sin_family = AF_SLURM ; + safe_unpack32(&addr->sin_addr.s_addr, buffer); + safe_unpack16(&addr->sin_port, buffer); + + addr->sin_addr.s_addr = htonl(addr->sin_addr.s_addr); + addr->sin_port = htons(addr->sin_port); + return SLURM_SUCCESS; + + unpack_error: + return SLURM_ERROR; +} + +/* + * vi: tabstop=8 shiftwidth=8 expandtab + */ diff --git a/executable_names/src/common/slurm_protocol_util.c b/executable_names/src/common/slurm_protocol_util.c new file mode 100644 index 0000000000000000000000000000000000000000..4091e1cfa76cbb9665a13c4ffbd73d3a4b9f03eb --- /dev/null +++ b/executable_names/src/common/slurm_protocol_util.c @@ -0,0 +1,126 @@ +/*****************************************************************************\ + * slurm_protocol_util.c - communication infrastructure functions + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include +#include + +#include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_protocol_util.h" +#include "src/common/log.h" +#include "src/common/xmalloc.h" + +/* + * check_header_version checks to see that the specified header was sent + * from a node running the same version of the protocol as the current node + * IN header - the message header received + * RET - SLURM error code + */ +int check_header_version(header_t * header) +{ + if (header->version != SLURM_PROTOCOL_VERSION) { + debug("Invalid Protocol Version %d", header->version); + slurm_seterrno_ret(SLURM_PROTOCOL_VERSION_ERROR); + } + return SLURM_PROTOCOL_SUCCESS; +} + +/* + * init_header - simple function to create a header, always insuring that + * an accurate version string is inserted + * OUT header - the message header to be send + * IN msg_type - type of message to be send + * IN flags - message flags to be send + */ +void init_header(header_t *header, slurm_msg_t *msg, + uint16_t flags) +{ + memset(header, 0, sizeof(header)); + header->version = SLURM_PROTOCOL_VERSION; + header->flags = flags; + header->msg_type = msg->msg_type; + header->body_length = 0; /* over-written later */ + header->forward = msg->forward; + if(msg->ret_list) + header->ret_cnt = list_count(msg->ret_list); + else + header->ret_cnt = 0; + header->ret_list = msg->ret_list; + header->orig_addr = msg->orig_addr; +} + +/* + * update_header - update a message header with the message len + * OUT header - the message header to update + * IN msg_length - length of message to be send + */ +void update_header(header_t * header, uint32_t msg_length) +{ + header->body_length = msg_length; +} + + +/* log the supplied slurm task launch message as debug3() level */ +void slurm_print_launch_task_msg(launch_tasks_request_msg_t *msg, char *name) +{ + int i; + int node_id = nodelist_find(msg->complete_nodelist, name); + + debug3("job_id: %i", msg->job_id); + debug3("job_step_id: %i", msg->job_step_id); + debug3("uid: %i", msg->uid); + debug3("gid: %i", msg->gid); + debug3("tasks_to_launch: %i", msg->tasks_to_launch); + debug3("envc: %i", msg->envc); + for (i = 0; i < msg->envc; i++) { + debug3("env[%i]: %s", i, msg->env[i]); + } + debug3("cwd: %s", msg->cwd); + debug3("argc: %i", msg->argc); + for (i = 0; i < msg->argc; i++) { + debug3("argv[%i]: %s", i, msg->argv[i]); + } + debug3("msg -> resp_port = %d", msg->resp_port); + debug3("msg -> io_port = %d", msg->io_port); + debug3("msg -> task_flags = %x", msg->task_flags); + + for (i = 0; i < msg->tasks_to_launch[node_id]; i++) { + debug3("global_task_id[%i]: %i ", i, + msg->global_task_ids[node_id][i]); + } +} diff --git a/executable_names/src/common/slurm_protocol_util.h b/executable_names/src/common/slurm_protocol_util.h new file mode 100644 index 0000000000000000000000000000000000000000..9f8d98898a016ec348cad4c33c024e119260767f --- /dev/null +++ b/executable_names/src/common/slurm_protocol_util.h @@ -0,0 +1,92 @@ +/*****************************************************************************\ + * slurm_protocol_util.h - communication infrastructure functions + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SLURM_PROTOCOL_UTIL_H +#define _SLURM_PROTOCOL_UTIL_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + +#include + +#include "src/common/slurm_protocol_defs.h" +#include "src/common/slurm_protocol_pack.h" +#include "src/common/slurm_protocol_common.h" + +/* + * check_header_version checks to see that the specified header was sent + * from a node running the same version of the protocol as the current node + * IN header - the message header received + * RET - SLURM error code + */ +extern int check_header_version(header_t * header); + +/* + * init_header - simple function to create a header, always insuring that + * an accurate version string is inserted + * OUT header - the message header to be send + * IN msg_type - type of message to be send + * IN flags - message flags to be send + */ +extern void +init_header(header_t * header, slurm_msg_t *msg, uint16_t flags); + + +/* + * update_header - update a message header with the message len + * OUT header - the message header to update + * IN msg_length - length of message to be send + */ +extern void +update_header(header_t * header, uint32_t msg_length); + + +/* log the supplied slurm task launch message as debug3() level */ +extern void slurm_print_launch_task_msg(launch_tasks_request_msg_t * msg, + char *name); + +#endif /* !_SLURM_PROTOCOL_UTIL_H */ diff --git a/executable_names/src/common/slurm_resource_info.c b/executable_names/src/common/slurm_resource_info.c new file mode 100644 index 0000000000000000000000000000000000000000..3b6e654073e8d28367b22dd172ad9ea3cd8f1142 --- /dev/null +++ b/executable_names/src/common/slurm_resource_info.c @@ -0,0 +1,296 @@ +/*****************************************************************************\ + * slurm_resource_info.c - Functions to determine number of available resources + * $Id: slurm_resource_info.c,v 1.12 2006/10/04 21:52:24 palermo Exp $ + ***************************************************************************** + * Copyright (C) 2006 Hewlett-Packard Development Company, L.P. + * Written by Susanne M. Balle, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STRING_H +# include +#endif + +#include +#include "src/common/log.h" +#include +#include "src/common/slurm_resource_info.h" + +/* + * slurm_get_avail_procs - Get the number of "available" cpus on a node + * given this number given the number of cpus_per_task and + * maximum sockets, cores, threads. Note that the value of + * cpus is the lowest-level logical processor (LLLP). + * IN mxsockets - Job requested max sockets + * IN mxcores - Job requested max cores + * IN mxthreads - Job requested max threads + * IN cpuspertask - Job requested cpus per task + * IN ntaskspernode - number of tasks per node + * IN ntaskspersocket- number of tasks per socket + * IN ntaskspercore - number of tasks per core + * IN/OUT cpus - Available cpu count + * IN/OUT sockets - Available socket count + * IN/OUT cores - Available core count + * IN/OUT threads - Available thread count + * IN alloc_sockets - Allocated socket count to other jobs + * IN alloc_lps - Allocated cpu count to other jobs + * IN cr_type - Consumable Resource type + * + * Note: used in both the select/{linear,cons_res} plugins. + */ +int slurm_get_avail_procs(const int mxsockets, + const int mxcores, + const int mxthreads, + const int cpuspertask, + const int ntaskspernode, + const int ntaskspersocket, + const int ntaskspercore, + int *cpus, + int *sockets, + int *cores, + int *threads, + const int alloc_sockets, + const int *alloc_cores, + const int alloc_lps, + const select_type_plugin_info_t cr_type) +{ + int avail_cpus = 0, max_cpus = 0; + int max_avail_cpus = INT_MAX; /* for alloc_* accounting */ + int max_sockets = mxsockets; + int max_cores = mxcores; + int max_threads = mxthreads; + int cpus_per_task = cpuspertask; + int i; + + /* pick defaults for any unspecified items */ + if (cpus_per_task <= 0) + cpus_per_task = 1; + if (max_sockets <= 0) + max_sockets = INT_MAX; + if (max_cores <= 0) + max_cores = INT_MAX; + if (max_threads <= 0) + max_threads = INT_MAX; + + if (*threads <= 0) + *threads = 1; + if (*cores <= 0) + *cores = 1; + if (*sockets <= 0) + *sockets = *cpus / *cores / *threads; +#if(0) + info("get_avail_procs User_ sockets %d cores %d threads %d ", + max_sockets, max_cores, max_threads); + info("get_avail_procs HW_ sockets %d cores %d threads %d ", + *sockets, *cores, *threads); + info("get_avail_procs Ntask node %d sockets %d core %d ", + ntaskspernode, ntaskspersocket, ntaskspercore); + info("get_avail_procs cr_type %d cpus %d Allocated sockets %d lps %d ", + cr_type, *cpus, alloc_sockets, alloc_lps); + if ((cr_type == CR_CORE) || (cr_type == CR_CORE_MEMORY)) { + for (i = 0; i < *sockets; i++) + info("get_avail_procs alloc_cores[%d] = %d", i, alloc_cores[i]); + } +#endif + if ((*threads <= 0) || (*cores <= 0) || (*sockets <= 0)) + fatal(" ((threads <= 0) || (cores <= 0) || (sockets <= 0))"); + + switch(cr_type) { + /* For the following CR types, nodes have no notion of socket, core, + and thread. Only one level of logical processors */ + case CR_CPU: + case CR_CPU_MEMORY: + case CR_MEMORY: + switch(cr_type) { + case CR_CPU: + case CR_CPU_MEMORY: + *cpus -= alloc_lps; + if (*cpus < 0) + error(" cons_res: *cpus < 0"); + break; + default: + break; + } + + /*** compute an overall maximum cpu count honoring ntasks* ***/ + max_cpus = *cpus; + if (ntaskspernode > 0) { + max_cpus = MIN(max_cpus, ntaskspernode); + } + break; + /* For all other types, nodes contain sockets, cores, and threads */ + case CR_SOCKET: + case CR_SOCKET_MEMORY: + case CR_CORE: + case CR_CORE_MEMORY: + default: + switch(cr_type) { + case CR_SOCKET: + case CR_SOCKET_MEMORY: + *sockets -= alloc_sockets; /* sockets count */ + if (*sockets < 0) + error(" cons_res: *sockets < 0"); + + *cpus -= alloc_lps; + if (*cpus < 0) + error(" cons_res: *cpus < 0"); + break; + case CR_CORE: + case CR_CORE_MEMORY: + *cpus -= alloc_lps; + if (*cpus < 0) + error(" cons_res: *cpus < 0"); + + if (alloc_lps > 0) { + max_avail_cpus = 0; + for (i=0; i<*sockets; i++) + max_avail_cpus += *cores - alloc_cores[i]; + max_avail_cpus *= *threads; + } + break; + default: + break; + } + + /*** honor socket/core/thread maximums ***/ + *sockets = MIN(*sockets, max_sockets); + *cores = MIN(*cores, max_cores); + *threads = MIN(*threads, max_threads); + + /*** compute an overall maximum cpu count honoring ntasks* ***/ + max_cpus = *threads; + if (ntaskspercore > 0) { + max_cpus = MIN(max_cpus, ntaskspercore); + } + max_cpus *= *cores; + if (ntaskspersocket > 0) { + max_cpus = MIN(max_cpus, ntaskspersocket); + } + max_cpus *= *sockets; + if (ntaskspernode > 0) { + max_cpus = MIN(max_cpus, ntaskspernode); + } + + /*** honor any availability maximum ***/ + max_cpus = MIN(max_cpus, max_avail_cpus); + break; + } + + /*** factor cpus_per_task into max_cpus ***/ + max_cpus *= cpus_per_task; + + /*** round down available based on cpus_per_task ***/ + avail_cpus = (*cpus / cpus_per_task) * cpus_per_task; + + avail_cpus = MIN(avail_cpus, max_cpus); + +#if(0) + info("get_avail_procs return cpus %d sockets %d cores %d threads %d ", + *cpus, *sockets, *cores, *threads); + info("get_avail_procs avail_cpus %d", avail_cpus); +#endif + return(avail_cpus); +} + +/* + * slurm_sprint_cpu_bind_type + * + * Given a cpu_bind_type, report all flag settings in str + * IN - cpu_bind_type + * OUT - str + */ +void slurm_sprint_cpu_bind_type(char *str, cpu_bind_type_t cpu_bind_type) +{ + if (!str) + return; + + str[0] = '\0'; + + if (cpu_bind_type & CPU_BIND_TO_THREADS) + strcat(str, "threads,"); + if (cpu_bind_type & CPU_BIND_TO_CORES) + strcat(str, "cores,"); + if (cpu_bind_type & CPU_BIND_TO_SOCKETS) + strcat(str, "sockets,"); + if (cpu_bind_type & CPU_BIND_VERBOSE) + strcat(str, "verbose,"); + if (cpu_bind_type & CPU_BIND_NONE) + strcat(str, "none,"); + if (cpu_bind_type & CPU_BIND_RANK) + strcat(str, "rank,"); + if (cpu_bind_type & CPU_BIND_MAP) + strcat(str, "mapcpu,"); + if (cpu_bind_type & CPU_BIND_MASK) + strcat(str, "maskcpu,"); + + if (*str) { + str[strlen(str)-1] = '\0'; /* remove trailing ',' */ + } else { + strcat(str, "(null type)"); /* no bits set */ + } +} + +/* + * slurm_sprint_mem_bind_type + * + * Given a mem_bind_type, report all flag settings in str + * IN - mem_bind_type + * OUT - str + */ +void slurm_sprint_mem_bind_type(char *str, mem_bind_type_t mem_bind_type) +{ + if (!str) + return; + + str[0] = '\0'; + + if (mem_bind_type & MEM_BIND_VERBOSE) + strcat(str, "verbose,"); + if (mem_bind_type & MEM_BIND_NONE) + strcat(str, "none,"); + if (mem_bind_type & MEM_BIND_RANK) + strcat(str, "rank,"); + if (mem_bind_type & MEM_BIND_LOCAL) + strcat(str, "local,"); + if (mem_bind_type & MEM_BIND_MAP) + strcat(str, "mapmem,"); + if (mem_bind_type & MEM_BIND_MASK) + strcat(str, "maskmem,"); + + if (*str) { + str[strlen(str)-1] = '\0'; /* remove trailing ',' */ + } else { + strcat(str, "(null type)"); /* no bits set */ + } +} diff --git a/executable_names/src/common/slurm_resource_info.h b/executable_names/src/common/slurm_resource_info.h new file mode 100644 index 0000000000000000000000000000000000000000..f74e0aadfde282495496dce754a571f656cce6b8 --- /dev/null +++ b/executable_names/src/common/slurm_resource_info.h @@ -0,0 +1,71 @@ +/*****************************************************************************\ + * resource_info.h - Functions to determine number of available resources + * $Id: slurm_resource_info.h,v 1.6 2006/10/04 18:53:13 palermo Exp $ + ***************************************************************************** + * Copyright (C) 2006 Hewlett-Packard Development Company, L.P. + * Written by Susanne M. Balle, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _RES_INFO_H +#define _RES_INFO_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#endif + +int slurm_get_avail_procs(const int mxsockets, + const int mxcores, + const int mxthreads, + const int cpuspertask, + const int ntaskspernode, + const int ntaskspersocket, + const int ntaskspercore, + int *cpus, + int *sockets, + int *cores, + int *threads, + const int alloc_sockets, + const int *alloc_cores, + const int alloc_lps, + const select_type_plugin_info_t cr_type); + +void slurm_sprint_cpu_bind_type(char *str, cpu_bind_type_t cpu_bind_type); +void slurm_sprint_mem_bind_type(char *str, mem_bind_type_t mem_bind_type); + +#endif /* !_RES_INFO_H */ diff --git a/executable_names/src/common/slurm_rlimits_info.c b/executable_names/src/common/slurm_rlimits_info.c new file mode 100644 index 0000000000000000000000000000000000000000..5dce456b67ee8956856f7983a3278d884a67a3a3 --- /dev/null +++ b/executable_names/src/common/slurm_rlimits_info.c @@ -0,0 +1,180 @@ +/*****************************************************************************\ + * slurm_rlimits_info.c - resource limits that are used by srun and the slurmd + * $Id: slurm.hp.rlimits.patch,v 1.5 2005/07/18 18:39:11 danielc Exp $ + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include +#include + +#include "src/common/macros.h" +#include "src/common/xstring.h" +#include "src/common/xassert.h" +#include "src/common/xmalloc.h" +#include "src/common/log.h" +#include "src/common/slurm_rlimits_info.h" + + +/* + * List SLURM rlimits get/setrlimit resource number with associated name and + * whether it should be propagated. + */ + +static slurm_rlimits_info_t rlimits_info[] = { + + /* resource, name, propagate_flag */ + +#ifdef RLIMIT_CPU + { RLIMIT_CPU, "CPU", -1 }, +#endif +#ifdef RLIMIT_FSIZE + { RLIMIT_FSIZE, "FSIZE", -1 }, +#endif +#ifdef RLIMIT_DATA + { RLIMIT_DATA, "DATA", -1 }, +#endif +#ifdef RLIMIT_STACK + { RLIMIT_STACK, "STACK", -1 }, +#endif +#ifdef RLIMIT_CORE + { RLIMIT_CORE, "CORE", -1 }, +#endif +#ifdef RLIMIT_RSS + { RLIMIT_RSS, "RSS", -1 }, +#endif +#ifdef RLIMIT_NPROC + { RLIMIT_NPROC, "NPROC", -1 }, +#endif +#ifdef RLIMIT_NOFILE + { RLIMIT_NOFILE, "NOFILE", -1 }, +#endif +#ifdef RLIMIT_MEMLOCK + { RLIMIT_MEMLOCK, "MEMLOCK", -1 }, +#endif +#ifdef RLIMIT_AS + { RLIMIT_AS, "AS", -1 }, +#endif + { 0, NULL, -1 } +}; + + +static bool rlimits_were_parsed = FALSE; + +/* + * Return a pointer to the private rlimits info array. + */ +slurm_rlimits_info_t * +get_slurm_rlimits_info( void ) +{ + xassert( rlimits_were_parsed == TRUE ); + + return rlimits_info; +} + + +#define RLIMIT_ "RLIMIT_" +#define LEN_RLIMIT_ (sizeof( RLIMIT_ ) - 1) +#define RLIMIT_DELIMS ", \t\n" +/* + * Parse a comma separated list of RLIMIT names. + * + * Return 0 on success, or -1 if the 'rlimits_str' input parameter contains + * a name that is not in rlimits_info[]. + */ +int +parse_rlimits( char *rlimits_str, int propagate_flag ) +{ + slurm_rlimits_info_t *rli; /* ptr iterator for rlimits_info[] */ + char *tp; /* token ptr */ + bool found; + char *rlimits_str_dup; + + xassert( rlimits_str ); + + if (strcmp( rlimits_str, "ALL" ) == 0) { + /* + * Propagate flag value applies to all rlimits + */ + for (rli = rlimits_info; rli->name; rli++) + rli->propagate_flag = propagate_flag; + rlimits_were_parsed = TRUE; + return( 0 ); + } + + /* + * Since parse_rlimits may be called multiple times, we + * need to reinitialize the propagate flags when individual + * rlimits are specified. + */ + if (rlimits_were_parsed) + for (rli = rlimits_info; rli->name; rli++) + rli->propagate_flag = -1; + + rlimits_str_dup = xstrdup( rlimits_str ); + if ((tp = strtok( rlimits_str_dup, RLIMIT_DELIMS )) != NULL) { + do { + found = FALSE; + for (rli = rlimits_info; rli->name; rli++) { + /* + * Accept either "RLIMIT_CORE" or "CORE" + */ + if (strncmp( tp, RLIMIT_, LEN_RLIMIT_ ) == 0) + tp += LEN_RLIMIT_; + if (strcmp( tp, rli->name )) + continue; + rli->propagate_flag = propagate_flag; + found = TRUE; + break; + } + if (found == FALSE) { + error( "Bad rlimit name: %s\n", tp ); + xfree( rlimits_str_dup ); + return( -1 ); + } + } while ((tp = strtok( NULL, RLIMIT_DELIMS ))); + } + xfree( rlimits_str_dup ); + + /* + * Any rlimits that weren't in the 'rlimits_str' parameter get the + * opposite propagate flag value. + */ + for (rli = rlimits_info; rli->name; rli++) + if (rli->propagate_flag == -1) + rli->propagate_flag = ( ! propagate_flag ); + + rlimits_were_parsed = TRUE; + return( 0 ); +} diff --git a/executable_names/src/common/slurm_rlimits_info.h b/executable_names/src/common/slurm_rlimits_info.h new file mode 100644 index 0000000000000000000000000000000000000000..404fbe14384fca8b79f9febc486b7795dc0b23fb --- /dev/null +++ b/executable_names/src/common/slurm_rlimits_info.h @@ -0,0 +1,62 @@ +/*****************************************************************************\ + * slurm_rlimits_info.h - resource limits that are used by srun and the slurmd + * $Id: slurm.hp.rlimits.patch,v 1.5 2005/07/18 18:39:11 danielc Exp $ + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + + +#ifndef __SLURM_RLIMITS_INFO_H__ +#define __SLURM_RLIMITS_INFO_H__ + + +/* + * Values for the propagate rlimits flag. + */ +#define PROPAGATE_RLIMITS 1 /* The default is to propagate rlimits */ +#define NO_PROPAGATE_RLIMITS 0 + +struct slurm_rlimits_info { + int resource; /* Values: RLIMIT_NPROC, RLIMIT_MEMLOCK, ... */ + char *name; /* String: "NPROC", "MEMLOCK", ... */ + int propagate_flag; /* PROPAGATE_RLIMITS or NO_PROPAGATE_RLIMITS */ +}; + +typedef struct slurm_rlimits_info slurm_rlimits_info_t; + + +extern slurm_rlimits_info_t *get_slurm_rlimits_info( void ); + +extern int parse_rlimits( char *rlimits_str, int propagate_flag ); + + +#endif /*__SLURM_RLIMITS_INFO_H__*/ diff --git a/executable_names/src/common/slurm_selecttype_info.c b/executable_names/src/common/slurm_selecttype_info.c new file mode 100644 index 0000000000000000000000000000000000000000..0c3fcd530d445c13e8205a7feaa32c405f2acb6c --- /dev/null +++ b/executable_names/src/common/slurm_selecttype_info.c @@ -0,0 +1,84 @@ +/*****************************************************************************\ + * slurm_selecttype_info.c - Parse the SelectTypeParameters parameters + ***************************************************************************** + * + * Copyright (C) 2006 Hewlett-Packard Development Company, L.P. + * Written by Susanne M. Balle, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * +\*****************************************************************************/ + +#include "src/common/slurm_selecttype_info.h" +#include "src/common/macros.h" +#include "src/common/xstring.h" +#include "src/common/xassert.h" +#include "src/common/xmalloc.h" +/* + * Parse a comma separated list of SelectType Parameters + * + * Return SLURM_SUCCESS on success, or SLURM_ERROR otherwise + */ +int parse_select_type_param(char *select_type_parameters, + select_type_plugin_info_t *param) +{ + int rc = SLURM_SUCCESS; + char *str_parameters; + + + char *st_str = xstrdup(select_type_parameters); + if ((str_parameters = strtok(st_str,",")) != NULL) { + do { + if (strcasecmp(str_parameters, "CR_Socket") == 0) { + *param = CR_SOCKET; + } else if (strcasecmp(str_parameters, "CR_Socket_Memory") == 0) { + *param = CR_SOCKET_MEMORY; + } else if (strcasecmp(str_parameters, "CR_Core") == 0) { + *param = CR_CORE; + } else if (strcasecmp(str_parameters, "CR_Core_Memory") == 0) { + *param = CR_CORE_MEMORY; + } else if (strcasecmp(str_parameters, "CR_Memory") == 0) { + *param = CR_MEMORY; + } else if (strcasecmp(str_parameters, "CR_CPU") == 0) { + *param = CR_CPU; + } else if (strcasecmp(str_parameters, "CR_CPU_Memory") == 0) { + *param = CR_CPU_MEMORY; + } else { + error( "Bad SelectType Parameter: %s\n", str_parameters ); + rc = SLURM_ERROR; + xfree(str_parameters); + return rc; + } + } while ((str_parameters = strtok(NULL,","))); + } + xfree(str_parameters); + + return rc; +} diff --git a/executable_names/src/common/slurm_selecttype_info.h b/executable_names/src/common/slurm_selecttype_info.h new file mode 100644 index 0000000000000000000000000000000000000000..e8156d78d2b00589d0a053e1fa3814bf18f5b4aa --- /dev/null +++ b/executable_names/src/common/slurm_selecttype_info.h @@ -0,0 +1,49 @@ +/*****************************************************************************\ + * slurm_selecttype_info.h - Parse the SelectTypeParameters parameters + ***************************************************************************** + * + * Copyright (C) 2006 Hewlett-Packard Development Company, L.P. + * Written by Susanne M. Balle, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * +\*****************************************************************************/ + +#ifndef __SLURM_SELECTTYPE_INFO_H__ +#define __SLURM_SELECTTYPE_INFO_H__ + +#include +#include +#include + +int parse_select_type_param(char *select_type_parameters, + select_type_plugin_info_t *param); + +#endif /*__SLURM_SELECTTYPE_INFO_H__*/ diff --git a/executable_names/src/common/slurm_step_layout.c b/executable_names/src/common/slurm_step_layout.c new file mode 100644 index 0000000000000000000000000000000000000000..945d180c5e1af0fc47825fdf7076b9f6553c021c --- /dev/null +++ b/executable_names/src/common/slurm_step_layout.c @@ -0,0 +1,746 @@ +/*****************************************************************************\ + * slurm_step_layout.c - functions to distribute tasks over nodes. + * $Id$ + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Written by Chris Holmes, , who borrowed heavily + * from other parts of SLURM. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + * This file is patterned after hostlist.c, written by Mark Grondona and + * Copyright (C) 2002 The Regents of the University of California. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +# if HAVE_STRING_H +# include +# endif +#else /* !HAVE_CONFIG_H */ +# include +#endif /* HAVE_CONFIG_H */ + + +#include + +#include + +#include + +#include "src/common/slurm_step_layout.h" +#include "src/common/log.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/read_config.h" +#include "src/common/slurm_protocol_api.h" + +/* build maps for task layout on nodes */ +static int _init_task_layout(slurm_step_layout_t *step_layout, + const char *arbitrary_nodes, + uint32_t *cpus_per_node, uint32_t *cpu_count_reps, + uint16_t task_dist, uint32_t plane_size); + +static int _task_layout_block(slurm_step_layout_t *step_layout, + uint32_t *cpus); +static int _task_layout_cyclic(slurm_step_layout_t *step_layout, + uint32_t *cpus); +static int _task_layout_plane(slurm_step_layout_t *step_layout, + uint32_t *cpus); +#ifndef HAVE_FRONT_END +static int _task_layout_hostfile(slurm_step_layout_t *step_layout, + const char *arbitrary_nodes); +#endif + + + +/* + * slurm_step_layout_create - determine how many tasks of a job will be + * run on each node. Distribution is influenced + * by number of cpus on each host. + * IN tlist - hostlist corresponding to task layout + * IN cpus_per_node - cpus per node + * IN cpu_count_reps - how many nodes have same cpu count + * IN num_hosts - number of hosts we have + * IN num_tasks - number of tasks to distribute across these cpus + * IN task_dist - type of distribution we are using + * IN plane_size - plane size (only needed for the plane distribution) + * RET a pointer to an slurm_step_layout_t structure + * NOTE: allocates memory that should be xfreed by caller + */ +slurm_step_layout_t *slurm_step_layout_create( + const char *tlist, + uint32_t *cpus_per_node, uint32_t *cpu_count_reps, + uint16_t num_hosts, + uint32_t num_tasks, + uint16_t task_dist, + uint32_t plane_size) +{ + char *arbitrary_nodes = NULL; + slurm_step_layout_t *step_layout = + xmalloc(sizeof(slurm_step_layout_t)); + + if(task_dist == SLURM_DIST_ARBITRARY) { + hostlist_t hl = NULL; + char buf[8192]; + /* set the node list for the task layout later if user + supplied could be different that the job allocation */ + arbitrary_nodes = xstrdup(tlist); + hl = hostlist_create(tlist); + hostlist_uniq(hl); + hostlist_ranged_string(hl, sizeof(buf), buf); + num_hosts = hostlist_count(hl); + hostlist_destroy(hl); + step_layout->node_list = xstrdup(buf); + } else { + step_layout->node_list = xstrdup(tlist); + } + + step_layout->task_cnt = num_tasks; + +#ifdef HAVE_FRONT_END /* Limited job step support */ + /* All jobs execute through front-end on Blue Gene. + * Normally we would not permit execution of job steps, + * but can fake it by just allocating all tasks to + * one of the allocated nodes. */ + step_layout->node_cnt = 1; +#else + step_layout->node_cnt = num_hosts; +#endif + + if(_init_task_layout(step_layout, arbitrary_nodes, + cpus_per_node, cpu_count_reps, + task_dist, plane_size) + != SLURM_SUCCESS) { + slurm_step_layout_destroy(step_layout); + step_layout = NULL; + } + return step_layout; +} + +/* + * fake_slurm_step_layout_create - used when you don't allocate a job from the + * controller does not set up anything + * that should really be used with a switch. + * Or to really lay out tasks any any certain fashion. + * IN tlist - hostlist corresponding to task layout + * IN cpus_per_node - cpus per node NULL if no allocation + * IN cpu_count_reps - how many nodes have same cpu count NULL if no allocation + * IN node_cnt - number of nodes we have + * IN task_cnt - number of tasks to distribute across these cpus 0 + * if using cpus_per_node + * RET a pointer to an slurm_step_layout_t structure + * NOTE: allocates memory that should be xfreed by caller + */ +slurm_step_layout_t *fake_slurm_step_layout_create( + const char *tlist, + uint32_t *cpus_per_node, + uint32_t *cpu_count_reps, + uint16_t node_cnt, + uint32_t task_cnt) +{ + uint32_t cpn = 1; + int cpu_cnt = 0, cpu_inx = 0, i, j; +/* char *name = NULL; */ + hostlist_t hl = NULL; + slurm_step_layout_t *step_layout = + xmalloc(sizeof(slurm_step_layout_t)); + + if(node_cnt <= 0 || (task_cnt <= 0 && !cpus_per_node) || !tlist) { + error("there is a problem with your fake_step_layout request\n" + "node_cnt = %d, task_cnt = %d, tlist = %s", + node_cnt, task_cnt, tlist); + xfree(step_layout); + return NULL; + } + + hl = hostlist_create(tlist); + /* make out how many cpus there are on each node */ + if(task_cnt > 0) + cpn = (task_cnt + node_cnt - 1) / node_cnt; + + step_layout = xmalloc(sizeof(slurm_step_layout_t)); + step_layout->node_list = xstrdup(tlist); + step_layout->node_cnt = node_cnt; + step_layout->tasks = xmalloc(sizeof(uint32_t) * node_cnt); + step_layout->tids = xmalloc(sizeof(uint32_t *) * node_cnt); +/* step_layout->node_addr = */ +/* xmalloc(sizeof(slurm_addr) * node_cnt); */ + + step_layout->task_cnt = 0; + for (i=0; inode_cnt; i++) { + if(cpus_per_node && cpu_count_reps) { + step_layout->tasks[i] = cpus_per_node[cpu_inx]; + step_layout->tids[i] = xmalloc(sizeof(uint32_t) * + step_layout->tasks[i]); + + for (j=0; jtasks[i]; j++) + step_layout->tids[i][j] = + step_layout->task_cnt++; + + if ((++cpu_cnt) >= cpu_count_reps[cpu_inx]) { + /* move to next record */ + cpu_inx++; + cpu_cnt = 0; + } + } else { + if(step_layout->task_cnt >= task_cnt) { + step_layout->tasks[i] = 0; + step_layout->tids[i] = NULL; + } else { + step_layout->tasks[i] = cpn; + step_layout->tids[i] = + xmalloc(sizeof(uint32_t) * cpn); + + for (j=0; jtids[i][j] = + step_layout->task_cnt++; + if(step_layout->task_cnt >= task_cnt) { + step_layout->tasks[i] = j + 1; + break; + } + } + } + } +/* name = hostlist_shift(hl); */ +/* if(!name) { */ +/* error("fake_slurm_step_layout_create: " */ +/* "We don't have the correct nodelist."); */ +/* goto error; */ +/* } */ +/* if(slurm_conf_get_addr(name, &step_layout->node_addr[i]) == */ +/* SLURM_ERROR) { */ +/* error("fake_slurm_step_layout_create: " */ +/* "we didn't get an addr for host %s.", name); */ + +/* } */ +/* free(name); */ + } + hostlist_destroy(hl); + return step_layout; +/* error: */ +/* hostlist_destroy(hl); */ +/* slurm_step_layout_destroy(step_layout); */ +/* return NULL; */ +} + + + +/* copys structure for step layout */ +extern slurm_step_layout_t *slurm_step_layout_copy( + slurm_step_layout_t *step_layout) +{ + slurm_step_layout_t *layout; + int i=0; + if(!step_layout) + return NULL; + + layout = xmalloc(sizeof(slurm_step_layout_t)); + layout->node_list = xstrdup(step_layout->node_list); + layout->node_cnt = step_layout->node_cnt; + layout->task_cnt = step_layout->task_cnt; + +/* layout->node_addr = xmalloc(sizeof(slurm_addr) * layout->node_cnt); */ +/* memcpy(layout->node_addr, step_layout->node_addr, */ +/* (sizeof(slurm_addr) * layout->node_cnt)); */ + + layout->tasks = xmalloc(sizeof(uint32_t) * layout->node_cnt); + memcpy(layout->tasks, step_layout->tasks, + (sizeof(uint32_t) * layout->node_cnt)); + + layout->tids = xmalloc(sizeof(uint32_t *) * layout->node_cnt); + for (i=0; inode_cnt; i++) { + layout->tids[i] = xmalloc(sizeof(uint32_t) * layout->tasks[i]); + memcpy(layout->tids[i], step_layout->tids[i], + (sizeof(uint32_t) * layout->tasks[i])); + } + + return layout; +} + +extern void pack_slurm_step_layout(slurm_step_layout_t *step_layout, + Buf buffer) +{ + uint16_t i = 0; + if(step_layout) + i=1; + + pack16(i, buffer); + if(!i) + return; + packstr(step_layout->node_list, buffer); + pack16(step_layout->node_cnt, buffer); + pack32(step_layout->task_cnt, buffer); +/* slurm_pack_slurm_addr_array(step_layout->node_addr, */ +/* step_layout->node_cnt, buffer); */ + + for(i=0; inode_cnt; i++) { + pack32_array(step_layout->tids[i], step_layout->tasks[i], + buffer); + } +} + +extern int unpack_slurm_step_layout(slurm_step_layout_t **layout, Buf buffer) +{ + uint16_t uint16_tmp; + uint32_t num_tids; + slurm_step_layout_t *step_layout = NULL; + int i; + + safe_unpack16(&uint16_tmp, buffer); + if(!uint16_tmp) + return SLURM_SUCCESS; + + step_layout = xmalloc(sizeof(slurm_step_layout_t)); + *layout = step_layout; + + step_layout->node_list = NULL; + step_layout->node_cnt = 0; + step_layout->tids = NULL; + step_layout->tasks = NULL; + safe_unpackstr_xmalloc(&step_layout->node_list, &uint16_tmp, buffer); + safe_unpack16(&step_layout->node_cnt, buffer); + safe_unpack32(&step_layout->task_cnt, buffer); + +/* if (slurm_unpack_slurm_addr_array(&(step_layout->node_addr), */ +/* &uint16_tmp, buffer)) */ +/* goto unpack_error; */ +/* if (uint16_tmp != step_layout->node_cnt) */ +/* goto unpack_error; */ + + step_layout->tasks = xmalloc(sizeof(uint32_t) * step_layout->node_cnt); + step_layout->tids = xmalloc(sizeof(uint32_t *) + * step_layout->node_cnt); + for(i = 0; i < step_layout->node_cnt; i++) { + safe_unpack32_array(&(step_layout->tids[i]), + &num_tids, + buffer); + step_layout->tasks[i] = num_tids; + } + + return SLURM_SUCCESS; + +unpack_error: + slurm_step_layout_destroy(step_layout); + *layout = NULL; + return SLURM_ERROR; +} + +/* destroys structure for step layout */ +extern int slurm_step_layout_destroy(slurm_step_layout_t *step_layout) +{ + int i=0; + if(step_layout) { + xfree(step_layout->node_list); +/* xfree(step_layout->node_addr); */ + xfree(step_layout->tasks); + for (i = 0; i < step_layout->node_cnt; i++) { + xfree(step_layout->tids[i]); + } + xfree(step_layout->tids); + + xfree(step_layout); + } + + return SLURM_SUCCESS; +} + +int slurm_step_layout_host_id (slurm_step_layout_t *s, int taskid) +{ + int i, j; + if (taskid > s->task_cnt - 1) + return SLURM_ERROR; + for (i=0; i < s->node_cnt; i++) + for (j=0; jtasks[i]; j++) + if(s->tids[i][j] == taskid) + return i; + + return SLURM_ERROR; +} + +char *slurm_step_layout_host_name (slurm_step_layout_t *s, int taskid) +{ + int hostid = slurm_step_layout_host_id (s, taskid); + + if (hostid < 0) + return NULL; + + return nodelist_nth_host(s->node_list, hostid); +} + +/* build maps for task layout on nodes */ +static int _init_task_layout(slurm_step_layout_t *step_layout, + const char *arbitrary_nodes, + uint32_t *cpus_per_node, uint32_t *cpu_count_reps, + uint16_t task_dist, uint32_t plane_size) +{ + int cpu_cnt = 0, cpu_inx = 0, i; + hostlist_t hl = NULL; +/* char *name = NULL; */ + uint32_t cpus[step_layout->node_cnt]; + + if (step_layout->node_cnt == 0) + return SLURM_ERROR; + if (step_layout->tasks) /* layout already completed */ + return SLURM_SUCCESS; + + step_layout->plane_size = plane_size; + +/* step_layout->node_addr = xmalloc(sizeof(slurm_addr) */ +/* * step_layout->node_cnt); */ + step_layout->tasks = xmalloc(sizeof(uint32_t) + * step_layout->node_cnt); + step_layout->tids = xmalloc(sizeof(uint32_t *) + * step_layout->node_cnt); + + hl = hostlist_create(step_layout->node_list); + /* make sure the number of nodes we think we have + is the correct number */ + i = hostlist_count(hl); + if(step_layout->node_cnt > i) + step_layout->node_cnt = i; + debug("laying out the %d tasks on %d hosts %s\n", + step_layout->task_cnt, step_layout->node_cnt, + step_layout->node_list); + if(step_layout->node_cnt < 1) { + error("no hostlist given can't layout tasks"); + hostlist_destroy(hl); + return SLURM_ERROR; + } + + for (i=0; inode_cnt; i++) { +/* name = hostlist_shift(hl); */ +/* if(!name) { */ +/* error("hostlist incomplete for this job request"); */ +/* hostlist_destroy(hl); */ +/* return SLURM_ERROR; */ +/* } */ +/* if(slurm_conf_get_addr(name, &step_layout->node_addr[i]) */ +/* == SLURM_ERROR) { */ +/* error("_init_task_layout: can't get addr for " */ +/* "host %s", name); */ +/* free(name); */ +/* continue; */ +/* } */ + +/* debug2("host %d = %s", i, name); */ +/* free(name); */ + cpus[i] = cpus_per_node[cpu_inx]; + + if ((++cpu_cnt) >= cpu_count_reps[cpu_inx]) { + /* move to next record */ + cpu_inx++; + cpu_cnt = 0; + } + } + hostlist_destroy(hl); + + if ((task_dist == SLURM_DIST_CYCLIC) || + (task_dist == SLURM_DIST_CYCLIC_CYCLIC) || + (task_dist == SLURM_DIST_CYCLIC_BLOCK)) + return _task_layout_cyclic(step_layout, cpus); +#ifndef HAVE_FRONT_END + else if(task_dist == SLURM_DIST_ARBITRARY) + return _task_layout_hostfile(step_layout, arbitrary_nodes); +#endif + else if(task_dist == SLURM_DIST_PLANE) + return _task_layout_plane(step_layout, cpus); + else + return _task_layout_block(step_layout, cpus); +} + +#ifndef HAVE_FRONT_END +/* use specific set run tasks on each host listed in hostfile + * XXX: Need to handle over-subscribe. + */ +static int _task_layout_hostfile(slurm_step_layout_t *step_layout, + const char *arbitrary_nodes) +{ + int i=0, j, taskid = 0, task_cnt=0; + hostlist_iterator_t itr = NULL, itr_task = NULL; + char *host = NULL; + char *host_task = NULL; + hostlist_t job_alloc_hosts = NULL; + hostlist_t step_alloc_hosts = NULL; + + debug2("job list is %s", step_layout->node_list); + job_alloc_hosts = hostlist_create(step_layout->node_list); + itr = hostlist_iterator_create(job_alloc_hosts); + if(!arbitrary_nodes) { + error("no hostlist given for arbitrary dist"); + return SLURM_ERROR; + } + + debug2("list is %s", arbitrary_nodes); + step_alloc_hosts = hostlist_create(arbitrary_nodes); + if(hostlist_count(step_alloc_hosts) != step_layout->task_cnt) { + error("Asked for %d tasks have %d in the nodelist. " + "Check your nodelist", + step_layout->task_cnt, + hostlist_count(step_alloc_hosts)); + return SLURM_ERROR; + } + itr_task = hostlist_iterator_create(step_alloc_hosts); + while((host = hostlist_next(itr))) { + step_layout->tasks[i] = 0; + while((host_task = hostlist_next(itr_task))) { + if(!strcmp(host, host_task)) { + step_layout->tasks[i]++; + task_cnt++; + } + free(host_task); + if(task_cnt >= step_layout->task_cnt) + break; + } + debug3("%s got %d tasks\n", + host, + step_layout->tasks[i]); + if(step_layout->tasks[i] == 0) + goto reset_hosts; + step_layout->tids[i] = xmalloc(sizeof(uint32_t) + * step_layout->tasks[i]); + taskid = 0; + j = 0; + hostlist_iterator_reset(itr_task); + while((host_task = hostlist_next(itr_task))) { + if(!strcmp(host, host_task)) { + step_layout->tids[i][j] = taskid; + j++; + } + taskid++; + free(host_task); + if(j >= step_layout->tasks[i]) + break; + } + i++; + reset_hosts: + hostlist_iterator_reset(itr_task); + free(host); + if(i > step_layout->task_cnt) + break; + } + hostlist_iterator_destroy(itr); + hostlist_iterator_destroy(itr_task); + hostlist_destroy(job_alloc_hosts); + hostlist_destroy(step_alloc_hosts); + if(task_cnt != step_layout->task_cnt) { + error("Asked for %d tasks but placed %d. Check your nodelist", + step_layout->task_cnt, task_cnt); + return SLURM_ERROR; + } + + return SLURM_SUCCESS; +} +#endif + +/* to effectively deal with heterogeneous nodes, we fake a cyclic + * distribution to figure out how many tasks go on each node and + * then make those assignments in a block fashion */ +static int _task_layout_block(slurm_step_layout_t *step_layout, uint32_t *cpus) +{ + int i, j, taskid = 0; + bool over_subscribe = false; + + /* figure out how many tasks go to each node */ + for (j=0; (taskidtask_cnt); j++) { /* cycle counter */ + bool space_remaining = false; + for (i=0; ((inode_cnt) + && (taskidtask_cnt)); i++) { + if ((jtasks[i]++; + if ((j+1) < cpus[i]) + space_remaining = true; + } + } + if (!space_remaining) + over_subscribe = true; + } + + /* now distribute the tasks */ + taskid = 0; + for (i=0; i < step_layout->node_cnt; i++) { + step_layout->tids[i] = xmalloc(sizeof(uint32_t) + * step_layout->tasks[i]); + for (j=0; jtasks[i]; j++) { + step_layout->tids[i][j] = taskid; + taskid++; + } + } + return SLURM_SUCCESS; +} + + +/* distribute tasks across available nodes: allocate tasks to nodes + * in a cyclic fashion using available processors. once all available + * processors are allocated, continue to allocate task over-subscribing + * nodes as needed. for example + * cpus per node 4 2 4 2 + * -- -- -- -- + * task distribution: 0 1 2 3 + * 4 5 6 7 + * 8 9 + * 10 11 all processors allocated now + * 12 13 14 15 etc. + */ +static int _task_layout_cyclic(slurm_step_layout_t *step_layout, + uint32_t *cpus) +{ + int i, j, taskid = 0; + bool over_subscribe = false; + + for (i=0; inode_cnt; i++) { + step_layout->tids[i] = xmalloc(sizeof(uint32_t) + * step_layout->task_cnt); + } + for (j=0; taskidtask_cnt; j++) { /* cycle counter */ + bool space_remaining = false; + for (i=0; ((inode_cnt) + && (taskidtask_cnt)); i++) { + if ((jtids[i][step_layout->tasks[i]] = + taskid; + taskid++; + step_layout->tasks[i]++; + if ((j+1) < cpus[i]) + space_remaining = true; + } + } + if (!space_remaining) + over_subscribe = true; + } + return SLURM_SUCCESS; +} + + +/* + * Compute the number of tasks per node for the plane + * distribution given a plane size of "plane_size". + * The plane distribution does not do any workload balancing and + * just use the user specified blocksize: "plane_size". + * This distribution does not take the hardware (number of CPUs + * per node) into account when computing the number of tasks per + * hosts. + * + */ +uint32_t *task_count_layout_plane(const uint32_t node_cnt, + const uint32_t num_tasks, + const uint32_t plane_size) +{ + int i, left = 0; + uint32_t *ntask = NULL; + int tasks_all; + int planes_per_host; + + ntask = (uint32_t *) xmalloc(sizeof(uint32_t *) * node_cnt); + + tasks_all = node_cnt*plane_size; + planes_per_host = num_tasks/tasks_all; + + for(i = 0; i 0) { + for (i = 0; i < node_cnt; i++) { + if (left <= 0) + continue; + if (left < plane_size) { + ntask[i] += left; + info("I ntask[%d]: %d", i, ntask[i]); + } else { + ntask[i] += plane_size; + info("II ntask[%d]: %d", i, ntask[i]); + } + left -= plane_size; + } + } + + return ntask; +} + +/* + * The plane distribution results in a block cyclic of block size " + * plane_size". + * The plane distribution does not do any workload balancing and + * just use the user specified blocksize: "plane_size". + * This distribution does not take the hardware (number of CPUs + * per node) into account when computing the number of tasks per + * hosts. + * + */ +static int _task_layout_plane(slurm_step_layout_t *step_layout, + uint32_t *cpus) +{ + int i, j, taskid = 0; + uint32_t *temp_tasks = NULL; + + debug3("_task_layout_plane plane_size %d ", step_layout->plane_size); + + if(step_layout->plane_size <= 0) + return SLURM_ERROR; + + for (i=0; inode_cnt; i++) { + step_layout->tids[i] = xmalloc(sizeof(int) * step_layout->task_cnt); + } + + temp_tasks = task_count_layout_plane(step_layout->node_cnt, + step_layout->task_cnt, + step_layout->plane_size); + + for(i=0; i < step_layout->node_cnt; i++) + step_layout->tasks[i]= temp_tasks[i]; + xfree(temp_tasks); + + info("node_cnt %d task_cnt %d plane_size %d", + step_layout->node_cnt, step_layout->task_cnt, + step_layout->plane_size); + for(i = 0; i node_cnt; i++) { + info("tasks[%d]: %d", i, step_layout->tasks[i]); + } + + if(step_layout->tasks == NULL) + return SLURM_ERROR; + + taskid = 0; + for(i = 0; i node_cnt; i++) { + for(j = 0; j < step_layout->tasks[i]; j++) { + step_layout->tids[i][j] = taskid++; + } + } + if(taskid != step_layout->task_cnt) { + error("_task_layout_plane: Mismatch in task count (%d != %d) ", + taskid, step_layout->task_cnt); + return SLURM_ERROR; + } + +#if(0) + /* debugging only remove */ + for (i=0; i < step_layout->node_cnt; i++) { + info ("Host %d _plane_ # of tasks %d", i, step_layout->tasks[i]); + for (j=0; jtasks[i]; j++) { + info ("Host %d _plane_ taskid %d task %d", i, j, step_layout->tids[i][j]); + } + } +#endif + + return SLURM_SUCCESS; +} diff --git a/executable_names/src/common/slurm_step_layout.h b/executable_names/src/common/slurm_step_layout.h new file mode 100644 index 0000000000000000000000000000000000000000..622a304c491ba53d1d8582a1ab3945e20926edd8 --- /dev/null +++ b/executable_names/src/common/slurm_step_layout.h @@ -0,0 +1,108 @@ +/*****************************************************************************\ + * slurm_step_layout.c - function to distribute tasks over nodes. + * $Id: slurm.hp.elan.patch,v 1.1 2005/07/28 04:08:19 cholmes Exp $ + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Written by Chris Holmes, , who borrowed heavily + * from other parts of SLURM. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + * This file is patterned after hostlist.h, written by Mark Grondona and + * Copyright (C) 2002 The Regents of the University of California. +\*****************************************************************************/ + +#ifndef _SLURM_STEP_LAYOUT_H +#define _SLURM_STEP_LAYOUT_H + +#if HAVE_CONFIG_H +# include "config.h" +# if HAVE_INTTYPES_H +# include +# else +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#endif + +#include "src/common/hostlist.h" +#include "src/common/pack.h" + +/* + * slurm_step_layout_create - determine how many tasks of a job will be + * run on each node. Distribution is influenced + * by number of cpus on each host. + * IN tlist - hostlist corresponding to task layout + * IN cpus_per_node - cpus per node + * IN cpu_count_reps - how many nodes have same cpu count + * IN node_cnt - number of nodes we have + * IN task_cnt - number of tasks to distribute across these cpus + * IN task_dist - type of distribution we are using + * IN plane_size - plane size (only needed for the plane distribution) + * RET a pointer to an slurm_step_layout_t structure + * NOTE: allocates memory that should be xfreed by caller + */ +extern slurm_step_layout_t *slurm_step_layout_create(const char *tlist, + uint32_t *cpus_per_node, + uint32_t *cpu_count_reps, + uint16_t node_cnt, + uint32_t task_cnt, + uint16_t task_dist, + uint32_t plane_size); + +/* + * fake_slurm_step_layout_create - used when you don't allocate a job from the + * controller does not set up anything + * that should really be used with a switch. + * Or to really lay out tasks any any certain fashion. + * IN tlist - hostlist corresponding to task layout + * IN cpus_per_node - cpus per node NULL if no allocation + * IN cpu_count_reps - how many nodes have same cpu count NULL if no allocation + * IN node_cnt - number of nodes we have + * IN task_cnt - number of tasks to distribute across these cpus 0 + * if using cpus_per_node + * RET a pointer to an slurm_step_layout_t structure + * NOTE: allocates memory that should be xfreed by caller + */ +extern slurm_step_layout_t *fake_slurm_step_layout_create( + const char *tlist, + uint32_t *cpus_per_node, + uint32_t *cpu_count_reps, + uint16_t node_cnt, + uint32_t task_cnt); + +/* copys structure for step layout */ +extern slurm_step_layout_t *slurm_step_layout_copy( + slurm_step_layout_t *step_layout); + +/* pack and unpack structure */ +extern void pack_slurm_step_layout(slurm_step_layout_t *step_layout, + Buf buffer); +extern int unpack_slurm_step_layout(slurm_step_layout_t **layout, Buf buffer); + +/* destroys structure for step layout */ +extern int slurm_step_layout_destroy(slurm_step_layout_t *step_layout); + +/* get info from the structure */ +extern int slurm_step_layout_host_id (slurm_step_layout_t *s, int taskid); +extern char *slurm_step_layout_host_name (slurm_step_layout_t *s, int hostid); + +#endif /* !_SLURM_STEP_LAYOUT_H */ diff --git a/executable_names/src/common/slurm_xlator.h b/executable_names/src/common/slurm_xlator.h new file mode 100644 index 0000000000000000000000000000000000000000..a75c3d73ff50e9efd312f4096eccde307dffff2f --- /dev/null +++ b/executable_names/src/common/slurm_xlator.h @@ -0,0 +1,288 @@ +/*****************************************************************************\ + * slurm_xlator.h - Definitions required to translate SLURM function names + * to aliases containing a prefix of "slurm_". + * + * This is required because some SLURM functions have common names + * (e.g. "debug" and "info"). If a user application defines these functions + * and uses SLURM APIs, they could link to the user function rather than + * the SLURM function. By renaming the functions, inappropriate linking + * should be avoided. + * + * All SLURM functions referenced from the switch and auth plugins should + * have aliases established. Functions not referenced from the plugins + * need not be aliased. + * + * To use this header file: + * 1. In the module containing the exported function code, establish an + * alias for each of the functions after they are defined. + * #include "src/common/macros.h" + * strong_alias(, slurm_); + * 2. For each function, change it's name then include the appropriate + * header file with definitions. + * #define slurm_ + * 3. In the plugin modules using the functions, include this header file + * and remove other slurm header files (they should all be in this header). + * This logic will have the plugin link only to the function names with + * the "slurm_" prefix. + * + * NOTE: Not all operating systems support this function aliasing (e.g. AIX). + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona , Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef __SLURM_XLATOR_H__ +#define __SLURM_XLATOR_H__ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if USE_ALIAS + +/* arg_desc.[ch] functions*/ +#define arg_count slurm_arg_count +#define arg_idx_by_name slurm_arg_idx_by_name +#define arg_name_by_inx slurm_arg_name_by_inx + +/* bitstring.[ch] functions*/ +#define bit_alloc slurm_bit_alloc +#define bit_test slurm_bit_test +#define bit_set slurm_bit_set +#define bit_clear slurm_bit_clear +#define bit_nclear slurm_bit_nclear +#define bit_nset slurm_bit_nset +#define bit_ffc slurm_bit_ffc +#define bit_ffs slurm_bit_ffs +#define bit_free slurm_bit_free +#define bit_realloc slurm_bit_realloc +#define bit_size slurm_bit_size +#define bit_and slurm_bit_and +#define bit_not slurm_bit_not +#define bit_or slurm_bit_or +#define bit_set_count slurm_bit_set_count +#define bit_clear_count slurm_bit_clear_count +#define bit_nset_max_count slurm_bit_nset_max_count +#define bit_and_set_count slurm_bit_and_set_count +#define bit_rotate_copy slurm_bit_rotate_copy +#define bit_rotate slurm_bit_rotate +#define bit_fmt slurm_bit_fmt +#define bit_unfmt slurm_bit_unfmt +#define bitfmt2int slurm_bitfmt2int +#define bit_fmt_hexmask slurm_bit_fmt_hexmask +#define bit_unfmt_hexmask slurm_bit_unfmt_hexmask +#define bit_fmt_binmask slurm_bit_fmt_binmask +#define bit_unfmt_binmask slurm_bit_unfmt_binmask +#define bit_fls slurm_bit_fls +#define bit_fill_gaps slurm_bit_fill_gaps +#define bit_super_set slurm_bit_super_set +#define bit_copy slurm_bit_copy +#define bit_pick_cnt slurm_bit_pick_cnt +#define bit_nffc slurm_bit_nffc +#define bit_noc slurm_bit_noc +#define bit_nffs slurm_bit_nffs +#define bit_copybits slurm_bit_copybits + +/* hostlist.[ch] functions */ +#define hostlist_create slurm_hostlist_create +#define hostlist_copy slurm_hostlist_copy +#define hostlist_count slurm_hostlist_count +#define hostlist_delete slurm_hostlist_delete +#define hostlist_delete_host slurm_hostlist_delete_host +#define hostlist_delete_nth slurm_hostlist_delete_nth +#define hostlist_deranged_string slurm_hostlist_deranged_string +#define hostlist_destroy slurm_hostlist_destroy +#define hostlist_find slurm_hostlist_find +#define hostlist_iterator_create slurm_hostlist_iterator_create +#define hostlist_iterator_destroy slurm_hostlist_iterator_destroy +#define hostlist_iterator_reset slurm_hostlist_iterator_reset +#define hostlist_next slurm_hostlist_next +#define hostlist_next_range slurm_hostlist_next_range +#define hostlist_nth slurm_hostlist_nth +#define hostlist_pop slurm_hostlist_pop +#define hostlist_pop_range slurm_hostlist_pop_range +#define hostlist_push slurm_hostlist_push +#define hostlist_push_host slurm_hostlist_push_host +#define hostlist_push_list slurm_hostlist_push_list +#define hostlist_ranged_string slurm_hostlist_ranged_string +#define hostlist_remove slurm_hostlist_remove +#define hostlist_shift slurm_hostlist_shift +#define hostlist_shift_range slurm_hostlist_shift_range +#define hostlist_sort slurm_hostlist_soft +#define hostlist_uniq slurm_hostlist_uniq +#define hostset_copy slurm_hostset_copy +#define hostset_count slurm_hostset_count +#define hostset_create slurm_hostset_create +#define hostset_delete slurm_hostset_delete +#define hostset_destroy slurm_hostset_destroy +#define hostset_insert slurm_hostset_insert +#define hostset_shift slurm_hostset_shift +#define hostset_shift_range slurm_hostset_shift_range +#define hostset_within slurm_hostset_within + +/* list.[ch] functions */ +#define list_create slurm_list_create +#define list_destroy slurm_list_destroy +#define list_is_empty slurm_list_is_empty +#define list_count slurm_list_count +#define list_append slurm_list_append +#define list_prepend slurm_list_prepend +#define list_find_first slurm_list_find_first +#define list_delete_all slurm_list_delete_all +#define list_for_each slurm_list_for_each +#define list_sort slurm_list_sort +#define list_push slurm_list_push +#define list_pop slurm_list_pop +#define list_peek slurm_list_peek +#define list_enqueue slurm_list_enqueue +#define list_dequeue slurm_list_dequeue +#define list_iterator_create slurm_list_iterator_create +#define list_iterator_reset slurm_list_iterator_reset +#define list_iterator_destroy slurm_list_iterator_destroy +#define list_next slurm_list_next +#define list_insert slurm_list_insert +#define list_find slurm_list_find +#define list_remove slurm_list_remove +#define list_delete slurm_list_delete +#define list_install_fork_handlers slurm_list_install_fork_handlers + +/* log.[ch] functions */ +#define log_init slurm_log_init +#define log_reinit slurm_log_reinit +#define log_fini slurm_log_fini +#define log_alter slurm_log_alter +#define log_set_fpfx slurm_log_set_fpfx +#define log_fp slurm_log_fp +#define log_has_data slurm_log_has_data +#define log_flush slurm_log_flush +#define dump_cleanup_list slurm_dump_cleanup_list +#define fatal_add_cleanup slurm_fatal_add_cleanup +#define fatal_add_cleanup_job slurm_fatal_add_cleanup_job +#define fatal_remove_cleanup slurm_fatal_remove_cleanup +#define fatal_remove_cleanup_job slurm_fatal_remove_cleanup_job +#define fatal_cleanup slurm_fatal_cleanup +#define fatal slurm_fatal +#define error slurm_error +#define info slurm_info +#define verbose slurm_verbose +#define debug slurm_debug +#define debug2 slurm_debug2 +#define debug3 slurm_debug3 + +/* macros.h functions + * None exported today. + * The header file used only for #define values. */ + +/* pack.[ch] functions */ +#define create_buf slurm_create_buf +#define free_buf slurm_free_buf +#define grow_buf slurm_grow_buf +#define init_buf slurm_init_buf +#define xfer_buf_data slurm_xfer_buf_data +#define pack_time slurm_pack_time +#define unpack_time slurm_unpack_time +#define pack32 slurm_pack32 +#define unpack32 slurm_unpack32 +#define pack16 slurm_pack16 +#define unpack16 slurm_unpack16 +#define pack8 slurm_pack8 +#define unpack8 slurm_unpack8 +#define pack32_array slurm_pack32_array +#define unpack32_array slurm_unpack32_array +#define packmem slurm_packmem +#define unpackmem slurm_unpackmem +#define unpackmem_ptr slurm_unpackmem_ptr +#define unpackmem_xmalloc slurm_unpackmem_xmalloc +#define unpackmem_malloc slurm_unpackmem_malloc +#define packstr_array slurm_packstr_array +#define unpackstr_array slurm_unpackstr_array +#define packmem_array slurm_packmem_array +#define unpackmem_array slurm_unpackmem_array + +/* env.[ch] functions */ +#define setenvf slurm_setenvpf +#define unsetenvp slurm_unsetenvp +#define getenvp slurm_getenvp + +/* slurm_auth.[ch] functions + * None exported today. + * The header file used only for #define values. */ + +/* strlcpy.[ch] functions */ +#define strlcpy slurm_strlcpy + +/* switch.[ch] functions + * None exported today. + * The header file used only for #define values. */ + +/* xassert.[ch] functions */ +#define __xassert_failed slurm_xassert_failed + +/* xsignal.[ch] functions */ +#define xsignal slurm_xsignal +#define xsignal_save_mask slurm_xsignal_save_mask +#define xsignal_set_mask slurm_xsignal_set_mask +#define xsignal_block slurm_xsignal_block +#define xsignal_unblock slurm_xsignal_unblock +#define xsignal_sigset_create slurm_xsignal_sigset_create + +/* xstring.[ch] functions */ +#define _xstrcat slurm_xstrcat +#define _xstrcatchar slurm_xstrcatchar +#define _xslurm_strerrorcat slurm_xslurm_strerrorcat +#define _xstrftimecat slurm_xstrftimecat +#define _xstrfmtcat slurm_xstrfmtcat +#define _xmemcat slurm_xmemcat +#define xstrdup slurm_xstrdup +#define xbasename slurm_xbasename + +#endif /* USE_ALIAS */ + +/* Include the function definitions after redefining their names. */ +#include "src/common/arg_desc.h" +#include "src/common/bitstring.h" +#include "src/common/hostlist.h" +#include "src/common/list.h" +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/pack.h" +#include "src/common/env.h" +#include "src/common/slurm_auth.h" +#include "src/common/strlcpy.h" +#include "src/common/switch.h" +#include "src/common/xassert.h" +#include "src/common/xmalloc.h" +#include "src/common/xsignal.h" +#include "src/common/xstring.h" + +#endif /*__SLURM_XLATOR_H__*/ diff --git a/executable_names/src/common/strlcpy.c b/executable_names/src/common/strlcpy.c new file mode 100644 index 0000000000000000000000000000000000000000..6a757ced7cb3a08f4afc5ca3c7e4717484b3b005 --- /dev/null +++ b/executable_names/src/common/strlcpy.c @@ -0,0 +1,86 @@ +/* $OpenBSD: strlcpy.c,v 1.5 2001/05/13 15:40:16 deraadt Exp $ */ + +/* + * Copyright (c) 1998 Todd C. Miller + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if HAVE_CONFIG_H +# include "config.h" +# if (!HAVE_STRLCPY) + +#if defined(LIBC_SCCS) && !defined(lint) +static char *rcsid = "$OpenBSD: strlcpy.c,v 1.5 2001/05/13 15:40:16 deraadt Exp $"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +#include "src/common/macros.h" +#include "src/common/strlcpy.h" + +/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +strong_alias(strlcpy, slurm_strlcpy); + +/* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ +size_t +strlcpy(dst, src, siz) + char *dst; + const char *src; + size_t siz; +{ + register char *d = dst; + register const char *s = src; + register size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) { + do { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} + +# endif /* !HAVE_STRLCPY */ +#endif /* HAVE_CONFIG_H */ + diff --git a/executable_names/src/common/strlcpy.h b/executable_names/src/common/strlcpy.h new file mode 100644 index 0000000000000000000000000000000000000000..fe01a87d14a9c206c31d18a49b5b890b178dd632 --- /dev/null +++ b/executable_names/src/common/strlcpy.h @@ -0,0 +1,19 @@ +#ifndef _STRLCPY_H +#define _STRLCPY_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +# ifndef HAVE_STRLCPY + +# include + + /* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ + size_t strlcpy(char *dst, const char *src, size_t siz); +# endif /* !HAVE_STRLCPY */ +#endif /* HAVE_CONFIG_H */ + +#endif /* _STRLCPY_H */ diff --git a/executable_names/src/common/switch.c b/executable_names/src/common/switch.c new file mode 100644 index 0000000000000000000000000000000000000000..8cfa5bf7c7ed375b30eb554edffa478560bb6796 --- /dev/null +++ b/executable_names/src/common/switch.c @@ -0,0 +1,617 @@ +/*****************************************************************************\ + * src/common/switch.c - Generic switch (interconnect) for slurm + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include +#include + +#include "src/common/macros.h" +#include "src/common/plugin.h" +#include "src/common/plugrack.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/switch.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + +/* + * WARNING: Do not change the order of these fields or add additional + * fields at the beginning of the structure. If you do, job completion + * logging plugins will stop working. If you need to add fields, add them + * at the end of the structure. + */ +typedef struct slurm_switch_ops { + int (*state_save) ( char *dir_name ); + int (*state_restore) ( char *dir_name, bool recover ); + + bool (*no_frag) ( void ); + int (*alloc_jobinfo) ( switch_jobinfo_t *jobinfo ); + int (*build_jobinfo) ( switch_jobinfo_t jobinfo, + char *nodelist, + uint32_t *tasks_per_node, + int cyclic_alloc, + char *network); + switch_jobinfo_t (*copy_jobinfo) ( switch_jobinfo_t jobinfo ); + void (*free_jobinfo) ( switch_jobinfo_t jobinfo ); + int (*pack_jobinfo) ( switch_jobinfo_t jobinfo, + Buf buffer ); + int (*unpack_jobinfo) ( switch_jobinfo_t jobinfo, + Buf buffer ); + int (*get_jobinfo) ( switch_jobinfo_t switch_job, + int key, void *data); + void (*print_jobinfo) ( FILE *fp, + switch_jobinfo_t jobinfo ); + char * (*string_jobinfo) ( switch_jobinfo_t jobinfo, + char *buf, size_t size); + int (*node_init) ( void ); + int (*node_fini) ( void ); + int (*job_preinit) ( switch_jobinfo_t jobinfo ); + int (*job_init) ( switch_jobinfo_t jobinfo, + uid_t uid ); + int (*job_fini) ( switch_jobinfo_t jobinfo ); + int (*job_postfini) ( switch_jobinfo_t jobinfo, + uid_t pgid, + uint32_t job_id, + uint32_t step_id ); + int (*job_attach) ( switch_jobinfo_t jobinfo, + char ***env, uint32_t nodeid, + uint32_t procid, uint32_t nnodes, + uint32_t nprocs, uint32_t rank); + char * (*switch_strerror) ( int errnum ); + int (*switch_errno) ( void ); + int (*clear_node) ( void ); + int (*alloc_nodeinfo) ( switch_node_info_t *nodeinfo ); + int (*build_nodeinfo) ( switch_node_info_t nodeinfo ); + int (*pack_nodeinfo) ( switch_node_info_t nodeinfo, + Buf buffer ); + int (*unpack_nodeinfo) ( switch_node_info_t nodeinfo, + Buf buffer ); + int (*free_nodeinfo) ( switch_node_info_t *nodeinfo ); + char * (*sprintf_nodeinfo) ( switch_node_info_t nodeinfo, + char *buf, size_t size ); + int (*step_complete) ( switch_jobinfo_t jobinfo, + char *nodelist ); + int (*step_part_comp) ( switch_jobinfo_t jobinfo, + char *nodelist ); + bool (*part_comp) ( void ); + int (*step_allocated) ( switch_jobinfo_t jobinfo, + char *nodelist ); + int (*state_clear) ( void ); + int (*slurmctld_init) ( void ); + int (*slurmd_init) ( void ); + int (*slurmd_step_init) ( void ); +} slurm_switch_ops_t; + +struct slurm_switch_context { + char * switch_type; + plugrack_t plugin_list; + plugin_handle_t cur_plugin; + int switch_errno; + slurm_switch_ops_t ops; +}; + +static slurm_switch_context_t g_context = NULL; +static pthread_mutex_t context_lock = PTHREAD_MUTEX_INITIALIZER; + + +static slurm_switch_context_t +_slurm_switch_context_create(const char *switch_type) +{ + slurm_switch_context_t c; + + if ( switch_type == NULL ) { + debug3( "_slurm_switch_context_create: no switch type" ); + return NULL; + } + + c = xmalloc( sizeof( struct slurm_switch_context ) ); + + c->switch_errno = SLURM_SUCCESS; + + /* Copy the job completion authentication type. */ + c->switch_type = xstrdup( switch_type ); + if (c->switch_type == NULL ) { + debug3( "can't make local copy of switch type" ); + xfree( c ); + return NULL; + } + + /* Plugin rack is demand-loaded on first reference. */ + c->plugin_list = NULL; + c->cur_plugin = PLUGIN_INVALID_HANDLE; + + return c; +} + +static int +_slurm_switch_context_destroy( slurm_switch_context_t c ) +{ + /* + * Must check return code here because plugins might still + * be loaded and active. + */ + if ( c->plugin_list ) { + if ( plugrack_destroy( c->plugin_list ) != SLURM_SUCCESS ) { + return SLURM_ERROR; + } + } + + xfree( c->switch_type ); + xfree( c ); + + return SLURM_SUCCESS; +} + +/* + * Resolve the operations from the plugin. + */ +static slurm_switch_ops_t * +_slurm_switch_get_ops( slurm_switch_context_t c ) +{ + /* + * These strings must be kept in the same order as the fields + * declared for slurm_switch_ops_t. + */ + static const char *syms[] = { + "switch_p_libstate_save", + "switch_p_libstate_restore", + "switch_p_no_frag", + "switch_p_alloc_jobinfo", + "switch_p_build_jobinfo", + "switch_p_copy_jobinfo", + "switch_p_free_jobinfo", + "switch_p_pack_jobinfo", + "switch_p_unpack_jobinfo", + "switch_p_get_jobinfo", + "switch_p_print_jobinfo", + "switch_p_sprint_jobinfo", + "switch_p_node_init", + "switch_p_node_fini", + "switch_p_job_preinit", + "switch_p_job_init", + "switch_p_job_fini", + "switch_p_job_postfini", + "switch_p_job_attach", + "switch_p_strerror", + "switch_p_get_errno", + "switch_p_clear_node_state", + "switch_p_alloc_node_info", + "switch_p_build_node_info", + "switch_p_pack_node_info", + "switch_p_unpack_node_info", + "switch_p_free_node_info", + "switch_p_sprintf_node_info", + "switch_p_job_step_complete", + "switch_p_job_step_part_comp", + "switch_p_part_comp", + "switch_p_job_step_allocated", + "switch_p_libstate_clear", + "switch_p_slurmctld_init", + "switch_p_slurmd_init", + "switch_p_slurmd_step_init" + }; + int n_syms = sizeof( syms ) / sizeof( char * ); + + /* Get the plugin list, if needed. */ + if ( c->plugin_list == NULL ) { + char *plugin_dir; + c->plugin_list = plugrack_create(); + if ( c->plugin_list == NULL ) { + verbose( "Unable to create a plugin manager" ); + return NULL; + } + + plugrack_set_major_type( c->plugin_list, "switch" ); + plugrack_set_paranoia( c->plugin_list, + PLUGRACK_PARANOIA_NONE, + 0 ); + plugin_dir = slurm_get_plugin_dir(); + plugrack_read_dir( c->plugin_list, plugin_dir ); + xfree(plugin_dir); + } + + /* Find the correct plugin. */ + c->cur_plugin = + plugrack_use_by_type( c->plugin_list, c->switch_type ); + if ( c->cur_plugin == PLUGIN_INVALID_HANDLE ) { + verbose( "can't find a plugin for type %s", c->switch_type ); + return NULL; + } + + /* Dereference the API. */ + if ( plugin_get_syms( c->cur_plugin, + n_syms, + syms, + (void **) &c->ops ) < n_syms ) { + verbose( "incomplete switch plugin detected" ); + return NULL; + } + + return &c->ops; +} + +extern int switch_init( void ) +{ + int retval = SLURM_SUCCESS; + char *switch_type = NULL; + + slurm_mutex_lock( &context_lock ); + + if ( g_context ) + goto done; + + switch_type = slurm_get_switch_type(); + g_context = _slurm_switch_context_create( switch_type ); + if ( g_context == NULL ) { + error( "cannot create a context for %s", switch_type ); + retval = SLURM_ERROR; + goto done; + } + + if ( _slurm_switch_get_ops( g_context ) == NULL ) { + error( "cannot resolve plugin operations for %s", switch_type ); + _slurm_switch_context_destroy( g_context ); + g_context = NULL; + retval = SLURM_ERROR; + } + + done: + slurm_mutex_unlock( &context_lock ); + xfree(switch_type); + return retval; +} + +extern int switch_fini(void) +{ + int rc; + + if (!g_context) + return SLURM_SUCCESS; + + rc = _slurm_switch_context_destroy(g_context); + return rc; +} + +extern int switch_save(char *dir_name) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.state_save))( dir_name ); +} + +extern int switch_restore(char *dir_name, bool recover) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.state_restore))( dir_name, recover ); +} + +extern int switch_clear(void) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.state_clear))( ); +} + +extern bool switch_no_frag(void) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.no_frag))( ); +} + +extern int switch_alloc_jobinfo(switch_jobinfo_t *jobinfo) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.alloc_jobinfo))( jobinfo ); +} + +extern int switch_build_jobinfo(switch_jobinfo_t jobinfo, + char *nodelist, uint32_t *tasks_per_node, + int cyclic_alloc, char *network) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.build_jobinfo))( jobinfo, nodelist, + tasks_per_node, cyclic_alloc, network ); +} + +extern switch_jobinfo_t switch_copy_jobinfo(switch_jobinfo_t jobinfo) +{ + if ( switch_init() < 0 ) + return NULL; + + return (*(g_context->ops.copy_jobinfo))( jobinfo ); +} + +extern void switch_free_jobinfo(switch_jobinfo_t jobinfo) +{ + if ( switch_init() < 0 ) + return; + + (*(g_context->ops.free_jobinfo))( jobinfo ); +} + +extern int switch_pack_jobinfo(switch_jobinfo_t jobinfo, Buf buffer) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.pack_jobinfo))( jobinfo, buffer ); +} + +extern int switch_unpack_jobinfo(switch_jobinfo_t jobinfo, Buf buffer) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.unpack_jobinfo))( jobinfo, buffer ); +} + +extern int switch_g_get_jobinfo(switch_jobinfo_t jobinfo, + int data_type, void *data) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.get_jobinfo))( jobinfo, data_type, data); +} + +extern void switch_print_jobinfo(FILE *fp, switch_jobinfo_t jobinfo) +{ + if ( switch_init() < 0 ) + return; + + (*(g_context->ops.print_jobinfo)) (fp, jobinfo); +} + +extern char *switch_sprint_jobinfo( switch_jobinfo_t jobinfo, + char *buf, size_t size) +{ + if ( switch_init() < 0 ) + return NULL; + + return (*(g_context->ops.string_jobinfo)) (jobinfo, buf, size); +} + +extern int interconnect_node_init(void) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.node_init)) (); +} + +extern int interconnect_node_fini(void) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.node_fini)) (); +} + +extern int interconnect_preinit(switch_jobinfo_t jobinfo) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.job_preinit)) (jobinfo); +} + +extern int interconnect_init(switch_jobinfo_t jobinfo, uid_t uid) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.job_init)) (jobinfo, uid); +} + +extern int interconnect_fini(switch_jobinfo_t jobinfo) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.job_fini)) (jobinfo); +} + +extern int interconnect_postfini(switch_jobinfo_t jobinfo, uid_t pgid, + uint32_t job_id, uint32_t step_id ) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.job_postfini)) (jobinfo, pgid, + job_id, step_id); +} + +extern int interconnect_attach(switch_jobinfo_t jobinfo, char ***env, + uint32_t nodeid, uint32_t procid, uint32_t nnodes, + uint32_t nprocs, uint32_t gid) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.job_attach)) (jobinfo, env, + nodeid, procid, nnodes, nprocs, gid); +} + +extern int switch_get_errno(void) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.switch_errno))( ); +} + +extern char *switch_strerror(int errnum) +{ + if ( switch_init() < 0 ) + return NULL; + + return (*(g_context->ops.switch_strerror))( errnum ); +} + + +/* + * node switch state monitoring functions + * required for IBM Federation switch + */ +extern int switch_g_clear_node_state(void) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.clear_node))(); +} + +extern int switch_g_alloc_node_info(switch_node_info_t *switch_node) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.alloc_nodeinfo))( switch_node ); +} + +extern int switch_g_build_node_info(switch_node_info_t switch_node) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.build_nodeinfo))( switch_node ); +} + +extern int switch_g_pack_node_info(switch_node_info_t switch_node, + Buf buffer) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.pack_nodeinfo))( switch_node, buffer ); +} + +extern int switch_g_unpack_node_info(switch_node_info_t switch_node, + Buf buffer) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.unpack_nodeinfo))( switch_node, buffer ); +} + +extern int switch_g_free_node_info(switch_node_info_t *switch_node) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.free_nodeinfo))( switch_node ); +} + +extern char*switch_g_sprintf_node_info(switch_node_info_t switch_node, + char *buf, size_t size) +{ + if ( switch_init() < 0 ) + return NULL; + + return (*(g_context->ops.sprintf_nodeinfo))( switch_node, buf, size ); +} + +extern int switch_g_job_step_complete(switch_jobinfo_t jobinfo, + char *nodelist) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.step_complete))( jobinfo, nodelist ); +} + +extern int switch_g_job_step_part_comp(switch_jobinfo_t jobinfo, + char *nodelist) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.step_part_comp))( jobinfo, nodelist ); +} + +extern bool switch_g_part_comp(void) +{ + if ( switch_init() < 0 ) + return false; + + return (*(g_context->ops.part_comp))( ); +} + + +extern int switch_g_job_step_allocated(switch_jobinfo_t jobinfo, + char *nodelist) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.step_allocated))( jobinfo, nodelist ); +} + +extern int switch_g_slurmctld_init(void) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.slurmctld_init)) (); +} + +extern int switch_g_slurmd_init(void) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.slurmd_init)) (); +} + +extern int switch_g_slurmd_step_init(void) +{ + if ( switch_init() < 0 ) + return SLURM_ERROR; + + return (*(g_context->ops.slurmd_step_init)) (); +} diff --git a/executable_names/src/common/switch.h b/executable_names/src/common/switch.h new file mode 100644 index 0000000000000000000000000000000000000000..3f2e055dda15653bb6829fab37804cdd3a25a932 --- /dev/null +++ b/executable_names/src/common/switch.h @@ -0,0 +1,354 @@ +/*****************************************************************************\ + * src/common/switch.h - Generic switch (interconnect) info for slurm + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _SWITCH_H +#define _SWITCH_H 1 + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include "src/common/macros.h" +#include "src/common/pack.h" + +/* opaque data structures - no peeking! */ +#ifndef __switch_jobinfo_t_defined +# define __switch_jobinfo_t_defined + typedef struct switch_jobinfo *switch_jobinfo_t; +#endif +#ifndef __switch_node_info_t_defined +# define __switch_node_info_t_defined + typedef struct switch_node_info *switch_node_info_t; +#endif +typedef struct slurm_switch_context * slurm_switch_context_t; + +/*****************************************\ + * GLOBAL SWITCH STATE MANGEMENT FUNCIONS * +\*****************************************/ + +/* initialize the switch plugin */ +extern int switch_init (void); + +extern int switch_g_slurmd_init(void); + +/* terminate the switch plugin and free all memory */ +extern int switch_fini (void); + +/* save any global switch state to a file within the specified directory + * the actual file name used in plugin specific + * IN dir_name - directory into which switch state is saved + * RET - slurm error code + */ +extern int switch_save (char *dir_name); + +/* restore any global switch state from a file within the specified directory + * the actual file name used in plugin specific + * IN dir_name - directory from hich switch state is restored + * IN recover - "true" to restore switch state, "false" to start with + * a clean slate. + * RET - slurm error code + */ +extern int switch_restore(char *dir_name, bool recover); + +/* clear all current switch window allocation information + * RET - slurm error code + */ +extern int switch_clear(void); + +/* report if resource fragmentation is important. if so, delay scheduling a + * new job while another is in the process of terminating. + * RET - true if fragmentation is important + */ +extern bool switch_no_frag(void); + +/* return the number of a switch-specific error code */ +extern int switch_get_errno(void); + +/* return a string description of a switch specific error code + * IN errnum - switch specific error return code + * RET - string describing the nature of the error + */ +extern char *switch_strerror(int errnum); + +/******************************************************\ + * JOB-SPECIFIC SWITCH CREDENTIAL MANAGEMENT FUNCIONS * +\******************************************************/ + +/* allocate storage for a switch job credential + * OUT jobinfo - storage for a switch job credential + * RET - slurm error code + * NOTE: storage must be freed using g_switch_free_jobinfo + */ +extern int switch_alloc_jobinfo (switch_jobinfo_t *jobinfo); + +/* fill a job's switch credential + * OUT jobinfo - storage for a switch job credential + * IN nodelist - list of nodes to be used by the job + * IN tasks_per_node - count of tasks per node in the job + * IN cyclic_alloc - task distribution pattern, 1=cyclic, 0=block + * IN network - plugin-specific network info (e.g. protocol) + * NOTE: storage must be freed using g_switch_free_jobinfo + */ +extern int switch_build_jobinfo (switch_jobinfo_t jobinfo, + char *nodelist, uint32_t *tasks_per_node, + int cyclic_alloc, char *network); + +/* copy a switch job credential + * IN jobinfo - the switch job credential to be copied + * RET - the copy + * NOTE: returned value must be freed using g_switch_free_jobinfo + */ +extern switch_jobinfo_t switch_copy_jobinfo(switch_jobinfo_t jobinfo); + +/* free storage previously allocated for a switch job credential + * IN jobinfo - the switch job credential to be freed + */ +extern void switch_free_jobinfo (switch_jobinfo_t jobinfo); + +/* pack a switch job credential into a buffer in machine independent form + * IN jobinfo - the switch job credential to be saved + * OUT buffer - buffer with switch credential appended + * RET - slurm error code + */ +extern int switch_pack_jobinfo (switch_jobinfo_t jobinfo, Buf buffer); + +/* unpack a switch job credential from a buffer + * OUT jobinfo - the switch job credential read + * IN buffer - buffer with switch credential read from current pointer loc + * RET - slurm error code + * NOTE: returned value must be freed using g_switch_free_jobinfo + */ +extern int switch_unpack_jobinfo(switch_jobinfo_t jobinfo, Buf buffer); + +/* get some field from a switch job credential + * IN jobinfo - the switch job credential + * IN data_type - the type of data to get from the credential + * OUT data - the desired data from the credential + * RET - slurm error code + */ +extern int switch_g_get_jobinfo(switch_jobinfo_t jobinfo, + int data_type, void *data); + +/* + * Note that the job step associated with the specified nodelist + * has completed execution. + */ +extern int switch_g_job_step_complete(switch_jobinfo_t jobinfo, + char *nodelist); + +/* + * Note that the job step has completed execution on the specified + * nodelist. The job step is not necessarily completed on all + * nodes, but switch resources associated with it on the specified + * nodes are no longer in use. + */ +extern int switch_g_job_step_part_comp(switch_jobinfo_t jobinfo, + char *nodelist); + +/* + * Return TRUE if the switch plugin processes partial job step + * completion calls (i.e. switch_g_job_step_part_comp). Support + * of partition completions is compute intensive, so it should + * be avoided unless switch resources are in short supply (e.g. + * switch/federation). Otherwise return FALSE. + */ +extern bool switch_g_part_comp(void); + +/* + * Restore the switch allocation information "jobinfo" for an already + * allocated job step, most likely to restore the switch information + * after a call to switch_clear(). + */ +extern int switch_g_job_step_allocated(switch_jobinfo_t jobinfo, + char *nodelist); + +/* write job credential string representation to a file + * IN fp - an open file pointer + * IN jobinfo - a switch job credential + */ +extern void switch_print_jobinfo(FILE *fp, switch_jobinfo_t jobinfo); + +/* write job credential to a string + * IN jobinfo - a switch job credential + * OUT buf - location to write job credential contents + * IN size - byte size of buf + * RET - the string, same as buf + */ +extern char *switch_sprint_jobinfo( switch_jobinfo_t jobinfo, + char *buf, size_t size); + +/********************************************************************\ + * JOB LAUNCH AND MANAGEMENT FUNCTIONS RELATED TO SWITCH CREDENTIAL * +\********************************************************************/ + +/* + * Setup node for interconnect use. + * + * This function is run from the top level slurmd only once per + * slurmd run. It may be used, for instance, to perform some one-time + * interconnect setup or spawn an error handling thread. + * + */ +extern int interconnect_node_init(void); + +/* + * Finalize interconnect on node. + * + * This function is called once as slurmd exits (slurmd will wait for + * this function to return before continuing the exit process) + */ +extern int interconnect_node_fini(void); + + +/* + * Notes on job related interconnect functions: + * + * Interconnect functions are run within slurmd in the following way: + * (Diagram courtesy of Jim Garlick [see qsw.c] ) + * + * Process 1 (root) Process 2 (root, user) | Process 3 (user task) + * | + * interconnect_preinit | + * fork ------------------ interconnect_init | + * waitpid setuid, chdir, etc. | + * fork N procs -----------+--- interconnect_attach + * wait all | exec mpi process + * interconnect_fini* | + * interconnect_postfini | + * | + * + * [ *Note: interconnect_fini() is run as the uid of the job owner, not root ] + */ + +/* + * Prepare node for job. + * + * pre is run as root in the first slurmd process, the so called job + * manager. This function can be used to perform any initialization + * that needs to be performed in the same process as interconnect_fini() + * + */ +extern int interconnect_preinit(switch_jobinfo_t jobinfo); + +/* + * initialize interconnect on node for job. This function is run from the + * 2nd slurmd process (some interconnect implementations may require + * interconnect init functions to be executed from a separate process + * than the process executing interconnect_fini() [e.g. QsNet]) + * + */ +extern int interconnect_init(switch_jobinfo_t jobinfo, uid_t uid); + +/* + * This function is run from the same process as interconnect_init() + * after all job tasks have exited. It is *not* run as root, because + * the process in question has already setuid to the job owner. + * + */ +extern int interconnect_fini(switch_jobinfo_t jobinfo); + +/* + * Finalize interconnect on node. + * + * This function is run from the initial slurmd process (same process + * as interconnect_preinit()), and is run as root. Any cleanup routines + * that need to be run with root privileges should be run from this + * function. + */ +extern int interconnect_postfini(switch_jobinfo_t jobinfo, uid_t pgid, + uint32_t job_id, uint32_t step_id ); + +/* + * attach process to interconnect + * (Called from within the process, so it is appropriate to set + * interconnect specific environment variables here) + */ +extern int interconnect_attach(switch_jobinfo_t jobinfo, char ***env, + uint32_t nodeid, uint32_t procid, uint32_t nnodes, + uint32_t nprocs, uint32_t rank); + +/* + * Clear switch state on this node + */ +extern int switch_g_clear_node_state(void); + +/* + * Initialize slurmd step switch state + */ +extern int switch_g_slurmd_step_init(void); + +/* + * Allocate storage for a node's switch state record + */ +extern int switch_g_alloc_node_info(switch_node_info_t *switch_node); + +/* + * Fill in a previously allocated switch state record for the node on which + * this function is executed. + */ +extern int switch_g_build_node_info(switch_node_info_t switch_node); + +/* + * Pack the data associated with a node's switch state into a buffer + * for network transmission. + */ +extern int switch_g_pack_node_info(switch_node_info_t switch_node, + Buf buffer); + +/* + * Unpack the data associated with a node's switch state record + * from a buffer. + */ +extern int switch_g_unpack_node_info(switch_node_info_t switch_node, + Buf buffer); + +/* + * Release the storage associated with a node's switch state record. + */ +extern int switch_g_free_node_info(switch_node_info_t *switch_node); + +/* + * Print the contents of a node's switch state record to a buffer. + */ +extern char*switch_g_sprintf_node_info(switch_node_info_t switch_node, + char *buf, size_t size); + +#endif /* _SWITCH_H */ diff --git a/executable_names/src/common/timers.c b/executable_names/src/common/timers.c new file mode 100644 index 0000000000000000000000000000000000000000..914ebf9b114b07aec9e3817aa64e73f62119ac05 --- /dev/null +++ b/executable_names/src/common/timers.c @@ -0,0 +1,72 @@ +/*****************************************************************************\ + * timers.c - Timer functions + ***************************************************************************** + * Copyright (C) 2002-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include + +/* + * diff_tv_str - build a string showing the time difference between two times + * IN tv1 - start of event + * IN tv2 - end of event + * OUT tv_str - place to put delta time in format "usec=%ld" + * IN len_tv_str - size of tv_str in bytes + */ +inline void diff_tv_str(struct timeval *tv1,struct timeval *tv2, + char *tv_str, int len_tv_str) +{ + long delta_t; + delta_t = (tv2->tv_sec - tv1->tv_sec) * 1000000; + delta_t += tv2->tv_usec - tv1->tv_usec; + snprintf(tv_str, len_tv_str, "usec=%ld", delta_t); + if (delta_t > 1000000) + info("Warning: Note very large processing time: %s",tv_str); +} + +/* + * diff_tv - return the difference between two times + * IN tv1 - start of event + * IN tv2 - end of event + * RET time in micro-seconds + */ +inline long diff_tv(struct timeval *tv1, struct timeval *tv2) +{ + long delta_t; + delta_t = (tv2->tv_sec - tv1->tv_sec) * 1000000; + delta_t += tv2->tv_usec - tv1->tv_usec; + return delta_t; +} diff --git a/executable_names/src/common/timers.h b/executable_names/src/common/timers.h new file mode 100644 index 0000000000000000000000000000000000000000..2d48095d837c96226873ba9cfe3b132a51a1601b --- /dev/null +++ b/executable_names/src/common/timers.h @@ -0,0 +1,68 @@ +/*****************************************************************************\ + * timers.h - timing functions + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette and Kevin Tew + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _HAVE_TIMERS_H +#define _HAVE_TIMERS_H + +#include + +#define DEF_TIMERS struct timeval tv1, tv2; char tv_str[20] +#define START_TIMER gettimeofday(&tv1, NULL) +#define END_TIMER gettimeofday(&tv2, NULL); \ + diff_tv_str(&tv1, &tv2, tv_str, 20) +#define DELTA_TIMER diff_tv(&tv1, &tv2) +#define TIME_STR tv_str + +/* + * diff_tv_str - build a string showing the time difference between two times + * IN tv1 - start of event + * IN tv2 - end of event + * OUT tv_str - place to put delta time in format "usec=%ld" + * IN len_tv_str - size of tv_str in bytes + */ +extern inline void diff_tv_str(struct timeval *tv1,struct timeval *tv2, + char *tv_str, int len_tv_str); + +/* + * diff_tv - return the difference between two times + * IN tv1 - start of event + * IN tv2 - end of event + * RET time in micro-seconds + */ +inline long diff_tv(struct timeval *tv1, struct timeval *tv2); + +#endif diff --git a/executable_names/src/common/uid.c b/executable_names/src/common/uid.c new file mode 100644 index 0000000000000000000000000000000000000000..34d699cad8f7028a0d10ae7f8e563c8c52d84bcb --- /dev/null +++ b/executable_names/src/common/uid.c @@ -0,0 +1,88 @@ +/*****************************************************************************\ + * src/common/uid.c - uid/gid lookup utility functions + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include +#include + +#include "uid.h" + +uid_t +uid_from_string (char *name) +{ + struct passwd *pwd = NULL; + char *p = NULL; + uid_t uid = (uid_t) strtoul (name, &p, 10); + + if (*p != '\0') + pwd = getpwnam (name); + else + pwd = getpwuid (uid); + + return pwd ? pwd->pw_uid : (uid_t) -1; +} + +char * +uid_to_string (uid_t uid) +{ + struct passwd *pwd = NULL; + + /* Suse Linux does not handle multiple users with UID=0 well */ + if (uid == 0) + return "root"; + + pwd = getpwuid(uid); + return pwd ? pwd->pw_name : "nobody"; +} + +gid_t +gid_from_string (char *name) +{ + struct group *g = NULL; + char *p = NULL; + gid_t gid = (gid_t) strtoul (name, &p, 10); + + if (*p != '\0') + g = getgrnam (name); + else + g = getgrgid (gid); + + return g ? g->gr_gid : (gid_t) -1; +} + diff --git a/executable_names/src/common/uid.h b/executable_names/src/common/uid.h new file mode 100644 index 0000000000000000000000000000000000000000..7d0ac1c903e7482c6950406320f36eb72cfd4992 --- /dev/null +++ b/executable_names/src/common/uid.h @@ -0,0 +1,63 @@ +/*****************************************************************************\ + * src/common/uid.h - uid/gid lookup utility functions + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef __SLURM_UID_UTILITY_H__ +#define __SLURM_UID_UTILITY_H__ + +#include + +/* + * Return validated uid_t for string in ``name'' which contains + * either the UID number or user name + * + * Returns uid after verifying presence in /etc/passwd, or + * (uid_t) -1 on failure. + */ +uid_t uid_from_string (char *name); + +/* + * Same as uid_from_name(), but for group name/id. + */ +gid_t gid_from_string (char *name); + +/* + * Translate uid to user name + */ +char *uid_to_string (uid_t uid); + +#endif /*__SLURM_UID_UTILITY_H__*/ diff --git a/executable_names/src/common/unsetenv.c b/executable_names/src/common/unsetenv.c new file mode 100644 index 0000000000000000000000000000000000000000..158c41a7dd690171dc42a1cfe956baac923f6556 --- /dev/null +++ b/executable_names/src/common/unsetenv.c @@ -0,0 +1,60 @@ +/*****************************************************************************\ + * src/common/unsetenv.c - Kludge for unsetenv on AIX + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include + +extern int unsetenv (const char *name) +{ + int len, rc; + char *tmp; + + if (!getenv(name)) /* Nothing to clear */ + return 0; + + len = strlen(name); + tmp = malloc(len + 3); + strcpy(tmp, name); + strcat(tmp, "=x"); + if ((rc = putenv(tmp)) != 0) + return rc; + + /* Here's the real kludge, just clear the variable out. + * This does result in a memory leak. */ + tmp[0] = '\0'; + return 0; +} diff --git a/executable_names/src/common/unsetenv.h b/executable_names/src/common/unsetenv.h new file mode 100644 index 0000000000000000000000000000000000000000..e92061b40b01f30f89911ef5791f745d6d83bee1 --- /dev/null +++ b/executable_names/src/common/unsetenv.h @@ -0,0 +1,43 @@ +/*****************************************************************************\ + * src/common/unsetenv.h - Kludge for unsetenv on AIX + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _UNSETENV_H +#define _UNSETENV_H + +extern int unsetenv(const char *name); + +#endif diff --git a/executable_names/src/common/util-net.c b/executable_names/src/common/util-net.c new file mode 100644 index 0000000000000000000000000000000000000000..370227df03c7863eab787c58994a899bec4b09d7 --- /dev/null +++ b/executable_names/src/common/util-net.c @@ -0,0 +1,368 @@ +/*****************************************************************************\ + * $Id$ + ***************************************************************************** + * Copyright (C) 2001-2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Chris Dunlap . + * UCRL-CODE-2002-009. + * + * This file is part of ConMan, a remote console management program. + * For details, see . + * + * ConMan 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * ConMan 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 ConMan; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + ***************************************************************************** + * Refer to "util-net.h" for documentation on public functions. +\*****************************************************************************/ + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/common/strlcpy.h" +#include "src/common/util-net.h" +#include "src/common/macros.h" + + +#ifndef INET_ADDRSTRLEN +# define INET_ADDRSTRLEN 16 +#endif /* !INET_ADDRSTRLEN */ + + +static pthread_mutex_t hostentLock = PTHREAD_MUTEX_INITIALIZER; + + +static int copy_hostent(const struct hostent *src, char *dst, int len); +#ifndef NDEBUG +static int validate_hostent_copy( + const struct hostent *src, const struct hostent *dst); +#endif /* !NDEBUG */ + + +struct hostent * get_host_by_name(const char *name, + void *buf, int buflen, int *h_err) +{ +/* gethostbyname() is not thread-safe, and there is no frelling standard + * for gethostbyname_r() -- the arg list varies from system to system! + */ + struct hostent *hptr; + int n = 0; + + assert(name != NULL); + assert(buf != NULL); + + slurm_mutex_lock(&hostentLock); + if ((hptr = gethostbyname(name))) + n = copy_hostent(hptr, buf, buflen); + if (h_err) + *h_err = h_errno; + slurm_mutex_unlock(&hostentLock); + + if (n < 0) { + errno = ERANGE; + return(NULL); + } + return(hptr ? (struct hostent *) buf : NULL); +} + + +struct hostent * get_host_by_addr(const char *addr, int len, int type, + void *buf, int buflen, int *h_err) +{ +/* gethostbyaddr() is not thread-safe, and there is no frelling standard + * for gethostbyaddr_r() -- the arg list varies from system to system! + */ + struct hostent *hptr; + int n = 0; + + assert(addr != NULL); + assert(buf != NULL); + + slurm_mutex_lock(&hostentLock); + if ((hptr = gethostbyaddr(addr, len, type))) + n = copy_hostent(hptr, buf, buflen); + if (h_err) + *h_err = h_errno; + slurm_mutex_unlock(&hostentLock); + + if (n < 0) { + errno = ERANGE; + return(NULL); + } + return(hptr ? (struct hostent *) buf : NULL); +} + + +const char * host_strerror(int h_err) +{ + if (h_err == HOST_NOT_FOUND) + return("Unknown host"); + else if (h_err == TRY_AGAIN) + return("Transient host name lookup failure"); + else if (h_err == NO_RECOVERY) + return("Unknown server error"); + else if ((h_err == NO_ADDRESS) || (h_err == NO_DATA)) + return("No address associated with name"); + return("Unknown error"); +} + + +int host_name_to_addr4(const char *name, struct in_addr *addr) +{ + struct hostent *hptr; + unsigned char buf[HOSTENT_SIZE]; + + assert(name != NULL); + assert(addr != NULL); + + if (!(hptr = get_host_by_name(name, buf, sizeof(buf), NULL))) + return(-1); + if (hptr->h_length > 4) { + errno = ERANGE; + return(-1); + } + memcpy(addr, hptr->h_addr_list[0], hptr->h_length); + return(0); +} + + +char * host_addr4_to_name(const struct in_addr *addr, char *dst, int dstlen) +{ + struct hostent *hptr; + unsigned char buf[HOSTENT_SIZE]; + + assert(addr != NULL); + assert(dst != NULL); + + if (!(hptr = get_host_by_addr((char *) addr, 4, AF_INET, + buf, sizeof(buf), NULL))) + return(NULL); + if (strlen(hptr->h_name) >= dstlen) { + errno = ERANGE; + return(NULL); + } + strcpy(dst, hptr->h_name); + return(dst); +} + + +char * host_name_to_cname(const char *src, char *dst, int dstlen) +{ + struct hostent *hptr; + unsigned char buf[HOSTENT_SIZE]; + struct in_addr addr; + + assert(src != NULL); + assert(dst != NULL); + + if (!(hptr = get_host_by_name(src, buf, sizeof(buf), NULL))) + return(NULL); + /* + * If 'src' is an ip-addr string, it will simply be copied to h_name. + * So, we need to perform a reverse query based on the in_addr + * in order to obtain the canonical name of the host. + * Besides, this additional query helps protect against DNS spoofing. + */ + memcpy(&addr, hptr->h_addr_list[0], hptr->h_length); + if (!(hptr = get_host_by_addr((char *) &addr, 4, AF_INET, + buf, sizeof(buf), NULL))) + return(NULL); + if (strlen(hptr->h_name) >= dstlen) { + errno = ERANGE; + return(NULL); + } + strcpy(dst, hptr->h_name); + return(dst); +} + + +static int copy_hostent(const struct hostent *src, char *buf, int len) +{ +/* Copies the (src) hostent struct (and all of its associated data) + * into the buffer (buf) of length (len). + * Returns 0 if the copy is successful, or -1 if the length of the buffer + * is not large enough to hold the result. + * + * Note that the order in which data is copied into (buf) is done + * in such a way as to ensure everything is properly word-aligned. + * There is a method to the madness. + */ + struct hostent *dst; + int n; + char **p, **q; + + assert(src != NULL); + assert(buf != NULL); + + dst = (struct hostent *) buf; + if ((len -= sizeof(struct hostent)) < 0) + return(-1); + dst->h_addrtype = src->h_addrtype; + dst->h_length = src->h_length; + buf += sizeof(struct hostent); + + /* Reserve space for h_aliases[]. + */ + dst->h_aliases = (char **) buf; + for (p=src->h_aliases, q=dst->h_aliases, n=0; *p; p++, q++, n++) {;} + if ((len -= ++n * sizeof(char *)) < 0) + return(-1); + buf = (char *) (q + 1); + + /* Reserve space for h_addr_list[]. + */ + dst->h_addr_list = (char **) buf; + for (p=src->h_addr_list, q=dst->h_addr_list, n=0; *p; p++, q++, n++) {;} + if ((len -= ++n * sizeof(char *)) < 0) + return(-1); + buf = (char *) (q + 1); + + /* Copy h_addr_list[] in_addr structs. + */ + for (p=src->h_addr_list, q=dst->h_addr_list; *p; p++, q++) { + if ((len -= src->h_length) < 0) + return(-1); + memcpy(buf, *p, src->h_length); + *q = buf; + buf += src->h_length; + } + *q = NULL; + + /* Copy h_aliases[] strings. + */ + for (p=src->h_aliases, q=dst->h_aliases; *p; p++, q++) { + n = strlcpy(buf, *p, len); + *q = buf; + buf += ++n; /* allow for trailing NUL char */ + if ((len -= n) < 0) + return(-1); + } + *q = NULL; + + /* Copy h_name string. + */ + dst->h_name = buf; + n = strlcpy(buf, src->h_name, len); + buf += ++n; /* allow for trailing NUL char */ + if ((len -= n) < 0) + return(-1); + + assert(validate_hostent_copy(src, dst) >= 0); + return(0); +} + + +#ifndef NDEBUG +static int validate_hostent_copy( + const struct hostent *src, const struct hostent *dst) +{ +/* Validates the src hostent struct has been successfully copied into dst. + * Returns 0 if the copy is good; o/w, returns -1. + */ + char **p, **q; + + assert(src != NULL); + assert(dst != NULL); + + if (!dst->h_name) + return(-1); + if (src->h_name == dst->h_name) + return(-1); + if (strcmp(src->h_name, dst->h_name)) + return(-1); + if (src->h_addrtype != dst->h_addrtype) + return(-1); + if (src->h_length != dst->h_length) + return(-1); + for (p=src->h_aliases, q=dst->h_aliases; *p; p++, q++) + if ((!q) || (p == q) || (strcmp(*p, *q))) + return(-1); + for (p=src->h_addr_list, q=dst->h_addr_list; *p; p++, q++) + if ((!q) || (p == q) || (memcmp(*p, *q, src->h_length))) + return(-1); + return(0); +} +#endif /* !NDEBUG */ + + +#ifndef HAVE_INET_PTON +int inet_pton(int family, const char *str, void *addr) +{ +/* cf. Stevens UNPv1 p72. + */ + struct in_addr tmpaddr; + + if (family != AF_INET) { + errno = EAFNOSUPPORT; + return(-1); + } +#ifdef HAVE_INET_ATON + if (!inet_aton(str, &tmpaddr)) + return(0); +#else /* !HAVE_INET_ATON */ + if ((tmpaddr.s_addr = inet_addr(str)) == -1) + return(0); +#endif /* !HAVE_INET_ATON */ + + memcpy(addr, &tmpaddr, sizeof(struct in_addr)); + return(1); +} +#endif /* !HAVE_INET_PTON */ + + +#ifndef HAVE_INET_NTOP +const char * inet_ntop(int family, const void *addr, char *str, size_t len) +{ +/* cf. Stevens UNPv1 p72. + */ + const unsigned char *p = (const unsigned char *) addr; + char tmpstr[INET_ADDRSTRLEN]; + + assert(str != NULL); + + if (family != AF_INET) { + errno = EAFNOSUPPORT; + return(NULL); + } + snprintf(tmpstr, sizeof(tmpstr), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); + if (strlen(tmpstr) >= len) { + errno = ENOSPC; + return(NULL); + } + strcpy(str, tmpstr); + return(str); +} +#endif /* !HAVE_INET_NTOP */ diff --git a/executable_names/src/common/util-net.h b/executable_names/src/common/util-net.h new file mode 100644 index 0000000000000000000000000000000000000000..120f713c6209be383ee9afb0c09048b75c08d370 --- /dev/null +++ b/executable_names/src/common/util-net.h @@ -0,0 +1,127 @@ +/*****************************************************************************\ + * $Id$ + ***************************************************************************** + * Copyright (C) 2001-2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Chris Dunlap . + * UCRL-CODE-2002-009. + * + * This file is part of ConMan, a remote console management program. + * For details, see . + * + * ConMan 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * ConMan 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 ConMan; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + + +#ifndef _UTIL_NET_H +#define _UTIL_NET_H + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include +#include +#include + + +#define HOSTENT_SIZE 8192 /* cf. Stevens UNPv1 11.15 p304 */ + + +struct hostent * get_host_by_name(const char *name, + void *buf, int buflen, int *h_err); +/* + * A portable thread-safe alternative to be used in place of gethostbyname(). + * The result is stored in the buffer (buf) of length (buflen); if the buffer + * is too small to hold the result, NULL is returned with errno = ERANGE. + * Returns a ptr into (buf) on success; returns NULL on error, setting the + * (h_err) variable reference (if not NULL) to indicate the h_error. + */ + +struct hostent * get_host_by_addr(const char *addr, int len, int type, + void *buf, int buflen, int *h_err); +/* + * A portable thread-safe alternative to be used in place of gethostbyaddr(). + * The result is stored in the buffer (buf) of length (buflen); if the buffer + * is too small to hold the result, NULL is returned with errno = ERANGE. + * Returns a ptr into (buf) on success; returns NULL on error, setting the + * (h_err) variable reference (if not NULL) to indicate the h_error. + */ + +const char * host_strerror(int h_err); +/* + * Returns a string describing the error code (h_err) returned by + * get_host_by_name() or get_host_by_addr(). + */ + +int host_name_to_addr4(const char *name, struct in_addr *addr); +/* + * Converts the string (name) to an IPv4 address (addr). + * Returns 0 on success, or -1 on error. + * Note that this routine is thread-safe. + */ + +char * host_addr4_to_name(const struct in_addr *addr, char *dst, int dstlen); +/* + * Converts an IPv4 address (addr) to a host name string residing in + * buffer (dst) of length (dstlen). + * Returns a ptr to the NULL-terminated string (dst) on success, + * or NULL on error. + * Note that this routine is thread-safe. + */ + +char * host_name_to_cname(const char *src, char *dst, int dstlen); +/* + * Converts the hostname or IP address string (src) to the + * canonical name of the host residing in buffer (dst) of length (dstlen). + * Returns a ptr to the NULL-terminated string (dst) on success, + * or NULL on error. + * Note that this routine is thread-safe. + */ + +#ifndef HAVE_INET_PTON +int inet_pton(int family, const char *str, void *addr); +/* + * Convert from presentation format of an internet number in (str) + * to the binary network format, storing the result for interface + * type (family) in the socket address structure specified by (addr). + * Returns 1 if OK, 0 if input not a valid presentation format, -1 on error. + */ +#endif /* !HAVE_INET_PTON */ + +#ifndef HAVE_INET_NTOP +const char * inet_ntop(int family, const void *addr, char *str, size_t len); +/* + * Convert an Internet address in binary network format for interface + * type (family) in the socket address structure specified by (addr), + * storing the result in the buffer (str) of length (len). + * Returns ptr to result buffer if OK, or NULL on error. + */ +#endif /* !HAVE_INET_NTOP */ + + +#endif /* !_UTIL_NET_H */ diff --git a/executable_names/src/common/xassert.c b/executable_names/src/common/xassert.c new file mode 100644 index 0000000000000000000000000000000000000000..ca015b12028f6b2a53344397cc783064ef09c395 --- /dev/null +++ b/executable_names/src/common/xassert.c @@ -0,0 +1,62 @@ +/*****************************************************************************\ + * xassert.c - replacement for assert which sends error to log instead + * of stderr + * $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "src/common/log.h" +#include "src/common/macros.h" + +/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +void __xassert_failed(char *expr, const char *file, int line, char *func); +strong_alias(__xassert_failed, slurm_xassert_failed); + +void __xassert_failed(char *expr, const char *file, int line, char *func) +{ + error("%s:%d: %s(): Assertion (%s) failed.\n", file, line, func, expr); + log_flush(); + abort(); +} diff --git a/executable_names/src/common/xassert.h b/executable_names/src/common/xassert.h new file mode 100644 index 0000000000000000000000000000000000000000..a5cad5b61f432c7e50f0af0b71bb360f10a772d8 --- /dev/null +++ b/executable_names/src/common/xassert.h @@ -0,0 +1,70 @@ +/*****************************************************************************\ + * xassert.h: assert type macro with configurable handling + * If NDEBUG is defined, do nothing. + * If not, and expression is zero, log an error message and abort. + * $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _XASSERT_H +#define _XASSERT_H 1 + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include "macros.h" + +#ifdef NDEBUG + +# define xassert(expr) ((void) (0)) + +#else /* !NDEBUG */ + +# define xassert(__ex) _STMT_START { \ + (__ex) ? ((void)0) : \ + __xassert_failed(__STRING(__ex), __FILE__, __LINE__, __CURRENT_FUNC__);\ + } _STMT_END + +/* This prints the assertion failed message to the slurm log facility + * (see log.h) and aborts the calling program + * (messages go to stderr if log is not initialized) + */ +extern void __xassert_failed(char *, const char *, int, const char *) + __NORETURN_ATTR; + +#endif /* NDEBUG. */ + +#endif /* !__XASSERT_H */ diff --git a/executable_names/src/common/xmalloc.c b/executable_names/src/common/xmalloc.c new file mode 100644 index 0000000000000000000000000000000000000000..307c0aceea7c8f7dad4ccdbed05b5bef7051a0be --- /dev/null +++ b/executable_names/src/common/xmalloc.c @@ -0,0 +1,282 @@ +/*****************************************************************************\ + * xmalloc.c - enhanced malloc routines + * Started with Jim Garlick's xmalloc and tied into slurm log facility. + * Also added ability to print file, line, and function of caller. + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jim Garlick and + * Mark Grondona + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include /* for INT_MAX */ + +#include "src/common/xmalloc.h" +#include "src/common/log.h" +#include "src/common/macros.h" + +#if HAVE_UNSAFE_MALLOC +# include + static pthread_mutex_t malloc_lock = PTHREAD_MUTEX_INITIALIZER; +# define MALLOC_LOCK() pthread_mutex_lock(&malloc_lock) +# define MALLOC_UNLOCK() pthread_mutex_unlock(&malloc_lock) +#else +# define MALLOC_LOCK() +# define MALLOC_UNLOCK() +#endif + + +#if NDEBUG +# define xmalloc_assert(expr) ((void) (0)) +#else +static void malloc_assert_failed(char *, const char *, int, + const char *, const char *); +# define xmalloc_assert(expr) _STMT_START { \ + (expr) ? ((void)(0)) : \ + malloc_assert_failed(__STRING(expr), file, line, func, \ + __CURRENT_FUNC__); \ + } _STMT_END +#endif /* NDEBUG */ + + +/* + * "Safe" version of malloc(). + * size (IN) number of bytes to malloc + * RETURN pointer to allocate heap space + */ +void *slurm_xmalloc(size_t size, const char *file, int line, const char *func) +{ + void *new; + int *p; + + + xmalloc_assert(size >= 0 && size <= INT_MAX); + MALLOC_LOCK(); + p = (int *)malloc(size + 2*sizeof(int)); + MALLOC_UNLOCK(); + if (!p) { + /* don't call log functions here, we're probably OOM + */ + fprintf(log_fp(), "%s:%d: %s: xmalloc(%d) failed\n", + file, line, func, (int)size); + exit(1); + } + p[0] = XMALLOC_MAGIC; /* add "secret" magic cookie */ + p[1] = (int)size; /* store size in buffer */ + + new = &p[2]; + memset(new, 0, size); + return new; +} + +/* + * same as above, except return NULL on malloc failure instead of exiting + */ +void *slurm_try_xmalloc(size_t size, const char *file, int line, + const char *func) +{ + void *new; + int *p; + + xmalloc_assert(size >= 0 && size <= INT_MAX); + MALLOC_LOCK(); + p = (int *)malloc(size + 2*sizeof(int)); + MALLOC_UNLOCK(); + if (!p) { + return NULL; + } + p[0] = XMALLOC_MAGIC; /* add "secret" magic cookie */ + p[1] = (int)size; /* store size in buffer */ + + new = &p[2]; + memset(new, 0, size); + return new; +} + +/* + * "Safe" version of realloc(). Args are different: pass in a pointer to + * the object to be realloced instead of the object itself. + * item (IN/OUT) double-pointer to allocated space + * newsize (IN) requested size + */ +void * slurm_xrealloc(void **item, size_t newsize, + const char *file, int line, const char *func) +{ + int *p = NULL; + + /* xmalloc_assert(*item != NULL, file, line, func); */ + xmalloc_assert(newsize >= 0 && (int)newsize <= INT_MAX); + + if (*item != NULL) { + int old_size; + p = (int *)*item - 2; + + /* magic cookie still there? */ + xmalloc_assert(p[0] == XMALLOC_MAGIC); + old_size = p[1]; + + MALLOC_LOCK(); + p = (int *)realloc(p, newsize + 2*sizeof(int)); + MALLOC_UNLOCK(); + + if (p == NULL) + goto error; + + if (old_size < newsize) { + char *p_new = (char *)(&p[2]) + old_size; + memset(p_new, 0, (int)(newsize-old_size)); + } + xmalloc_assert(p[0] == XMALLOC_MAGIC); + + } else { + /* Initalize new memory */ + MALLOC_LOCK(); + p = (int *)malloc(newsize + 2*sizeof(int)); + MALLOC_UNLOCK(); + + if (p == NULL) + goto error; + + memset(&p[2], 0, newsize); + p[0] = XMALLOC_MAGIC; + } + + p[1] = (int)newsize; + *item = &p[2]; + return *item; + + error: + fprintf(log_fp(), "%s:%d: %s: xrealloc(%d) failed\n", + file, line, func, (int)newsize); + abort(); +} + +/* + * same as above, but return <= 0 on malloc() failure instead of aborting. + * `*item' will be unchanged. + */ +int slurm_try_xrealloc(void **item, size_t newsize, + const char *file, int line, const char *func) +{ + int *p = NULL; + + /* xmalloc_assert(*item != NULL, file, line, func); */ + xmalloc_assert(newsize >= 0 && (int)newsize <= INT_MAX); + + if (*item != NULL) { + int old_size; + p = (int *)*item - 2; + + /* magic cookie still there? */ + xmalloc_assert(p[0] == XMALLOC_MAGIC); + old_size = p[1]; + + MALLOC_LOCK(); + p = (int *)realloc(p, newsize + 2*sizeof(int)); + MALLOC_UNLOCK(); + + if (p == NULL) + return 0; + + if (old_size < newsize) { + char *p_new = (char *)(&p[2]) + old_size; + memset(p_new, 0, (int)(newsize-old_size)); + } + xmalloc_assert(p[0] == XMALLOC_MAGIC); + + } else { + /* Initalize new memory */ + MALLOC_LOCK(); + p = (int *)malloc(newsize + 2*sizeof(int)); + MALLOC_UNLOCK(); + + if (p == NULL) + return 0; + + memset(&p[2], 0, newsize); + p[0] = XMALLOC_MAGIC; + } + + p[1] = newsize; + *item = &p[2]; + return 1; +} + + +/* + * Return the size of a buffer. + * item (IN) pointer to allocated space + */ +int slurm_xsize(void *item, const char *file, int line, const char *func) +{ + int *p = (int *)item - 2; + xmalloc_assert(item != NULL); + xmalloc_assert(p[0] == XMALLOC_MAGIC); + return p[1]; +} + +/* + * Free which takes a pointer to object to free, which it turns into a null + * object. + * item (IN/OUT) double-pointer to allocated space + */ +void slurm_xfree(void **item, const char *file, int line, const char *func) +{ + if (*item != NULL) { + int *p = (int *)*item - 2; + /* magic cookie still there? */ + xmalloc_assert(p[0] == XMALLOC_MAGIC); + MALLOC_LOCK(); + free(p); + MALLOC_UNLOCK(); + *item = NULL; + } +} + +#ifndef NDEBUG +static void malloc_assert_failed(char *expr, const char *file, + int line, const char *caller, const char *func) +{ + error("%s() Error: from %s:%d: %s(): Assertion (%s) failed", + func, file, line, caller, expr); + abort(); +} +#endif diff --git a/executable_names/src/common/xmalloc.h b/executable_names/src/common/xmalloc.h new file mode 100644 index 0000000000000000000000000000000000000000..54ea9935a6c02d9fbe4903d427f421e50a65aed6 --- /dev/null +++ b/executable_names/src/common/xmalloc.h @@ -0,0 +1,114 @@ +/*****************************************************************************\ + * xmalloc.h - enhanced malloc routines for slurm + * - default: never return if errors are encountered. + * - attempt to report file, line, and calling function on assertion failure + * - use configurable slurm log facility for reporting errors + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jim Garlick and + * Mark Grondona + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + ***************************************************************************** + * Description: + * + * void *xmalloc(size_t size); + * void *try_xmalloc(size_t size); + * void xrealloc(void *p, size_t newsize); + * int try_xrealloc(void *p, size_t newsize); + * void xfree(void *p); + * int xsize(void *p); + * + * xmalloc(size) allocates size bytes and returns a pointer to the allocated + * memory. The memory is set to zero. xmalloc() will not return unless + * there are no errors. The memory must be freed using xfree(). + * + * try_xmalloc(size) is the same as above, but a NULL pointer is returned + * when there is an error allocating the memory. + * + * xrealloc(p, newsize) changes the size of the block pointed to by p to the + * value of newsize. Newly allocated memory is not zeroed. If p is NULL, + * xrealloc() performs the same function as `p = xmalloc(newsize)'. If p + * is not NULL, it is required to have been initialized with a call to + * [try_]xmalloc() or [try_]xrealloc(). + * + * try_xrealloc(p, newsize) is the same as above, but returns <= 0 if the + * there is an error allocating the requested memory. + * + * xfree(p) frees the memory block pointed to by p. The memory must have been + * initialized with a call to [try_]xmalloc() or [try_]xrealloc(). + * + * xsize(p) returns the current size of the memory allocation pointed to by + * p. The memory must have been allocated with [try_]xmalloc() or + * [try_]xrealloc(). + * +\*****************************************************************************/ + +#ifndef _XMALLOC_H +#define _XMALLOC_H + +#if HAVE_SYS_TYPES_H +# include +#endif + +#include "macros.h" + +#define xmalloc(__sz) \ + slurm_xmalloc (__sz, __FILE__, __LINE__, __CURRENT_FUNC__) + +#define try_xmalloc(__sz) \ + slurm_try_xmalloc(__sz, __FILE__, __LINE__, __CURRENT_FUNC__) + +#define xfree(__p) \ + slurm_xfree((void **)&(__p), __FILE__, __LINE__, __CURRENT_FUNC__) + +#define xrealloc(__p, __sz) \ + slurm_xrealloc((void **)&(__p), __sz, \ + __FILE__, __LINE__, __CURRENT_FUNC__) + +#define try_xrealloc(__p, __sz) \ + slurm_try_xrealloc((void **)&(__p), __sz, \ + __FILE__, __LINE__, __CURRENT_FUNC__) + +#define xsize(__p) \ + slurm_xsize((void *)__p, __FILE__, __LINE__, __CURRENT_FUNC__) + +void *slurm_xmalloc(size_t, const char *, int, const char *); +void *slurm_try_xmalloc(size_t , const char *, int , const char *); +void slurm_xfree(void **, const char *, int, const char *); +void *slurm_xrealloc(void **, size_t, const char *, int, const char *); +int slurm_try_xrealloc(void **, size_t, const char *, int, const char *); +int slurm_xsize(void *, const char *, int, const char *); + +#define XMALLOC_MAGIC 0x42 + +#endif /* !_XMALLOC_H */ diff --git a/executable_names/src/common/xsignal.c b/executable_names/src/common/xsignal.c new file mode 100644 index 0000000000000000000000000000000000000000..dfe9f077b9e35ff526ea1b371e321cd062e1cc41 --- /dev/null +++ b/executable_names/src/common/xsignal.c @@ -0,0 +1,151 @@ +/*****************************************************************************\ + * src/common/xsignal.c - POSIX signal functions + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include + +#include "src/common/log.h" +#include "src/common/macros.h" +#include "src/common/xsignal.h" +#include "src/common/xassert.h" + +/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +strong_alias(xsignal, slurm_xsignal); +strong_alias(xsignal_save_mask, slurm_xsignal_save_mask); +strong_alias(xsignal_set_mask, slurm_xsignal_set_mask); +strong_alias(xsignal_block, slurm_xsignal_block); +strong_alias(xsignal_unblock, slurm_xsignal_unblock); +strong_alias(xsignal_sigset_create, slurm_xsignal_sigset_create); + +SigFunc * +xsignal(int signo, SigFunc *f) +{ + struct sigaction sa, old_sa; + + sa.sa_handler = f; + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask, signo); + sa.sa_flags = 0; + if (sigaction(signo, &sa, &old_sa) < 0) + error("xsignal(%d) failed: %m", signo); + return (old_sa.sa_handler); +} + + +/* + * Wrapper for pthread_sigmask. + */ +static int +_sigmask(int how, sigset_t *set, sigset_t *oset) +{ + int err; + + if ((err = pthread_sigmask(how, set, oset))) + return error ("pthread_sigmask: %s", slurm_strerror(err)); + + return SLURM_SUCCESS; +} + + +/* + * Fill in the sigset_t with the list of signals in the + * the (zero-terminated) array of signals `sigarray.' + */ +int +xsignal_sigset_create(int sigarray[], sigset_t *setp) +{ + int i = 0, sig; + + if (sigemptyset(setp) < 0) + error("sigemptyset: %m"); + + while ((sig = sigarray[i++])) { + if (sigaddset(setp, sig) < 0) + return error ("sigaddset(%d): %m", sig); + } + + return SLURM_SUCCESS; +} + +int +xsignal_save_mask(sigset_t *set) +{ + sigemptyset(set); + return _sigmask(SIG_SETMASK, NULL, set); +} + +int +xsignal_set_mask(sigset_t *set) +{ + return _sigmask(SIG_SETMASK, set, NULL); +} + +int +xsignal_block(int sigarray[]) +{ + sigset_t set; + + xassert(sigarray != NULL); + + if (xsignal_sigset_create(sigarray, &set) < 0) + return SLURM_ERROR; + + return _sigmask(SIG_BLOCK, &set, NULL); +} + +int +xsignal_unblock(int sigarray[]) +{ + sigset_t set; + + xassert(sigarray != NULL); + + if (xsignal_sigset_create(sigarray, &set) < 0) + return SLURM_ERROR; + + return _sigmask(SIG_UNBLOCK, &set, NULL); +} + diff --git a/executable_names/src/common/xsignal.h b/executable_names/src/common/xsignal.h new file mode 100644 index 0000000000000000000000000000000000000000..b0dd20ec021c3770b19c1f708ed12a53969954e8 --- /dev/null +++ b/executable_names/src/common/xsignal.h @@ -0,0 +1,84 @@ +/*****************************************************************************\ + * src/common/xsignal.h - POSIX signal wrapper functions + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _XSIGNAL_H +#define _XSIGNAL_H + +#include + +typedef void SigFunc(int); + +/* + * Install a signal handler in the POSIX way, but with BSD signal() semantics + */ +SigFunc *xsignal(int signo, SigFunc *); + +/* + * Save current set of blocked signals into `set' + */ +int xsignal_save_mask(sigset_t *set); + +/* + * Set the mask of blocked signals to exactly `set' + */ +int xsignal_set_mask(sigset_t *set); + +/* + * Add the list of signals given in the signal array `sigarray' + * to the current list of signals masked in the process. + * + * sigarray is a zero-terminated array of signal numbers, + * e.g. { SIGINT, SIGTERM, ... , 0 } + * + * Returns SLURM_SUCCESS or SLURM_ERROR. + * + */ +int xsignal_block(int sigarray[]); + +/* + * As xsignal_block() above, but instead remove the list of signals + * from the threads signal mask. + */ +int xsignal_unblock(int sigarray[]); + +/* + * Create a sigset_t from a sigarray + */ +int xsignal_sigset_create(int sigarray[], sigset_t *setp); + +#endif /* !_XSIGNAL_H */ diff --git a/executable_names/src/common/xstring.c b/executable_names/src/common/xstring.c new file mode 100644 index 0000000000000000000000000000000000000000..f0bcb5a56421438417075a25ac5eef414d04a62f --- /dev/null +++ b/executable_names/src/common/xstring.c @@ -0,0 +1,374 @@ +/*****************************************************************************\ + * xstring.c - heap-oriented string manipulation functions with "safe" + * string expansion as needed. + ****************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jim Garlick + * Mark Grondona , et al. + * + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#if HAVE_UNISTD_H +# include +#endif + +#ifdef WITH_PTHREADS +# include +#endif + +#include +#include + +#include + +#include "src/common/macros.h" +#include "src/common/strlcpy.h" +#include "src/common/xassert.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + +#define XFGETS_CHUNKSIZE 64 + +/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +strong_alias(_xstrcat, slurm_xstrcat); +strong_alias(_xstrcatchar, slurm_xstrcatchar); +strong_alias(_xslurm_strerrorcat, slurm_xslurm_strerrorcat); +strong_alias(_xstrftimecat, slurm_xstrftimecat); +strong_alias(_xstrfmtcat, slurm_xstrfmtcat); +strong_alias(_xmemcat, slurm_xmemcat); +strong_alias(xstrdup, slurm_xstrdup); +strong_alias(xstrndup, slurm_xstrndup); +strong_alias(xbasename, slurm_xbasename); +strong_alias(_xstrsubstitute, slurm_xstrsubstitute); +strong_alias(xshort_hostname, slurm_xshort_hostname); +strong_alias(xstring_is_whitespace, slurm_xstring_is_whitespace); + +/* + * Ensure that a string has enough space to add 'needed' characters. + * If the string is uninitialized, it should be NULL. + */ +static void makespace(char **str, int needed) +{ + int used; + + if (*str == NULL) + *str = xmalloc(needed + 1); + else { + used = strlen(*str) + 1; + while (used + needed > xsize(*str)) { + int newsize = xsize(*str) + XFGETS_CHUNKSIZE; + int actualsize; + + xrealloc(*str, newsize); + actualsize = xsize(*str); + + xassert(actualsize == newsize); + } + } +} + +/* + * Concatenate str2 onto str1, expanding str1 as needed. + * str1 (IN/OUT) target string (pointer to in case of expansion) + * str2 (IN) source string + */ +void _xstrcat(char **str1, const char *str2) +{ + if (str2 == NULL) + str2 = "(null)"; + + makespace(str1, strlen(str2)); + strcat(*str1, str2); +} + +/* + * append one char to str and null terminate + */ +static void strcatchar(char *str, char c) +{ + int len = strlen(str); + + str[len++] = c; + str[len] = '\0'; +} + +/* + * Add a character to str, expanding str1 as needed. + * str1 (IN/OUT) target string (pointer to in case of expansion) + * size (IN/OUT) size of str1 (pointer to in case of expansion) + * c (IN) character to add + */ +void _xstrcatchar(char **str, char c) +{ + makespace(str, 1); + strcatchar(*str, c); +} + + +/* + * concatenate slurm_strerror(errno) onto string in buf, expand buf as needed + * + */ +void _xslurm_strerrorcat(char **buf) +{ + + char *err = slurm_strerror(errno); + + xstrcat(*buf, err); +} + +/* + * append strftime of fmt to buffer buf, expand buf as needed + * + */ +void _xstrftimecat(char **buf, const char *fmt) +{ + char p[256]; /* output truncated to 256 chars */ + time_t t; + struct tm tm; + + const char default_fmt[] = "%m/%d/%Y %H:%M:%S %Z"; +#ifdef DISABLE_LOCALTIME + static int disabled=0; + if (!buf) disabled=1; + if (disabled) return; +#endif + + if (fmt == NULL) + fmt = default_fmt; + + if (time(&t) == (time_t) -1) + fprintf(stderr, "time() failed\n"); + + if (!localtime_r(&t, &tm)) + fprintf(stderr, "localtime_r() failed\n"); + + strftime(p, sizeof(p), fmt, &tm); + + + _xstrcat(buf, p); +} + +/* + * append formatted string with printf-style args to buf, expanding + * buf as needed + */ +int _xstrfmtcat(char **str, const char *fmt, ...) +{ + va_list ap; + int rc; + char buf[4096]; + + va_start(ap, fmt); + rc = vsnprintf(buf, 4096, fmt, ap); + va_end(ap); + + xstrcat(*str, buf); + + return rc; +} + +/* + * append a range of memory from start to end to the string str, + * expanding str as needed + */ +void _xmemcat(char **str, char *start, char *end) +{ + char buf[4096]; + size_t len; + + xassert(end >= start); + + len = (size_t) end - (size_t) start; + + if (len == 0) + return; + + if (len > 4095) + len = 4095; + + memcpy(buf, start, len); + buf[len] = '\0'; + xstrcat(*str, buf); +} + +/* + * Replacement for libc basename + * path (IN) path possibly containing '/' characters + * RETURN last component of path + */ +char * xbasename(char *path) +{ + char *p; + + p = strrchr(path , '/'); + return (p ? (p + 1) : path); +} + +/* + * Duplicate a string. + * str (IN) string to duplicate + * RETURN copy of string + */ +char * xstrdup(const char *str) +{ + size_t siz, + rsiz; + char *result; + + if (str == NULL) { + return NULL; + } + siz = strlen(str) + 1; + result = (char *)xmalloc(siz); + + rsiz = strlcpy(result, str, siz); + + xassert(rsiz == siz-1); + + return result; +} + +/* + * Duplicate at most "n" characters of a string. + * str (IN) string to duplicate + * n (IN) + * RETURN copy of string + */ +char * xstrndup(const char *str, size_t n) +{ + size_t siz, + rsiz; + char *result; + + if (str == NULL) + return NULL; + + siz = strlen(str); + if (n < siz) + siz = n; + siz++; + result = (char *)xmalloc(siz); + + rsiz = strlcpy(result, str, siz); + + return result; +} + +/* + * Find the first instance of a sub-string "pattern" in the string "str", + * and replace it with the string "replacement". + * str (IN/OUT) target string (pointer to in case of expansion) + * pattern (IN) substring to look for in str + * replacement (IN) string with which to replace the "pattern" string + */ +void _xstrsubstitute(char **str, const char *pattern, const char *replacement) +{ + int pat_len, rep_len; + char *ptr, *end_copy; + int pat_offset; + + if (*str == NULL || pattern == NULL || pattern[0] == '\0') + return; + + if ((ptr = strstr(*str, pattern)) == NULL) + return; + pat_offset = ptr - (*str); + pat_len = strlen(pattern); + if (replacement == NULL) + rep_len = 0; + else + rep_len = strlen(replacement); + + end_copy = xstrdup(ptr + pat_len); + if (rep_len != 0) { + makespace(str, rep_len-pat_len); + strcpy((*str)+pat_offset, replacement); + } + strcpy((*str)+pat_offset+rep_len, end_copy); + xfree(end_copy); +} + +/* xshort_hostname + * Returns an xmalloc'd string containing the hostname + * of the local machine. The hostname contains only + * the short version of the hostname (e.g. "linux123.foo.bar" + * becomes "linux123") + * + * Returns NULL on error. + */ +char *xshort_hostname(void) +{ + int error_code; + char *dot_ptr, path_name[1024]; + + error_code = gethostname (path_name, sizeof(path_name)); + if (error_code) + return NULL; + + dot_ptr = strchr (path_name, '.'); + if (dot_ptr == NULL) + dot_ptr = path_name + strlen(path_name); + else + dot_ptr[0] = '\0'; + + return xstrdup(path_name); +} + +/* Returns true if all characters in a string are whitespace characters, + * otherwise returns false; + */ +bool xstring_is_whitespace(const char *str) +{ + int i, len; + + len = strlen(str); + for (i = 0; i < len; i++) { + if (!isspace(str[i])) { + return false; + } + } + + return true; +} + diff --git a/executable_names/src/common/xstring.h b/executable_names/src/common/xstring.h new file mode 100644 index 0000000000000000000000000000000000000000..ea456755790ffd9170bca82d734ec8945e47b4d7 --- /dev/null +++ b/executable_names/src/common/xstring.h @@ -0,0 +1,133 @@ +/*****************************************************************************\ + * xstring.h - "safe" string processing functions with automatic memory + * management + ****************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jim Garlick , et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _XSTRING_H +#define _XSTRING_H 1 + +#include "src/common/macros.h" + +#define xstrcat(__p, __q) _xstrcat(&(__p), __q) +#define xstrcatchar(__p, __c) _xstrcatchar(&(__p), __c) +#define xslurm_strerrorcat(__p) _xslurm_strerrorcat(&(__p)) +#define xstrftimecat(__p, __fmt) _xstrftimecat(&(__p), __fmt) +#define xstrfmtcat(__p, __fmt, args...) _xstrfmtcat(&(__p), __fmt, ## args) +#define xmemcat(__p, __s, __e) _xmemcat(&(__p), __s, __e) +#define xstrsubstitute(__p, __pat, __rep) _xstrsubstitute(&(__p), __pat, __rep) + +/* +** The following functions take a ptr to a string and expand the +** size of that string as needed to append the requested data. +** the macros above are provided to automatically take the +** address of the first argument, thus simplifying the interface +** +** space is allocated with xmalloc/xrealloc, so caller must use +** xfree to free. +** +*/ + +/* +** cat str2 onto str1, expanding str1 as necessary +*/ +void _xstrcat(char **str1, const char *str2); + +/* +** concatenate one char, `c', onto str1, expanding str1 as needed +*/ +void _xstrcatchar(char **str1, char c); + +/* +** concatenate stringified errno onto str +*/ +void _xslurm_strerrorcat(char **str); + +/* +** concatenate current time onto str, using fmt if it is non-NUL +** see strftime(3) for the usage of the format string +*/ +void _xstrftimecat(char **str, const char *fmt); + +/* +** concatenate printf-style formatted string onto str +** return value is result from vsnprintf(3) +*/ +int _xstrfmtcat(char **str, const char *fmt, ...); + +/* +** concatenate range of memory from start to end (not including end) +** onto str. +*/ +void _xmemcat(char **str, char *start, char *end); + +/* +** strdup which uses xmalloc routines +*/ +char *xstrdup(const char *str); + +/* +** strndup which uses xmalloc routines +*/ +char *xstrndup(const char *str, size_t n); + +/* +** replacement for libc basename +*/ +char *xbasename(char *path); + +/* +** Find the first instance of a sub-string "pattern" in the string "str", +** and replace it with the string "replacement". +*/ +void _xstrsubstitute(char **str, const char *pattern, const char *replacement); + +/* xshort_hostname + * Returns an xmalloc'd string containing the hostname + * of the local machine. The hostname contains only + * the short version of the hostname (e.g. "linux123.foo.bar" + * becomes "linux123") + * + * Returns NULL on error. + */ +char *xshort_hostname(void); + +/* + * Return true if all characters in a string are whitespace characters, + * otherwise return false. ("str" must be terminated by a null character) + */ +bool xstring_is_whitespace(const char *str); + +#endif /* !_XSTRING_H */ diff --git a/executable_names/src/plugins/Makefile.am b/executable_names/src/plugins/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..25088e401ac43076025482b08e2ee4343f2f69da --- /dev/null +++ b/executable_names/src/plugins/Makefile.am @@ -0,0 +1,2 @@ + +SUBDIRS = auth checkpoint jobacct jobcomp mpi proctrack sched select switch task diff --git a/executable_names/src/plugins/Makefile.in b/executable_names/src/plugins/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..846625f3f73f2fac05ae1e13e929b831fcc330e7 --- /dev/null +++ b/executable_names/src/plugins/Makefile.in @@ -0,0 +1,554 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +SUBDIRS = auth checkpoint jobacct jobcomp mpi proctrack sched select switch task +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/plugins/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/auth/Makefile.am b/executable_names/src/plugins/auth/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..95bdd081f77cc49cde4f7102e96eba370108634d --- /dev/null +++ b/executable_names/src/plugins/auth/Makefile.am @@ -0,0 +1,3 @@ +# Makefile for auth plugins + +SUBDIRS = authd munge none diff --git a/executable_names/src/plugins/auth/Makefile.in b/executable_names/src/plugins/auth/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..f60d9f2dddcb0cf4b1137c57a13e883923c7d42f --- /dev/null +++ b/executable_names/src/plugins/auth/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for auth plugins +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/auth +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +SUBDIRS = authd munge none +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/auth/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/plugins/auth/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/auth/authd/Makefile.am b/executable_names/src/plugins/auth/authd/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..1453ef0d9f96a3c36cb08b5c241adaca4acb812a --- /dev/null +++ b/executable_names/src/plugins/auth/authd/Makefile.am @@ -0,0 +1,20 @@ +# Makefile for auth/authd plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +# Add your plugin to this line, following the naming conventions. +if WITH_AUTHD +AUTHD = auth_authd.la +endif + +pkglib_LTLIBRARIES = $(AUTHD) + +# Authd authentication plugin -- requires libauth +auth_authd_la_SOURCES = auth_authd.c +auth_authd_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +auth_authd_la_LIBADD = -lauth -le + diff --git a/executable_names/src/plugins/auth/authd/Makefile.in b/executable_names/src/plugins/auth/authd/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..c71c4452dda2704a064b95da744eca9aa46afe1f --- /dev/null +++ b/executable_names/src/plugins/auth/authd/Makefile.in @@ -0,0 +1,563 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for auth/authd plugin + +SOURCES = $(auth_authd_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/auth/authd +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +auth_authd_la_DEPENDENCIES = +am_auth_authd_la_OBJECTS = auth_authd.lo +auth_authd_la_OBJECTS = $(am_auth_authd_la_OBJECTS) +@WITH_AUTHD_TRUE@am_auth_authd_la_rpath = -rpath $(pkglibdir) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(auth_authd_la_SOURCES) +DIST_SOURCES = $(auth_authd_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +# Add your plugin to this line, following the naming conventions. +@WITH_AUTHD_TRUE@AUTHD = auth_authd.la +pkglib_LTLIBRARIES = $(AUTHD) + +# Authd authentication plugin -- requires libauth +auth_authd_la_SOURCES = auth_authd.c +auth_authd_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +auth_authd_la_LIBADD = -lauth -le +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/auth/authd/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/auth/authd/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +auth_authd.la: $(auth_authd_la_OBJECTS) $(auth_authd_la_DEPENDENCIES) + $(LINK) $(am_auth_authd_la_rpath) $(auth_authd_la_LDFLAGS) $(auth_authd_la_OBJECTS) $(auth_authd_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/auth_authd.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/auth/authd/auth_authd.c b/executable_names/src/plugins/auth/authd/auth_authd.c new file mode 100644 index 0000000000000000000000000000000000000000..592c26b99fd2dc11e3560fec76e9b03dba630cb0 --- /dev/null +++ b/executable_names/src/plugins/auth/authd/auth_authd.c @@ -0,0 +1,378 @@ +/*****************************************************************************\ + * auth_authd - plugin for Brent Chun's authd + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +# if STDC_HEADERS +# include +# include +# endif /* STDC_HEADERS */ +# if HAVE_UNISTD_H +# include +# endif /* HAVE_UNISTD_H */ +#else /* ! HAVE_CONFIG_H */ +# include +# include +# include +# include +#endif /* HAVE_CONFIG_H */ + +#include +#include +#include + +#ifndef UNIX_PATH_MAX +#define UNIX_PATH_MAX 108 /* Cribbed from linux/un.h */ +#endif + +#include +#include "src/common/slurm_xlator.h" + +const char plugin_name[] = "Brent Chun's authd authentication plugin"; +const char plugin_type[] = "auth/authd"; +const uint32_t plugin_version = 90; + +/* + * Where to find the timeout in the argument vector. This is set + * during initialization and should not change. + */ +static int timeout_idx = -1; + +/* Default timeout. */ +static const int AUTHD_TTL = 2; + +typedef struct _slurm_auth_credential { + credentials cred; + signature sig; + int cr_errno; +} slurm_auth_credential_t; + +/* Plugin-global errno. */ +static int plugin_errno = SLURM_SUCCESS; + +/* + * Errno values. If you add something here you have to add its + * corresponding error string in slurm_auth_errstr() below. + */ +enum { + SLURM_AUTH_UNPACK = SLURM_AUTH_FIRST_LOCAL_ERROR, + SLURM_AUTH_EXPIRED +}; + + +int init( void ) +{ + const arg_desc_t *desc; + + verbose( "authd authentication module initializing" ); + + if ( ( desc = slurm_auth_get_arg_desc() ) == NULL ) { + error( "unable to query SLURM for argument vector layout" ); + return SLURM_ERROR; + } + + if ( ( timeout_idx = arg_idx_by_name( desc, ARG_TIMEOUT ) ) < 0 ) { + error( "Required argument 'Timeout' not provided" ); + return SLURM_ERROR; + } + + return SLURM_SUCCESS; +} + +extern int fini ( void ) +{ + return SLURM_SUCCESS; +} + +slurm_auth_credential_t * +slurm_auth_create( void *argv[] ) +{ + int ttl; + int rc; + slurm_auth_credential_t *cred; + + if ( argv == NULL ) { + plugin_errno = SLURM_AUTH_MEMORY; + return NULL; + } + + cred = (slurm_auth_credential_t *) + xmalloc( sizeof( slurm_auth_credential_t ) ); + cred->cr_errno = SLURM_SUCCESS; + cred->cred.uid = geteuid(); + cred->cred.gid = getegid(); + + cred->cred.valid_from = time( NULL ); + + ttl = timeout_idx >= 0 ? (int) argv[ timeout_idx ] : AUTHD_TTL; + /* + * In debug mode read the time-to-live from an environment + * variable. + */ +#ifndef NDEBUG + { + char *env = getenv( "SLURM_AUTHD_TTL" ); + if ( env ) { + ttl = atoi( env ); + if ( ttl <= 0 ) ttl = AUTHD_TTL; + } + } +#endif /*NDEBUG*/ + + cred->cred.valid_to = cred->cred.valid_from + ttl; + + /* Sign the credential. */ + auth_init_credentials (&cred->cred, ttl); + if ((rc = auth_get_signature( &cred->cred, &cred->sig )) < 0 ) { + plugin_errno = SLURM_AUTH_INVALID; + xfree( cred ); + return NULL; + } + + return cred; +} + +int +slurm_auth_destroy( slurm_auth_credential_t *cred ) +{ + if ( cred == NULL ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + xfree( cred ); + return SLURM_SUCCESS; +} + +int +slurm_auth_verify( slurm_auth_credential_t *cred, void *argv[] ) +{ + int rc; + time_t now; + + if ( ( cred == NULL ) || ( argv == NULL ) ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + + if ((rc = auth_verify_signature( &cred->cred, &cred->sig )) < 0) { + cred->cr_errno = SLURM_AUTH_INVALID; + return SLURM_ERROR; + } + + now = time( NULL ); + if ( ( now < cred->cred.valid_from ) || ( now > cred->cred.valid_to ) ) { + cred->cr_errno = SLURM_AUTH_EXPIRED; + return SLURM_ERROR; + } + + /* XXX check to see if user is valid on the system. */ + + return SLURM_SUCCESS; +} + + +uid_t +slurm_auth_get_uid( slurm_auth_credential_t *cred ) +{ + if ( cred == NULL ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_AUTH_NOBODY; + } + return cred->cred.uid; +} + + +gid_t +slurm_auth_get_gid( slurm_auth_credential_t *cred ) +{ + if ( cred == NULL ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_AUTH_NOBODY; + } + return cred->cred.gid; +} + + +int +slurm_auth_pack( slurm_auth_credential_t *cred, Buf buf ) +{ + uint16_t sig_size = sizeof( signature ); + + if ( ( cred == NULL ) || ( buf == NULL ) ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + + /* + * Marshall the plugin type and version for runtime sanity check. + * Add the terminating zero so we get it for free at the + * other end. + */ + packmem( (char *) plugin_type, strlen( plugin_type ) + 1, buf ); + pack32( plugin_version, buf ); + + pack32( (uint32_t) cred->cred.uid, buf ); + pack32( (uint32_t) cred->cred.gid, buf ); + pack_time( cred->cred.valid_from, buf ); + pack_time( cred->cred.valid_to, buf ); + packmem( cred->sig.data, sig_size, buf ); + + return SLURM_SUCCESS; +} + + +slurm_auth_credential_t * +slurm_auth_unpack( Buf buf ) +{ + slurm_auth_credential_t *cred; + uint16_t sig_size; /* ignored */ + uint32_t version, tmpint; + char *data; + + if ( buf == NULL ) { + plugin_errno = SLURM_AUTH_BADARG; + return NULL; + } + + + /* Check the plugin type. */ + if ( unpackmem_ptr( &data, &sig_size, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK; + return NULL; + } + if ( strcmp( data, plugin_type ) != 0 ) { + plugin_errno = SLURM_AUTH_MISMATCH; + return NULL; + } + + if ( unpack32( &version, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK; + return NULL; + } + if( version != plugin_version ) { + plugin_errno = SLURM_AUTH_MISMATCH; + return NULL; + } + + /* Allocate a credential. */ + cred = (slurm_auth_credential_t *) + xmalloc( sizeof( slurm_auth_credential_t ) ); + cred->cr_errno = SLURM_SUCCESS; + + if ( unpack32( &tmpint, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK; + goto unpack_error; + } + cred->cred.uid = tmpint; + if ( unpack32( &tmpint, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK; + goto unpack_error; + } + cred->cred.gid = tmpint; + if ( unpack_time( &cred->cred.valid_from, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK; + goto unpack_error; + } + if ( unpack_time( &cred->cred.valid_to, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK; + goto unpack_error; + } + if ( unpackmem_ptr( &data, &sig_size, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK; + goto unpack_error; + } + memcpy( cred->sig.data, data, sizeof( signature ) ); + + return cred; + + unpack_error: + xfree( cred ); + return NULL; +} + + +int +slurm_auth_print( slurm_auth_credential_t *cred, FILE *fp ) +{ + if ( cred == NULL ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + + verbose( "BEGIN AUTHD CREDENTIAL\n" ); + verbose( " UID: %u", cred->cred.uid ); + verbose( " GID: %u", cred->cred.gid ); + verbose( " Valid from: %s", ctime( &cred->cred.valid_from ) ); + verbose( " Valid to: %s", ctime( &cred->cred.valid_to ) ); + verbose( " Signature: 0x%02x%02x%02x%02x ...\n", + cred->sig.data[ 0 ], cred->sig.data[ 1 ], + cred->sig.data[ 2 ], cred->sig.data[ 3 ] ); + verbose( "END AUTHD CREDENTIAL\n" ); + + return SLURM_SUCCESS; +} + + +int +slurm_auth_errno( slurm_auth_credential_t *cred ) +{ + if ( cred == NULL ) + return plugin_errno; + else + return cred->cr_errno; +} + + +const char * +slurm_auth_errstr( int slurm_errno ) +{ + static struct { + int err; + char *msg; + } tbl[] = { + { SLURM_AUTH_UNPACK, "cannot unpack authentication type" }, + { SLURM_AUTH_EXPIRED, "the credential has expired" }, + { 0, NULL } + }; + + int i; + + for ( i = 0; ; ++i ) { + if ( tbl[ i ].msg == NULL ) return "unknown error"; + if ( tbl[ i ].err == slurm_errno ) return tbl[ i ].msg; + } +} diff --git a/executable_names/src/plugins/auth/munge/Makefile.am b/executable_names/src/plugins/auth/munge/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..f8ce899c70f757417c6f6b4d5a2beb420f395fb1 --- /dev/null +++ b/executable_names/src/plugins/auth/munge/Makefile.am @@ -0,0 +1,19 @@ +# Makefile for auth/munge plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common $(MUNGE_CPPFLAGS) + +# Add your plugin to this line, following the naming conventions. +if WITH_MUNGE +MUNGE = auth_munge.la +endif + +pkglib_LTLIBRARIES = $(MUNGE) + +# Munge authentication plugin +auth_munge_la_SOURCES = auth_munge.c +auth_munge_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) $(MUNGE_LDFLAGS) +auth_munge_la_LIBADD = $(MUNGE_LIBS) diff --git a/executable_names/src/plugins/auth/munge/Makefile.in b/executable_names/src/plugins/auth/munge/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..678aee39ff8a3384f4e23256bfba2cac39e16c08 --- /dev/null +++ b/executable_names/src/plugins/auth/munge/Makefile.in @@ -0,0 +1,564 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for auth/munge plugin + +SOURCES = $(auth_munge_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/auth/munge +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +am__DEPENDENCIES_1 = +auth_munge_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_auth_munge_la_OBJECTS = auth_munge.lo +auth_munge_la_OBJECTS = $(am_auth_munge_la_OBJECTS) +@WITH_MUNGE_TRUE@am_auth_munge_la_rpath = -rpath $(pkglibdir) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(auth_munge_la_SOURCES) +DIST_SOURCES = $(auth_munge_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common $(MUNGE_CPPFLAGS) + +# Add your plugin to this line, following the naming conventions. +@WITH_MUNGE_TRUE@MUNGE = auth_munge.la +pkglib_LTLIBRARIES = $(MUNGE) + +# Munge authentication plugin +auth_munge_la_SOURCES = auth_munge.c +auth_munge_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) $(MUNGE_LDFLAGS) +auth_munge_la_LIBADD = $(MUNGE_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/auth/munge/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/auth/munge/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +auth_munge.la: $(auth_munge_la_OBJECTS) $(auth_munge_la_DEPENDENCIES) + $(LINK) $(am_auth_munge_la_rpath) $(auth_munge_la_LDFLAGS) $(auth_munge_la_OBJECTS) $(auth_munge_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/auth_munge.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/auth/munge/auth_munge.c b/executable_names/src/plugins/auth/munge/auth_munge.c new file mode 100644 index 0000000000000000000000000000000000000000..7fcbb1787631ce5b63b8e301e84c1ee120f732b7 --- /dev/null +++ b/executable_names/src/plugins/auth/munge/auth_munge.c @@ -0,0 +1,576 @@ +/*****************************************************************************\ + * auth_munge.c - SLURM auth implementation via Chris Dunlap's Munge + * $Id$ + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +# if STDC_HEADERS +# include +# endif +# if HAVE_SYS_TYPES_H +# include +# endif /* HAVE_SYS_TYPES_H */ +# if HAVE_UNISTD_H +# include +# endif +# if HAVE_INTTYPES_H +# include +# else /* ! HAVE_INTTYPES_H */ +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* ! HAVE_CONFIG_H */ +# include +# include +# include +# include +# include +#endif /* HAVE_CONFIG_H */ + +#include +#include + +#include + +#include +#include "src/common/slurm_xlator.h" + +#define MUNGE_ERRNO_OFFSET 1000 + +const char plugin_name[] = "auth plugin for Munge (Chris Dunlap, LLNL)"; +const char plugin_type[] = "auth/munge"; +const uint32_t plugin_version = 10; + +static int plugin_errno = SLURM_SUCCESS; + +static int host_list_idx = -1; + + +enum { + SLURM_AUTH_UNPACK = SLURM_AUTH_FIRST_LOCAL_ERROR +}; + +/* + * The Munge implementation of the slurm AUTH credential + */ +typedef struct _slurm_auth_credential { +#ifndef NDEBUG +# define MUNGE_MAGIC 0xfeed + int magic; /* magical munge validity magic */ +#endif + char *m_str; /* munged string */ + void *buf; /* Application specific data */ + bool verified; /* true if this cred has been verified */ + int len; /* amount of App data */ + uid_t uid; /* UID. valid only if verified == true */ + gid_t gid; /* GID. valid only if verified == true */ + int cr_errno; +} slurm_auth_credential_t; + +/* + * Munge info structure for print* function + */ +typedef struct munge_info { + time_t encoded; + time_t decoded; + munge_cipher_t cipher; + munge_mac_t mac; + munge_zip_t zip; +} munge_info_t; + + +/* Static prototypes + */ + +static munge_info_t * cred_info_alloc(void); +static munge_info_t * cred_info_create(munge_ctx_t ctx); +static void cred_info_destroy(munge_info_t *); +static void _print_cred_info(munge_info_t *mi); +static void _print_cred(munge_ctx_t ctx); +static int _decode_cred(slurm_auth_credential_t *c); + + +/* + * Munge plugin initialization + */ +int init ( void ) +{ + host_list_idx = arg_idx_by_name( slurm_auth_get_arg_desc(), + ARG_HOST_LIST ); + if (host_list_idx == -1) + return SLURM_ERROR; + + verbose("%s loaded", plugin_name); + return SLURM_SUCCESS; +} + + +/* + * Allocate a credential. This function should return NULL if it cannot + * allocate a credential. Whether the credential is populated with useful + * data at this time is implementation-dependent. + */ +slurm_auth_credential_t * +slurm_auth_create( void *argv[] ) +{ + int retry = 2; + slurm_auth_credential_t *cred = NULL; + munge_err_t e = EMUNGE_SUCCESS; + munge_ctx_t ctx = munge_ctx_create(); + SigFunc *ohandler; + + if (ctx == NULL) { + error("munge_ctx_create failure"); + return NULL; + } + + cred = xmalloc(sizeof(*cred)); + cred->verified = false; + cred->m_str = NULL; + cred->buf = NULL; + cred->len = 0; + cred->cr_errno = SLURM_SUCCESS; + + xassert(cred->magic = MUNGE_MAGIC); + + /* + * Temporarily block SIGALARM to avoid misleading + * "Munged communication error" from libmunge if we + * happen to time out the connection in this secion of + * code. + */ + ohandler = xsignal(SIGALRM, SIG_BLOCK); + + again: + if ((e = munge_encode(&cred->m_str, ctx, cred->buf, cred->len))) { + if (e == EMUNGE_SOCKET && retry--) + goto again; + + error("Munge encode failed: %s", munge_ctx_strerror(ctx)); + xfree( cred ); + cred = NULL; + plugin_errno = e + MUNGE_ERRNO_OFFSET; + } + + xsignal(SIGALRM, ohandler); + + munge_ctx_destroy(ctx); + + return cred; +} + +/* + * Free a credential that was allocated with slurm_auth_alloc(). + */ +int +slurm_auth_destroy( slurm_auth_credential_t *cred ) +{ + if (!cred) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + + xassert(cred->magic == MUNGE_MAGIC); + + /* + * Note: Munge cred string and application-specific data in + * "buf" not encoded with xmalloc() + */ + if (cred->m_str) + free(cred->m_str); + if (cred->buf) + free(cred->buf); + + xfree(cred); + return SLURM_SUCCESS; +} + +/* + * Verify a credential to approve or deny authentication. + * + * Return SLURM_SUCCESS if the credential is in order and valid. + */ +int +slurm_auth_verify( slurm_auth_credential_t *c, void *argv ) +{ + if (!c) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + + xassert(c->magic == MUNGE_MAGIC); + + if (c->verified) + return SLURM_SUCCESS; + + if (_decode_cred(c) < 0) + return SLURM_ERROR; + + return SLURM_SUCCESS; +} + +/* + * Obtain the Linux UID from the credential. The accuracy of this data + * is not assured until slurm_auth_verify() has been called for it. + */ +uid_t +slurm_auth_get_uid( slurm_auth_credential_t *cred ) +{ + if (cred == NULL) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_AUTH_NOBODY; + } + if ((!cred->verified) && (_decode_cred(cred) < 0)) { + cred->cr_errno = SLURM_AUTH_INVALID; + return SLURM_AUTH_NOBODY; + } + + xassert(cred->magic == MUNGE_MAGIC); + + return cred->uid; +} + +/* + * Obtain the Linux GID from the credential. See slurm_auth_get_uid() + * above for details on correct behavior. + */ +gid_t +slurm_auth_get_gid( slurm_auth_credential_t *cred ) +{ + if (cred == NULL) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_AUTH_NOBODY; + } + if ((!cred->verified) && (_decode_cred(cred) < 0)) { + cred->cr_errno = SLURM_AUTH_INVALID; + return SLURM_AUTH_NOBODY; + } + + xassert(cred->magic == MUNGE_MAGIC); + + return cred->gid; +} + +/* + * Marshall a credential for transmission over the network, according to + * SLURM's marshalling protocol. + */ +int +slurm_auth_pack( slurm_auth_credential_t *cred, Buf buf ) +{ + if (cred == NULL) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + if (buf == NULL) { + cred->cr_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + + xassert(cred->magic == MUNGE_MAGIC); + + /* + * Prefix the credential with a description of the credential + * type so that it can be sanity-checked at the receiving end. + */ + packstr( (char *) plugin_type, buf ); + pack32( plugin_version, buf ); + /* + * Pack the data. + */ + packstr(cred->m_str, buf); + + return SLURM_SUCCESS; +} + +/* + * Unmarshall a credential after transmission over the network according + * to SLURM's marshalling protocol. + */ +slurm_auth_credential_t * +slurm_auth_unpack( Buf buf ) +{ + slurm_auth_credential_t *cred; + char *type; + uint16_t size; + uint32_t version; + + if ( buf == NULL ) { + plugin_errno = SLURM_AUTH_BADARG; + return NULL; + } + + /* + * Get the authentication type. + */ + if ( unpackmem_ptr( &type, &size, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK; + return NULL; + } + + if (( type == NULL ) + || ( strcmp( type, plugin_type ) != 0 )) { + plugin_errno = SLURM_AUTH_MISMATCH; + return NULL; + } + if ( unpack32( &version, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK; + return NULL; + } + if ( version != plugin_version ) { + plugin_errno = SLURM_AUTH_MISMATCH; + return NULL; + } + + /* Allocate and initialize credential. */ + cred = xmalloc(sizeof(*cred)); + cred->verified = false; + cred->m_str = NULL; + cred->buf = NULL; + cred->len = 0; + cred->cr_errno = SLURM_SUCCESS; + + xassert(cred->magic = MUNGE_MAGIC); + + if (unpackstr_malloc(&cred->m_str, &size, buf) < 0) { + plugin_errno = SLURM_AUTH_UNPACK; + goto unpack_error; + } + return cred; + + unpack_error: + xfree( cred ); + return NULL; +} + +/* + * Print to a stdio stream a human-readable representation of the + * credential for debugging or logging purposes. The format is left + * to the imagination of the plugin developer. + */ +int +slurm_auth_print( slurm_auth_credential_t *cred, FILE *fp ) +{ + if (cred == NULL) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + if ( fp == NULL ) { + cred->cr_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + + fprintf(fp, "BEGIN SLURM MUNGE AUTHENTICATION CREDENTIAL\n" ); + fprintf(fp, "%s\n", cred->m_str ); + fprintf(fp, "END SLURM MUNGE AUTHENTICATION CREDENTIAL\n" ); + return SLURM_SUCCESS; +} + +int +slurm_auth_errno( slurm_auth_credential_t *cred ) +{ + if ( cred == NULL ) + return plugin_errno; + else + return cred->cr_errno; +} + + +const char * +slurm_auth_errstr( int slurm_errno ) +{ + static struct { + int err; + char *msg; + } tbl[] = { + { SLURM_AUTH_UNPACK, "cannot unpack authentication type" }, + { 0, NULL } + }; + + int i; + + if (slurm_errno > MUNGE_ERRNO_OFFSET) + return munge_strerror(slurm_errno); + + for ( i = 0; ; ++i ) { + if ( tbl[ i ].msg == NULL ) return "unknown error"; + if ( tbl[ i ].err == slurm_errno ) return tbl[ i ].msg; + } +} + + +/* + * Decode the munge encoded credential `m_str' placing results, if validated, + * into slurm credential `c' + */ +static int +_decode_cred(slurm_auth_credential_t *c) +{ + int retry = 2; + munge_err_t e; + munge_ctx_t ctx; + + if (c == NULL) + return SLURM_ERROR; + + xassert(c->magic == MUNGE_MAGIC); + + if (c->verified) + return SLURM_SUCCESS; + + if ((ctx = munge_ctx_create()) == NULL) { + error("munge_ctx_create failure"); + return SLURM_ERROR; + } + + again: + if ((e = munge_decode(c->m_str, ctx, &c->buf, &c->len, &c->uid, &c->gid))) { + if ((e == EMUNGE_SOCKET) && retry--) { + error ("Munge decode failed: %s (retrying ...)", + munge_ctx_strerror(ctx)); + goto again; + } + + /* + * Print any valid credential data + */ + error ("Munge decode failed: %s", munge_ctx_strerror(ctx)); + _print_cred(ctx); + + plugin_errno = e + MUNGE_ERRNO_OFFSET; + + goto done; + } + + c->verified = true; + + done: + munge_ctx_destroy(ctx); + + return e ? SLURM_ERROR : SLURM_SUCCESS; +} + + + +/* + * Allocate space for Munge credential info structure + */ +static munge_info_t * +cred_info_alloc(void) +{ + munge_info_t *mi = xmalloc(sizeof(*mi)); + memset(mi, 0, sizeof(*mi)); + return mi; +} + +/* + * Free a Munge cred info object. + */ +static void +cred_info_destroy(munge_info_t *mi) +{ + xfree(mi); +} + +/* + * Create a credential info object from a Munge context + */ +static munge_info_t * +cred_info_create(munge_ctx_t ctx) +{ + munge_err_t e; + munge_info_t *mi = cred_info_alloc(); + + e = munge_ctx_get(ctx, MUNGE_OPT_ENCODE_TIME, &mi->encoded); + if (e != EMUNGE_SUCCESS) + error ("auth_munge: Unable to retrieve encode time: %s", + munge_ctx_strerror(ctx)); + + e = munge_ctx_get(ctx, MUNGE_OPT_DECODE_TIME, &mi->decoded); + if (e != EMUNGE_SUCCESS) + error ("auth_munge: Unable to retrieve decode time: %s", + munge_ctx_strerror(ctx)); + + e = munge_ctx_get(ctx, MUNGE_OPT_CIPHER_TYPE, &mi->cipher); + if (e != EMUNGE_SUCCESS) + error ("auth_munge: Unable to retrieve cipher type: %s", + munge_ctx_strerror(ctx)); + + e = munge_ctx_get(ctx, MUNGE_OPT_MAC_TYPE, &mi->mac); + if (e != EMUNGE_SUCCESS) + error ("auth_munge: Unable to retrieve mac type: %s", + munge_ctx_strerror(ctx)); + + e = munge_ctx_get(ctx, MUNGE_OPT_ZIP_TYPE, &mi->zip); + if (e != EMUNGE_SUCCESS) + error ("auth_munge: Unable to retrieve zip type: %s", + munge_ctx_strerror(ctx)); + + return mi; +} + + +/* + * Print credential info object to the slurm log facility. + */ +static void +_print_cred_info(munge_info_t *mi) +{ + char buf[256]; + + xassert(mi != NULL); + + if (mi->encoded > 0) + info ("ENCODED: %s", ctime_r(&mi->encoded, buf)); + + if (mi->decoded > 0) + info ("DECODED: %s", ctime_r(&mi->decoded, buf)); +} + + +/* + * Print credential information. + */ +static void +_print_cred(munge_ctx_t ctx) +{ + munge_info_t *mi = cred_info_create(ctx); + _print_cred_info(mi); + cred_info_destroy(mi); +} + diff --git a/executable_names/src/plugins/auth/none/Makefile.am b/executable_names/src/plugins/auth/none/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..89f520333b2f745e9660c683a1d1a59eb684d437 --- /dev/null +++ b/executable_names/src/plugins/auth/none/Makefile.am @@ -0,0 +1,13 @@ +# Makefile for auth/none plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = auth_none.la + +# Null authentication plugin. +auth_none_la_SOURCES = auth_none.c +auth_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/auth/none/Makefile.in b/executable_names/src/plugins/auth/none/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..3130e05760b5b36abb5b39a13e8373bdfb59b977 --- /dev/null +++ b/executable_names/src/plugins/auth/none/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for auth/none plugin + +SOURCES = $(auth_none_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/auth/none +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +auth_none_la_LIBADD = +am_auth_none_la_OBJECTS = auth_none.lo +auth_none_la_OBJECTS = $(am_auth_none_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(auth_none_la_SOURCES) +DIST_SOURCES = $(auth_none_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = auth_none.la + +# Null authentication plugin. +auth_none_la_SOURCES = auth_none.c +auth_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/auth/none/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/auth/none/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +auth_none.la: $(auth_none_la_OBJECTS) $(auth_none_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(auth_none_la_LDFLAGS) $(auth_none_la_OBJECTS) $(auth_none_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/auth_none.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/auth/none/auth_none.c b/executable_names/src/plugins/auth/none/auth_none.c new file mode 100644 index 0000000000000000000000000000000000000000..6318963a8f8624f157463265becf22cc285ccc92 --- /dev/null +++ b/executable_names/src/plugins/auth/none/auth_none.c @@ -0,0 +1,401 @@ +/*****************************************************************************\ + * auth_none.c - NO-OP slurm authentication plugin, validates all users. + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +# if STDC_HEADERS +# include +# endif +# if HAVE_SYS_TYPES_H +# include +# endif /* HAVE_SYS_TYPES_H */ +# if HAVE_UNISTD_H +# include +# endif +# if HAVE_INTTYPES_H +# include +# else /* ! HAVE_INTTYPES_H */ +# if HAVE_STDINT_H +# include +# endif +# endif /* HAVE_INTTYPES_H */ +#else /* ! HAVE_CONFIG_H */ +# include +# include +# include +# include +#endif /* HAVE_CONFIG_H */ + +#include + +#include +#include "src/common/slurm_xlator.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "auth" for SLURM authentication) and is a + * description of how this plugin satisfies that application. SLURM will + * only load authentication plugins if the plugin_type string has a prefix + * of "auth/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the authentication API matures. + */ +const char plugin_name[] = "Null authentication plugin"; +const char plugin_type[] = "auth/none"; +const uint32_t plugin_version = 90; + + +/* + * An opaque type representing authentication credentials. This type can be + * called whatever is meaningful and may contain any data required by the + * plugin. However, the plugin must be able to recover the Linux UID and + * GID given only an object of this type. + * + * Since no verification of the credentials is performed in the "none" + * authentication, this plugin simply uses the system-supplied UID and GID. + * In a more robust authentication context, this might include tickets or + * other signatures which the functions of this API can use to conduct + * verification. + * + * The client code never sees the inside of this structure directly. + * Objects of this type are passed in and out of the plugin via + * anonymous pointers. Because of this, robust plugins may wish to add + * some form of runtime typing to ensure that the pointers they have + * received are actually appropriate credentials and not pointers to + * random memory. + * + * A word about thread safety. The authentication plugin API specifies + * that SLURM will exercise the plugin sanely. That is, the authenticity + * of a credential which has not been activated should not be tested. + * However, the credential should be thread-safe. This does not mean + * necessarily that a plugin must recognize when an inconsistent sequence + * of API calls is in progress, but if a plugin will crash or otherwise + * misbehave if it is handed a credential in an inconsistent state (perhaps + * it is in the process of being activated and a signature is incomplete) + * then it is the plugin's responsibility to provide its own serialization\ + * to avoid that. + * + */ +typedef struct _slurm_auth_credential { + uid_t uid; + gid_t gid; + int cr_errno; +} slurm_auth_credential_t; + +/* A plugin-global errno. */ +static int plugin_errno = SLURM_SUCCESS; + +/* + * New errno values particular to this plugin. We declare the first + * one to be SLURM_AUTH_FIRST_LOCAL_ERROR to avoid conflicting with + * the general ones. + */ +enum { + SLURM_AUTH_UNPACK_TYPE = SLURM_AUTH_FIRST_LOCAL_ERROR, + SLURM_AUTH_UNPACK_VERSION, + SLURM_AUTH_UNPACK_CRED +}; + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +extern int init ( void ) +{ + verbose("%s loaded", plugin_name); + return SLURM_SUCCESS; +} + +extern int fini ( void ) +{ + return SLURM_SUCCESS; +} + +/* + * The remainder of this file implements the standard SLURM authentication + * API. + */ + +/* + * Allocate and initializes a credential. This function should return + * NULL if it cannot allocate a credential. + */ +slurm_auth_credential_t * +slurm_auth_create( void *argv[] ) +{ + slurm_auth_credential_t *cred; + + cred = ((slurm_auth_credential_t *) + xmalloc( sizeof( slurm_auth_credential_t ) )); + cred->cr_errno = SLURM_SUCCESS; + cred->uid = geteuid(); + cred->gid = getegid(); + return cred; +} + +/* + * Free a credential that was allocated with slurm_auth_create() or + * slurm_auth_unpack(). + */ +int +slurm_auth_destroy( slurm_auth_credential_t *cred ) +{ + if ( cred == NULL ) { + plugin_errno = SLURM_AUTH_MEMORY; + return SLURM_ERROR; + } + xfree( cred ); + return SLURM_SUCCESS; +} + +/* + * Verify a credential to approve or deny authentication. + * + * Return SLURM_SUCCESS if the credential is in order and valid. + */ +int +slurm_auth_verify( slurm_auth_credential_t *cred, void *argv[] ) +{ + return SLURM_SUCCESS; +} + +/* + * Obtain the Linux UID from the credential. The accuracy of this data + * is not assured until slurm_auth_verify() has been called for it. + */ +uid_t +slurm_auth_get_uid( slurm_auth_credential_t *cred ) +{ + if ( cred == NULL ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_AUTH_NOBODY; + } else { + return cred->uid; + } +} + +/* + * Obtain the Linux GID from the credential. See slurm_auth_get_uid() + * above for details on correct behavior. + */ +gid_t +slurm_auth_get_gid( slurm_auth_credential_t *cred ) +{ + if ( cred == NULL ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_AUTH_NOBODY; + } else { + return cred->gid; + } +} + +/* + * Marshall a credential for transmission over the network, according to + * SLURM's marshalling protocol. + */ +int +slurm_auth_pack( slurm_auth_credential_t *cred, Buf buf ) +{ + if ( ( cred == NULL ) || ( buf == NULL ) ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + + /* + * Prefix the credential with a description of the credential + * type so that it can be sanity-checked at the receiving end. + */ + packmem( (char *) plugin_type, strlen( plugin_type ) + 1, buf ); + pack32( plugin_version, buf ); + /* + * Pack the data values. + */ + pack32( (uint32_t) cred->uid, buf ); + pack32( (uint32_t) cred->gid, buf ); + + return SLURM_SUCCESS; +} + +/* + * Unmarshall a credential after transmission over the network according + * to SLURM's marshalling protocol. + */ +slurm_auth_credential_t * +slurm_auth_unpack( Buf buf ) +{ + slurm_auth_credential_t *cred; + char *tmpstr; + uint32_t tmpint; + uint32_t version; + uint16_t size; + + if ( buf == NULL ) { + plugin_errno = SLURM_AUTH_BADARG; + return NULL; + } + + /* + * Get the authentication type. + */ + if ( unpackmem_ptr( &tmpstr, &size, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK_TYPE; + return NULL; + } + if (( tmpstr == NULL ) + || ( strcmp( tmpstr, plugin_type ) != 0 )) { + plugin_errno = SLURM_AUTH_MISMATCH; + return NULL; + } + if ( unpack32( &version, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK_VERSION; + return NULL; + } + if ( version != plugin_version ) { + plugin_errno = SLURM_AUTH_MISMATCH; + return NULL; + } + + /* Allocate a new credential. */ + cred = ((slurm_auth_credential_t *) + xmalloc( sizeof( slurm_auth_credential_t ) )); + cred->cr_errno = SLURM_SUCCESS; + + /* + * We do it the hard way because we don't know anything about the + * size of uid_t or gid_t, only that they are integer values. We + * pack them as 32-bit integers, but we can't pass addresses to them + * directly to unpack as 32-bit integers because there will be bad + * clobbering if they really aren't. This technique ensures a + * warning at compile time if the sizes are incompatible. + */ + if ( unpack32( &tmpint, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK_CRED; + xfree( cred ); + return NULL; + } + cred->uid = tmpint; + if ( unpack32( &tmpint, buf ) != SLURM_SUCCESS ) { + plugin_errno = SLURM_AUTH_UNPACK_CRED; + xfree( cred ); + return NULL; + } + cred->gid = tmpint; + + return cred; +} + +/* + * Print to a stdio stream a human-readable representation of the + * credential for debugging or logging purposes. The format is left + * to the imagination of the plugin developer. + */ +int +slurm_auth_print( slurm_auth_credential_t *cred, FILE *fp ) +{ + if ( ( cred == NULL) || ( fp == NULL ) ) { + plugin_errno = SLURM_AUTH_BADARG; + return SLURM_ERROR; + } + + printf( "BEGIN SLURM BASIC AUTHENTICATION CREDENTIAL\n" ); + printf( "\tUID = %u\n", cred->uid ); + printf( "\tGID = %u\n", cred->gid ); + printf( "END SLURM BASIC AUTHENTICATION CREDENTIAL\n" ); + + return SLURM_SUCCESS; +} + + +/* + * Return the errno. If no credential is given, return the errno + * of the plugin. This leads to possibly ambiguous situations, but + * there really isn't any easy way of dealing with that. + */ +int +slurm_auth_errno( slurm_auth_credential_t *cred ) +{ + if ( cred == NULL ) + return plugin_errno; + else + return cred->cr_errno; +} + + +/* + * Return a string corresponding to an error. We are responsible only for + * the errors we define here in the plugin. The SLURM plugin wrappers + * take care of the API-mandated errors. + */ +const char * +slurm_auth_errstr( int slurm_errno ) +{ + static struct { + int err; + char *msg; + } tbl[] = { + { SLURM_AUTH_UNPACK_TYPE, "cannot unpack authentication type" }, + { SLURM_AUTH_UNPACK_VERSION, "cannot unpack credential version" }, + { SLURM_AUTH_UNPACK_CRED, "cannot unpack credential" }, + { 0, NULL } + }; + + int i; + + for ( i = 0; ; ++i ) { + if ( tbl[ i ].msg == NULL ) return "unknown error"; + if ( tbl[ i ].err == slurm_errno ) return tbl[ i ].msg; + } +} diff --git a/executable_names/src/plugins/checkpoint/Makefile.am b/executable_names/src/plugins/checkpoint/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..c86f681229c8682ea6c00530ad3b5fa05f4066bd --- /dev/null +++ b/executable_names/src/plugins/checkpoint/Makefile.am @@ -0,0 +1,3 @@ +# Makefile for checkpoint plugins + +SUBDIRS = aix none diff --git a/executable_names/src/plugins/checkpoint/Makefile.in b/executable_names/src/plugins/checkpoint/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..5ddccae8a5588a3609916b6f4d400a96743cff4b --- /dev/null +++ b/executable_names/src/plugins/checkpoint/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for checkpoint plugins +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/checkpoint +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +SUBDIRS = aix none +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/checkpoint/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/plugins/checkpoint/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/checkpoint/aix/Makefile.am b/executable_names/src/plugins/checkpoint/aix/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..7baac412e47a67d1dfced9afc27dda08cf2251aa --- /dev/null +++ b/executable_names/src/plugins/checkpoint/aix/Makefile.am @@ -0,0 +1,16 @@ +# Makefile for checkpoint/aix plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +# AIX checkpoint plugin. +if HAVE_AIX +pkglib_LTLIBRARIES = checkpoint_aix.la +checkpoint_aix_la_SOURCES = checkpoint_aix.c +checkpoint_aix_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +else +EXTRA_checkpoint_aix_la_SOURCES = checkpoint_aix.c +endif diff --git a/executable_names/src/plugins/checkpoint/aix/Makefile.in b/executable_names/src/plugins/checkpoint/aix/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..e13b9187f2a1fee85f473de6c6bf3dcdda150354 --- /dev/null +++ b/executable_names/src/plugins/checkpoint/aix/Makefile.in @@ -0,0 +1,564 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for checkpoint/aix plugin + +SOURCES = $(checkpoint_aix_la_SOURCES) $(EXTRA_checkpoint_aix_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/checkpoint/aix +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +checkpoint_aix_la_LIBADD = +am__checkpoint_aix_la_SOURCES_DIST = checkpoint_aix.c +@HAVE_AIX_TRUE@am_checkpoint_aix_la_OBJECTS = checkpoint_aix.lo +am__EXTRA_checkpoint_aix_la_SOURCES_DIST = checkpoint_aix.c +checkpoint_aix_la_OBJECTS = $(am_checkpoint_aix_la_OBJECTS) +@HAVE_AIX_TRUE@am_checkpoint_aix_la_rpath = -rpath $(pkglibdir) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(checkpoint_aix_la_SOURCES) \ + $(EXTRA_checkpoint_aix_la_SOURCES) +DIST_SOURCES = $(am__checkpoint_aix_la_SOURCES_DIST) \ + $(am__EXTRA_checkpoint_aix_la_SOURCES_DIST) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +# AIX checkpoint plugin. +@HAVE_AIX_TRUE@pkglib_LTLIBRARIES = checkpoint_aix.la +@HAVE_AIX_TRUE@checkpoint_aix_la_SOURCES = checkpoint_aix.c +@HAVE_AIX_TRUE@checkpoint_aix_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +@HAVE_AIX_FALSE@EXTRA_checkpoint_aix_la_SOURCES = checkpoint_aix.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/checkpoint/aix/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/checkpoint/aix/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +checkpoint_aix.la: $(checkpoint_aix_la_OBJECTS) $(checkpoint_aix_la_DEPENDENCIES) + $(LINK) $(am_checkpoint_aix_la_rpath) $(checkpoint_aix_la_LDFLAGS) $(checkpoint_aix_la_OBJECTS) $(checkpoint_aix_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkpoint_aix.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/checkpoint/aix/checkpoint_aix.c b/executable_names/src/plugins/checkpoint/aix/checkpoint_aix.c new file mode 100644 index 0000000000000000000000000000000000000000..303e5d2b5d78241337409338a48e98ba5589867e --- /dev/null +++ b/executable_names/src/plugins/checkpoint/aix/checkpoint_aix.c @@ -0,0 +1,503 @@ +/*****************************************************************************\ + * checkpoint_aix.c - AIX slurm checkpoint plugin. + * $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif +#ifdef WITH_PTHREADS +# include +#endif + +#include +#include +#include +#include +#include + +#include "src/common/list.h" +#include "src/common/log.h" +#include "src/common/pack.h" +#include "src/common/xassert.h" +#include "src/common/xstring.h" +#include "src/common/xmalloc.h" +#include "src/slurmctld/agent.h" +#include "src/slurmctld/slurmctld.h" + +struct check_job_info { + uint16_t disabled; /* counter, checkpointable only if zero */ + uint16_t node_cnt; + uint16_t reply_cnt; + uint16_t wait_time; + time_t time_stamp; /* begin or end checkpoint time */ + uint32_t error_code; + char *error_msg; +}; + +static void _send_sig(uint32_t job_id, uint32_t step_id, uint16_t signal, + char *node_name, slurm_addr node_addr); +static int _step_sig(struct step_record * step_ptr, uint16_t wait, + uint16_t signal, uint16_t sig_timeout); + +/* checkpoint request timeout processing */ +static pthread_t ckpt_agent_tid = 0; +static pthread_mutex_t ckpt_agent_mutex = PTHREAD_MUTEX_INITIALIZER; +static List ckpt_timeout_list = NULL; +struct ckpt_timeout_info { + uint32_t job_id; + uint32_t step_id; + uint16_t signal; + time_t start_time; + time_t end_time; + char *node_name; + slurm_addr node_addr; +}; +static void *_ckpt_agent_thr(void *arg); +static void _ckpt_enqueue_timeout(uint32_t job_id, uint32_t step_id, + time_t start_time, uint16_t signal, uint16_t wait_time, + char *node_name, slurm_addr node_addr); +static void _ckpt_dequeue_timeout(uint32_t job_id, uint32_t step_id, + time_t start_time); +static void _ckpt_timeout_free(void *rec); +static void _ckpt_signal_step(struct ckpt_timeout_info *rec); +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "checkpoint" for SLURM checkpoint) and + * is a description of how this plugin satisfies that application. SLURM will + * only load checkpoint plugins if the plugin_type string has a + * prefix of "checkpoint/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the checkpoint API matures. + */ +const char plugin_name[] = "Checkpoint AIX plugin"; +const char plugin_type[] = "checkpoint/aix"; +const uint32_t plugin_version = 90; + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +extern int init ( void ) +{ + pthread_attr_t attr; + + slurm_attr_init(&attr); + if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) + error("pthread_attr_setdetachstate: %m"); + if (pthread_create(&ckpt_agent_tid, &attr, _ckpt_agent_thr, NULL)) { + error("pthread_create: %m"); + return SLURM_ERROR; + } + slurm_attr_destroy(&attr); + + return SLURM_SUCCESS; +} + + +extern int fini ( void ) +{ + int i; + + if (!&ckpt_agent_tid) + return SLURM_SUCCESS; + + for (i=0; i<4; i++) { + if (pthread_cancel(ckpt_agent_tid)) { + ckpt_agent_tid = 0; + return SLURM_SUCCESS; + } + usleep(1000); + } + error("Could not kill checkpoint pthread"); + return SLURM_ERROR; +} + +/* + * The remainder of this file implements the standard SLURM checkpoint API. + */ + +extern int slurm_ckpt_op ( uint16_t op, uint16_t data, + struct step_record * step_ptr, time_t * event_time, + uint32_t *error_code, char **error_msg ) +{ + int rc = SLURM_SUCCESS; + struct check_job_info *check_ptr; + + xassert(step_ptr); + check_ptr = (struct check_job_info *) step_ptr->check_job; + xassert(check_ptr); + + switch (op) { + case CHECK_ABLE: + if (check_ptr->disabled) + rc = ESLURM_DISABLED; + else { + if (check_ptr->reply_cnt < check_ptr->node_cnt) + *event_time = check_ptr->time_stamp; + rc = SLURM_SUCCESS; + } + break; + case CHECK_DISABLE: + check_ptr->disabled++; + break; + case CHECK_ENABLE: + check_ptr->disabled--; + break; + case CHECK_CREATE: + check_ptr->time_stamp = time(NULL); + check_ptr->reply_cnt = 0; + check_ptr->error_code = 0; + xfree(check_ptr->error_msg); +#ifdef SIGSOUND + rc = _step_sig(step_ptr, data, SIGSOUND, SIGWINCH); +#else + /* No checkpoint, SIGWINCH for testing purposes */ + info("Checkpoint not supported, sending SIGWINCH"); + rc = _step_sig(step_ptr, data, SIGWINCH, SIGWINCH); +#endif + break; + case CHECK_VACATE: + check_ptr->time_stamp = time(NULL); + check_ptr->reply_cnt = 0; + check_ptr->error_code = 0; + xfree(check_ptr->error_msg); +#ifdef SIGMIGRATE + rc = _step_sig(step_ptr, data, SIGMIGRATE, SIGTERM); +#else + /* No checkpoint, kill job now, useful for testing */ + info("Checkpoint not supported, sending SIGTERM"); + rc = _step_sig(step_ptr, data, SIGTERM, SIGTERM); +#endif + break; + case CHECK_RESTART: + rc = ESLURM_NOT_SUPPORTED; + break; + case CHECK_ERROR: + xassert(error_code); + xassert(error_msg); + *error_code = check_ptr->error_code; + xfree(*error_msg); + *error_msg = xstrdup(check_ptr->error_msg); + break; + default: + error("Invalid checkpoint operation: %d", op); + rc = EINVAL; + } + + return rc; +} + +extern int slurm_ckpt_comp ( struct step_record * step_ptr, time_t event_time, + uint32_t error_code, char *error_msg ) +{ + struct check_job_info *check_ptr; + + xassert(step_ptr); + check_ptr = (struct check_job_info *) step_ptr->check_job; + xassert(check_ptr); + + if (event_time && (event_time != check_ptr->time_stamp)) + return ESLURM_ALREADY_DONE; + + if (error_code > check_ptr->error_code) { + info("slurm_ckpt_comp error %u: %s", error_code, error_msg); + check_ptr->error_code = error_code; + xfree(check_ptr->error_msg); + check_ptr->error_msg = xstrdup(error_msg); + return SLURM_SUCCESS; + } + + /* We need an error-free reply from each compute node, + * plus POE itself to note completion */ + if (check_ptr->reply_cnt++ == check_ptr->node_cnt) { + time_t now = time(NULL); + long delay = (long) difftime(now, check_ptr->time_stamp); + info("Checkpoint complete for job %u.%u in %ld seconds", + step_ptr->job_ptr->job_id, step_ptr->step_id, + delay); + check_ptr->time_stamp = now; + _ckpt_dequeue_timeout(step_ptr->job_ptr->job_id, + step_ptr->step_id, event_time); + } + return SLURM_SUCCESS; +} + +extern int slurm_ckpt_alloc_job(check_jobinfo_t *jobinfo) +{ + *jobinfo = (check_jobinfo_t) xmalloc(sizeof(struct check_job_info)); + return SLURM_SUCCESS; +} + +extern int slurm_ckpt_free_job(check_jobinfo_t jobinfo) +{ + xfree(jobinfo); + return SLURM_SUCCESS; +} + +extern int slurm_ckpt_pack_job(check_jobinfo_t jobinfo, Buf buffer) +{ + struct check_job_info *check_ptr = + (struct check_job_info *)jobinfo; + + pack16(check_ptr->disabled, buffer); + pack16(check_ptr->node_cnt, buffer); + pack16(check_ptr->reply_cnt, buffer); + pack16(check_ptr->wait_time, buffer); + + pack32(check_ptr->error_code, buffer); + packstr(check_ptr->error_msg, buffer); + pack_time(check_ptr->time_stamp, buffer); + + return SLURM_SUCCESS; +} + +extern int slurm_ckpt_unpack_job(check_jobinfo_t jobinfo, Buf buffer) +{ + uint16_t uint16_tmp; + struct check_job_info *check_ptr = + (struct check_job_info *)jobinfo; + + safe_unpack16(&check_ptr->disabled, buffer); + safe_unpack16(&check_ptr->node_cnt, buffer); + safe_unpack16(&check_ptr->reply_cnt, buffer); + safe_unpack16(&check_ptr->wait_time, buffer); + + safe_unpack32(&check_ptr->error_code, buffer); + safe_unpackstr_xmalloc(&check_ptr->error_msg, &uint16_tmp, buffer); + safe_unpack_time(&check_ptr->time_stamp, buffer); + + return SLURM_SUCCESS; + + unpack_error: + xfree(check_ptr->error_msg); + return SLURM_ERROR; +} + +/* Send a signal RPC to a specific node */ +static void _send_sig(uint32_t job_id, uint32_t step_id, uint16_t signal, + char *node_name, slurm_addr node_addr) +{ + agent_arg_t *agent_args; + kill_tasks_msg_t *kill_tasks_msg; + + kill_tasks_msg = xmalloc(sizeof(kill_tasks_msg_t)); + kill_tasks_msg->job_id = job_id; + kill_tasks_msg->job_step_id = step_id; + kill_tasks_msg->signal = signal; + + agent_args = xmalloc(sizeof(agent_arg_t)); + agent_args->msg_type = REQUEST_SIGNAL_TASKS; + agent_args->retry = 1; + agent_args->msg_args = kill_tasks_msg; + agent_args->hostlist = hostlist_create(node_name); + agent_args->node_count = 1; + + agent_queue_request(agent_args); +} + +/* Send specified signal only to the process launched on node 0. + * If the request times out, send sig_timeout. */ +static int _step_sig(struct step_record * step_ptr, uint16_t wait, + uint16_t signal, uint16_t sig_timeout) +{ + struct check_job_info *check_ptr; + struct job_record *job_ptr; + int i; + + xassert(step_ptr); + check_ptr = (struct check_job_info *) step_ptr->check_job; + xassert(check_ptr); + job_ptr = step_ptr->job_ptr; + xassert(job_ptr); + + if (IS_JOB_FINISHED(job_ptr)) + return ESLURM_ALREADY_DONE; + + if (check_ptr->disabled) + return ESLURM_DISABLED; + + check_ptr->node_cnt = 0; /* re-calculate below */ + for (i = 0; i < node_record_count; i++) { + if (bit_test(step_ptr->step_node_bitmap, i) == 0) + continue; + if (check_ptr->node_cnt++ > 0) + continue; + check_ptr->time_stamp = time(NULL); + check_ptr->wait_time = wait; + _send_sig(step_ptr->job_ptr->job_id, step_ptr->step_id, + signal, node_record_table_ptr[i].name, + node_record_table_ptr[i].slurm_addr); + _ckpt_enqueue_timeout(step_ptr->job_ptr->job_id, + step_ptr->step_id, check_ptr->time_stamp, + sig_timeout, wait, node_record_table_ptr[i].name, + node_record_table_ptr[i].slurm_addr); + } + + if (!check_ptr->node_cnt) { + error("_step_sig: job %u.%u has no nodes", job_ptr->job_id, + step_ptr->step_id); + return ESLURM_INVALID_NODE_NAME; + } + + info("checkpoint requested for job %u.%u", job_ptr->job_id, + step_ptr->step_id); + return SLURM_SUCCESS; +} + +/* Checkpoint processing pthread + * Never returns, but is cancelled on plugin termiantion */ +static void *_ckpt_agent_thr(void *arg) +{ + ListIterator iter; + struct ckpt_timeout_info *rec; + time_t now; + + while (1) { + sleep(1); + if (!ckpt_timeout_list) + continue; + + now = time(NULL); + iter = list_iterator_create(ckpt_timeout_list); + slurm_mutex_lock(&ckpt_agent_mutex); + /* look for and process any timeouts */ + while ((rec = list_next(iter))) { + if (rec->end_time > now) + continue; + info("checkpoint timeout for %u.%u", + rec->job_id, rec->step_id); + _ckpt_signal_step(rec); + list_delete(iter); + } + slurm_mutex_unlock(&ckpt_agent_mutex); + list_iterator_destroy(iter); + } +} + +static void _ckpt_signal_step(struct ckpt_timeout_info *rec) +{ + /* debug("signal %u.%u %u", rec->job_id, rec->step_id, rec->signal); */ + _send_sig(rec->job_id, rec->step_id, rec->signal, + rec->node_name, rec->node_addr); +} + +/* Queue a checkpoint request timeout */ +static void _ckpt_enqueue_timeout(uint32_t job_id, uint32_t step_id, + time_t start_time, uint16_t signal, uint16_t wait_time, + char *node_name, slurm_addr node_addr) +{ + struct ckpt_timeout_info *rec; + + if ((wait_time == 0) || (signal == 0)) + return; + + slurm_mutex_lock(&ckpt_agent_mutex); + if (!ckpt_timeout_list) + ckpt_timeout_list = list_create(_ckpt_timeout_free); + rec = xmalloc(sizeof(struct ckpt_timeout_info)); + rec->job_id = job_id; + rec->step_id = step_id; + rec->signal = signal; + rec->start_time = start_time; + rec->end_time = start_time + wait_time; + rec->node_name = xstrdup(node_name); + rec->node_addr = node_addr; + /* debug("enqueue %u.%u %u", job_id, step_id, wait_time); */ + list_enqueue(ckpt_timeout_list, rec); + slurm_mutex_unlock(&ckpt_agent_mutex); +} + +static void _ckpt_timeout_free(void *rec) +{ + struct ckpt_timeout_info *ckpt_rec = (struct ckpt_timeout_info *)rec; + + if (ckpt_rec) { + xfree(ckpt_rec->node_name); + xfree(ckpt_rec); + } +} + +/* De-queue a checkpoint timeout request. The operation completed */ +static void _ckpt_dequeue_timeout(uint32_t job_id, uint32_t step_id, + time_t start_time) +{ + ListIterator iter; + struct ckpt_timeout_info *rec; + + slurm_mutex_lock(&ckpt_agent_mutex); + if (!ckpt_timeout_list) + goto fini; + iter = list_iterator_create(ckpt_timeout_list); + while ((rec = list_next(iter))) { + if ((rec->job_id != job_id) || (rec->step_id != step_id) + || (start_time && (rec->start_time != start_time))) + continue; + /* debug("dequeue %u.%u", job_id, step_id); */ + list_delete(iter); + break; + } + list_iterator_destroy(iter); + fini: + slurm_mutex_unlock(&ckpt_agent_mutex); +} + diff --git a/executable_names/src/plugins/checkpoint/none/Makefile.am b/executable_names/src/plugins/checkpoint/none/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..48fb803c7e86e8b86e1944690bdaf537ec79e1b3 --- /dev/null +++ b/executable_names/src/plugins/checkpoint/none/Makefile.am @@ -0,0 +1,13 @@ +# Makefile for checkpoint/none plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = checkpoint_none.la + +# Null checkpoint plugin. +checkpoint_none_la_SOURCES = checkpoint_none.c +checkpoint_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/checkpoint/none/Makefile.in b/executable_names/src/plugins/checkpoint/none/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..e6f38fa97cfaccf60b89c5d0237c5a222635c9dd --- /dev/null +++ b/executable_names/src/plugins/checkpoint/none/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for checkpoint/none plugin + +SOURCES = $(checkpoint_none_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/checkpoint/none +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +checkpoint_none_la_LIBADD = +am_checkpoint_none_la_OBJECTS = checkpoint_none.lo +checkpoint_none_la_OBJECTS = $(am_checkpoint_none_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(checkpoint_none_la_SOURCES) +DIST_SOURCES = $(checkpoint_none_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = checkpoint_none.la + +# Null checkpoint plugin. +checkpoint_none_la_SOURCES = checkpoint_none.c +checkpoint_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/checkpoint/none/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/checkpoint/none/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +checkpoint_none.la: $(checkpoint_none_la_OBJECTS) $(checkpoint_none_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(checkpoint_none_la_LDFLAGS) $(checkpoint_none_la_OBJECTS) $(checkpoint_none_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkpoint_none.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/checkpoint/none/checkpoint_none.c b/executable_names/src/plugins/checkpoint/none/checkpoint_none.c new file mode 100644 index 0000000000000000000000000000000000000000..c5afb07e824f43fc71cade832c37ce37f89dbccd --- /dev/null +++ b/executable_names/src/plugins/checkpoint/none/checkpoint_none.c @@ -0,0 +1,136 @@ +/*****************************************************************************\ + * checkpoint_none.c - NO-OP slurm checkpoint plugin. + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include +#include +#include + +#include "src/slurmctld/slurmctld.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "checkpoint" for SLURM checkpoint) and + * is a description of how this plugin satisfies that application. SLURM will + * only load checkpoint plugins if the plugin_type string has a + * prefix of "checkpoint/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the checkpoint API matures. + */ +const char plugin_name[] = "Checkpoint NONE plugin"; +const char plugin_type[] = "checkpoint/none"; +const uint32_t plugin_version = 90; + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +extern int init ( void ) +{ + return SLURM_SUCCESS; +} + +extern int fini ( void ) +{ + return SLURM_SUCCESS; +} + +/* + * The remainder of this file implements the standard SLURM checkpoint API. + */ + +extern int slurm_ckpt_op ( uint16_t op, uint16_t data, + struct step_record * step_ptr, time_t * event_time, + uint32_t *error_code, char **error_msg ) +{ + return ESLURM_NOT_SUPPORTED; +} + +extern int slurm_ckpt_comp ( struct step_record * step_ptr, time_t event_time, + uint32_t error_code, char *error_msg) +{ + return ESLURM_NOT_SUPPORTED; +} + +extern int slurm_ckpt_alloc_job(check_jobinfo_t *jobinfo) +{ + return SLURM_SUCCESS; +} + +extern int slurm_ckpt_free_job(check_jobinfo_t jobinfo) +{ + return SLURM_SUCCESS; +} + +extern int slurm_ckpt_pack_job(check_jobinfo_t jobinfo, Buf buffer) +{ + return SLURM_SUCCESS; +} + +extern int slurm_ckpt_unpack_job(check_jobinfo_t jobinfo, Buf buffer) +{ + return SLURM_SUCCESS; +} diff --git a/executable_names/src/plugins/jobacct/Makefile.am b/executable_names/src/plugins/jobacct/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..1039e1ad8067eceb6ad7ec002c938c0cc457ecc8 --- /dev/null +++ b/executable_names/src/plugins/jobacct/Makefile.am @@ -0,0 +1,3 @@ +# Makefile for jobacct plugins + +SUBDIRS = linux aix none diff --git a/executable_names/src/plugins/jobacct/Makefile.in b/executable_names/src/plugins/jobacct/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..5e05a0c2013ab009dc4e1d115acdff26f420866a --- /dev/null +++ b/executable_names/src/plugins/jobacct/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for jobacct plugins +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/jobacct +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +SUBDIRS = linux aix none +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/jobacct/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/plugins/jobacct/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/jobacct/aix/Makefile.am b/executable_names/src/plugins/jobacct/aix/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..b3e360945061018075b3c1ba47da990efa9bb379 --- /dev/null +++ b/executable_names/src/plugins/jobacct/aix/Makefile.am @@ -0,0 +1,16 @@ +# Makefile for jobacct/aix plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = jobacct_aix.la + +# Null job completion logging plugin. +jobacct_aix_la_SOURCES = jobacct_aix.c \ + $(top_builddir)/src/plugins/jobacct/common/jobacct_common.c \ + $(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c \ + $(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c +jobacct_aix_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/jobacct/aix/Makefile.in b/executable_names/src/plugins/jobacct/aix/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..84f195edbe601743f256b87ee3b82042e6ffc4f3 --- /dev/null +++ b/executable_names/src/plugins/jobacct/aix/Makefile.in @@ -0,0 +1,587 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for jobacct/aix plugin + +SOURCES = $(jobacct_aix_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/jobacct/aix +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +jobacct_aix_la_LIBADD = +am_jobacct_aix_la_OBJECTS = jobacct_aix.lo jobacct_common.lo \ + common_slurmctld.lo common_slurmstepd.lo +jobacct_aix_la_OBJECTS = $(am_jobacct_aix_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(jobacct_aix_la_SOURCES) +DIST_SOURCES = $(jobacct_aix_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = jobacct_aix.la + +# Null job completion logging plugin. +jobacct_aix_la_SOURCES = jobacct_aix.c \ + $(top_builddir)/src/plugins/jobacct/common/jobacct_common.c \ + $(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c \ + $(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c + +jobacct_aix_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/jobacct/aix/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/jobacct/aix/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +jobacct_aix.la: $(jobacct_aix_la_OBJECTS) $(jobacct_aix_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(jobacct_aix_la_LDFLAGS) $(jobacct_aix_la_OBJECTS) $(jobacct_aix_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common_slurmctld.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common_slurmstepd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobacct_aix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobacct_common.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +jobacct_common.lo: $(top_builddir)/src/plugins/jobacct/common/jobacct_common.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jobacct_common.lo -MD -MP -MF "$(DEPDIR)/jobacct_common.Tpo" -c -o jobacct_common.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/jobacct_common.Tpo" "$(DEPDIR)/jobacct_common.Plo"; else rm -f "$(DEPDIR)/jobacct_common.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c' object='jobacct_common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jobacct_common.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c + +common_slurmctld.lo: $(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common_slurmctld.lo -MD -MP -MF "$(DEPDIR)/common_slurmctld.Tpo" -c -o common_slurmctld.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/common_slurmctld.Tpo" "$(DEPDIR)/common_slurmctld.Plo"; else rm -f "$(DEPDIR)/common_slurmctld.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c' object='common_slurmctld.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common_slurmctld.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c + +common_slurmstepd.lo: $(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common_slurmstepd.lo -MD -MP -MF "$(DEPDIR)/common_slurmstepd.Tpo" -c -o common_slurmstepd.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/common_slurmstepd.Tpo" "$(DEPDIR)/common_slurmstepd.Plo"; else rm -f "$(DEPDIR)/common_slurmstepd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c' object='common_slurmstepd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common_slurmstepd.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/jobacct/aix/jobacct_aix.c b/executable_names/src/plugins/jobacct/aix/jobacct_aix.c new file mode 100644 index 0000000000000000000000000000000000000000..7644d3f6998e967ee34b24b88c1c1ab5fc29798d --- /dev/null +++ b/executable_names/src/plugins/jobacct/aix/jobacct_aix.c @@ -0,0 +1,465 @@ +/*****************************************************************************\ + * jobacct_aix.c - slurm job accounting plugin for AIX. + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Written by Andy Riebs, , who borrowed heavily + * from other parts of SLURM, and Danny Auble, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This file is patterned after jobcomp_linux.c, written by Morris Jette and + * Copyright (C) 2002 The Regents of the University of California. +\*****************************************************************************/ + +#include "src/plugins/jobacct/common/jobacct_common.h" + +#ifdef HAVE_AIX +#include +#include +#define NPROCS 5000 +#endif + + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "jobacct" for SLURM job completion logging) and + * is a description of how this plugin satisfies that application. SLURM will + * only load job completion logging plugins if the plugin_type string has a + * prefix of "jobacct/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the job accounting API + * matures. + */ +const char plugin_name[] = "Job accounting AIX plugin"; +const char plugin_type[] = "jobacct/aix"; +const uint32_t plugin_version = 100; + +/* Other useful declarations */ +#ifdef HAVE_AIX +typedef struct prec { /* process record */ + pid_t pid; + pid_t ppid; + int usec; /* user cpu time */ + int ssec; /* system cpu time */ + int pages; /* pages */ + float rss; /* maxrss */ + float vsize; /* max virtual size */ +} prec_t; + +static int freq = 0; +static int pagesize = 0; +/* Finally, pre-define all the routines. */ + +static void _get_offspring_data(List prec_list, prec_t *ancestor, pid_t pid); +static void _get_process_data(); +static void *_watch_tasks(void *arg); +static void _destroy_prec(void *object); + +/* system call to get process table */ +extern int getprocs(struct procsinfo *procinfo, int, struct fdsinfo *, + int, pid_t *, int); + /* procinfo: pointer to array of procinfo struct */ + /* nproc: number of user procinfo struct */ + /* sizproc: size of expected procinfo structure */ + +#endif + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +extern int init ( void ) +{ + verbose("%s loaded", plugin_name); + return SLURM_SUCCESS; +} + +extern int fini ( void ) +{ + return SLURM_SUCCESS; +} + +/* + * The following routine is called by the slurmd mainline + */ + +int jobacct_p_init_struct(struct jobacctinfo *jobacct, + jobacct_id_t *jobacct_id) +{ + return common_init_struct(jobacct, jobacct_id); +} + +struct jobacctinfo *jobacct_p_alloc(jobacct_id_t *jobacct_id) +{ + return common_alloc_jobacct(jobacct_id); +} + +void jobacct_p_free(struct jobacctinfo *jobacct) +{ + common_free_jobacct(jobacct); +} + +int jobacct_p_setinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data) +{ + return common_setinfo(jobacct, type, data); + +} + +int jobacct_p_getinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data) +{ + return common_getinfo(jobacct, type, data); +} + +void jobacct_p_aggregate(struct jobacctinfo *dest, struct jobacctinfo *from) +{ + common_aggregate(dest, from); +} + +void jobacct_p_2_sacct(sacct_t *sacct, struct jobacctinfo *jobacct) +{ + common_2_sacct(sacct, jobacct); +} + +void jobacct_p_pack(struct jobacctinfo *jobacct, Buf buffer) +{ + common_pack(jobacct, buffer); +} + +int jobacct_p_unpack(struct jobacctinfo **jobacct, Buf buffer) +{ + return common_unpack(jobacct, buffer); +} + + +int jobacct_p_init_slurmctld(char *job_acct_log) +{ + return common_init_slurmctld(job_acct_log); +} + +int jobacct_p_fini_slurmctld() +{ + return common_fini_slurmctld(); +} + +int jobacct_p_job_start_slurmctld(struct job_record *job_ptr) +{ + return common_job_start_slurmctld(job_ptr); +} + +int jobacct_p_job_complete_slurmctld(struct job_record *job_ptr) +{ + return common_job_complete_slurmctld(job_ptr); +} + +int jobacct_p_step_start_slurmctld(struct step_record *step) +{ + return common_step_start_slurmctld(step); +} + +int jobacct_p_step_complete_slurmctld(struct step_record *step) +{ + return common_step_complete_slurmctld(step); +} + +int jobacct_p_suspend_slurmctld(struct job_record *job_ptr) +{ + return common_suspend_slurmctld(job_ptr); +} +/* + * jobacct_startpoll() is called when the plugin is loaded by + * slurmd, before any other functions are called. Put global + * initialization here. + */ + +int jobacct_p_startpoll(int frequency) +{ + int rc = SLURM_SUCCESS; + +#ifdef HAVE_AIX + pthread_attr_t attr; + pthread_t _watch_tasks_thread_id; + + debug("jobacct AIX plugin loaded"); + + debug("jobacct: frequency = %d", frequency); + + jobacct_shutdown = false; + + if (frequency == 0) { /* don't want dynamic monitoring? */ + debug2("jobacct AIX dynamic logging disabled"); + return rc; + } + + freq = frequency; + pagesize = getpagesize()/1024; + task_list = list_create(common_free_jobacct); + + /* create polling thread */ + slurm_attr_init(&attr); + if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) + error("pthread_attr_setdetachstate error %m"); + + if (pthread_create(&_watch_tasks_thread_id, &attr, + &_watch_tasks, NULL)) { + debug("jobacct failed to create _watch_tasks " + "thread: %m"); + frequency = 0; + } + else + debug3("jobacct AIX dynamic logging enabled"); + slurm_attr_destroy(&attr); +#else + error("jobacct AIX not loaded, not an aix system, check slurm.conf"); +#endif + return rc; +} + +int jobacct_p_endpoll() +{ + return common_endpoll(); +} + +int jobacct_p_add_task(pid_t pid, jobacct_id_t *jobacct_id) +{ + return common_add_task(pid, jobacct_id); +} + +struct jobacctinfo *jobacct_p_stat_task(pid_t pid) +{ +#ifdef HAVE_AIX + _get_process_data(); +#endif + return common_stat_task(pid); +} + +struct jobacctinfo *jobacct_p_remove_task(pid_t pid) +{ + return common_remove_task(pid); +} + +void jobacct_p_suspendpoll() +{ + common_suspendpoll(); +} + +#ifdef HAVE_AIX + +/* + * _get_offspring_data() -- collect memory usage data for the offspring + * + * For each process that lists as its parent, add its memory + * usage data to the ancestor's record. Recurse to gather data + * for *all* subsequent generations. + * + * IN: prec_list list of prec's + * ancestor The entry in prec_list to which the data + * should be added. Even as we recurse, this will + * always be the prec for the base of the family + * tree. + * pid The process for which we are currently looking + * for offspring. + * + * OUT: none. + * + * RETVAL: none. + * + * THREADSAFE! Only one thread ever gets here. + */ +static void _get_offspring_data(List prec_list, prec_t *ancestor, pid_t pid) +{ + ListIterator itr; + prec_t *prec = NULL; + + itr = list_iterator_create(prec_list); + while((prec = list_next(itr))) { + if (prec->ppid == pid) { + _get_offspring_data(prec_list, ancestor, prec->pid); + debug2("adding %d to %d rss = %f vsize = %f", + prec->pid, ancestor->pid, + prec->rss, prec->vsize); + ancestor->usec += prec->usec; + ancestor->ssec += prec->ssec; + ancestor->pages += prec->pages; + ancestor->rss += prec->rss; + ancestor->vsize += prec->vsize; + } + } + list_iterator_destroy(itr); + + return; +} + +/* + * _get_process_data() - Build a table of all current processes + * + * IN: pid. + * + * OUT: none + * + * THREADSAFE! Only one thread ever gets here. + * + * Assumption: + * Any file with a name of the form "/proc/[0-9]+/stat" + * is a Linux-style stat entry. We disregard the data if they look + * wrong. + */ +static void _get_process_data() +{ + struct procsinfo proc; + int pid = 0; + static int processing = 0; + prec_t *prec = NULL; + struct jobacctinfo *jobacct = NULL; + List prec_list = NULL; + ListIterator itr; + ListIterator itr2; + + if(processing) { + debug("already running, returning"); + return; + } + + processing = 1; + prec_list = list_create(_destroy_prec); + /* get the whole process table */ + while(getprocs(&proc, sizeof(proc), 0, 0, &pid, 1) == 1) { + prec = xmalloc(sizeof(prec_t)); + list_append(prec_list, prec); + prec->pid = proc.pi_pid; + prec->ppid = proc.pi_ppid; + prec->usec = proc.pi_ru.ru_utime.tv_sec + + proc.pi_ru.ru_utime.tv_usec * 1e-6; + prec->ssec = proc.pi_ru.ru_stime.tv_sec + + proc.pi_ru.ru_stime.tv_usec * 1e-6; + prec->pages = proc.pi_majflt; + prec->rss = (proc.pi_trss + proc.pi_drss) * pagesize; + //prec->rss *= 1024; + prec->vsize = (proc.pi_tsize / 1024); + prec->vsize += (proc.pi_dvm * pagesize); + //prec->vsize *= 1024; + /* debug("vsize = %f = (%d/1024)+(%d*%d)", */ +/* prec->vsize, proc.pi_tsize, proc.pi_dvm, pagesize); */ + } + if(!list_count(prec_list)) + goto finished; + + slurm_mutex_lock(&jobacct_lock); + if(!task_list || !list_count(task_list)) { + slurm_mutex_unlock(&jobacct_lock); + goto finished; + } + itr = list_iterator_create(task_list); + while((jobacct = list_next(itr))) { + itr2 = list_iterator_create(prec_list); + while((prec = list_next(itr2))) { + //debug2("pid %d ? %d", prec->ppid, jobacct->pid); + if (prec->pid == jobacct->pid) { + /* find all my descendents */ + _get_offspring_data(prec_list, prec, + prec->pid); + + /* tally their usage */ + jobacct->max_rss = jobacct->tot_rss = + MAX(jobacct->max_rss, (int)prec->rss); + jobacct->max_vsize = jobacct->tot_vsize = + MAX(jobacct->max_vsize, + (int)prec->vsize); + jobacct->max_pages = jobacct->tot_pages = + MAX(jobacct->max_pages, prec->pages); + jobacct->min_cpu = jobacct->tot_cpu = + MAX(jobacct->min_cpu, + (prec->usec + prec->ssec)); + debug2("%d size now %d %d time %d", + jobacct->pid, jobacct->max_rss, + jobacct->max_vsize, jobacct->tot_cpu); + + break; + } + } + list_iterator_destroy(itr2); + } + list_iterator_destroy(itr); + slurm_mutex_unlock(&jobacct_lock); +finished: + list_destroy(prec_list); + processing = 0; + + return; +} + + +/* _watch_tasks() -- monitor slurm jobs and track their memory usage + * + * IN, OUT: Irrelevant; this is invoked by pthread_create() + */ + +static void *_watch_tasks(void *arg) +{ + + while(!jobacct_shutdown) { /* Do this until shutdown is requested */ + if(!suspended) { + _get_process_data(); /* Update the data */ + } + sleep(freq); + } + return NULL; +} + + +static void _destroy_prec(void *object) +{ + prec_t *prec = (prec_t *)object; + xfree(prec); + return; +} + +#endif diff --git a/executable_names/src/plugins/jobacct/common/common_slurmctld.c b/executable_names/src/plugins/jobacct/common/common_slurmctld.c new file mode 100644 index 0000000000000000000000000000000000000000..bbe8190a578c8de82e80238746ef0422e0c1708e --- /dev/null +++ b/executable_names/src/plugins/jobacct/common/common_slurmctld.c @@ -0,0 +1,535 @@ +/*****************************************************************************\ + * jobacct_common.c - common functions for almost all jobacct plugins. + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Written by Danny Auble, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This file is patterned after jobcomp_linux.c, written by Morris Jette and + * Copyright (C) 2002 The Regents of the University of California. +\*****************************************************************************/ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include "jobacct_common.h" + +static FILE * LOGFILE; +static int LOGFILE_FD; +static pthread_mutex_t logfile_lock = PTHREAD_MUTEX_INITIALIZER; +static char * log_file = NULL; +static int init; +/* Format of the JOB_STEP record */ +const char *_jobstep_format = +"%d " +"%u " /* stepid */ +"%d " /* completion status */ +"%d " /* completion code */ +"%u " /* nprocs */ +"%u " /* number of cpus */ +"%u " /* elapsed seconds */ +"%u " /* total cputime seconds */ +"%u " /* total cputime microseconds */ +"%u " /* user seconds */ +"%u " /* user microseconds */ +"%u " /* system seconds */ +"%u " /* system microseconds */ +"%u " /* max rss */ +"%u " /* max ixrss */ +"%u " /* max idrss */ +"%u " /* max isrss */ +"%u " /* max minflt */ +"%u " /* max majflt */ +"%u " /* max nswap */ +"%u " /* total inblock */ +"%u " /* total outblock */ +"%u " /* total msgsnd */ +"%u " /* total msgrcv */ +"%u " /* total nsignals */ +"%u " /* total nvcsw */ +"%u " /* total nivcsw */ +"%u " /* max vsize */ +"%u " /* max vsize task */ +"%.2f " /* ave vsize */ +"%u " /* max rss */ +"%u " /* max rss task */ +"%.2f " /* ave rss */ +"%u " /* max pages */ +"%u " /* max pages task */ +"%.2f " /* ave pages */ +"%.2f " /* min cpu */ +"%u " /* min cpu task */ +"%.2f " /* ave cpu */ +"%s " /* step process name */ +"%s " /* step node names */ +"%u " /* max vsize node */ +"%u " /* max rss node */ +"%u " /* max pages node */ +"%u " /* min cpu node */ +"%s " /* account */ +"%d"; /* requester user id */ + +/* + * Print the record to the log file. + */ + +static int _print_record(struct job_record *job_ptr, + time_t time, char *data) +{ + static int rc=SLURM_SUCCESS; + char *block_id = NULL; + if(!job_ptr->details) { + error("job_acct: job=%u doesn't exist", job_ptr->job_id); + return SLURM_ERROR; + } + debug2("_print_record, job=%u, \"%s\"", + job_ptr->job_id, data); +#ifdef HAVE_BG + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_BLOCK_ID, + &block_id); + +#endif + if(!block_id) + block_id = xstrdup("-"); + + slurm_mutex_lock( &logfile_lock ); + + if (fprintf(LOGFILE, + "%u %s %u %u %d %d %s - %s\n", + job_ptr->job_id, job_ptr->partition, + (int)job_ptr->details->submit_time, (int)time, + job_ptr->user_id, job_ptr->group_id, block_id, data) + < 0) + rc=SLURM_ERROR; +#ifdef HAVE_FDATSYNC + fdatasync(LOGFILE_FD); +#endif + slurm_mutex_unlock( &logfile_lock ); + xfree(block_id); + + return rc; +} + +extern int common_init_slurmctld(char *job_acct_log) +{ + int rc = SLURM_SUCCESS; + mode_t prot = 0600; + struct stat statbuf; + + debug2("jobacct_init() called"); + slurm_mutex_lock( &logfile_lock ); + if (LOGFILE) + fclose(LOGFILE); + log_file=job_acct_log; + if (*log_file != '/') + fatal("JobAcctLogfile must specify an absolute pathname"); + if (stat(log_file, &statbuf)==0) /* preserve current file mode */ + prot = statbuf.st_mode; + LOGFILE = fopen(log_file, "a"); + if (LOGFILE == NULL) { + error("open %s: %m", log_file); + init = 0; + slurm_mutex_unlock( &logfile_lock ); + return SLURM_ERROR; + } else + chmod(log_file, prot); + if (setvbuf(LOGFILE, NULL, _IOLBF, 0)) + error("setvbuf() failed"); + LOGFILE_FD = fileno(LOGFILE); + slurm_mutex_unlock( &logfile_lock ); + init = 1; + return rc; +} + +extern int common_fini_slurmctld() +{ + if (LOGFILE) + fclose(LOGFILE); + return SLURM_SUCCESS; +} + +extern int common_job_start_slurmctld(struct job_record *job_ptr) +{ + int i, + ncpus=0, + rc=SLURM_SUCCESS, + tmp; + char buf[BUFFER_SIZE], *jname, *account, *nodes; + long priority; + int track_steps = 0; + + if(!init) { + debug("jobacct init was not called or it failed"); + return SLURM_ERROR; + } + + debug2("jobacct_job_start() called"); + for (i=0; i < job_ptr->num_cpu_groups; i++) + ncpus += (job_ptr->cpus_per_node[i]) + * (job_ptr->cpu_count_reps[i]); + priority = (job_ptr->priority == NO_VAL) ? + -1L : (long) job_ptr->priority; + + if ((tmp = strlen(job_ptr->name))) { + jname = xmalloc(++tmp); + for (i=0; iname[i])) + jname[i]='_'; + else + jname[i]=job_ptr->name[i]; + } + } else { + jname = xstrdup("allocation"); + track_steps = 1; + } + + if (job_ptr->account && job_ptr->account[0]) + account = job_ptr->account; + else + account = "(null)"; + if (job_ptr->nodes && job_ptr->nodes[0]) + nodes = job_ptr->nodes; + else + nodes = "(null)"; + + if(job_ptr->batch_flag) + track_steps = 1; + + tmp = snprintf(buf, BUFFER_SIZE, + "%d %s %d %ld %u %s %s", + JOB_START, jname, + track_steps, priority, job_ptr->num_procs, + nodes, account); + + rc = _print_record(job_ptr, job_ptr->start_time, buf); + + xfree(jname); + return rc; +} + +extern int common_job_complete_slurmctld(struct job_record *job_ptr) +{ + char buf[BUFFER_SIZE]; + if(!init) { + debug("jobacct init was not called or it failed"); + return SLURM_ERROR; + } + + debug2("jobacct_job_complete() called"); + if (job_ptr->end_time == 0) { + debug("jobacct: job %u never started", job_ptr->job_id); + return SLURM_ERROR; + } + snprintf(buf, BUFFER_SIZE, "%d %u %d", + JOB_TERMINATED, + (int) (job_ptr->end_time - job_ptr->start_time), + job_ptr->job_state & (~JOB_COMPLETING)); + + return _print_record(job_ptr, job_ptr->end_time, buf); +} + +extern int common_step_start_slurmctld(struct step_record *step) +{ + char buf[BUFFER_SIZE]; + int cpus = 0; + char node_list[BUFFER_SIZE]; +#ifdef HAVE_BG + uint16_t quarter = (uint16_t)NO_VAL; + uint16_t nodecard = (uint16_t)NO_VAL; +#endif + float float_tmp = 0; + char *account; + + if(!init) { + debug("jobacct init was not called or it failed"); + return SLURM_ERROR; + } + +#ifdef HAVE_BG + cpus = step->job_ptr->num_procs; + select_g_get_jobinfo(step->job_ptr->select_jobinfo, + SELECT_DATA_QUARTER, + &quarter); + select_g_get_jobinfo(step->job_ptr->select_jobinfo, + SELECT_DATA_NODECARD, + &nodecard); + if(quarter != (uint16_t)NO_VAL + && nodecard != (uint16_t)NO_VAL) + snprintf(node_list, BUFFER_SIZE, + "%s.%d.%d", step->job_ptr->nodes, + quarter, nodecard); + else if(quarter != (uint16_t)NO_VAL) + snprintf(node_list, BUFFER_SIZE, + "%s.%d", step->job_ptr->nodes, quarter); + else + snprintf(node_list, BUFFER_SIZE, "%s", + step->job_ptr->nodes); + +#else + if(!step->step_layout || !step->step_layout->task_cnt) { + cpus = step->job_ptr->num_procs; + snprintf(node_list, BUFFER_SIZE, "%s", step->job_ptr->nodes); + } else { + cpus = step->step_layout->task_cnt; + snprintf(node_list, BUFFER_SIZE, "%s", + step->step_layout->node_list); + } +#endif + if (step->job_ptr->account && step->job_ptr->account[0]) + account = step->job_ptr->account; + else + account = "(null)"; + + step->job_ptr->requid = -1; /* force to -1 */ + + snprintf(buf, BUFFER_SIZE, _jobstep_format, + JOB_STEP, + step->step_id, /* stepid */ + JOB_RUNNING, /* completion status */ + 0, /* completion code */ + cpus, /* number of tasks */ + cpus, /* number of cpus */ + 0, /* elapsed seconds */ + 0, /* total cputime seconds */ + 0, /* total cputime seconds */ + 0, /* user seconds */ + 0,/* user microseconds */ + 0, /* system seconds */ + 0,/* system microsecs */ + 0, /* max rss */ + 0, /* max ixrss */ + 0, /* max idrss */ + 0, /* max isrss */ + 0, /* max minflt */ + 0, /* max majflt */ + 0, /* max nswap */ + 0, /* total inblock */ + 0, /* total outblock */ + 0, /* total msgsnd */ + 0, /* total msgrcv */ + 0, /* total nsignals */ + 0, /* total nvcsw */ + 0, /* total nivcsw */ + 0, /* max vsize */ + 0, /* max vsize task */ + float_tmp, /* ave vsize */ + 0, /* max rss */ + 0, /* max rss task */ + float_tmp, /* ave rss */ + 0, /* max pages */ + 0, /* max pages task */ + float_tmp, /* ave pages */ + float_tmp, /* min cpu */ + 0, /* min cpu task */ + float_tmp, /* ave cpu */ + step->name, /* step exe name */ + node_list, /* name of nodes step running on */ + 0, /* max vsize node */ + 0, /* max rss node */ + 0, /* max pages node */ + 0, /* min cpu node */ + account, + step->requid); /* requester user id */ + + return _print_record(step->job_ptr, step->start_time, buf); +} + +extern int common_step_complete_slurmctld(struct step_record *step) +{ + char buf[BUFFER_SIZE]; + time_t now; + int elapsed; + int comp_status; + int cpus = 0; + char node_list[BUFFER_SIZE]; + struct jobacctinfo *jobacct = (struct jobacctinfo *)step->jobacct; +#ifdef HAVE_BG + uint16_t quarter = (uint16_t)NO_VAL; + uint16_t nodecard = (uint16_t)NO_VAL; +#endif + float ave_vsize = 0, ave_rss = 0, ave_pages = 0; + float ave_cpu = 0, ave_cpu2 = 0; + char *account; + + if(!init) { + debug("jobacct init was not called or it failed"); + return SLURM_ERROR; + } + + now = time(NULL); + + if ((elapsed=now-step->start_time)<0) + elapsed=0; /* For *very* short jobs, if clock is wrong */ + if (step->exit_code) + comp_status = JOB_FAILED; + else + comp_status = JOB_COMPLETE; + +#ifdef HAVE_BG + cpus = step->job_ptr->num_procs; + select_g_get_jobinfo(step->job_ptr->select_jobinfo, + SELECT_DATA_QUARTER, + &quarter); + select_g_get_jobinfo(step->job_ptr->select_jobinfo, + SELECT_DATA_NODECARD, + &nodecard); + if(quarter != (uint16_t)NO_VAL + && nodecard != (uint16_t)NO_VAL) + snprintf(node_list, BUFFER_SIZE, + "%s.%d.%d", step->job_ptr->nodes, + quarter, nodecard); + else if(quarter != (uint16_t)NO_VAL) + snprintf(node_list, BUFFER_SIZE, + "%s.%d", step->job_ptr->nodes, quarter); + else + snprintf(node_list, BUFFER_SIZE, "%s", + step->job_ptr->nodes); + +#else + if(!step->step_layout || !step->step_layout->task_cnt) { + cpus = step->job_ptr->num_procs; + snprintf(node_list, BUFFER_SIZE, "%s", step->job_ptr->nodes); + + } else { + cpus = step->step_layout->task_cnt; + snprintf(node_list, BUFFER_SIZE, "%s", + step->step_layout->node_list); + } +#endif + /* figure out the ave of the totals sent */ + if(cpus > 0) { + ave_vsize = jobacct->tot_vsize; + ave_vsize /= cpus; + ave_rss = jobacct->tot_rss; + ave_rss /= cpus; + ave_pages = jobacct->tot_pages; + ave_pages /= cpus; + ave_cpu = jobacct->tot_cpu; + ave_cpu /= cpus; + ave_cpu /= 100; + } + ave_cpu2 = jobacct->min_cpu; + ave_cpu2 /= 100; + + if (step->job_ptr->account && step->job_ptr->account[0]) + account = step->job_ptr->account; + else + account = "(null)"; + + snprintf(buf, BUFFER_SIZE, _jobstep_format, + JOB_STEP, + step->step_id, /* stepid */ + comp_status, /* completion status */ + step->exit_code, /* completion code */ + cpus, /* number of tasks */ + cpus, /* number of cpus */ + elapsed, /* elapsed seconds */ + /* total cputime seconds */ + jobacct->rusage.ru_utime.tv_sec + + jobacct->rusage.ru_stime.tv_sec, + /* total cputime seconds */ + jobacct->rusage.ru_utime.tv_usec + + jobacct->rusage.ru_stime.tv_usec, + jobacct->rusage.ru_utime.tv_sec, /* user seconds */ + jobacct->rusage.ru_utime.tv_usec,/* user microseconds */ + jobacct->rusage.ru_stime.tv_sec, /* system seconds */ + jobacct->rusage.ru_stime.tv_usec,/* system microsecs */ + jobacct->rusage.ru_maxrss, /* max rss */ + jobacct->rusage.ru_ixrss, /* max ixrss */ + jobacct->rusage.ru_idrss, /* max idrss */ + jobacct->rusage.ru_isrss, /* max isrss */ + jobacct->rusage.ru_minflt, /* max minflt */ + jobacct->rusage.ru_majflt, /* max majflt */ + jobacct->rusage.ru_nswap, /* max nswap */ + jobacct->rusage.ru_inblock, /* total inblock */ + jobacct->rusage.ru_oublock, /* total outblock */ + jobacct->rusage.ru_msgsnd, /* total msgsnd */ + jobacct->rusage.ru_msgrcv, /* total msgrcv */ + jobacct->rusage.ru_nsignals, /* total nsignals */ + jobacct->rusage.ru_nvcsw, /* total nvcsw */ + jobacct->rusage.ru_nivcsw, /* total nivcsw */ + jobacct->max_vsize, /* max vsize */ + jobacct->max_vsize_id.taskid, /* max vsize node */ + ave_vsize, /* ave vsize */ + jobacct->max_rss, /* max vsize */ + jobacct->max_rss_id.taskid, /* max rss node */ + ave_rss, /* ave rss */ + jobacct->max_pages, /* max pages */ + jobacct->max_pages_id.taskid, /* max pages node */ + ave_pages, /* ave pages */ + ave_cpu2, /* min cpu */ + jobacct->min_cpu_id.taskid, /* min cpu node */ + ave_cpu, /* ave cpu */ + step->name, /* step exe name */ + node_list, /* name of nodes step running on */ + jobacct->max_vsize_id.nodeid, /* max vsize task */ + jobacct->max_rss_id.nodeid, /* max rss task */ + jobacct->max_pages_id.nodeid, /* max pages task */ + jobacct->min_cpu_id.nodeid, /* min cpu task */ + account, + step->requid); /* requester user id */ + + return _print_record(step->job_ptr, now, buf); +} + +extern int common_suspend_slurmctld(struct job_record *job_ptr) +{ + char buf[BUFFER_SIZE]; + static time_t now = 0; + static time_t temp = 0; + int elapsed; + if(!init) { + debug("jobacct init was not called or it failed"); + return SLURM_ERROR; + } + + /* tell what time has passed */ + if(!now) + now = job_ptr->start_time; + temp = now; + now = time(NULL); + + if ((elapsed=now-temp) < 0) + elapsed=0; /* For *very* short jobs, if clock is wrong */ + + /* here we are really just going for a marker in time to tell where + the process was suspended, we don't really need to keep track of + anything else */ + snprintf(buf, BUFFER_SIZE, "%d %u %d", + JOB_SUSPEND, + elapsed, + job_ptr->job_state & (~JOB_COMPLETING));/* job status */ + + return _print_record(job_ptr, now, buf); + +} diff --git a/executable_names/src/plugins/jobacct/common/common_slurmstepd.c b/executable_names/src/plugins/jobacct/common/common_slurmstepd.c new file mode 100644 index 0000000000000000000000000000000000000000..b55863e17e052da0ab627de235881be2efb8fb99 --- /dev/null +++ b/executable_names/src/plugins/jobacct/common/common_slurmstepd.c @@ -0,0 +1,146 @@ +/*****************************************************************************\ + * jobacct_common.c - common functions for almost all jobacct plugins. + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Written by Danny Auble, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This file is patterned after jobcomp_linux.c, written by Morris Jette and + * Copyright (C) 2002 The Regents of the University of California. +\*****************************************************************************/ + +#include "jobacct_common.h" + +bool jobacct_shutdown = false; +bool suspended = false; +List task_list = NULL; +pthread_mutex_t jobacct_lock = PTHREAD_MUTEX_INITIALIZER; + +extern int common_endpoll() +{ + jobacct_shutdown = true; + + return SLURM_SUCCESS; +} +extern int common_add_task(pid_t pid, jobacct_id_t *jobacct_id) +{ + struct jobacctinfo *jobacct = common_alloc_jobacct(jobacct_id); + + slurm_mutex_lock(&jobacct_lock); + if(pid <= 0) { + error("invalid pid given (%d) for task acct", pid); + goto error; + } else if (!task_list) { + error("no task list created!"); + goto error; + } + + jobacct->pid = pid; + jobacct->min_cpu = 0; + debug2("adding task %u pid %d on node %u to jobacct", + jobacct_id->taskid, pid, jobacct_id->nodeid); + list_push(task_list, jobacct); + slurm_mutex_unlock(&jobacct_lock); + + return SLURM_SUCCESS; +error: + slurm_mutex_unlock(&jobacct_lock); + common_free_jobacct(jobacct); + return SLURM_ERROR; +} + +extern struct jobacctinfo *common_stat_task(pid_t pid) +{ + struct jobacctinfo *jobacct = NULL; + struct jobacctinfo *ret_jobacct = NULL; + ListIterator itr = NULL; + + slurm_mutex_lock(&jobacct_lock); + if (!task_list) { + error("no task list created!"); + goto error; + } + + itr = list_iterator_create(task_list); + while((jobacct = list_next(itr))) { + if(jobacct->pid == pid) + break; + } + list_iterator_destroy(itr); + ret_jobacct = xmalloc(sizeof(struct jobacctinfo)); + memcpy(ret_jobacct, jobacct, sizeof(struct jobacctinfo)); +error: + slurm_mutex_unlock(&jobacct_lock); + return ret_jobacct; +} + +extern struct jobacctinfo *common_remove_task(pid_t pid) +{ + struct jobacctinfo *jobacct = NULL; + struct jobacctinfo *ret_jobacct = NULL; + ListIterator itr = NULL; + + slurm_mutex_lock(&jobacct_lock); + if (!task_list) { + error("no task list created!"); + goto error; + } + + itr = list_iterator_create(task_list); + while((jobacct = list_next(itr))) { + if(jobacct->pid == pid) { + list_remove(itr); + break; + } + } + list_iterator_destroy(itr); + if(jobacct) { + debug2("removing task %u pid %d from jobacct", + jobacct->max_vsize_id.taskid, jobacct->pid); + ret_jobacct = xmalloc(sizeof(struct jobacctinfo)); + memcpy(ret_jobacct, jobacct, sizeof(struct jobacctinfo)); + common_free_jobacct(jobacct); + } else { + error("pid(%d) not being watched in jobacct!", pid); + } +error: + slurm_mutex_unlock(&jobacct_lock); + return ret_jobacct; +} + +extern void common_suspendpoll() +{ + if(suspended) + suspended = false; + else + suspended = true; +} diff --git a/executable_names/src/plugins/jobacct/common/jobacct_common.c b/executable_names/src/plugins/jobacct/common/jobacct_common.c new file mode 100644 index 0000000000000000000000000000000000000000..342e6530a1299af8f5a1c3effa6287d826361a6d --- /dev/null +++ b/executable_names/src/plugins/jobacct/common/jobacct_common.c @@ -0,0 +1,461 @@ +/*****************************************************************************\ + * jobacct_common.c - common functions for almost all jobacct plugins. + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Written by Danny Auble, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This file is patterned after jobcomp_linux.c, written by Morris Jette and + * Copyright (C) 2002 The Regents of the University of California. +\*****************************************************************************/ + +#include "jobacct_common.h" + +static void _pack_jobacct_id(jobacct_id_t *jobacct_id, Buf buffer) +{ + pack32((uint32_t)jobacct_id->nodeid, buffer); + pack16((uint16_t)jobacct_id->taskid, buffer); +} + +static int _unpack_jobacct_id(jobacct_id_t *jobacct_id, Buf buffer) +{ + safe_unpack32(&jobacct_id->nodeid, buffer); + safe_unpack16(&jobacct_id->taskid, buffer); + return SLURM_SUCCESS; +unpack_error: + return SLURM_ERROR; +} + +extern int common_init_struct(struct jobacctinfo *jobacct, + jobacct_id_t *jobacct_id) +{ + if(!jobacct_id) { + jobacct_id_t temp_id; + temp_id.taskid = (uint16_t)NO_VAL; + temp_id.nodeid = (uint32_t)NO_VAL; + jobacct_id = &temp_id; + } + jobacct->rusage.ru_utime.tv_sec = 0; + jobacct->rusage.ru_utime.tv_usec = 0; + jobacct->rusage.ru_stime.tv_sec = 0; + jobacct->rusage.ru_stime.tv_usec = 0; + jobacct->rusage.ru_maxrss = 0; + jobacct->rusage.ru_ixrss = 0; + jobacct->rusage.ru_idrss = 0; + jobacct->rusage.ru_isrss = 0; + jobacct->rusage.ru_minflt = 0; + jobacct->rusage.ru_majflt = 0; + jobacct->rusage.ru_nswap = 0; + jobacct->rusage.ru_inblock = 0; + jobacct->rusage.ru_oublock = 0; + jobacct->rusage.ru_msgsnd = 0; + jobacct->rusage.ru_msgrcv = 0; + jobacct->rusage.ru_nsignals = 0; + jobacct->rusage.ru_nvcsw = 0; + jobacct->rusage.ru_nivcsw = 0; + + jobacct->max_vsize = 0; + memcpy(&jobacct->max_vsize_id, jobacct_id, sizeof(jobacct_id_t)); + jobacct->tot_vsize = 0; + jobacct->max_rss = 0; + memcpy(&jobacct->max_rss_id, jobacct_id, sizeof(jobacct_id_t)); + jobacct->tot_rss = 0; + jobacct->max_pages = 0; + memcpy(&jobacct->max_pages_id, jobacct_id, sizeof(jobacct_id_t)); + jobacct->tot_pages = 0; + jobacct->min_cpu = (uint32_t)NO_VAL; + memcpy(&jobacct->min_cpu_id, jobacct_id, sizeof(jobacct_id_t)); + jobacct->tot_cpu = 0; + + return SLURM_SUCCESS; +} + +extern struct jobacctinfo *common_alloc_jobacct(jobacct_id_t *jobacct_id) +{ + struct jobacctinfo *jobacct = xmalloc(sizeof(struct jobacctinfo)); + common_init_struct(jobacct, jobacct_id); + return jobacct; +} + +extern void common_free_jobacct(void *object) +{ + struct jobacctinfo *jobacct = (struct jobacctinfo *)object; + xfree(jobacct); + jobacct = NULL; +} + +extern int common_setinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data) +{ + int rc = SLURM_SUCCESS; + int *fd = (int *)data; + uint32_t *uint32 = (uint32_t *) data; + jobacct_id_t *jobacct_id = (jobacct_id_t *) data; + struct rusage *rusage = (struct rusage *) data; + struct jobacctinfo *send = (struct jobacctinfo *) data; + + slurm_mutex_lock(&jobacct_lock); + switch (type) { + case JOBACCT_DATA_TOTAL: + memcpy(jobacct, send, sizeof(struct jobacctinfo)); + break; + case JOBACCT_DATA_PIPE: + safe_write(*fd, jobacct, sizeof(struct jobacctinfo)); + break; + case JOBACCT_DATA_RUSAGE: + memcpy(&jobacct->rusage, rusage, sizeof(struct rusage)); + break; + case JOBACCT_DATA_MAX_RSS: + jobacct->max_rss = *uint32; + break; + case JOBACCT_DATA_MAX_RSS_ID: + jobacct->max_rss_id = *jobacct_id; + break; + case JOBACCT_DATA_TOT_RSS: + jobacct->tot_rss = *uint32; + break; + case JOBACCT_DATA_MAX_VSIZE: + jobacct->max_vsize = *uint32; + break; + case JOBACCT_DATA_MAX_VSIZE_ID: + jobacct->max_vsize_id = *jobacct_id; + break; + case JOBACCT_DATA_TOT_VSIZE: + jobacct->tot_vsize = *uint32; + break; + case JOBACCT_DATA_MAX_PAGES: + jobacct->max_pages = *uint32; + break; + case JOBACCT_DATA_MAX_PAGES_ID: + jobacct->max_pages_id = *jobacct_id; + break; + case JOBACCT_DATA_TOT_PAGES: + jobacct->tot_pages = *uint32; + break; + case JOBACCT_DATA_MIN_CPU: + jobacct->min_cpu = *uint32; + break; + case JOBACCT_DATA_MIN_CPU_ID: + jobacct->min_cpu_id = *jobacct_id; + break; + case JOBACCT_DATA_TOT_CPU: + jobacct->tot_cpu = *uint32; + break; + default: + debug("jobacct_g_set_setinfo data_type %d invalid", + type); + } + slurm_mutex_unlock(&jobacct_lock); + return rc; +rwfail: + slurm_mutex_unlock(&jobacct_lock); + return SLURM_ERROR; + +} + +extern int common_getinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data) +{ + int rc = SLURM_SUCCESS; + int *fd = (int *)data; + uint32_t *uint32 = (uint32_t *) data; + jobacct_id_t *jobacct_id = (jobacct_id_t *) data; + struct rusage *rusage = (struct rusage *) data; + struct jobacctinfo *send = (struct jobacctinfo *) data; + + slurm_mutex_lock(&jobacct_lock); + switch (type) { + case JOBACCT_DATA_TOTAL: + memcpy(send, jobacct, sizeof(struct jobacctinfo)); + break; + case JOBACCT_DATA_PIPE: + safe_read(*fd, jobacct, sizeof(struct jobacctinfo)); + break; + case JOBACCT_DATA_RUSAGE: + memcpy(rusage, &jobacct->rusage, sizeof(struct rusage)); + break; + case JOBACCT_DATA_MAX_RSS: + *uint32 = jobacct->max_rss; + break; + case JOBACCT_DATA_MAX_RSS_ID: + *jobacct_id = jobacct->max_rss_id; + break; + case JOBACCT_DATA_TOT_RSS: + *uint32 = jobacct->tot_rss; + break; + case JOBACCT_DATA_MAX_VSIZE: + *uint32 = jobacct->max_vsize; + break; + case JOBACCT_DATA_MAX_VSIZE_ID: + *jobacct_id = jobacct->max_vsize_id; + break; + case JOBACCT_DATA_TOT_VSIZE: + *uint32 = jobacct->tot_vsize; + break; + case JOBACCT_DATA_MAX_PAGES: + *uint32 = jobacct->max_pages; + break; + case JOBACCT_DATA_MAX_PAGES_ID: + *jobacct_id = jobacct->max_pages_id; + break; + case JOBACCT_DATA_TOT_PAGES: + *uint32 = jobacct->tot_pages; + break; + case JOBACCT_DATA_MIN_CPU: + *uint32 = jobacct->min_cpu; + break; + case JOBACCT_DATA_MIN_CPU_ID: + *jobacct_id = jobacct->min_cpu_id; + break; + case JOBACCT_DATA_TOT_CPU: + *uint32 = jobacct->tot_cpu; + break; + default: + debug("jobacct_g_set_setinfo data_type %d invalid", + type); + } + slurm_mutex_unlock(&jobacct_lock); + return rc; +rwfail: + slurm_mutex_unlock(&jobacct_lock); + return SLURM_ERROR; + +} + +extern void common_aggregate(struct jobacctinfo *dest, + struct jobacctinfo *from) +{ + xassert(dest); + xassert(from); + + slurm_mutex_lock(&jobacct_lock); + if(dest->max_vsize < from->max_vsize) { + dest->max_vsize = from->max_vsize; + dest->max_vsize_id = from->max_vsize_id; + } + dest->tot_vsize += from->tot_vsize; + + if(dest->max_rss < from->max_rss) { + dest->max_rss = from->max_rss; + dest->max_rss_id = from->max_rss_id; + } + dest->tot_rss += from->tot_rss; + + if(dest->max_pages < from->max_pages) { + dest->max_pages = from->max_pages; + dest->max_pages_id = from->max_pages_id; + } + dest->tot_pages += from->tot_pages; + if((dest->min_cpu > from->min_cpu) + || (dest->min_cpu == (uint32_t)NO_VAL)) { + if(from->min_cpu == (uint32_t)NO_VAL) + from->min_cpu = 0; + dest->min_cpu = from->min_cpu; + dest->min_cpu_id = from->min_cpu_id; + } + dest->tot_cpu += from->tot_cpu; + + if(dest->max_vsize_id.taskid == (uint16_t)NO_VAL) + dest->max_vsize_id = from->max_vsize_id; + + if(dest->max_rss_id.taskid == (uint16_t)NO_VAL) + dest->max_rss_id = from->max_rss_id; + + if(dest->max_pages_id.taskid == (uint16_t)NO_VAL) + dest->max_pages_id = from->max_pages_id; + + if(dest->min_cpu_id.taskid == (uint16_t)NO_VAL) + dest->min_cpu_id = from->min_cpu_id; + + /* sum up all rusage stuff */ + dest->rusage.ru_utime.tv_sec += from->rusage.ru_utime.tv_sec; + dest->rusage.ru_utime.tv_usec += from->rusage.ru_utime.tv_usec; + while (dest->rusage.ru_utime.tv_usec >= 1E6) { + dest->rusage.ru_utime.tv_sec++; + dest->rusage.ru_utime.tv_usec -= 1E6; + } + dest->rusage.ru_stime.tv_sec += from->rusage.ru_stime.tv_sec; + dest->rusage.ru_stime.tv_usec += from->rusage.ru_stime.tv_usec; + while (dest->rusage.ru_stime.tv_usec >= 1E6) { + dest->rusage.ru_stime.tv_sec++; + dest->rusage.ru_stime.tv_usec -= 1E6; + } + + dest->rusage.ru_maxrss += from->rusage.ru_maxrss; + dest->rusage.ru_ixrss += from->rusage.ru_ixrss; + dest->rusage.ru_idrss += from->rusage.ru_idrss; + dest->rusage.ru_isrss += from->rusage.ru_isrss; + dest->rusage.ru_minflt += from->rusage.ru_minflt; + dest->rusage.ru_majflt += from->rusage.ru_majflt; + dest->rusage.ru_nswap += from->rusage.ru_nswap; + dest->rusage.ru_inblock += from->rusage.ru_inblock; + dest->rusage.ru_oublock += from->rusage.ru_oublock; + dest->rusage.ru_msgsnd += from->rusage.ru_msgsnd; + dest->rusage.ru_msgrcv += from->rusage.ru_msgrcv; + dest->rusage.ru_nsignals += from->rusage.ru_nsignals; + dest->rusage.ru_nvcsw += from->rusage.ru_nvcsw; + dest->rusage.ru_nivcsw += from->rusage.ru_nivcsw; + slurm_mutex_unlock(&jobacct_lock); +} + +extern void common_2_sacct(sacct_t *sacct, struct jobacctinfo *jobacct) +{ + xassert(jobacct); + xassert(sacct); + slurm_mutex_lock(&jobacct_lock); + sacct->max_vsize = jobacct->max_vsize; + sacct->max_vsize_id = jobacct->max_vsize_id; + sacct->ave_vsize = jobacct->tot_vsize; + sacct->max_rss = jobacct->max_rss; + sacct->max_rss_id = jobacct->max_rss_id; + sacct->ave_rss = jobacct->tot_rss; + sacct->max_pages = jobacct->max_pages; + sacct->max_pages_id = jobacct->max_pages_id; + sacct->ave_pages = jobacct->tot_pages; + sacct->min_cpu = jobacct->min_cpu; + sacct->min_cpu_id = jobacct->min_cpu_id; + sacct->ave_cpu = jobacct->tot_cpu; + slurm_mutex_unlock(&jobacct_lock); +} + +extern void common_pack(struct jobacctinfo *jobacct, Buf buffer) +{ + int i=0; + + if(!jobacct) { + for(i=0; i<26; i++) + pack32((uint32_t) 0, buffer); + for(i=0; i<4; i++) + pack16((uint16_t) 0, buffer); + return; + } + slurm_mutex_lock(&jobacct_lock); + pack32((uint32_t)jobacct->rusage.ru_utime.tv_sec, buffer); + pack32((uint32_t)jobacct->rusage.ru_utime.tv_usec, buffer); + pack32((uint32_t)jobacct->rusage.ru_stime.tv_sec, buffer); + pack32((uint32_t)jobacct->rusage.ru_stime.tv_usec, buffer); + pack32((uint32_t)jobacct->rusage.ru_maxrss, buffer); + pack32((uint32_t)jobacct->rusage.ru_ixrss, buffer); + pack32((uint32_t)jobacct->rusage.ru_idrss, buffer); + pack32((uint32_t)jobacct->rusage.ru_isrss, buffer); + pack32((uint32_t)jobacct->rusage.ru_minflt, buffer); + pack32((uint32_t)jobacct->rusage.ru_majflt, buffer); + pack32((uint32_t)jobacct->rusage.ru_nswap, buffer); + pack32((uint32_t)jobacct->rusage.ru_inblock, buffer); + pack32((uint32_t)jobacct->rusage.ru_oublock, buffer); + pack32((uint32_t)jobacct->rusage.ru_msgsnd, buffer); + pack32((uint32_t)jobacct->rusage.ru_msgrcv, buffer); + pack32((uint32_t)jobacct->rusage.ru_nsignals, buffer); + pack32((uint32_t)jobacct->rusage.ru_nvcsw, buffer); + pack32((uint32_t)jobacct->rusage.ru_nivcsw, buffer); + pack32((uint32_t)jobacct->max_vsize, buffer); + pack32((uint32_t)jobacct->tot_vsize, buffer); + pack32((uint32_t)jobacct->max_rss, buffer); + pack32((uint32_t)jobacct->tot_rss, buffer); + pack32((uint32_t)jobacct->max_pages, buffer); + pack32((uint32_t)jobacct->tot_pages, buffer); + pack32((uint32_t)jobacct->min_cpu, buffer); + pack32((uint32_t)jobacct->tot_cpu, buffer); + _pack_jobacct_id(&jobacct->max_vsize_id, buffer); + _pack_jobacct_id(&jobacct->max_rss_id, buffer); + _pack_jobacct_id(&jobacct->max_pages_id, buffer); + _pack_jobacct_id(&jobacct->min_cpu_id, buffer); + slurm_mutex_unlock(&jobacct_lock); +} + +/* you need to xfree this */ +extern int common_unpack(struct jobacctinfo **jobacct, Buf buffer) +{ + uint32_t uint32_tmp; + *jobacct = xmalloc(sizeof(struct jobacctinfo)); + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_utime.tv_sec = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_utime.tv_usec = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_stime.tv_sec = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_stime.tv_usec = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_maxrss = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_ixrss = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_idrss = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_isrss = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_minflt = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_majflt = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_nswap = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_inblock = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_oublock = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_msgsnd = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_msgrcv = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_nsignals = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_nvcsw = uint32_tmp; + safe_unpack32(&uint32_tmp, buffer); + (*jobacct)->rusage.ru_nivcsw = uint32_tmp; + safe_unpack32(&(*jobacct)->max_vsize, buffer); + safe_unpack32(&(*jobacct)->tot_vsize, buffer); + safe_unpack32(&(*jobacct)->max_rss, buffer); + safe_unpack32(&(*jobacct)->tot_rss, buffer); + safe_unpack32(&(*jobacct)->max_pages, buffer); + safe_unpack32(&(*jobacct)->tot_pages, buffer); + safe_unpack32(&(*jobacct)->min_cpu, buffer); + safe_unpack32(&(*jobacct)->tot_cpu, buffer); + if(_unpack_jobacct_id(&(*jobacct)->max_vsize_id, buffer) + != SLURM_SUCCESS) + goto unpack_error; + if(_unpack_jobacct_id(&(*jobacct)->max_rss_id, buffer) + != SLURM_SUCCESS) + goto unpack_error; + if(_unpack_jobacct_id(&(*jobacct)->max_pages_id, buffer) + != SLURM_SUCCESS) + goto unpack_error; + if(_unpack_jobacct_id(&(*jobacct)->min_cpu_id, buffer) + != SLURM_SUCCESS) + goto unpack_error; + return SLURM_SUCCESS; + +unpack_error: + xfree(*jobacct); + return SLURM_ERROR; +} diff --git a/executable_names/src/plugins/jobacct/common/jobacct_common.h b/executable_names/src/plugins/jobacct/common/jobacct_common.h new file mode 100644 index 0000000000000000000000000000000000000000..43d619e91c6be9fdeea2b57c9638e4830156e690 --- /dev/null +++ b/executable_names/src/plugins/jobacct/common/jobacct_common.h @@ -0,0 +1,132 @@ +/*****************************************************************************\ + * jobacct_common.h - common functions for almost all jobacct plugins. + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Written by Danny Auble, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This file is patterned after jobcomp_linux.c, written by Morris Jette and + * Copyright (C) 2002 The Regents of the University of California. +\*****************************************************************************/ + +#ifndef _HAVE_JOBACCT_COMMON_H +#define _HAVE_JOBACCT_COMMON_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include +#include + +#include "src/common/slurm_jobacct.h" +#include "src/common/xmalloc.h" +#include "src/common/list.h" +#include "src/common/xstring.h" +#include "src/common/node_select.h" + +#include + +#define BUFFER_SIZE 4096 + +struct jobacctinfo { + pid_t pid; + struct rusage rusage; /* returned by wait3 */ + uint32_t max_vsize; /* max size of virtual memory */ + jobacct_id_t max_vsize_id; /* contains which task number it was on */ + uint32_t tot_vsize; /* total virtual memory + (used to figure out ave later) */ + uint32_t max_rss; /* max Resident Set Size */ + jobacct_id_t max_rss_id; /* contains which task it was on */ + uint32_t tot_rss; /* total rss + (used to figure out ave later) */ + uint32_t max_pages; /* max pages */ + jobacct_id_t max_pages_id; /* contains which task it was on */ + uint32_t tot_pages; /* total pages + (used to figure out ave later) */ + uint32_t min_cpu; /* min cpu time */ + jobacct_id_t min_cpu_id; /* contains which task it was on */ + uint32_t tot_cpu; /* total cpu time + (used to figure out ave later) */ +}; + +/* Define jobacctinfo_t below to avoid including extraneous slurm headers */ +#ifndef __jobacctinfo_t_defined +# define __jobacctinfo_t_defined + typedef struct jobacctinfo *jobacctinfo_t; /* opaque data type */ +#endif + + +/* in jobacct_common.c */ +extern int common_init_struct(struct jobacctinfo *jobacct, + jobacct_id_t *jobacct_id); +extern struct jobacctinfo *common_alloc_jobacct(jobacct_id_t *jobacct_id); +extern void common_free_jobacct(void *object); +extern int common_setinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data); +extern int common_getinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data); +extern void common_aggregate(struct jobacctinfo *dest, + struct jobacctinfo *from); +extern void common_2_sacct(sacct_t *sacct, struct jobacctinfo *jobacct); +extern void common_pack(struct jobacctinfo *jobacct, Buf buffer); +extern int common_unpack(struct jobacctinfo **jobacct, Buf buffer); + +/*in common_slurmctld.c */ +extern int common_init_slurmctld(char *job_acct_log); +extern int common_fini_slurmctld(); +extern int common_job_start_slurmctld(struct job_record *job_ptr); +extern int common_job_complete_slurmctld(struct job_record *job_ptr); +extern int common_step_start_slurmctld(struct step_record *step); +extern int common_step_complete_slurmctld(struct step_record *step); +extern int common_suspend_slurmctld(struct job_record *job_ptr); + +/*in common slurmstepd.c */ +extern int common_endpoll(); +extern int common_add_task(pid_t pid, jobacct_id_t *jobacct_id); +extern struct jobacctinfo *common_stat_task(pid_t pid); +extern struct jobacctinfo *common_remove_task(pid_t pid); +extern void common_suspendpoll(); + +extern bool jobacct_shutdown; +extern bool suspended; +extern List task_list; +extern pthread_mutex_t jobacct_lock; + +#endif diff --git a/executable_names/src/plugins/jobacct/linux/Makefile.am b/executable_names/src/plugins/jobacct/linux/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..bfb01f5dead675f593c6b1a066c7d594873bb2ff --- /dev/null +++ b/executable_names/src/plugins/jobacct/linux/Makefile.am @@ -0,0 +1,16 @@ +# Makefile for jobacct/linux plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = jobacct_linux.la + +# Null job completion logging plugin. +jobacct_linux_la_SOURCES = jobacct_linux.c \ + $(top_builddir)/src/plugins/jobacct/common/jobacct_common.c \ + $(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c \ + $(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c +jobacct_linux_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/jobacct/linux/Makefile.in b/executable_names/src/plugins/jobacct/linux/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..d1752481176d29ab8f836995b0478edf8f1c4687 --- /dev/null +++ b/executable_names/src/plugins/jobacct/linux/Makefile.in @@ -0,0 +1,587 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for jobacct/linux plugin + +SOURCES = $(jobacct_linux_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/jobacct/linux +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +jobacct_linux_la_LIBADD = +am_jobacct_linux_la_OBJECTS = jobacct_linux.lo jobacct_common.lo \ + common_slurmctld.lo common_slurmstepd.lo +jobacct_linux_la_OBJECTS = $(am_jobacct_linux_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(jobacct_linux_la_SOURCES) +DIST_SOURCES = $(jobacct_linux_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = jobacct_linux.la + +# Null job completion logging plugin. +jobacct_linux_la_SOURCES = jobacct_linux.c \ + $(top_builddir)/src/plugins/jobacct/common/jobacct_common.c \ + $(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c \ + $(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c + +jobacct_linux_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/jobacct/linux/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/jobacct/linux/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +jobacct_linux.la: $(jobacct_linux_la_OBJECTS) $(jobacct_linux_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(jobacct_linux_la_LDFLAGS) $(jobacct_linux_la_OBJECTS) $(jobacct_linux_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common_slurmctld.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common_slurmstepd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobacct_common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobacct_linux.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +jobacct_common.lo: $(top_builddir)/src/plugins/jobacct/common/jobacct_common.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jobacct_common.lo -MD -MP -MF "$(DEPDIR)/jobacct_common.Tpo" -c -o jobacct_common.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/jobacct_common.Tpo" "$(DEPDIR)/jobacct_common.Plo"; else rm -f "$(DEPDIR)/jobacct_common.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c' object='jobacct_common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jobacct_common.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/jobacct_common.c + +common_slurmctld.lo: $(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common_slurmctld.lo -MD -MP -MF "$(DEPDIR)/common_slurmctld.Tpo" -c -o common_slurmctld.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/common_slurmctld.Tpo" "$(DEPDIR)/common_slurmctld.Plo"; else rm -f "$(DEPDIR)/common_slurmctld.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c' object='common_slurmctld.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common_slurmctld.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/common_slurmctld.c + +common_slurmstepd.lo: $(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common_slurmstepd.lo -MD -MP -MF "$(DEPDIR)/common_slurmstepd.Tpo" -c -o common_slurmstepd.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/common_slurmstepd.Tpo" "$(DEPDIR)/common_slurmstepd.Plo"; else rm -f "$(DEPDIR)/common_slurmstepd.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c' object='common_slurmstepd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common_slurmstepd.lo `test -f '$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c' || echo '$(srcdir)/'`$(top_builddir)/src/plugins/jobacct/common/common_slurmstepd.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/jobacct/linux/jobacct_linux.c b/executable_names/src/plugins/jobacct/linux/jobacct_linux.c new file mode 100644 index 0000000000000000000000000000000000000000..6ac5cece89087555899cb17408b31af1d7aa37a0 --- /dev/null +++ b/executable_names/src/plugins/jobacct/linux/jobacct_linux.c @@ -0,0 +1,533 @@ +/*****************************************************************************\ + * jobacct_linux.c - slurm job accounting plugin. + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Written by Andy Riebs, , who borrowed heavily + * from other parts of SLURM, and Danny Auble, + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This file is patterned after jobcomp_linux.c, written by Morris Jette and + * Copyright (C) 2002 The Regents of the University of California. +\*****************************************************************************/ + +#include "src/plugins/jobacct/common/jobacct_common.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "jobacct" for SLURM job completion logging) and + * is a description of how this plugin satisfies that application. SLURM will + * only load job completion logging plugins if the plugin_type string has a + * prefix of "jobacct/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the job accounting API + * matures. + */ +const char plugin_name[] = "Job accounting LINUX plugin"; +const char plugin_type[] = "jobacct/linux"; +const uint32_t plugin_version = 100; + +/* Other useful declarations */ + +typedef struct prec { /* process record */ + pid_t pid; + pid_t ppid; + int usec; /* user cpu time */ + int ssec; /* system cpu time */ + int pages; /* pages */ + int rss; /* rss */ + int vsize; /* virtual size */ +} prec_t; + +static int freq = 0; +/* Finally, pre-define all local routines. */ + +static void _get_offspring_data(List prec_list, prec_t *ancestor, pid_t pid); +static void _get_process_data(); +static int _get_process_data_line(FILE *in, prec_t *prec); +static void *_watch_tasks(void *arg); +static void _destroy_prec(void *object); + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +extern int init ( void ) +{ + verbose("%s loaded", plugin_name); + return SLURM_SUCCESS; +} + +extern int fini ( void ) +{ + return SLURM_SUCCESS; +} + +/* + * The following routine is called by the slurmd mainline + */ + +int jobacct_p_init_struct(struct jobacctinfo *jobacct, + jobacct_id_t *jobacct_id) +{ + return common_init_struct(jobacct, jobacct_id); +} + +struct jobacctinfo *jobacct_p_alloc(jobacct_id_t *jobacct_id) +{ + return common_alloc_jobacct(jobacct_id); +} + +void jobacct_p_free(struct jobacctinfo *jobacct) +{ + common_free_jobacct(jobacct); +} + +int jobacct_p_setinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data) +{ + return common_setinfo(jobacct, type, data); + +} + +int jobacct_p_getinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data) +{ + return common_getinfo(jobacct, type, data); +} + +void jobacct_p_aggregate(struct jobacctinfo *dest, struct jobacctinfo *from) +{ + common_aggregate(dest, from); +} + +void jobacct_p_2_sacct(sacct_t *sacct, struct jobacctinfo *jobacct) +{ + common_2_sacct(sacct, jobacct); +} + +void jobacct_p_pack(struct jobacctinfo *jobacct, Buf buffer) +{ + common_pack(jobacct, buffer); +} + +int jobacct_p_unpack(struct jobacctinfo **jobacct, Buf buffer) +{ + return common_unpack(jobacct, buffer); +} + + +int jobacct_p_init_slurmctld(char *job_acct_log) +{ + return common_init_slurmctld(job_acct_log); +} + +int jobacct_p_fini_slurmctld() +{ + return common_fini_slurmctld(); +} + +int jobacct_p_job_start_slurmctld(struct job_record *job_ptr) +{ + return common_job_start_slurmctld(job_ptr); +} + +int jobacct_p_job_complete_slurmctld(struct job_record *job_ptr) +{ + return common_job_complete_slurmctld(job_ptr); +} + +int jobacct_p_step_start_slurmctld(struct step_record *step) +{ + return common_step_start_slurmctld(step); +} + +int jobacct_p_step_complete_slurmctld(struct step_record *step) +{ + return common_step_complete_slurmctld(step); +} + +int jobacct_p_suspend_slurmctld(struct job_record *job_ptr) +{ + return common_suspend_slurmctld(job_ptr); +} + +/* + * jobacct_startpoll() is called when the plugin is loaded by + * slurmd, before any other functions are called. Put global + * initialization here. + */ + +int jobacct_p_startpoll(int frequency) +{ + int rc = SLURM_SUCCESS; + + pthread_attr_t attr; + pthread_t _watch_tasks_thread_id; + + debug("jobacct LINUX plugin loaded"); + + /* Parse the JobAcctParameters */ + + + debug("jobacct: frequency = %d", frequency); + + jobacct_shutdown = false; + + if (frequency == 0) { /* don't want dynamic monitoring? */ + debug2("jobacct LINUX dynamic logging disabled"); + return rc; + } + + freq = frequency; + task_list = list_create(common_free_jobacct); + + /* create polling thread */ + slurm_attr_init(&attr); + if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) + error("pthread_attr_setdetachstate error %m"); + + if (pthread_create(&_watch_tasks_thread_id, &attr, + &_watch_tasks, NULL)) { + debug("jobacct failed to create _watch_tasks " + "thread: %m"); + frequency = 0; + } + else + debug3("jobacct LINUX dynamic logging enabled"); + slurm_attr_destroy(&attr); + + return rc; +} + +int jobacct_p_endpoll() +{ + slurm_mutex_lock(&jobacct_lock); + if(task_list) + list_destroy(task_list); + task_list = NULL; + slurm_mutex_unlock(&jobacct_lock); + + return common_endpoll(); +} + +int jobacct_p_add_task(pid_t pid, jobacct_id_t *jobacct_id) +{ + return common_add_task(pid, jobacct_id); +} + +struct jobacctinfo *jobacct_p_stat_task(pid_t pid) +{ + _get_process_data(); + return common_stat_task(pid); +} + +struct jobacctinfo *jobacct_p_remove_task(pid_t pid) +{ + return common_remove_task(pid); +} + +void jobacct_p_suspendpoll() +{ + common_suspendpoll(); +} + +/* + * _get_offspring_data() -- collect memory usage data for the offspring + * + * For each process that lists as its parent, add its memory + * usage data to the ancestor's record. Recurse to gather data + * for *all* subsequent generations. + * + * IN: prec_list list of prec's + * ancestor The entry in precTable[] to which the data + * should be added. Even as we recurse, this will + * always be the prec for the base of the family + * tree. + * pid The process for which we are currently looking + * for offspring. + * + * OUT: none. + * + * RETVAL: none. + * + * THREADSAFE! Only one thread ever gets here. + */ +static void +_get_offspring_data(List prec_list, prec_t *ancestor, pid_t pid) { + + ListIterator itr; + prec_t *prec = NULL; + + itr = list_iterator_create(prec_list); + while((prec = list_next(itr))) { + if (prec->ppid == pid) { + _get_offspring_data(prec_list, ancestor, prec->pid); + ancestor->usec += prec->usec; + ancestor->ssec += prec->ssec; + ancestor->pages += prec->pages; + ancestor->rss += prec->rss; + ancestor->vsize += prec->vsize; + } + } + list_iterator_destroy(itr); + return; +} + +/* + * _get_process_data() - Build a table of all current processes + * + * IN: pid. + * + * OUT: none + * + * THREADSAFE! Only one thread ever gets here. + * + * Assumption: + * Any file with a name of the form "/proc/[0-9]+/stat" + * is a Linux-style stat entry. We disregard the data if they look + * wrong. + */ +static void _get_process_data() { + static DIR *SlashProc; /* For /proc */ + static int SlashProcOpen = 0; + + struct dirent *SlashProcEntry; + FILE *statFile; + char *iptr, *optr; + char statFileName[256]; /* Allow ~20x extra length */ + List prec_list = NULL; + + int i; + ListIterator itr; + ListIterator itr2; + prec_t *prec = NULL; + struct jobacctinfo *jobacct = NULL; + static int processing = 0; + + if(processing) { + debug("already running, returning"); + return; + } + + processing = 1; + prec_list = list_create(_destroy_prec); + + if (SlashProcOpen) { + rewinddir(SlashProc); + } else { + SlashProc=opendir("/proc"); + if (SlashProc == NULL) { + perror("opening /proc"); + goto finished; + } + SlashProcOpen=1; + } + strcpy(statFileName, "/proc/"); + + while ((SlashProcEntry=readdir(SlashProc))) { + + /* Save a few cyles by simulating + strcat(statFileName, SlashProcEntry->d_name); + strcat(statFileName, "/stat"); + while checking for a numeric filename (which really + should be a pid). + */ + optr = statFileName+sizeof("/proc"); + iptr = SlashProcEntry->d_name; + i = 0; + do { + if((*iptr < '0') + || ((*optr++ = *iptr++) > '9')) { + i = -1; + break; + } + } while (*iptr); + + if(i == -1) + continue; + iptr = (char*)"/stat"; + + do { *optr++ = *iptr++; } while (*iptr); + *optr = 0; + + if ((statFile=fopen(statFileName,"r"))==NULL) + continue; /* Assume the process went away */ + + prec = xmalloc(sizeof(prec_t)); + if (_get_process_data_line(statFile, prec)) { + list_append(prec_list, prec); + } else + xfree(prec); + fclose(statFile); + } + + if (!list_count(prec_list)) { + goto finished; /* We have no business being here! */ + } + + slurm_mutex_lock(&jobacct_lock); + if(!task_list || !list_count(task_list)) { + slurm_mutex_unlock(&jobacct_lock); + goto finished; + } + + itr = list_iterator_create(task_list); + while((jobacct = list_next(itr))) { + itr2 = list_iterator_create(prec_list); + while((prec = list_next(itr2))) { + if (prec->pid == jobacct->pid) { + /* find all my descendents */ + _get_offspring_data(prec_list, + prec, prec->pid); + /* tally their usage */ + jobacct->max_rss = jobacct->tot_rss = + MAX(jobacct->max_rss, prec->rss); + jobacct->max_vsize = jobacct->tot_vsize = + MAX(jobacct->max_vsize, prec->vsize); + jobacct->max_pages = jobacct->tot_pages = + MAX(jobacct->max_pages, prec->pages); + jobacct->min_cpu = jobacct->tot_cpu = + MAX(jobacct->min_cpu, + (prec->usec + prec->ssec)); + debug2("%d size now %d %d time %d", + jobacct->pid, jobacct->max_rss, + jobacct->max_vsize, jobacct->tot_cpu); + + break; + } + } + list_iterator_destroy(itr2); + } + list_iterator_destroy(itr); + slurm_mutex_unlock(&jobacct_lock); + +finished: + list_destroy(prec_list); + processing = 0; + return; +} + +/* _get_process_data_line() - get line of data from /proc//stat + * + * IN: in - input file channel + * OUT: prec - the destination for the data + * + * RETVAL: ==0 - no valid data + * !=0 - data are valid + * + * Note: It seems a bit wasteful to do all those atoi() and + * atol() conversions that are implicit in the scanf(), + * but they help to ensure that we really are looking at the + * expected type of record. + */ +static int _get_process_data_line(FILE *in, prec_t *prec) { + /* discardable data */ + int d; + char c; + char *s; + uint32_t tmpu32; + int max_path_len = pathconf("/", _PC_NAME_MAX); + + /* useful datum */ + int nvals; + + s = xmalloc(max_path_len + 1); + nvals=fscanf(in, + "%d %s %c %d %d " + "%d %d %d %d %d " + "%d %d %d %d %d " + "%d %d %d %d %d " + "%d %d %d %d %d", + &prec->pid, s, &c, &prec->ppid, &d, + &d, &d, &d, &tmpu32, &tmpu32, + &tmpu32, &prec->pages, &tmpu32, &prec->usec, &prec->ssec, + &tmpu32, &tmpu32, &tmpu32, &tmpu32, &tmpu32, + &tmpu32, &tmpu32, &prec->vsize, &prec->rss, &tmpu32); + /* The fields in the record are + * pid, command, state, ppid, pgrp, + * session, tty_nr, tpgid, flags, minflt, + * cminflt, majflt, cmajflt, utime, stime, + * cutime, cstime, priority, nice, lit_0, + * itrealvalue, starttime, vsize, rss, rlim + */ + xfree(s); + if (nvals != 25) /* Is it what we expected? */ + return 0; /* No! */ + + prec->rss *= getpagesize(); /* convert rss from pages to bytes */ + prec->rss /= 1024; /* convert rss to kibibytes */ + prec->vsize /= 1024; /* and convert vsize to kibibytes */ + return 1; +} + +/* _watch_tasks() -- monitor slurm jobs and track their memory usage + * + * IN, OUT: Irrelevant; this is invoked by pthread_create() + */ + +static void *_watch_tasks(void *arg) { + + while(!jobacct_shutdown) { /* Do this until shutdown is requested */ + if(!suspended) { + _get_process_data(); /* Update the data */ + } + sleep(freq); + } + return NULL; +} + + +static void _destroy_prec(void *object) +{ + prec_t *prec = (prec_t *)object; + xfree(prec); + return; +} diff --git a/executable_names/src/plugins/jobacct/none/Makefile.am b/executable_names/src/plugins/jobacct/none/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..4d6584b310844055f5799230ed073751bb281efa --- /dev/null +++ b/executable_names/src/plugins/jobacct/none/Makefile.am @@ -0,0 +1,13 @@ +# Makefile for jobacct/none plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = jobacct_none.la + +# Null job completion logging plugin. +jobacct_none_la_SOURCES = jobacct_none.c +jobacct_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/jobacct/none/Makefile.in b/executable_names/src/plugins/jobacct/none/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..7de98d27b823c568a7814d8f0bfb2c3cd1233548 --- /dev/null +++ b/executable_names/src/plugins/jobacct/none/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for jobacct/none plugin + +SOURCES = $(jobacct_none_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/jobacct/none +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +jobacct_none_la_LIBADD = +am_jobacct_none_la_OBJECTS = jobacct_none.lo +jobacct_none_la_OBJECTS = $(am_jobacct_none_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(jobacct_none_la_SOURCES) +DIST_SOURCES = $(jobacct_none_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = jobacct_none.la + +# Null job completion logging plugin. +jobacct_none_la_SOURCES = jobacct_none.c +jobacct_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/jobacct/none/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/jobacct/none/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +jobacct_none.la: $(jobacct_none_la_OBJECTS) $(jobacct_none_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(jobacct_none_la_LDFLAGS) $(jobacct_none_la_OBJECTS) $(jobacct_none_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobacct_none.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/jobacct/none/jobacct_none.c b/executable_names/src/plugins/jobacct/none/jobacct_none.c new file mode 100644 index 0000000000000000000000000000000000000000..87522379dc3a9cae164cabcd5cd86422b1e60a92 --- /dev/null +++ b/executable_names/src/plugins/jobacct/none/jobacct_none.c @@ -0,0 +1,231 @@ + +/*****************************************************************************\ + * jobacct_none.c - NO-OP slurm job completion logging plugin. + ***************************************************************************** + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Written by Andy Riebs, . + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * This file is patterned after jobcomp_none.c, written by Morris Jette and + * Copyright (C) 2002 The Regents of the University of California. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include +#include + +#include "src/slurmctld/slurmctld.h" +#include "src/slurmd/slurmd/slurmd.h" +#include "src/common/slurm_jobacct.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "jobacct" for SLURM job completion logging) and + * is a description of how this plugin satisfies that application. SLURM will + * only load job completion logging plugins if the plugin_type string has a + * prefix of "jobacct/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the job accounting API + * matures. + */ +const char plugin_name[] = "Job accounting NOT_INVOKED plugin"; +const char plugin_type[] = "jobacct/none"; +const uint32_t plugin_version = 100; + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +extern int init ( void ) +{ + verbose("%s loaded", plugin_name); + return SLURM_SUCCESS; +} + +extern int fini ( void ) +{ + return SLURM_SUCCESS; +} + +/* + * The following routines are called by slurmctld + */ + +/* + * The following routines are called by slurmd + */ +int jobacct_p_init_struct(struct jobacctinfo *jobacct, + jobacct_id_t *jobacct_id) +{ + return SLURM_SUCCESS; +} + +struct jobacctinfo *jobacct_p_alloc(jobacct_id_t *jobacct_id) +{ + return NULL; +} + +void jobacct_p_free(struct jobacctinfo *jobacct) +{ + return; +} + +int jobacct_p_setinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data) +{ + return SLURM_SUCCESS; + +} + +int jobacct_p_getinfo(struct jobacctinfo *jobacct, + enum jobacct_data_type type, void *data) +{ + return SLURM_SUCCESS; +} + +void jobacct_p_aggregate(struct jobacctinfo *dest, struct jobacctinfo *from) +{ + return; +} + +void jobacct_p_2_sacct(sacct_t *sacct, struct jobacctinfo *jobacct) +{ + return; +} + +void jobacct_p_pack(struct jobacctinfo *jobacct, Buf buffer) +{ + return; +} + +int jobacct_p_unpack(struct jobacctinfo **jobacct, Buf buffer) +{ + return SLURM_SUCCESS; +} + + +int jobacct_p_init_slurmctld(char *job_acct_log) +{ + return SLURM_SUCCESS; +} + +int jobacct_p_fini_slurmctld() +{ + return SLURM_SUCCESS; +} + +int jobacct_p_job_start_slurmctld(struct job_record *job_ptr) +{ + return SLURM_SUCCESS; +} + +int jobacct_p_job_complete_slurmctld(struct job_record *job_ptr) +{ + return SLURM_SUCCESS; +} + +int jobacct_p_step_start_slurmctld(struct step_record *step) +{ + return SLURM_SUCCESS; +} + +int jobacct_p_step_complete_slurmctld(struct step_record *step) +{ + return SLURM_SUCCESS; +} + +int jobacct_p_suspend_slurmctld(struct job_record *job_ptr) +{ + return SLURM_SUCCESS; +} + +int jobacct_p_startpoll(int frequency) +{ + info("jobacct NONE plugin loaded"); + debug3("slurmd_jobacct_init() called"); + + return SLURM_SUCCESS; +} + +int jobacct_p_endpoll() +{ + return SLURM_SUCCESS; +} + +int jobacct_p_add_task(pid_t pid, jobacct_id_t *jobacct_id) +{ + return SLURM_SUCCESS; +} + +struct jobacctinfo *jobacct_p_stat_task(pid_t pid) +{ + return NULL; +} + +struct jobacctinfo *jobacct_p_remove_task(pid_t pid) +{ + return NULL; +} + +void jobacct_p_suspendpoll() +{ + return; +} diff --git a/executable_names/src/plugins/jobcomp/Makefile.am b/executable_names/src/plugins/jobcomp/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..49d7c632bef5d37b5a62c36ebc2170c3e26768b3 --- /dev/null +++ b/executable_names/src/plugins/jobcomp/Makefile.am @@ -0,0 +1,3 @@ +# Makefile for jobcomp plugins + +SUBDIRS = filetxt none script diff --git a/executable_names/src/plugins/jobcomp/Makefile.in b/executable_names/src/plugins/jobcomp/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..fd961d209b1b21e307ac8148e01e4538279b0d47 --- /dev/null +++ b/executable_names/src/plugins/jobcomp/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for jobcomp plugins +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/jobcomp +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +SUBDIRS = filetxt none script +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/jobcomp/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/plugins/jobcomp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/jobcomp/filetxt/Makefile.am b/executable_names/src/plugins/jobcomp/filetxt/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..0c48f13ec11aa6a0692325d297cc9a1c6a800bb4 --- /dev/null +++ b/executable_names/src/plugins/jobcomp/filetxt/Makefile.am @@ -0,0 +1,13 @@ +# Makefile for jobcomp/filetxt plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = jobcomp_filetxt.la + +# Text file job completion logging plugin. +jobcomp_filetxt_la_SOURCES = jobcomp_filetxt.c +jobcomp_filetxt_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/jobcomp/filetxt/Makefile.in b/executable_names/src/plugins/jobcomp/filetxt/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..7b4a89deebad511bbd978100aed00ebbb645ba39 --- /dev/null +++ b/executable_names/src/plugins/jobcomp/filetxt/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for jobcomp/filetxt plugin + +SOURCES = $(jobcomp_filetxt_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/jobcomp/filetxt +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +jobcomp_filetxt_la_LIBADD = +am_jobcomp_filetxt_la_OBJECTS = jobcomp_filetxt.lo +jobcomp_filetxt_la_OBJECTS = $(am_jobcomp_filetxt_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(jobcomp_filetxt_la_SOURCES) +DIST_SOURCES = $(jobcomp_filetxt_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = jobcomp_filetxt.la + +# Text file job completion logging plugin. +jobcomp_filetxt_la_SOURCES = jobcomp_filetxt.c +jobcomp_filetxt_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/jobcomp/filetxt/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/jobcomp/filetxt/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +jobcomp_filetxt.la: $(jobcomp_filetxt_la_OBJECTS) $(jobcomp_filetxt_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(jobcomp_filetxt_la_LDFLAGS) $(jobcomp_filetxt_la_OBJECTS) $(jobcomp_filetxt_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobcomp_filetxt.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/jobcomp/filetxt/jobcomp_filetxt.c b/executable_names/src/plugins/jobcomp/filetxt/jobcomp_filetxt.c new file mode 100644 index 0000000000000000000000000000000000000000..bde8506c73ef994cd4da546f30ea86b6630fe1b6 --- /dev/null +++ b/executable_names/src/plugins/jobcomp/filetxt/jobcomp_filetxt.c @@ -0,0 +1,296 @@ +/*****************************************************************************\ + * jobcomp_filetxt.c - text file slurm job completion logging plugin. + ***************************************************************************** + * Copyright (C) 2003 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/common/macros.h" +#include "src/common/node_select.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/slurm_jobcomp.h" +#include "src/common/uid.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/slurmctld/slurmctld.h" + +#define JOB_FORMAT "JobId=%lu UserId=%s(%lu) Name=%s JobState=%s Partition=%s "\ + "TimeLimit=%s StartTime=%s EndTime=%s NodeList=%s NodeCnt=%u %s\n" + +/* Type for error string table entries */ +typedef struct { + int xe_number; + char *xe_message; +} slurm_errtab_t; + +static slurm_errtab_t slurm_errtab[] = { + {0, "No error"}, + {-1, "Unspecified error"} +}; + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "jobcomp" for SLURM job completion logging) and + * is a description of how this plugin satisfies that application. SLURM will + * only load job completion logging plugins if the plugin_type string has a + * prefix of "jobcomp/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the job completion logging API + * matures. + */ +const char plugin_name[] = "Job completion text file logging plugin"; +const char plugin_type[] = "jobcomp/filetxt"; +const uint32_t plugin_version = 90; + +/* A plugin-global errno. */ +static int plugin_errno = SLURM_SUCCESS; + +/* File descriptor used for logging */ +static pthread_mutex_t file_lock = PTHREAD_MUTEX_INITIALIZER; +static char * log_name = NULL; +static int job_comp_fd = -1; +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +int init ( void ) +{ + return SLURM_SUCCESS; +} + +/* + * The remainder of this file implements the standard SLURM job completion + * logging API. + */ + +int slurm_jobcomp_set_location ( char * location ) +{ + int rc = SLURM_SUCCESS; + + if (location == NULL) { + plugin_errno = EACCES; + return SLURM_ERROR; + } + xfree(log_name); + log_name = xstrdup(location); + + slurm_mutex_lock( &file_lock ); + if (job_comp_fd >= 0) + close(job_comp_fd); + job_comp_fd = open(location, O_WRONLY | O_CREAT | O_APPEND, 0644); + if (job_comp_fd == -1) { + fatal("open %s: %m", location); + plugin_errno = errno; + rc = SLURM_ERROR; + } else + fchmod(job_comp_fd, 0644); + slurm_mutex_unlock( &file_lock ); + return rc; +} + +/* get the user name for the give user_id */ +static void +_get_user_name(uint32_t user_id, char *user_name, int buf_size) +{ + static uint32_t cache_uid = 0; + static char cache_name[32] = "root"; + struct passwd * user_info = NULL; + + if (user_id == cache_uid) + snprintf(user_name, buf_size, "%s", cache_name); + else { + user_info = getpwuid((uid_t) user_id); + if (user_info && user_info->pw_name[0]) + snprintf(cache_name, sizeof(cache_name), "%s", + user_info->pw_name); + else + snprintf(cache_name, sizeof(cache_name), "Unknown"); + cache_uid = user_id; + snprintf(user_name, buf_size, "%s", cache_name); + } +} + +/* + * make_time_str - convert time_t to string with "YYYY-MM-DDTHH:MM:SS" + * Note this is the ISO8601 standard format + * IN time - a time stamp + * IN str_size - size of string buffer + * OUT string - pointer user defined buffer + */ +static void +_make_time_str (time_t *time, char *string, int str_size) +{ + struct tm time_tm; + + localtime_r (time, &time_tm); + snprintf ( string, str_size, "%4.4u-%2.2u-%2.2uT%2.2u:%2.2u:%2.2u", + (time_tm.tm_year + 1900), (time_tm.tm_mon+1), time_tm.tm_mday, + time_tm.tm_hour, time_tm.tm_min, time_tm.tm_sec); +} + +int slurm_jobcomp_log_record ( struct job_record *job_ptr ) +{ + int rc = SLURM_SUCCESS; + char job_rec[512+MAX_JOBNAME_LEN]; + char usr_str[32], start_str[32], end_str[32], lim_str[32]; + char select_buf[128]; + size_t offset = 0, tot_size, wrote; + enum job_states job_state; + + if ((log_name == NULL) || (job_comp_fd < 0)) { + error("JobCompLoc log file %s not open", log_name); + return SLURM_ERROR; + } + + slurm_mutex_lock( &file_lock ); + _get_user_name(job_ptr->user_id, usr_str, sizeof(usr_str)); + if (job_ptr->time_limit == INFINITE) + strcpy(lim_str, "UNLIMITED"); + else + snprintf(lim_str, sizeof(lim_str), "%lu", + (unsigned long) job_ptr->time_limit); + + /* Job will typically be COMPLETING when this is called. + * We remove this flag to get the eventual completion state: + * JOB_FAILED, JOB_TIMEOUT, etc. */ + job_state = job_ptr->job_state & (~JOB_COMPLETING); + + _make_time_str(&(job_ptr->start_time), start_str, sizeof(start_str)); + _make_time_str(&(job_ptr->end_time), end_str, sizeof(end_str)); + + select_g_sprint_jobinfo(job_ptr->select_jobinfo, + select_buf, sizeof(select_buf), SELECT_PRINT_MIXED); + + snprintf(job_rec, sizeof(job_rec), JOB_FORMAT, + (unsigned long) job_ptr->job_id, usr_str, + (unsigned long) job_ptr->user_id, job_ptr->name, + job_state_string(job_state), + job_ptr->partition, lim_str, start_str, + end_str, job_ptr->nodes, job_ptr->node_cnt, + select_buf); + tot_size = strlen(job_rec); + + while ( offset < tot_size ) { + wrote = write(job_comp_fd, job_rec + offset, + tot_size - offset); + if (wrote == -1) { + if (errno == EAGAIN) + continue; + else { + plugin_errno = errno; + rc = SLURM_ERROR; + break; + } + } + offset += wrote; + } + slurm_mutex_unlock( &file_lock ); + return rc; +} + +extern int slurm_jobcomp_get_errno( void ) +{ + return plugin_errno; +} + +/* + * Linear search through table of errno values and strings, + * returns NULL on error, string on success. + */ +static char *_lookup_slurm_api_errtab(int errnum) +{ + char *res = NULL; + int i; + + for (i = 0; i < sizeof(slurm_errtab) / sizeof(slurm_errtab_t); i++) { + if (slurm_errtab[i].xe_number == errnum) { + res = slurm_errtab[i].xe_message; + break; + } + } + return res; +} + +extern char *slurm_jobcomp_strerror( int errnum ) +{ + char *res = _lookup_slurm_api_errtab(errnum); + return (res ? res : strerror(errnum)); +} + +int fini ( void ) +{ + if (job_comp_fd >= 0) + close(job_comp_fd); + xfree(log_name); + return SLURM_SUCCESS; +} diff --git a/executable_names/src/plugins/jobcomp/none/Makefile.am b/executable_names/src/plugins/jobcomp/none/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..75fac02ac7fa834a2190e0266368f9d0e2f64cd0 --- /dev/null +++ b/executable_names/src/plugins/jobcomp/none/Makefile.am @@ -0,0 +1,13 @@ +# Makefile for jobcomp/none plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = jobcomp_none.la + +# Null job completion logging plugin. +jobcomp_none_la_SOURCES = jobcomp_none.c +jobcomp_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/jobcomp/none/Makefile.in b/executable_names/src/plugins/jobcomp/none/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..cf0740285eb1bfcb3e4db3a31c7d432b1ca9365a --- /dev/null +++ b/executable_names/src/plugins/jobcomp/none/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for jobcomp/none plugin + +SOURCES = $(jobcomp_none_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/jobcomp/none +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +jobcomp_none_la_LIBADD = +am_jobcomp_none_la_OBJECTS = jobcomp_none.lo +jobcomp_none_la_OBJECTS = $(am_jobcomp_none_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(jobcomp_none_la_SOURCES) +DIST_SOURCES = $(jobcomp_none_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = jobcomp_none.la + +# Null job completion logging plugin. +jobcomp_none_la_SOURCES = jobcomp_none.c +jobcomp_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/jobcomp/none/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/jobcomp/none/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +jobcomp_none.la: $(jobcomp_none_la_OBJECTS) $(jobcomp_none_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(jobcomp_none_la_LDFLAGS) $(jobcomp_none_la_OBJECTS) $(jobcomp_none_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobcomp_none.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/jobcomp/none/jobcomp_none.c b/executable_names/src/plugins/jobcomp/none/jobcomp_none.c new file mode 100644 index 0000000000000000000000000000000000000000..20c7cc6fed207a2ba7db1d8cd09913e2bbb8c78c --- /dev/null +++ b/executable_names/src/plugins/jobcomp/none/jobcomp_none.c @@ -0,0 +1,125 @@ +/*****************************************************************************\ + * jobcomp_none.c - NO-OP slurm job completion logging plugin. + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include +#include + +#include "src/common/slurm_jobcomp.h" +#include "src/slurmctld/slurmctld.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "jobcomp" for SLURM job completion logging) and + * is a description of how this plugin satisfies that application. SLURM will + * only load job completion logging plugins if the plugin_type string has a + * prefix of "jobcomp/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the job completion logging API + * matures. + */ +const char plugin_name[] = "Job completion logging NONE plugin"; +const char plugin_type[] = "jobcomp/none"; +const uint32_t plugin_version = 90; + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +int init ( void ) +{ + return SLURM_SUCCESS; +} + +/* + * The remainder of this file implements the standard SLURM job completion + * logging API. + */ + +int slurm_jobcomp_set_location ( char * location ) +{ + return SLURM_SUCCESS; +} + +int slurm_jobcomp_log_record ( struct job_record *job_ptr ) +{ + return SLURM_SUCCESS; +} + +int slurm_jobcomp_get_errno( void ) +{ + return SLURM_SUCCESS; +} + +char *slurm_jobcomp_strerror( int errnum ) +{ + return NULL; +} + +int fini ( void ) +{ + return SLURM_SUCCESS; +} diff --git a/executable_names/src/plugins/jobcomp/script/Makefile.am b/executable_names/src/plugins/jobcomp/script/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..9ad7aa904708ec2b17f0b1de29814003e6a3aefd --- /dev/null +++ b/executable_names/src/plugins/jobcomp/script/Makefile.am @@ -0,0 +1,13 @@ +# Makefile for jobcomp/filetxt plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = jobcomp_script.la + +# Text file job completion logging plugin. +jobcomp_script_la_SOURCES = job_record.c job_record.h jobcomp_script.c +jobcomp_script_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/jobcomp/script/Makefile.in b/executable_names/src/plugins/jobcomp/script/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..818ea9274bf434629eaee729bb3f6248768c0903 --- /dev/null +++ b/executable_names/src/plugins/jobcomp/script/Makefile.in @@ -0,0 +1,559 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for jobcomp/filetxt plugin + +SOURCES = $(jobcomp_script_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/jobcomp/script +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +jobcomp_script_la_LIBADD = +am_jobcomp_script_la_OBJECTS = job_record.lo jobcomp_script.lo +jobcomp_script_la_OBJECTS = $(am_jobcomp_script_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(jobcomp_script_la_SOURCES) +DIST_SOURCES = $(jobcomp_script_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = jobcomp_script.la + +# Text file job completion logging plugin. +jobcomp_script_la_SOURCES = job_record.c job_record.h jobcomp_script.c +jobcomp_script_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/jobcomp/script/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/jobcomp/script/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +jobcomp_script.la: $(jobcomp_script_la_OBJECTS) $(jobcomp_script_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(jobcomp_script_la_LDFLAGS) $(jobcomp_script_la_OBJECTS) $(jobcomp_script_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_record.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobcomp_script.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/jobcomp/script/README b/executable_names/src/plugins/jobcomp/script/README new file mode 100644 index 0000000000000000000000000000000000000000..1c334bce0232ab114ee60749fba97f5c05e47d44 --- /dev/null +++ b/executable_names/src/plugins/jobcomp/script/README @@ -0,0 +1,16 @@ +This job completion plugin runs a program after the job is completed. + +The JobCompType is jobcomp/script and the JobCompLoc is the pathname of the script to run. + +The plugin sets up the environment for the program to contain the following variables. + +JOBID: The job id of the slurm job +UID: The uid of the user the job was run for +JOBNAME: The name of the job +JOBSTATE: The state of the job when it ended +PARTITION: The partiton the job ran on +LIMIT: The time limit of the job +START: The start time of the job +END: The end time of the job +NODES: The nodes the job ran on or an empty string if it wasn't assigned +PATH: Sets to the standard path diff --git a/executable_names/src/plugins/jobcomp/script/job_record.c b/executable_names/src/plugins/jobcomp/script/job_record.c new file mode 100644 index 0000000000000000000000000000000000000000..0272976f1c346040b1e6dfbe53b6c530136956aa --- /dev/null +++ b/executable_names/src/plugins/jobcomp/script/job_record.c @@ -0,0 +1,92 @@ +/****************************************************************************** + * job_record.c - Functions to alter script plugin job record structure. + ****************************************************************************** + * Produced at Center for High Performance Computing, North Dakota State + * University + * Written by Nathan Huff + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + + +#include +#include +#include +#include "job_record.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" + +/* + * Create a new job_record containing the job completion information + */ +job_record job_record_create(uint32_t job_id, uint32_t user_id, char *job_name, + char *job_state, char *partition, uint32_t limit, time_t start, time_t end, + time_t submit, uint16_t batch_flag, char *node_list) +{ + job_record ret; + + ret = xmalloc(sizeof(struct job_record_)); + ret->job_id = job_id; + ret->user_id = user_id; + ret->job_name = xstrdup(job_name); + ret->job_state = xstrdup(job_state); + ret->partition = xstrdup(partition); + ret->limit = limit; + ret->start = start; + ret->submit = submit; + ret->batch_flag = batch_flag; + ret->end = end; + ret->node_list = xstrdup(node_list); + return ret; +} + +/* + * Free the memory from a job_record structure + */ +void job_record_destroy(void *job) { + job_record j = job; + if (j == NULL) return; + xfree(j->job_name); + xfree(j->partition); + xfree(j->node_list); + xfree(j->job_state); + xfree(j); +} diff --git a/executable_names/src/plugins/jobcomp/script/job_record.h b/executable_names/src/plugins/jobcomp/script/job_record.h new file mode 100644 index 0000000000000000000000000000000000000000..7198aeea013526fc001bfa92cca835bdb80f0c38 --- /dev/null +++ b/executable_names/src/plugins/jobcomp/script/job_record.h @@ -0,0 +1,66 @@ +/*****************************************************************************\ + * job_record.h - Header for job_record structure. + ***************************************************************************** + * Produced at Center for High Performance Computing, North Dakota State + * University + * Written by Nathan Huff + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + + +#ifndef _JOB_RECORD_H +#define _JOB_RECORD_H + +/* Structure to contain job completion information */ +struct job_record_ { + uint32_t job_id; + uint32_t user_id; + char *job_name; + char *job_state; + char *partition; + uint32_t limit; + uint16_t batch_flag; + time_t submit; + time_t start; + time_t end; + char *node_list; +}; + +typedef struct job_record_ * job_record; + +/* Create a job record */ +job_record job_record_create(uint32_t job_id, uint32_t user_id, char *job_name, + char *job_state, char *partition, uint32_t limit, time_t start, time_t end, + time_t submit, uint16_t batch_flag, char *node_list); + +/* Destroy a job record */ +void job_record_destroy(void *j); + +#endif /* _JOB_RECORD_H */ diff --git a/executable_names/src/plugins/jobcomp/script/jobcomp_script.c b/executable_names/src/plugins/jobcomp/script/jobcomp_script.c new file mode 100644 index 0000000000000000000000000000000000000000..d590f0f48e452643eda7ca68d000f5f52dda673c --- /dev/null +++ b/executable_names/src/plugins/jobcomp/script/jobcomp_script.c @@ -0,0 +1,498 @@ +/*****************************************************************************\ + * jobcomp_script.c - Script running slurm job completion logging plugin. + * $Id$ + ***************************************************************************** + * Produced at Center for High Performance Computing, North Dakota State + * University + * Written by Nathan Huff + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/common/slurm_jobcomp.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/list.h" +#include "src/slurmctld/slurmctld.h" +#include "job_record.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "jobcomp" for SLURM job completion logging) and + * is a description of how this plugin satisfies that application. SLURM will + * only load job completion logging plugins if the plugin_type string has a + * prefix of "jobcomp/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the job completion logging API + * matures. + */ +const char plugin_name[] = "Job completion logging script plugin"; +const char plugin_type[] = "jobcomp/script"; +const uint32_t plugin_version = 90; + +static int plugin_errno = SLURM_SUCCESS; +static char * script = NULL; +static char error_str[256]; +static List comp_list = NULL; + +static pthread_t script_thread = 0; +static pthread_mutex_t thread_flag_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t comp_list_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t comp_list_cond = PTHREAD_COND_INITIALIZER; +static int agent_exit = 0; + +/* + * Check if the script exists and if we can execute it. + */ +static int +_check_script_permissions(char * location) +{ + struct stat filestat; + uid_t user; + gid_t group; + + if(stat(location,&filestat) < 0) { + plugin_errno = errno; + return error("jobcomp/script script does not exist"); + } + + if(!(filestat.st_mode&S_IFREG)) { + plugin_errno = EACCES; + return error("jobcomp/script script isn't a regular file"); + } + + user = geteuid(); + group = getegid(); + if(user == filestat.st_uid) { + if (filestat.st_mode&S_IXUSR) { + return SLURM_SUCCESS; + } else { + plugin_errno = EACCES; + return error("jobcomp/script script is not executable"); + } + } else if(group == filestat.st_gid) { + if (filestat.st_mode&S_IXGRP) { + return SLURM_SUCCESS; + } else { + plugin_errno = EACCES; + return error("jobcomp/script script is not executable"); + } + } else if(filestat.st_mode&S_IXOTH) { + return SLURM_SUCCESS; + } + + plugin_errno = EACCES; + return error("jobcomp/script script is not executable"); +} + + +/* Create a new environment pointer containing information from + * slurm_jobcomp_log_record so that the script can access it. + */ +static char ** _create_environment(char *job, char *user, char *job_name, + char *job_state, char *partition, char *limit, char* start, char * end, + char * submit, char * batch, char *node_list) +{ + int len = 0; + char ** envptr; + char *ptr; + + len += strlen(job)+7; + len += strlen(user)+5; + len += strlen(job_name)+9; + len += strlen(job_state)+10; + len += strlen(partition)+11; + len += strlen(limit)+7; + len += strlen(start)+7; + len += strlen(end)+5; + len += strlen(node_list)+7; + len += strlen(submit)+7; + len += strlen(batch)+6; +#ifdef _PATH_STDPATH + len += strlen(_PATH_STDPATH)+6; +#endif + len += (13*sizeof(char *)); + + if(!(envptr = (char **)try_xmalloc(len))) return NULL; + + ptr = (char *)envptr + (11*sizeof(char *)); + + envptr[0] = ptr; + memcpy(ptr,"JOBID=",6); + ptr += 6; + memcpy(ptr,job,strlen(job)+1); + ptr += strlen(job)+1; + + envptr[1] = ptr; + memcpy(ptr,"UID=",4); + ptr += 4; + memcpy(ptr,user,strlen(user)+1); + ptr += strlen(user)+1; + + envptr[2] = ptr; + memcpy(ptr,"JOBNAME=",8); + ptr += 8; + memcpy(ptr,job_name,strlen(job_name)+1); + ptr += strlen(job_name)+1; + + envptr[3] = ptr; + memcpy(ptr,"JOBSTATE=",9); + ptr += 9; + memcpy(ptr,job_state,strlen(job_state)+1); + ptr += strlen(job_state)+1; + + envptr[4] = ptr; + memcpy(ptr,"PARTITION=",10); + ptr += 10; + memcpy(ptr,partition,strlen(partition)+1); + ptr += strlen(partition)+1; + + envptr[5] = ptr; + memcpy(ptr,"LIMIT=",6); + ptr += 6; + memcpy(ptr,limit,strlen(limit)+1); + ptr += strlen(limit)+1; + + envptr[6] = ptr; + memcpy(ptr,"START=",6); + ptr += 6; + memcpy(ptr,start,strlen(start)+1); + ptr += strlen(start)+1; + + envptr[7] = ptr; + memcpy(ptr,"END=",4); + ptr += 4; + memcpy(ptr,end,strlen(end)+1); + ptr += strlen(end)+1; + + envptr[8] = ptr; + memcpy(ptr,"NODES=",6); + ptr += 6; + memcpy(ptr,node_list,strlen(node_list)+1); + ptr += strlen(node_list)+1; + + envptr[9] = ptr; + memcpy(ptr,"SUBMIT=",7); + ptr += 7; + memcpy(ptr,submit,strlen(submit)+1); + ptr += strlen(submit)+1; + + envptr[10] = ptr; + memcpy(ptr, "BATCH=",6); + ptr += 6; + memcpy(ptr,batch,strlen(batch)+1); + ptr += strlen(batch)+1; + +#ifdef _PATH_STDPATH + envptr[11] = ptr; + memcpy(ptr,"PATH=",5); + ptr += 5; + memcpy(ptr,_PATH_STDPATH,strlen(_PATH_STDPATH)+1); + ptr += strlen(_PATH_STDPATH)+1; + + envptr[12] = NULL; +#else + envptr[11] = NULL; +#endif + + return envptr; +} + +/* + * Thread function that executes a script + */ +void *script_agent (void *args) { + pid_t pid = -1; + char user_id_str[32],job_id_str[32], nodes_cache[1]; + char start_str[32], end_str[32], lim_str[32]; + char submit_str[32], *batch_str; + char * argvp[] = {script, NULL}; + int status; + char ** envp, * nodes; + job_record job; + + while(1) { + pthread_mutex_lock(&comp_list_mutex); + while ((list_is_empty(comp_list) != 0) && (agent_exit == 0)) { + pthread_cond_wait(&comp_list_cond, &comp_list_mutex); + } + if (agent_exit) { + pthread_mutex_unlock(&comp_list_mutex); + return NULL; + } + job = (job_record)list_pop(comp_list); + pthread_mutex_unlock(&comp_list_mutex); + + snprintf(user_id_str,sizeof(user_id_str),"%u",job->user_id); + snprintf(job_id_str,sizeof(job_id_str),"%u",job->job_id); + snprintf(start_str, sizeof(start_str),"%lu", + (unsigned long)job->start); + snprintf(end_str, sizeof(end_str),"%lu", + (unsigned long)job->end); + snprintf(submit_str, sizeof(submit_str),"%lu", + (unsigned long)job->submit); + if (job->batch_flag) + batch_str = "yes"; + else + batch_str = "no"; + nodes_cache[0] = '\0'; + + if (job->limit == INFINITE) { + strcpy(lim_str, "UNLIMITED"); + } else { + snprintf(lim_str, sizeof(lim_str), "%lu", + (unsigned long) job->limit); + } + + if(job->node_list == NULL) { + nodes = nodes_cache; + } else { + nodes = job->node_list; + } + + /*Setup environment*/ + envp = _create_environment(job_id_str,user_id_str, + job->job_name, job->job_state, + job->partition, lim_str, + start_str,end_str,submit_str, + batch_str,nodes); + + if(envp == NULL) { + plugin_errno = ENOMEM; + } + + pid = fork(); + + if (pid < 0) { + xfree(envp); + job_record_destroy((void *)job); + plugin_errno = errno; + } else if (pid == 0) { + /*Change directory to tmp*/ + if (chdir(_PATH_TMP) != 0) { + exit(errno); + } + + /*Redirect stdin, stderr, and stdout to /dev/null*/ + if (freopen(_PATH_DEVNULL, "rb", stdin) == NULL) { + exit(errno); + } + if (freopen(_PATH_DEVNULL, "wb", stdout) == NULL) { + exit(errno); + } + if (freopen(_PATH_DEVNULL, "wb", stderr) == NULL) { + exit(errno); + } + + /*Exec Script*/ + execve(script,argvp,envp); + } else { + xfree(envp); + job_record_destroy((void *)job); + waitpid(pid,&status,0); + if(WIFEXITED(status) && WEXITSTATUS(status)) { + plugin_errno = WEXITSTATUS(status); + } + } + } +} + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +int init ( void ) +{ + pthread_attr_t attr; + + verbose("jobcomp/script plugin loaded init"); + + pthread_mutex_lock(&thread_flag_mutex); + + comp_list = list_create((ListDelF) job_record_destroy); + if(comp_list == NULL) { + return SLURM_ERROR; + } + + if (script_thread) { + debug2( "Script thread already running, not starting another"); + pthread_mutex_unlock(&thread_flag_mutex); + return SLURM_ERROR; + } + slurm_attr_init(&attr); + pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED ); + pthread_create(&script_thread, &attr, script_agent, NULL); + + pthread_mutex_unlock(&thread_flag_mutex); + slurm_attr_destroy(&attr); + + return SLURM_SUCCESS; +} + +/* Set the location of the script to run*/ +int slurm_jobcomp_set_location ( char * location ) +{ + if (location == NULL) { + plugin_errno = EACCES; + return error("jobcomp/script JobCompLoc needs to be set"); + } + + if (_check_script_permissions(location) != SLURM_SUCCESS) { + return SLURM_ERROR; + } + + xfree(script); + script = xstrdup(location); + + return SLURM_SUCCESS; +} + +int slurm_jobcomp_log_record ( struct job_record *job_ptr ) +{ + job_record job; + enum job_states job_state; + time_t submit; + + debug3("Entering slurm_jobcomp_log_record"); + /* Job will typically be COMPLETING when this is called. + * We remove this flag to get the eventual completion state: + * JOB_FAILED, JOB_TIMEOUT, etc. */ + job_state = job_ptr->job_state & (~JOB_COMPLETING); + + if (job_ptr->details) + submit = job_ptr->details->submit_time; + else + submit = job_ptr->start_time; + + job = job_record_create(job_ptr->job_id, job_ptr->user_id, job_ptr->name, + job_state_string(job_state), + job_ptr->partition, job_ptr->time_limit, + job_ptr->start_time, job_ptr->end_time, + submit, job_ptr->batch_flag, job_ptr->nodes); + pthread_mutex_lock(&comp_list_mutex); + list_append(comp_list,(void *)job); + pthread_mutex_unlock(&comp_list_mutex); + pthread_cond_broadcast(&comp_list_cond); + return SLURM_SUCCESS; +} + +/* Return the error code of the plugin*/ +int slurm_jobcomp_get_errno( void ) +{ + return plugin_errno; +} + +/* Return a string representation of the error */ +char *slurm_jobcomp_strerror( int errnum ) +{ + strerror_r(errnum,error_str,sizeof(error_str)); + return error_str; +} + +static int _wait_for_thread (pthread_t thread_id) +{ + int i; + + for (i=0; i<4; i++) { + if (pthread_kill(thread_id, 0)) + return SLURM_SUCCESS; + usleep(1000); + } + error("Could not kill jobcomp script pthread"); + return SLURM_ERROR; +} + +/* Called when script unloads */ +int fini ( void ) +{ + int rc = SLURM_SUCCESS; + + pthread_mutex_lock(&thread_flag_mutex); + if (script_thread) { + verbose("Script Job Completion plugin shutting down"); + agent_exit = 1; + pthread_cond_broadcast(&comp_list_cond); + rc = _wait_for_thread(script_thread); + script_thread = 0; + } + pthread_mutex_unlock(&thread_flag_mutex); + + xfree(script); + if (rc == SLURM_SUCCESS) { + pthread_mutex_lock(&comp_list_mutex); + list_destroy(comp_list); + pthread_mutex_unlock(&comp_list_mutex); + } + + return rc; +} diff --git a/executable_names/src/plugins/mpi/Makefile.am b/executable_names/src/plugins/mpi/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..7048fa45beba1d4b209ba2e0eccbbdf3fd583cab --- /dev/null +++ b/executable_names/src/plugins/mpi/Makefile.am @@ -0,0 +1,3 @@ +# Makefile for mpi plugins + +SUBDIRS = mpichgm mvapich none lam diff --git a/executable_names/src/plugins/mpi/Makefile.in b/executable_names/src/plugins/mpi/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..ab6e7908d859efab0c7de977c0ea52fe0d221517 --- /dev/null +++ b/executable_names/src/plugins/mpi/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for mpi plugins +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/mpi +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +SUBDIRS = mpichgm mvapich none lam +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/mpi/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/plugins/mpi/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/mpi/lam/Makefile.am b/executable_names/src/plugins/mpi/lam/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..112981723083f4a472179133d980f0dba0845bbe --- /dev/null +++ b/executable_names/src/plugins/mpi/lam/Makefile.am @@ -0,0 +1,12 @@ +# Makefile for mpi/lam plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = mpi_lam.la + +mpi_lam_la_SOURCES = mpi_lam.c lam.h +mpi_lam_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/mpi/lam/Makefile.in b/executable_names/src/plugins/mpi/lam/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..f251236d30a598f4031abc0ef476ab15c7785f00 --- /dev/null +++ b/executable_names/src/plugins/mpi/lam/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for mpi/lam plugin + +SOURCES = $(mpi_lam_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/mpi/lam +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +mpi_lam_la_LIBADD = +am_mpi_lam_la_OBJECTS = mpi_lam.lo +mpi_lam_la_OBJECTS = $(am_mpi_lam_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(mpi_lam_la_SOURCES) +DIST_SOURCES = $(mpi_lam_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = mpi_lam.la +mpi_lam_la_SOURCES = mpi_lam.c lam.h +mpi_lam_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/mpi/lam/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/mpi/lam/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +mpi_lam.la: $(mpi_lam_la_OBJECTS) $(mpi_lam_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(mpi_lam_la_LDFLAGS) $(mpi_lam_la_OBJECTS) $(mpi_lam_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_lam.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/mpi/lam/lam.h b/executable_names/src/plugins/mpi/lam/lam.h new file mode 100644 index 0000000000000000000000000000000000000000..0d746b47caa4f3b68b09e7868b88f2fcda09eff1 --- /dev/null +++ b/executable_names/src/plugins/mpi/lam/lam.h @@ -0,0 +1,46 @@ +/*****************************************************************************\ + ** lam.h - Library routines for initiating jobs on with lam type mpi + ** $Id: mpi_gmpi.c,v 1.7 2005/06/07 18:25:32 morrone Exp $ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Danny Auble + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include "src/srun/srun_job.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" +#include "src/common/env.h" + +//extern int lam_thr_create(srun_job_t *job); diff --git a/executable_names/src/plugins/mpi/lam/mpi_lam.c b/executable_names/src/plugins/mpi/lam/mpi_lam.c new file mode 100644 index 0000000000000000000000000000000000000000..2afeed062210cb66cec30a068d90f7dc8dfd146d --- /dev/null +++ b/executable_names/src/plugins/mpi/lam/mpi_lam.c @@ -0,0 +1,102 @@ +/*****************************************************************************\ + ** mpi_lam.c - Library routines for initiating jobs on with lam type mpi + ** $Id: mpi_gmpi.c,v 1.7 2005/06/07 18:25:32 morrone Exp $ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Danny Auble + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include +#include "src/common/slurm_xlator.h" +#include "src/plugins/mpi/lam/lam.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "switch" for SLURM switch) and is a description + * of how this plugin satisfies that application. SLURM will only load + * a switch plugin if the plugin_type string has a prefix of "switch/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as this API matures. + */ +const char plugin_name[] = "mpi LAM plugin"; +const char plugin_type[] = "mpi/lam"; +const uint32_t plugin_version = 100; + +int mpi_p_init(slurmd_job_t *job) +{ + debug("Using mpi/lam"); + return SLURM_SUCCESS; +} + +int mpi_p_thr_create(srun_job_t *job) +{ + debug("Using mpi/lam"); + return SLURM_SUCCESS; +} + +int mpi_p_single_task() +{ + return true; +} + +int mpi_p_exit() +{ + return SLURM_SUCCESS; +} diff --git a/executable_names/src/plugins/mpi/mpichgm/Makefile.am b/executable_names/src/plugins/mpi/mpichgm/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..a91adb0aeb41187adaed6bd7fa134ca4e3dba1f1 --- /dev/null +++ b/executable_names/src/plugins/mpi/mpichgm/Makefile.am @@ -0,0 +1,15 @@ +# Makefile for mpi/gmpi plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = mpi_mpichgm.la + +# Null switch plugin. +mpi_mpichgm_la_SOURCES = mpi_mpichgm.c mpichgm.c mpichgm.h\ + $(top_srcdir)/src/common/global_srun.c \ + $(top_srcdir)/src/common/net.c +mpi_mpichgm_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/mpi/mpichgm/Makefile.in b/executable_names/src/plugins/mpi/mpichgm/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..fd13106f1692852afac623e53e8151f062d403c6 --- /dev/null +++ b/executable_names/src/plugins/mpi/mpichgm/Makefile.in @@ -0,0 +1,579 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for mpi/gmpi plugin + +SOURCES = $(mpi_mpichgm_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/mpi/mpichgm +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +mpi_mpichgm_la_LIBADD = +am_mpi_mpichgm_la_OBJECTS = mpi_mpichgm.lo mpichgm.lo global_srun.lo \ + net.lo +mpi_mpichgm_la_OBJECTS = $(am_mpi_mpichgm_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(mpi_mpichgm_la_SOURCES) +DIST_SOURCES = $(mpi_mpichgm_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = mpi_mpichgm.la + +# Null switch plugin. +mpi_mpichgm_la_SOURCES = mpi_mpichgm.c mpichgm.c mpichgm.h\ + $(top_srcdir)/src/common/global_srun.c \ + $(top_srcdir)/src/common/net.c + +mpi_mpichgm_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/mpi/mpichgm/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/mpi/mpichgm/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +mpi_mpichgm.la: $(mpi_mpichgm_la_OBJECTS) $(mpi_mpichgm_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(mpi_mpichgm_la_LDFLAGS) $(mpi_mpichgm_la_OBJECTS) $(mpi_mpichgm_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global_srun.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_mpichgm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpichgm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +global_srun.lo: $(top_srcdir)/src/common/global_srun.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global_srun.lo -MD -MP -MF "$(DEPDIR)/global_srun.Tpo" -c -o global_srun.lo `test -f '$(top_srcdir)/src/common/global_srun.c' || echo '$(srcdir)/'`$(top_srcdir)/src/common/global_srun.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/global_srun.Tpo" "$(DEPDIR)/global_srun.Plo"; else rm -f "$(DEPDIR)/global_srun.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/src/common/global_srun.c' object='global_srun.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global_srun.lo `test -f '$(top_srcdir)/src/common/global_srun.c' || echo '$(srcdir)/'`$(top_srcdir)/src/common/global_srun.c + +net.lo: $(top_srcdir)/src/common/net.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net.lo -MD -MP -MF "$(DEPDIR)/net.Tpo" -c -o net.lo `test -f '$(top_srcdir)/src/common/net.c' || echo '$(srcdir)/'`$(top_srcdir)/src/common/net.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/net.Tpo" "$(DEPDIR)/net.Plo"; else rm -f "$(DEPDIR)/net.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/src/common/net.c' object='net.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o net.lo `test -f '$(top_srcdir)/src/common/net.c' || echo '$(srcdir)/'`$(top_srcdir)/src/common/net.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/mpi/mpichgm/mpi_mpichgm.c b/executable_names/src/plugins/mpi/mpichgm/mpi_mpichgm.c new file mode 100644 index 0000000000000000000000000000000000000000..18a8c625646fd147d8e7b3775024eaeaccf184ed --- /dev/null +++ b/executable_names/src/plugins/mpi/mpichgm/mpi_mpichgm.c @@ -0,0 +1,116 @@ +/*****************************************************************************\ + ** mpi_mpichgm.c - Library routines for initiating jobs on with gmpi type mpi + ** $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Danny Auble + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include +#include "src/common/slurm_xlator.h" +#include "src/plugins/mpi/mpichgm/mpichgm.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "switch" for SLURM switch) and is a description + * of how this plugin satisfies that application. SLURM will only load + * a switch plugin if the plugin_type string has a prefix of "switch/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as this API matures. + */ +const char plugin_name[] = "mpi MPICH-GM plugin"; +const char plugin_type[] = "mpi/mpich-gm"; +const uint32_t plugin_version = 100; + +int mpi_p_init(slurmd_job_t *job, int rank) +{ + char addrbuf[1024]; + char *p; + char *addr = getenvp (job->env, "SLURM_LAUNCH_NODE_IPADDR"); + + debug("Using mpi/mpich-gm"); + slurm_print_slurm_addr (job->envtp->self, addrbuf, sizeof(addrbuf)); + + if ((p = strchr (addrbuf, ':')) != NULL) + *p = '\0'; + + setenvf (&job->env, "GMPI_MASTER", "%s", addr); + setenvf (&job->env, "GMPI_SLAVE", "%s", addrbuf); + setenvf (&job->env, "GMPI_ID", "%d", rank); + debug2("init for mpi rank %d\n", rank); + + return SLURM_SUCCESS; +} + +int mpi_p_thr_create(srun_job_t *job) +{ + debug("Using mpi/mpich-gm"); + return gmpi_thr_create(job); +} + +int mpi_p_single_task() +{ + return false; +} + +int mpi_p_exit() +{ + return SLURM_SUCCESS; +} diff --git a/executable_names/src/plugins/mpi/mpichgm/mpichgm.c b/executable_names/src/plugins/mpi/mpichgm/mpichgm.c new file mode 100644 index 0000000000000000000000000000000000000000..15276b5ca02de64a229c94462886c36b190bb92a --- /dev/null +++ b/executable_names/src/plugins/mpi/mpichgm/mpichgm.c @@ -0,0 +1,348 @@ +/*****************************************************************************\ + ** mpichgm.c - srun support for MPICH-GM (GMPI) + ** $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Takao Hatazaki + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef WITH_PTHREADS +# include +#endif + +#include +#include +#include +#include +#include +#include + +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/net.h" +#include "src/common/global_srun.h" +#include "src/srun/opt.h" + +#include "src/plugins/mpi/mpichgm/mpichgm.h" + +typedef struct { + int defined; + unsigned int port_board_id; + unsigned int unique_high_id; + unsigned int unique_low_id; + unsigned int numanode; + unsigned int remote_pid; + unsigned int remote_port; +} gm_slave_t; + +#define GMPI_RECV_BUF_LEN 65536 + + +static int gmpi_fd = -1; + +static int _gmpi_parse_init_recv_msg(srun_job_t *job, char *rbuf, + gm_slave_t *slave_data, int *ii) +{ + unsigned int magic, id, port_board_id, unique_high_id, + unique_low_id, numanode, remote_pid, remote_port; + int got; + gm_slave_t *dp; + + got = sscanf(rbuf, "<<<%u:%u:%u:%u:%u:%u:%u::%u>>>", + &magic, &id, &port_board_id, &unique_high_id, + &unique_low_id, &numanode, &remote_pid, &remote_port); + *ii = id; + if (got != 8) { + error("GMPI master received invalid init message"); + return -1; + } + if (magic != job->jobid) { + error("GMPI master received invalid magic number"); + return -1; + } + if (id >= job->ntasks) + fatal("GMPI id is out of range"); + if (port_board_id == 0) + fatal("MPI id=%d was unable to open a GM port", id); + + dp = &slave_data[id]; + if (dp->defined) { + error("Ignoring the message from MPI id=%d", id); + return -1; + } + dp->defined = 1; + dp->port_board_id = port_board_id; + dp->unique_high_id = unique_high_id; + dp->unique_low_id = unique_low_id; + dp->numanode = numanode; + dp->remote_pid = remote_pid; + dp->remote_port = remote_port; + + debug3("slave_data[%d]: <<<%u:%u:%u:%u:%u:%u:%u::%u>>>", + id, magic, id, port_board_id, + dp->unique_high_id, dp->unique_low_id, dp->numanode, + dp->remote_pid, dp->remote_port); + return 0; +} + + +static int _gmpi_establish_map(srun_job_t *job) +{ + struct sockaddr_in addr; + in_addr_t *iaddrs; + socklen_t addrlen; + int accfd, newfd, rlen, nprocs, i, j, id; + size_t gmaplen, lmaplen, maplen; + char *p, *rbuf = NULL, *gmap = NULL, *lmap = NULL, *map = NULL; + char tmp[128]; + gm_slave_t *slave_data = NULL, *dp; + + /* + * Collect info from slaves. + * Will never finish unless slaves are GMPI processes. + */ + accfd = gmpi_fd; + addrlen = sizeof(addr); + nprocs = job->ntasks; + iaddrs = (in_addr_t *)xmalloc(sizeof(*iaddrs)*nprocs); + slave_data = (gm_slave_t *)xmalloc(sizeof(*slave_data)*nprocs); + for (i=0; i", dp->port_board_id, + dp->unique_high_id, dp->unique_low_id, dp->numanode); + strcpy(p, tmp); + p += strlen(tmp); + } + strcpy(p, "|||"); + p += 3; + gmaplen = (size_t)(p - gmap); + + /* + * Respond to slaves. + */ + lmap = (char *)xmalloc(128*nprocs); + for (i=0; inumanode == slave_data[j].numanode)) { + sprintf(tmp, "<%u>", j); + strcpy(p, tmp); + p += strlen(tmp); + } + } + lmaplen = (size_t)(p - lmap); + map = (char *)xmalloc(gmaplen+lmaplen+4); + strcpy(map, gmap); + strcpy(map+gmaplen, lmap); + strcpy(map+gmaplen+lmaplen, "]]]"); + maplen = gmaplen + lmaplen + 3; + + /* + * Send it. + */ + if ((newfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { + fatal("GMPI master failed to respond"); + } + j = 1; + if (setsockopt(newfd, SOL_SOCKET, SO_REUSEADDR, + (void *)&j, sizeof(j))) + error("setsockopt in GMPI master: %m"); + bzero(&addr, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(iaddrs[i]); + addr.sin_port = htons(dp->remote_port); + if (connect(newfd, (struct sockaddr *)&addr, sizeof(addr))) + fatal("GMPI master failed to connect"); + send(newfd, map, maplen, 0); + close(newfd); + xfree(map); + } + xfree(slave_data); + xfree(lmap); + xfree(gmap); + xfree(iaddrs); + + debug2("GMPI master responded to all GMPI processes"); + return 0; +} + + +static void _gmpi_wait_abort(srun_job_t *job) +{ + struct sockaddr_in addr; + socklen_t addrlen; + int newfd, rlen; + unsigned int magic; + char *rbuf; + + rbuf = (char *)xmalloc(GMPI_RECV_BUF_LEN); + addrlen = sizeof(addr); + while (1) { + newfd = accept(gmpi_fd, (struct sockaddr *)&addr, + &addrlen); + if (newfd == -1) { + fatal("GMPI master failed to accept (abort-wait)"); + } + rlen = recv(newfd, rbuf, GMPI_RECV_BUF_LEN, 0); + if (rlen <= 0) { + error("GMPI recv (abort-wait) returned %d", rlen); + close(newfd); + continue; + } else { + rbuf[rlen] = 0; + } + if (sscanf(rbuf, "<<>>", &magic) != 1) { + error("GMPI (abort-wait) received spurious message."); + close(newfd); + continue; + } + if (magic != job->jobid) { + error("GMPI (abort-wait) received bad magic number."); + close(newfd); + continue; + } + close(newfd); + debug("Received ABORT message from an MPI process."); + fwd_signal(job, SIGKILL, opt.max_threads); +#if 0 + xfree(rbuf); + close(jgmpi_fd); + gmpi_fd = -1; + return; +#endif + } +} + + +static void *_gmpi_thr(void *arg) +{ + srun_job_t *job; + + job = (srun_job_t *) arg; + + debug3("GMPI master thread pid=%lu", (unsigned long) getpid()); + _gmpi_establish_map(job); + + debug3("GMPI master thread is waiting for ABORT message."); + _gmpi_wait_abort(job); + + return (void *)0; +} + + +extern int gmpi_thr_create(srun_job_t *job) +{ + short port; + pthread_attr_t attr; + pthread_t gtid; + + /* + * It is possible for one to modify the mpirun command in + * MPICH-GM distribution so that it calls srun, instead of + * rsh, for remote process invocations. In that case, we + * should not override envs nor open the master port. + */ + if (getenv("GMPI_PORT")) + return (0); + + if (net_stream_listen (&gmpi_fd, &port) < 0) { + error ("Unable to create GMPI listen port: %m"); + return -1; + } + + /* + * Accept in a separate thread. + */ + slurm_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + if (pthread_create(>id, &attr, &_gmpi_thr, (void *)job)) { + slurm_attr_destroy(&attr); + return -1; + } + slurm_attr_destroy(&attr); + setenvf (NULL, "GMPI_PORT", "%u", port); + setenvf (NULL, "GMPI_MAGIC", "%u", job->jobid); + setenvf (NULL, "GMPI_NP", "%d", job->ntasks); + setenvf (NULL, "GMPI_SHMEM", "1"); + /* FIXME for multi-board config. */ + setenvf (NULL, "GMPI_BOARD", "-1"); + + debug("Started GMPI master thread (%lu)", (unsigned long) gtid); + + return 0; +} diff --git a/executable_names/src/plugins/mpi/mpichgm/mpichgm.h b/executable_names/src/plugins/mpi/mpichgm/mpichgm.h new file mode 100644 index 0000000000000000000000000000000000000000..53b8e59e76867f05a8a315dfd929a93d82c73c30 --- /dev/null +++ b/executable_names/src/plugins/mpi/mpichgm/mpichgm.h @@ -0,0 +1,46 @@ +/*****************************************************************************\ + ** mpichgm.h - Library routines for initiating jobs on with gmpi type mpi + ** $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Danny Auble + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include "src/srun/srun_job.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" +#include "src/common/env.h" + +extern int gmpi_thr_create(srun_job_t *job); diff --git a/executable_names/src/plugins/mpi/mvapich/Makefile.am b/executable_names/src/plugins/mpi/mvapich/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..a918f231b18185df73ffaeec5b368fa04a30b540 --- /dev/null +++ b/executable_names/src/plugins/mpi/mvapich/Makefile.am @@ -0,0 +1,16 @@ +# Makefile for mpi/mvapich plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = mpi_mvapich.la + +# Null switch plugin. +mpi_mvapich_la_SOURCES = mpi_mvapich.c mvapich.c mvapich.h\ + $(top_srcdir)/src/common/net.c \ + $(top_srcdir)/src/common/global_srun.c + +mpi_mvapich_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/mpi/mvapich/Makefile.in b/executable_names/src/plugins/mpi/mvapich/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..a7e449e5faad3570f66a29a45ee4b2aea6fda01d --- /dev/null +++ b/executable_names/src/plugins/mpi/mvapich/Makefile.in @@ -0,0 +1,579 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for mpi/mvapich plugin + +SOURCES = $(mpi_mvapich_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/mpi/mvapich +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +mpi_mvapich_la_LIBADD = +am_mpi_mvapich_la_OBJECTS = mpi_mvapich.lo mvapich.lo net.lo \ + global_srun.lo +mpi_mvapich_la_OBJECTS = $(am_mpi_mvapich_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(mpi_mvapich_la_SOURCES) +DIST_SOURCES = $(mpi_mvapich_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = mpi_mvapich.la + +# Null switch plugin. +mpi_mvapich_la_SOURCES = mpi_mvapich.c mvapich.c mvapich.h\ + $(top_srcdir)/src/common/net.c \ + $(top_srcdir)/src/common/global_srun.c + +mpi_mvapich_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/mpi/mvapich/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/mpi/mvapich/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +mpi_mvapich.la: $(mpi_mvapich_la_OBJECTS) $(mpi_mvapich_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(mpi_mvapich_la_LDFLAGS) $(mpi_mvapich_la_OBJECTS) $(mpi_mvapich_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global_srun.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_mvapich.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mvapich.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +net.lo: $(top_srcdir)/src/common/net.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net.lo -MD -MP -MF "$(DEPDIR)/net.Tpo" -c -o net.lo `test -f '$(top_srcdir)/src/common/net.c' || echo '$(srcdir)/'`$(top_srcdir)/src/common/net.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/net.Tpo" "$(DEPDIR)/net.Plo"; else rm -f "$(DEPDIR)/net.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/src/common/net.c' object='net.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o net.lo `test -f '$(top_srcdir)/src/common/net.c' || echo '$(srcdir)/'`$(top_srcdir)/src/common/net.c + +global_srun.lo: $(top_srcdir)/src/common/global_srun.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global_srun.lo -MD -MP -MF "$(DEPDIR)/global_srun.Tpo" -c -o global_srun.lo `test -f '$(top_srcdir)/src/common/global_srun.c' || echo '$(srcdir)/'`$(top_srcdir)/src/common/global_srun.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/global_srun.Tpo" "$(DEPDIR)/global_srun.Plo"; else rm -f "$(DEPDIR)/global_srun.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/src/common/global_srun.c' object='global_srun.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global_srun.lo `test -f '$(top_srcdir)/src/common/global_srun.c' || echo '$(srcdir)/'`$(top_srcdir)/src/common/global_srun.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/mpi/mvapich/mpi_mvapich.c b/executable_names/src/plugins/mpi/mvapich/mpi_mvapich.c new file mode 100644 index 0000000000000000000000000000000000000000..bce618bdd3dee6ae2e2bfca826d58faf434a738b --- /dev/null +++ b/executable_names/src/plugins/mpi/mvapich/mpi_mvapich.c @@ -0,0 +1,134 @@ +/*****************************************************************************\ + ** mpi_mvapich.c - Library routines for initiating jobs on with mvapich + ** type mpi. + ** $Id: mpi_gmpi.c,v 1.7 2005/06/07 18:25:32 morrone Exp $ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Danny Auble + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include +#include "src/common/slurm_xlator.h" +#include "src/plugins/mpi/mvapich/mvapich.h" +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "switch" for SLURM switch) and is a description + * of how this plugin satisfies that application. SLURM will only load + * a switch plugin if the plugin_type string has a prefix of "switch/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as this API matures. + */ +const char plugin_name[] = "mpi MVAPICH plugin"; +const char plugin_type[] = "mpi/mvapich"; +const uint32_t plugin_version = 100; + +int mpi_p_init (slurmd_job_t *job, int rank) +{ + int i; + char *processes = NULL; + char *addr = getenvp (job->env, "SLURM_LAUNCH_NODE_IPADDR"); + + debug("Using mpi/mvapich"); + setenvf (&job->env, "MPIRUN_HOST", "%s", addr); + setenvf (&job->env, "MPIRUN_RANK", "%d", rank); + setenvf (&job->env, "MPIRUN_MPD", "0"); + + debug2("init for mpi rank %d\n", rank); + /* + * Fake MPIRUN_PROCESSES env var -- we don't need this for + * SLURM at this time. (what a waste) + */ + for (i = 0; i < job->nprocs; i++) + xstrcat (processes, "x:"); + + setenvf (&job->env, "MPIRUN_PROCESSES", "%s", processes); + + /* + * Some mvapich versions will ignore MPIRUN_PROCESSES If + * the following env var is set. + */ + setenvf (&job->env, "NOT_USE_TOTALVIEW", "1"); + + /* + * Set VIADEV_ENABLE_AFFINITY=0 so that mvapich doesn't + * override SLURM's CPU affinity. (Unless this var is + * already set in user env) + */ + if (!getenvp (job->env, "VIADEV_ENABLE_AFFINITY")) + setenvf (&job->env, "VIADEV_ENABLE_AFFINITY", "0"); + + return SLURM_SUCCESS; +} + +int mpi_p_thr_create(srun_job_t *job) +{ + debug("Using mpi/mvapich"); + return mvapich_thr_create(job); +} + +int mpi_p_single_task() +{ + return false; +} + +int mpi_p_exit() +{ + return SLURM_SUCCESS; +} diff --git a/executable_names/src/plugins/mpi/mvapich/mvapich.c b/executable_names/src/plugins/mpi/mvapich/mvapich.c new file mode 100644 index 0000000000000000000000000000000000000000..89cea1fe8cf7bfd4ebcc0e9afb3b2d027a50d55a --- /dev/null +++ b/executable_names/src/plugins/mpi/mvapich/mvapich.c @@ -0,0 +1,532 @@ +/*****************************************************************************\ + * mvapich.c - srun support for MPICH-IB (MVAPICH 0.9.4 and 0.9.5,7,8) + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef WITH_PTHREADS +# include +#endif + +#include +#include +#include +#include +#include + +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/net.h" +#include "src/common/fd.h" +#include "src/common/global_srun.h" +#include "src/srun/opt.h" + +/* NOTE: MVAPICH has changed protocols without changing version numbers. + * This makes support of MVAPICH very difficult. + * Support for the following versions have been validated: + * + * For MVAPICH-GEN2-1.0-103, set MVAPICH_VERSION_REQUIRES_PIDS to 2 + * For MVAPICH 0.9.4 and 0.9.5, set MVAPICH_VERSION_REQUIRES_PIDS to 3 + * + * See functions mvapich_requires_pids() below for other mvapich versions. + */ +#define MVAPICH_VERSION_REQUIRES_PIDS 3 + +#include "src/plugins/mpi/mvapich/mvapich.h" + +/* + * Arguments passed to mvapich support thread. + */ +struct mvapich_args { + srun_job_t *job; /* SRUN job information */ + int fd; /* fd on which to accept new connections */ +}; + + +/* + * Information read from each MVAPICH process + */ +struct mvapich_info +{ + int fd; /* fd for socket connection to MPI task */ + int rank; /* This process' MPI rank */ + int pidlen; /* length of pid buffer */ + char *pid; /* This rank's local pid (V3 only) */ + int hostidlen; /* Host id length */ + int hostid; /* Separate hostid (for protocol v5) */ + int addrlen; /* Length of addr array in bytes */ + + int *addr; /* This process' address array, which for + * process rank N in an M process job + * looks like: + * + * qp0,qp1,..,lid,qpN+1,..,qpM-1, hostid + * + * Where position N is this rank's lid, + * and the hostid is tacked onto the end + * of the array (for protocol version 3) + */ +}; + +/* Globals for the mvapich thread. + */ +static struct mvapich_info **mvarray = NULL; +static int mvapich_fd = -1; +static int nprocs = -1; +static int protocol_version = -1; +static int v5_phase = 0; + + +static struct mvapich_info * mvapich_info_create (void) +{ + struct mvapich_info *mvi = xmalloc (sizeof (*mvi)); + memset (mvi, 0, sizeof (*mvi)); + mvi->fd = -1; + mvi->rank = -1; + return (mvi); +} + +static void mvapich_info_destroy (struct mvapich_info *mvi) +{ + xfree (mvi->addr); + xfree (mvi->pid); + xfree (mvi); + return; +} + +static int mvapich_requires_pids (void) +{ + if ( protocol_version == MVAPICH_VERSION_REQUIRES_PIDS + || protocol_version == 5) + return (1); + return (0); +} + +static int mvapich_abort_sends_rank (void) +{ + if (protocol_version >= 3) + return (1); + return (0); +} + +/* + * Create an mvapich_info object by reading information from + * file descriptor `fd' + */ +static int mvapich_get_task_info (struct mvapich_info *mvi) +{ + int fd = mvi->fd; + + if (fd_read_n (fd, &mvi->addrlen, sizeof (int)) < 0) + return error ("mvapich: Unable to read addrlen for rank %d: %m", + mvi->rank); + + mvi->addr = xmalloc (mvi->addrlen); + + if (fd_read_n (fd, mvi->addr, mvi->addrlen) < 0) + return error ("mvapich: Unable to read addr info for rank %d: %m", + mvi->rank); + + if (!mvapich_requires_pids ()) + return (0); + + if (fd_read_n (fd, &mvi->pidlen, sizeof (int)) < 0) + return error ("mvapich: Unable to read pidlen for rank %d: %m", + mvi->rank); + + mvi->pid = xmalloc (mvi->pidlen); + + if (fd_read_n (fd, mvi->pid, mvi->pidlen) < 0) + return error ("mvapich: Unable to read pid for rank %d: %m", mvi->rank); + + return (0); +} + +static int mvapich_get_hostid (struct mvapich_info *mvi) +{ + if (fd_read_n (mvi->fd, &mvi->hostidlen, sizeof (int)) < 0) + return error ("mvapich: Unable to read hostidlen for rank %d: %m", + mvi->rank); + if (mvi->hostidlen != sizeof (int)) + return error ("mvapich: Unexpected size for hostidlen (%d)", mvi->hostidlen); + if (fd_read_n (mvi->fd, &mvi->hostid, sizeof (int)) < 0) + return error ("mvapich: unable to read hostid from rank %d", + mvi->rank); + + return (0); +} + +static int mvapich_get_task_header (int fd, int *version, int *rank) +{ + /* + * V5 only sends version on first pass + */ + if (protocol_version != 5 || v5_phase == 0) { + if (fd_read_n (fd, version, sizeof (int)) < 0) + return error ("mvapich: Unable to read version from task: %m"); + } + + if (fd_read_n (fd, rank, sizeof (int)) < 0) + return error ("mvapich: Unable to read task rank: %m"); + + if (protocol_version == 5 && v5_phase > 0) + return (0); + + if (protocol_version == -1) + protocol_version = *version; + else if (protocol_version != *version) { + return error ("mvapich: rank %d version %d != %d", *rank, *version, + protocol_version); + } + + return (0); + +} + +static int mvapich_handle_task (int fd, struct mvapich_info *mvi) +{ + mvi->fd = fd; + + switch (protocol_version) { + case 1: + case 2: + case 3: + return mvapich_get_task_info (mvi); + case 5: + if (v5_phase == 0) + return mvapich_get_hostid (mvi); + else + return mvapich_get_task_info (mvi); + default: + return (error ("mvapich: Unsupported protocol version %d", + protocol_version)); + } + + return (0); +} + +/* + * Broadcast addr information to all connected mvapich processes. + * The format of the information sent back to each process is: + * + * for rank N in M process job: + * + * lid info : lid0,lid1,...lidM-1 + * qp info : qp0, qp1, ..., -1, qpN+1, ...,qpM-1 + * hostids : hostid0,hostid1,...,hostidM-1 + * + * total of 3*nprocs ints. + * + */ +static void mvapich_bcast_addrs (void) +{ + struct mvapich_info *m; + int out_addrs_len = 3 * nprocs * sizeof (int); + int *out_addrs = xmalloc (out_addrs_len); + int i = 0; + int j = 0; + + for (i = 0; i < nprocs; i++) { + m = mvarray[i]; + /* + * lids are found in addrs[rank] for each process + */ + out_addrs[i] = m->addr[m->rank]; + + /* + * hostids are the last entry in addrs + */ + out_addrs[2 * nprocs + i] = + m->addr[(m->addrlen/sizeof (int)) - 1]; + } + + for (i = 0; i < nprocs; i++) { + m = mvarray[i]; + + /* + * qp array is tailored to each process. + */ + for (j = 0; j < nprocs; j++) + out_addrs[nprocs + j] = + (i == j) ? -1 : mvarray[j]->addr[i]; + + fd_write_n (m->fd, out_addrs, out_addrs_len); + + /* + * Protocol version 3 requires pid list to be sent next + */ + if (mvapich_requires_pids ()) { + for (j = 0; j < nprocs; j++) + fd_write_n (m->fd, &mvarray[j]->pid, + mvarray[j]->pidlen); + } + + } + + xfree (out_addrs); + return; +} + +static void mvapich_bcast_hostids (void) +{ + int * hostids; + int i = 0; + size_t len = nprocs * sizeof (int); + + hostids = xmalloc (len); + + for (i = 0; i < nprocs; i++) + hostids [i] = mvarray[i]->hostid; + + for (i = 0; i < nprocs; i++) { + struct mvapich_info *mvi = mvarray [i]; + if (fd_write_n (mvi->fd, hostids, len) < 0) + error ("mvapich: write hostid rank %d: %m", mvi->rank); + close (mvi->fd); + } + + xfree (hostids); +} + +static void mvapich_bcast (void) +{ + if (protocol_version < 5 || v5_phase > 0) + return mvapich_bcast_addrs (); + else + return mvapich_bcast_hostids (); +} + +static void mvapich_barrier (void) +{ + int i; + struct mvapich_info *m; + /* + * Simple barrier to wait for qp's to come up. + * Once all processes have written their rank over the socket, + * simply write their rank right back to them. + */ + + debug ("mvapich: starting barrier"); + + for (i = 0; i < nprocs; i++) { + int j; + m = mvarray[i]; + if (fd_read_n (m->fd, &j, sizeof (j)) == -1) + error("mvapich read on barrier"); + } + + debug ("mvapich: completed barrier for all tasks"); + + for (i = 0; i < nprocs; i++) { + m = mvarray[i]; + if (fd_write_n (m->fd, &i, sizeof (i)) == -1) + error("mvapich write on barrier"); + close (m->fd); + m->fd = -1; + } + + return; +} + +static void mvapich_print_abort_message (slurm_step_layout_t *sl, int rank) +{ + char *host; + + if (!mvapich_abort_sends_rank ()) { + info ("mvapich: Received ABORT message from an MPI process."); + return; + } + + host = slurm_step_layout_host_name( + sl, slurm_step_layout_host_id(sl, rank)); + + info ("mvapich: Received ABORT message from MPI rank %d [on %s]", + rank, host); + return; +} + + +static void mvapich_wait_for_abort(srun_job_t *job) +{ + int rlen; + char rbuf[1024]; + + /* + * Wait for abort notification from any process. + * For mvapich 0.9.4, it appears that an MPI_Abort is registered + * simply by connecting to this socket and immediately closing + * the connection. In other versions, the process may write + * its rank. + */ + while (1) { + slurm_addr addr; + int newfd = slurm_accept_msg_conn (mvapich_fd, &addr); + + if (newfd == -1) { + fatal("MPI master failed to accept (abort-wait)"); + } + + fd_set_blocking (newfd); + + if ((rlen = fd_read_n (newfd, rbuf, sizeof (rbuf))) < 0) { + error("MPI recv (abort-wait) returned %d", rlen); + close(newfd); + continue; + } + close(newfd); + + mvapich_print_abort_message(job->step_layout, *((int *) rbuf)); + fwd_signal(job, SIGKILL, opt.max_threads); + } + + return; /* but not reached */ +} + +static void mvapich_mvarray_create (void) +{ + int i; + mvarray = xmalloc (nprocs * sizeof (*mvarray)); + for (i = 0; i < nprocs; i++) { + mvarray [i] = mvapich_info_create (); + mvarray [i]->rank = i; + } +} + +static void mvapich_mvarray_destroy (void) +{ + int i; + for (i = 0; i < nprocs; i++) + mvapich_info_destroy (mvarray [i]); + xfree (mvarray); +} + +static int mvapich_handle_connection (int fd) +{ + int version, rank; + + if (mvapich_get_task_header (fd, &version, &rank) < 0) + return (-1); + + if (rank > nprocs - 1) + return (error ("mvapich: task reported invalid rank (%d)", + rank)); + + if (mvapich_handle_task (fd, mvarray [rank]) < 0) + return (-1); + + return (0); +} + +static void *mvapich_thr(void *arg) +{ + srun_job_t *job = arg; + int i = 0; + + debug ("mvapich-0.9.x/gen2: thread started: %ld", pthread_self ()); + + mvapich_mvarray_create (); + +again: + i = 0; + while (i < nprocs) { + slurm_addr addr; + int fd; + + if ((fd = slurm_accept_msg_conn (mvapich_fd, &addr)) < 0) { + error ("mvapich: accept: %m"); + goto fail; + } + + if (mvapich_handle_connection (fd) < 0) + goto fail; + + i++; + } + + mvapich_bcast (); + + if (protocol_version == 5 && v5_phase == 0) { + v5_phase = 1; + goto again; + } + + mvapich_barrier (); + + mvapich_wait_for_abort (job); + + mvapich_mvarray_destroy (); + + return (NULL); + +fail: + error ("mvapich: fatal error, killing job"); + fwd_signal (job, SIGKILL, opt.max_threads); + return (void *)0; +} + +extern int mvapich_thr_create(srun_job_t *job) +{ + short port; + pthread_attr_t attr; + pthread_t tid; + + nprocs = opt.nprocs; + + if (net_stream_listen(&mvapich_fd, &port) < 0) + error ("Unable to create ib listen port: %m"); + + /* + * Accept in a separate thread. + */ + slurm_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + if (pthread_create(&tid, &attr, &mvapich_thr, (void *)job)) + return -1; + + /* + * Set some environment variables in current env so they'll get + * passed to all remote tasks + */ + setenvf (NULL, "MPIRUN_PORT", "%d", port); + setenvf (NULL, "MPIRUN_NPROCS", "%d", nprocs); + setenvf (NULL, "MPIRUN_ID", "%d", job->jobid); + + verbose ("mvapich-0.9.[45] master listening on port %d", port); + + return 0; +} diff --git a/executable_names/src/plugins/mpi/mvapich/mvapich.h b/executable_names/src/plugins/mpi/mvapich/mvapich.h new file mode 100644 index 0000000000000000000000000000000000000000..8e0bd4508b9247cbd27ebca6a0ee6ad17320fce0 --- /dev/null +++ b/executable_names/src/plugins/mpi/mvapich/mvapich.h @@ -0,0 +1,47 @@ +/*****************************************************************************\ + ** mpi_mvapich.c - Library routines for initiating jobs on with mvapich + ** type mpi. + ** $Id: mpi_gmpi.c,v 1.7 2005/06/07 18:25:32 morrone Exp $ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Danny Auble + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include "src/srun/srun_job.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" +#include "src/common/env.h" + +extern int mvapich_thr_create(srun_job_t *job); diff --git a/executable_names/src/plugins/mpi/none/Makefile.am b/executable_names/src/plugins/mpi/none/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..f3551bea5071cb2266453f9d2d2026095ecd8e39 --- /dev/null +++ b/executable_names/src/plugins/mpi/none/Makefile.am @@ -0,0 +1,13 @@ +# Makefile for mpi/none plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = mpi_none.la + +# Null MPI plugin. +mpi_none_la_SOURCES = mpi_none.c +mpi_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/mpi/none/Makefile.in b/executable_names/src/plugins/mpi/none/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..02ea5c5e15869175d63bc06ff92a3ffce307c57a --- /dev/null +++ b/executable_names/src/plugins/mpi/none/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for mpi/none plugin + +SOURCES = $(mpi_none_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/mpi/none +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +mpi_none_la_LIBADD = +am_mpi_none_la_OBJECTS = mpi_none.lo +mpi_none_la_OBJECTS = $(am_mpi_none_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(mpi_none_la_SOURCES) +DIST_SOURCES = $(mpi_none_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = mpi_none.la + +# Null MPI plugin. +mpi_none_la_SOURCES = mpi_none.c +mpi_none_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/mpi/none/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/mpi/none/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +mpi_none.la: $(mpi_none_la_OBJECTS) $(mpi_none_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(mpi_none_la_LDFLAGS) $(mpi_none_la_OBJECTS) $(mpi_none_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_none.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/mpi/none/mpi_none.c b/executable_names/src/plugins/mpi/none/mpi_none.c new file mode 100644 index 0000000000000000000000000000000000000000..0cdbfecccf84e136f13fef59379d5faf30a240c0 --- /dev/null +++ b/executable_names/src/plugins/mpi/none/mpi_none.c @@ -0,0 +1,105 @@ +/*****************************************************************************\ + ** mpi_none.c - Library routines for initiating jobs on without mpi support + ** $Id$ + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Danny Auble + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "src/common/slurm_xlator.h" +#include "src/srun/srun_job.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" +#include "src/common/env.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "switch" for SLURM switch) and is a description + * of how this plugin satisfies that application. SLURM will only load + * a switch plugin if the plugin_type string has a prefix of "switch/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as this API matures. + */ +const char plugin_name[] = "mpi none plugin"; +const char plugin_type[] = "mpi/none"; +const uint32_t plugin_version = 100; + +int mpi_p_init(slurmd_job_t *job) +{ + debug("Using mpi/none"); + return SLURM_SUCCESS; +} + +int mpi_p_thr_create(srun_job_t *job) +{ + debug("Using mpi/none"); + return SLURM_SUCCESS; +} + +int mpi_p_single_task() +{ + return false; +} + +int mpi_p_exit() +{ + return SLURM_SUCCESS; +} diff --git a/executable_names/src/plugins/proctrack/Makefile.am b/executable_names/src/plugins/proctrack/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..8bc6a0fc6e8af1bc44b8a3a14fce1a1257d0f1df --- /dev/null +++ b/executable_names/src/plugins/proctrack/Makefile.am @@ -0,0 +1,11 @@ +# Makefile for proctrack plugins + +if HAVE_AIX_PROCTRACK +AIX_PROCTRACK = aix +endif + +if HAVE_SGI_JOB +SGI_JOB = sgi_job +endif + +SUBDIRS = $(AIX_PROCTRACK) $(SGI_JOB) pgid linuxproc rms diff --git a/executable_names/src/plugins/proctrack/Makefile.in b/executable_names/src/plugins/proctrack/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..8083953e87c210415ba57d1c89440cb1970f7bdb --- /dev/null +++ b/executable_names/src/plugins/proctrack/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for proctrack plugins +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/proctrack +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = aix sgi_job pgid linuxproc rms +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +@HAVE_AIX_PROCTRACK_TRUE@AIX_PROCTRACK = aix +@HAVE_SGI_JOB_TRUE@SGI_JOB = sgi_job +SUBDIRS = $(AIX_PROCTRACK) $(SGI_JOB) pgid linuxproc rms +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/proctrack/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/plugins/proctrack/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/proctrack/aix/Makefile.am b/executable_names/src/plugins/proctrack/aix/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..b9dd4610d42d33d5082cbc5eebc59275653ecd5b --- /dev/null +++ b/executable_names/src/plugins/proctrack/aix/Makefile.am @@ -0,0 +1,14 @@ +# Makefile for proctrack/aix plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -Wl,-bI:$(PROCTRACKDIR)/proctrackext.exp\ + -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = proctrack_aix.la + +# AIX process tracking kernel extension plugin. +proctrack_aix_la_SOURCES = proctrack_aix.c +proctrack_aix_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/proctrack/aix/Makefile.in b/executable_names/src/plugins/proctrack/aix/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..2d3c4b0305b54e710a198753de751a84bebd5df6 --- /dev/null +++ b/executable_names/src/plugins/proctrack/aix/Makefile.in @@ -0,0 +1,560 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for proctrack/aix plugin + +SOURCES = $(proctrack_aix_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/proctrack/aix +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +proctrack_aix_la_LIBADD = +am_proctrack_aix_la_OBJECTS = proctrack_aix.lo +proctrack_aix_la_OBJECTS = $(am_proctrack_aix_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(proctrack_aix_la_SOURCES) +DIST_SOURCES = $(proctrack_aix_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -Wl,-bI:$(PROCTRACKDIR)/proctrackext.exp\ + -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = proctrack_aix.la + +# AIX process tracking kernel extension plugin. +proctrack_aix_la_SOURCES = proctrack_aix.c +proctrack_aix_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/proctrack/aix/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/proctrack/aix/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +proctrack_aix.la: $(proctrack_aix_la_OBJECTS) $(proctrack_aix_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(proctrack_aix_la_LDFLAGS) $(proctrack_aix_la_OBJECTS) $(proctrack_aix_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proctrack_aix.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/proctrack/aix/proctrack_aix.c b/executable_names/src/plugins/proctrack/aix/proctrack_aix.c new file mode 100644 index 0000000000000000000000000000000000000000..134522a341d89a3fff6ef28d35608c0fcba19ff8 --- /dev/null +++ b/executable_names/src/plugins/proctrack/aix/proctrack_aix.c @@ -0,0 +1,263 @@ +/*****************************************************************************\ + * proctrack_aix.c - process tracking via AIX kernel extension. + ***************************************************************************** + * Copyright (C) 2005-2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include "src/common/log.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "jobcomp" for SLURM job completion logging) and + * is a description of how this plugin satisfies that application. SLURM will + * only load job completion logging plugins if the plugin_type string has a + * prefix of "jobcomp/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the job completion logging API + * matures. + */ +const char plugin_name[] = "Process tracking via AIX kernel extension plugin"; +const char plugin_type[] = "proctrack/aix"; +const uint32_t plugin_version = 90; + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +extern int init ( void ) +{ + uint32_t required_version = 3; + + if (proctrack_version() < required_version) { + error("proctrack AIX kernel extension must be >= %u", + required_version); + return SLURM_ERROR; + } + + return SLURM_SUCCESS; +} + +extern int fini ( void ) +{ + return SLURM_SUCCESS; +} + +extern int slurm_container_create ( slurmd_job_t *job ) +{ + return SLURM_SUCCESS; +} + +/* + * Uses job step process group id as a unique identifier. Job id + * and step id are not unique by themselves. + */ +extern int slurm_container_add ( slurmd_job_t *job, pid_t pid ) +{ + int pgid = (int) job->pgid; + + xassert(job); + xassert(pgid > 1); + + if (proctrack_job_reg_pid(&pgid, &pid) != 0) { + error("proctrack_job_reg_pid(%d, %d): %m", pgid, (int)pid); + return SLURM_ERROR; + } + + job->cont_id = (uint32_t)pgid; + return SLURM_SUCCESS; +} + +extern int slurm_container_signal ( uint32_t id, int signal ) +{ + int jobid = (int) id; + if (!id) /* no container ID */ + return ESRCH; + + return proctrack_job_kill(&jobid, &signal); +} + +extern int slurm_container_destroy ( uint32_t id ) +{ + int jobid = (int) id; + + if (!id) /* no container ID */ + return ESRCH; + + if (proctrack_job_unreg(&jobid) == 0) + return SLURM_SUCCESS; + + return SLURM_ERROR; +} + +extern uint32_t +slurm_container_find(pid_t pid) +{ + int local_pid = (int) pid; + int cont_id = proctrack_get_job_id(&local_pid); + if (cont_id == -1) + return (uint32_t) 0; + return (uint32_t) cont_id; +} + +extern bool +slurm_container_has_pid(uint32_t cont_id, pid_t pid) +{ + int local_pid = (int) pid; + int found_cont_id = proctrack_get_job_id(&local_pid); + + if (found_cont_id == -1 || (uint32_t)found_cont_id != cont_id) + return false; + + return true; +} + +extern int +slurm_container_get_pids(uint32_t cont_id, pid_t **pids, int *npids) +{ + int32_t *p; + int np; + int len = 64; + + p = (int32_t *)xmalloc(len * sizeof(int32_t)); + while((np = proctrack_get_pids(cont_id, len, p)) > len) { + /* array is too short, double its length */ + len *= 2; + xrealloc(p, len); + } + + if (np == -1) { + error("proctrack_get_pids(AIX) for container %u failed: %m", + cont_id); + xfree(p); + *pids = NULL; + *npids = 0; + return SLURM_ERROR; + } + + if (sizeof(uint32_t) == sizeof(pid_t)) { + debug3("slurm_container_get_pids: No need to copy pids array"); + *npids = np; + *pids = (pid_t *)p; + } else { + /* need to cast every individual pid in the array */ + pid_t *p_copy; + int i; + + debug3("slurm_container_get_pids: Must copy pids array"); + p_copy = (pid_t *)xmalloc(np * sizeof(pid_t)); + for (i = 0; i < np; i++) { + p_copy[i] = (pid_t)p[i]; + } + xfree(p); + + *npids = np; + *pids = p_copy; + } + return SLURM_SUCCESS; +} + +extern int +slurm_container_wait(uint32_t cont_id) +{ + int jobid = (int) cont_id; + int delay = 1; + + if (cont_id == 0 || cont_id == 1) { + errno = EINVAL; + return SLURM_ERROR; + } + + /* Spin until the container is successfully destroyed */ + while (proctrack_job_unreg(&jobid) != 0) { + sleep(delay); + if (delay < 120) { + delay *= 2; + } else { + int i; + pid_t *pids = NULL; + int npids = 0; + error("Container %u is still not empty", cont_id); + + slurm_container_get_pids(cont_id, &pids, &npids); + if (npids > 0) { + for (i = 0; i < npids; i++) { + verbose(" Container %u has pid %d", + pids[i]); + } + xfree(pids); + } + } + } + + return SLURM_SUCCESS; +} + diff --git a/executable_names/src/plugins/proctrack/linuxproc/Makefile.am b/executable_names/src/plugins/proctrack/linuxproc/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..4ae166c365c3b3d38e66ccb68591459efb95b895 --- /dev/null +++ b/executable_names/src/plugins/proctrack/linuxproc/Makefile.am @@ -0,0 +1,16 @@ +# Makefile for proctrack/linuxproc plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = proctrack_linuxproc.la + +# Process group ID process tracking plugin. +proctrack_linuxproc_la_SOURCES = \ + proctrack_linuxproc.c \ + kill_tree.c \ + kill_tree.h +proctrack_linuxproc_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/proctrack/linuxproc/Makefile.in b/executable_names/src/plugins/proctrack/linuxproc/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..91049082230d7ae75386aaf568675763adaf81bf --- /dev/null +++ b/executable_names/src/plugins/proctrack/linuxproc/Makefile.in @@ -0,0 +1,564 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for proctrack/linuxproc plugin + +SOURCES = $(proctrack_linuxproc_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/proctrack/linuxproc +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +proctrack_linuxproc_la_LIBADD = +am_proctrack_linuxproc_la_OBJECTS = proctrack_linuxproc.lo \ + kill_tree.lo +proctrack_linuxproc_la_OBJECTS = $(am_proctrack_linuxproc_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(proctrack_linuxproc_la_SOURCES) +DIST_SOURCES = $(proctrack_linuxproc_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = proctrack_linuxproc.la + +# Process group ID process tracking plugin. +proctrack_linuxproc_la_SOURCES = \ + proctrack_linuxproc.c \ + kill_tree.c \ + kill_tree.h + +proctrack_linuxproc_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/proctrack/linuxproc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/proctrack/linuxproc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +proctrack_linuxproc.la: $(proctrack_linuxproc_la_OBJECTS) $(proctrack_linuxproc_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(proctrack_linuxproc_la_LDFLAGS) $(proctrack_linuxproc_la_OBJECTS) $(proctrack_linuxproc_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kill_tree.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proctrack_linuxproc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/proctrack/linuxproc/kill_tree.c b/executable_names/src/plugins/proctrack/linuxproc/kill_tree.c new file mode 100644 index 0000000000000000000000000000000000000000..317fe6dc714109b13520b511495ee36b972649bc --- /dev/null +++ b/executable_names/src/plugins/proctrack/linuxproc/kill_tree.c @@ -0,0 +1,389 @@ +/*****************************************************************************\ + * kill_tree.c - Kill process tree based upon process IDs + * Used primarily for MPICH-GM + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Takao Hatazaki + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "slurm/slurm.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/common/log.h" +#include "kill_tree.h" + +typedef struct xpid_s { + pid_t pid; + int is_usercmd; + char *cmd; + struct xpid_s *next; +} xpid_t; + +typedef struct xppid_s { + pid_t ppid; + xpid_t *list; + struct xppid_s *next; +} xppid_t; + +#define HASH_LEN 64 + +#define GET_HASH_IDX(ppid) ((ppid)%HASH_LEN) + +static xpid_t *_alloc_pid(pid_t pid, int is_usercmd, char *cmd, xpid_t *next) +{ + xpid_t *new; + + new = (xpid_t *)xmalloc(sizeof(*new)); + new->pid = pid; + new->is_usercmd = is_usercmd; + new->cmd = xstrdup(cmd); + new->next = next; + return new; +} + +static xppid_t *_alloc_ppid(pid_t ppid, pid_t pid, int is_usercmd, char *cmd, + xppid_t *next) +{ + xppid_t *new; + + new = xmalloc(sizeof(*new)); + new->ppid = ppid; + new->list = _alloc_pid(pid, is_usercmd, cmd, NULL); + new->next = next; + return new; +} + +static void _push_to_hashtbl(pid_t ppid, pid_t pid, + int is_usercmd, char *cmd, xppid_t **hashtbl) +{ + int idx; + xppid_t *ppids, *newppid; + xpid_t *newpid; + + idx = GET_HASH_IDX(ppid); + ppids = hashtbl[idx]; + while (ppids) { + if (ppids->ppid == ppid) { + newpid = _alloc_pid(pid, is_usercmd, cmd, ppids->list); + ppids->list = newpid; + return; + } + ppids = ppids->next; + } + newppid = _alloc_ppid(ppid, pid, is_usercmd, cmd, hashtbl[idx]); + hashtbl[idx] = newppid; +} + +static int get_myname(char *s) +{ + char path[PATH_MAX], rbuf[1024]; + int fd; + + sprintf(path, "/proc/%ld/stat", (long)getpid()); + if ((fd = open(path, O_RDONLY)) < 0) { + error("Cannot open /proc/getpid()/stat"); + return -1; + } + if (read(fd, rbuf, 1024) <= 0) { + error("Cannot read /proc/getpid()/stat"); + close(fd); + return -1; + } + close(fd); + if (sscanf(rbuf, "%*d %s ", s) != 1) { + error("Cannot get the command name from /proc/getpid()/stat"); + return -1; + } + return 0; +} + +static xppid_t **_build_hashtbl() +{ + DIR *dir; + struct dirent *de; + char path[PATH_MAX], *endptr, *num, rbuf[1024]; + char myname[1024], cmd[1024]; + int fd; + long pid, ppid; + xppid_t **hashtbl; + + if ((dir = opendir("/proc")) == NULL) { + error("opendir(/proc): %m"); + return NULL; + } + if (get_myname(myname) < 0) return NULL; + debug3("Myname in build_hashtbl: %s", myname); + + hashtbl = (xppid_t **)xmalloc(HASH_LEN * sizeof(xppid_t *)); + + while ((de = readdir(dir)) != NULL) { + num = de->d_name; + strtol(num, &endptr, 10); + if (endptr == NULL || *endptr != 0) + continue; + sprintf(path, "/proc/%s/stat", num); + if ((fd = open(path, O_RDONLY)) < 0) { + continue; + } + if (read(fd, rbuf, 1024) <= 0) { + close(fd); + continue; + } + if (sscanf(rbuf, "%ld %s %*s %ld", &pid, cmd, &ppid) != 3) { + close(fd); + continue; + } + close(fd); + + /* Record cmd for debugging purpose */ + _push_to_hashtbl((pid_t)ppid, (pid_t)pid, + strcmp(myname, cmd), cmd, hashtbl); + } + closedir(dir); + return hashtbl; +} + +static void _destroy_list(xpid_t *list) +{ + xpid_t *tmp; + + while (list) { + tmp = list->next; + xfree(list->cmd); + xfree(list); + list = tmp; + } +} + +static void _destroy_hashtbl(xppid_t **hashtbl) +{ + int i; + xppid_t *ppid, *tmp; + + for (i=0; ilist); + tmp = ppid->next; + xfree(ppid); + ppid = tmp; + } + } + xfree(hashtbl); +} + + +static xpid_t *_get_list(int top, xpid_t *list, xppid_t **hashtbl) +{ + xppid_t *ppid; + xpid_t *children; + + ppid = hashtbl[GET_HASH_IDX(top)]; + while (ppid) { + if (ppid->ppid == top) { + children = ppid->list; + while (children) { + list = _alloc_pid(children->pid, + children->is_usercmd, + children->cmd, + list); + children = children->next; + } + children = ppid->list; + while (children) { + list = _get_list(children->pid, list, hashtbl); + children = children->next; + } + break; + } + ppid = ppid->next; + } + return list; +} + +static int _kill_proclist(xpid_t *list, int sig) +{ + int rc, rc0; + + rc = 0; + while (list) { + if (list->pid > 1) { + if (! list->is_usercmd) { + debug2("%ld %s is not a user command. " + "Skipped sending signal %d", + (long)list->pid, list->cmd, sig); + } else { + verbose("Sending %d to %d %s", + sig, list->pid, list->cmd); + rc0 = kill(list->pid, sig); + if (rc0) rc = errno; /* save the last error */ + } + } + list = list->next; + } + + return rc; +} + + +/* + * Some of processes may not be in the same process group + * (e.g. GMPI processes). So, find out the process tree, + * then kill all that subtree. + */ +extern int kill_proc_tree(pid_t top, int sig) +{ + xpid_t *list; + int rc = -1; + xppid_t **hashtbl; + + if ((hashtbl = _build_hashtbl()) == NULL) + return -1; + + list = _get_list(top, NULL, hashtbl); + rc = _kill_proclist(list, sig); + _destroy_hashtbl(hashtbl); + _destroy_list(list); + return rc; +} + + +/* + * Return the pid of the process named "process_name" + * which is the ancestor of "process". + */ +extern pid_t find_ancestor(pid_t process, char *process_name) +{ + char path[PATH_MAX], rbuf[1024]; + int fd; + long pid, ppid; + + pid = ppid = (long)process; + do { + if (ppid <= 1) { + return 0; + } + + sprintf(path, "/proc/%ld/stat", ppid); + if ((fd = open(path, O_RDONLY)) < 0) { + return 0; + } + if (read(fd, rbuf, 1024) <= 0) { + close(fd); + return 0; + } + close(fd); + if (sscanf(rbuf, "%ld %*s %*s %ld", &pid, &ppid) != 2) { + return 0; + } + + sprintf(path, "/proc/%ld/cmdline", pid); + if ((fd = open(path, O_RDONLY)) < 0) { + continue; + } + if (read(fd, rbuf, 1024) <= 0) { + close(fd); + continue; + } + close(fd); + } while (!strstr(rbuf, process_name)); + + return pid; +} + +/* The returned "pids" array does NOT include the slurmstepd */ +extern int proctrack_linuxproc_get_pids(pid_t top, pid_t **pids, int *npids) +{ + xppid_t **hashtbl; + xpid_t *list, *ptr; + pid_t *p; + int i; + int len = 32; + + if ((hashtbl = _build_hashtbl()) == NULL) + return SLURM_ERROR; + + list = _get_list(top, NULL, hashtbl); + if (list == NULL) { + *pids = NULL; + *npids = 0; + _destroy_hashtbl(hashtbl); + return SLURM_ERROR; + } + + p = (pid_t *)xmalloc(sizeof(pid_t) * len); + ptr = list; + i = 0; + while(ptr != NULL) { + if (ptr->is_usercmd) { /* don't include the slurmstepd */ + if (i >= len-1) { + len *= 2; + xrealloc(p, len); + } + p[i] = ptr->pid; + i++; + } + ptr = ptr->next; + } + + if (i == 0) { + xfree(p); + *pids = NULL; + *npids = 0; + _destroy_hashtbl(hashtbl); + _destroy_list(list); + return SLURM_ERROR; + } else { + *pids = p; + *npids = i; + _destroy_hashtbl(hashtbl); + _destroy_list(list); + return SLURM_SUCCESS; + } +} diff --git a/executable_names/src/plugins/proctrack/linuxproc/kill_tree.h b/executable_names/src/plugins/proctrack/linuxproc/kill_tree.h new file mode 100644 index 0000000000000000000000000000000000000000..9dfc3a4ae316a910de222d3bc6fb9d002f5a59df --- /dev/null +++ b/executable_names/src/plugins/proctrack/linuxproc/kill_tree.h @@ -0,0 +1,54 @@ +/*****************************************************************************\ + * kill_tree.h - Kill process tree based upon process IDs + * Used primarily for MPICH-GM + ***************************************************************************** + * Copyright (C) 2004 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Takao Hatazaki + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef _HAVE_KILL_TREE_H +#define _HAVE_KILL_TREE_H + +#include + +extern int kill_proc_tree(pid_t top, int sig); +extern pid_t find_ancestor(pid_t process, char *process_name); +/* + * Some of processes may not be in the same process group + * (e.g. GMPI processes). So, find out the process tree, + * then kill all that subtree. + */ + +extern int proctrack_linuxproc_get_pids(pid_t top, pid_t **pids, int *npids); + +#endif /* _HAVE_KILL_TREE_H */ diff --git a/executable_names/src/plugins/proctrack/linuxproc/proctrack_linuxproc.c b/executable_names/src/plugins/proctrack/linuxproc/proctrack_linuxproc.c new file mode 100644 index 0000000000000000000000000000000000000000..1f81a817a894f97b7350549c0f2d2bf5abcb8b2f --- /dev/null +++ b/executable_names/src/plugins/proctrack/linuxproc/proctrack_linuxproc.c @@ -0,0 +1,172 @@ +/*****************************************************************************\ + * proctrack_linuxproc.c - process tracking via linux /proc process tree. + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include +#include +#include +#include "src/common/log.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" +#include "kill_tree.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "jobcomp" for SLURM job completion logging) and + * is a description of how this plugin satisfies that application. SLURM will + * only load job completion logging plugins if the plugin_type string has a + * prefix of "jobcomp/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the job completion logging API + * matures. + */ +const char plugin_name[] = "Process tracking via linux /proc"; +const char plugin_type[] = "proctrack/linuxproc"; +const uint32_t plugin_version = 90; + + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +extern int init ( void ) +{ + return SLURM_SUCCESS; +} + +extern int fini ( void ) +{ + return SLURM_SUCCESS; +} + +/* + * Uses slurmd job-step manager's pid as the unique container id. + */ +extern int slurm_container_create ( slurmd_job_t *job ) +{ + job->cont_id = (uint32_t)job->jmgr_pid; + return SLURM_SUCCESS; +} + +extern int slurm_container_add ( slurmd_job_t *job, pid_t pid ) +{ + return SLURM_SUCCESS; +} + +extern int slurm_container_signal ( uint32_t id, int signal ) +{ + return kill_proc_tree((pid_t)id, signal); +} + +extern int slurm_container_destroy ( uint32_t id ) +{ + return SLURM_SUCCESS; +} + +extern uint32_t slurm_container_find(pid_t pid) +{ + return (uint32_t) find_ancestor(pid, "slurmstepd"); +} + +extern bool slurm_container_has_pid(uint32_t cont_id, pid_t pid) +{ + uint32_t cont; + + cont = (uint32_t) find_ancestor(pid, "slurmstepd"); + if (cont == cont_id) + return true; + + return false; +} + +extern int +slurm_container_wait(uint32_t cont_id) +{ + int delay = 1; + + if (cont_id == 0 || cont_id == 1) { + errno = EINVAL; + return SLURM_ERROR; + } + + /* Spin until the container is successfully destroyed */ + while (slurm_container_destroy(cont_id) != SLURM_SUCCESS) { + slurm_container_signal(cont_id, SIGKILL); + sleep(delay); + if (delay < 120) { + delay *= 2; + } else { + error("Unable to destroy container %u", cont_id); + } + } + + return SLURM_SUCCESS; +} + +extern int +slurm_container_get_pids(uint32_t cont_id, pid_t **pids, int *npids) +{ + return proctrack_linuxproc_get_pids((pid_t)cont_id, pids, npids); +} diff --git a/executable_names/src/plugins/proctrack/pgid/Makefile.am b/executable_names/src/plugins/proctrack/pgid/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..ddc8c436bd2e76caa21d5652c293dfb383ed41c3 --- /dev/null +++ b/executable_names/src/plugins/proctrack/pgid/Makefile.am @@ -0,0 +1,13 @@ +# Makefile for proctrack/pgid plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = proctrack_pgid.la + +# Process group ID process tracking plugin. +proctrack_pgid_la_SOURCES = proctrack_pgid.c +proctrack_pgid_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/proctrack/pgid/Makefile.in b/executable_names/src/plugins/proctrack/pgid/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..0076df7c58faf3ec4c958415fe46afe97a815269 --- /dev/null +++ b/executable_names/src/plugins/proctrack/pgid/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for proctrack/pgid plugin + +SOURCES = $(proctrack_pgid_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/proctrack/pgid +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +proctrack_pgid_la_LIBADD = +am_proctrack_pgid_la_OBJECTS = proctrack_pgid.lo +proctrack_pgid_la_OBJECTS = $(am_proctrack_pgid_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(proctrack_pgid_la_SOURCES) +DIST_SOURCES = $(proctrack_pgid_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = proctrack_pgid.la + +# Process group ID process tracking plugin. +proctrack_pgid_la_SOURCES = proctrack_pgid.c +proctrack_pgid_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/proctrack/pgid/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/proctrack/pgid/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +proctrack_pgid.la: $(proctrack_pgid_la_OBJECTS) $(proctrack_pgid_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(proctrack_pgid_la_LDFLAGS) $(proctrack_pgid_la_OBJECTS) $(proctrack_pgid_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proctrack_pgid.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/proctrack/pgid/proctrack_pgid.c b/executable_names/src/plugins/proctrack/pgid/proctrack_pgid.c new file mode 100644 index 0000000000000000000000000000000000000000..420245d2528858a13ddc91e18d73798c6b0e8694 --- /dev/null +++ b/executable_names/src/plugins/proctrack/pgid/proctrack_pgid.c @@ -0,0 +1,191 @@ +/*****************************************************************************\ + * proctrack_pgid.c - process tracking via process group ID plugin. + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#define __USE_XOPEN_EXTENDED /* getpgid */ +#include + +#include +#include +#include +#include +#include +#include "src/common/log.h" +#include "src/slurmd/slurmstepd/slurmstepd_job.h" + +/* + * These variables are required by the generic plugin interface. If they + * are not found in the plugin, the plugin loader will ignore it. + * + * plugin_name - a string giving a human-readable description of the + * plugin. There is no maximum length, but the symbol must refer to + * a valid string. + * + * plugin_type - a string suggesting the type of the plugin or its + * applicability to a particular form of data or method of data handling. + * If the low-level plugin API is used, the contents of this string are + * unimportant and may be anything. SLURM uses the higher-level plugin + * interface which requires this string to be of the form + * + * / + * + * where is a description of the intended application of + * the plugin (e.g., "jobcomp" for SLURM job completion logging) and + * is a description of how this plugin satisfies that application. SLURM will + * only load job completion logging plugins if the plugin_type string has a + * prefix of "jobcomp/". + * + * plugin_version - an unsigned 32-bit integer giving the version number + * of the plugin. If major and minor revisions are desired, the major + * version number may be multiplied by a suitable magnitude constant such + * as 100 or 1000. Various SLURM versions will likely require a certain + * minimum versions for their plugins as the job completion logging API + * matures. + */ +const char plugin_name[] = "Process tracking via process group ID plugin"; +const char plugin_type[] = "proctrack/pgid"; +const uint32_t plugin_version = 90; + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +extern int init ( void ) +{ + return SLURM_SUCCESS; +} + +extern int fini ( void ) +{ + return SLURM_SUCCESS; +} + +extern int slurm_container_create ( slurmd_job_t *job ) +{ + return SLURM_SUCCESS; +} + +/* + * Uses job step process group id. + */ +extern int slurm_container_add ( slurmd_job_t *job, pid_t pid ) +{ + job->cont_id = (uint32_t)job->pgid; + return SLURM_SUCCESS; +} + +extern int slurm_container_signal ( uint32_t id, int signal ) +{ + pid_t pid = (pid_t) id; + + if (!id) /* no container ID */ + return ESRCH; + + if (id == getpid() || id == getpgid(0)) { + error("slurm_signal_container would kill caller!"); + return ESRCH; + } + + return (int)killpg(pid, signal); +} + +extern int slurm_container_destroy ( uint32_t id ) +{ + return SLURM_SUCCESS; +} + +extern uint32_t slurm_container_find(pid_t pid) +{ + pid_t rc = getpgid(pid); + + if (rc == -1) + return (uint32_t) 0; + else + return (uint32_t) rc; +} + +extern bool slurm_container_has_pid(uint32_t cont_id, pid_t pid) +{ + pid_t pgid = getpgid(pid); + + if (pgid == -1 || (uint32_t)pgid != cont_id) + return false; + + return true; +} + +extern int +slurm_container_wait(uint32_t cont_id) +{ + pid_t pgid = (pid_t)cont_id; + int delay = 1; + + if (cont_id == 0 || cont_id == 1) { + errno = EINVAL; + return SLURM_ERROR; + } + + /* Spin until the process group is gone. */ + while (killpg(pgid, 0) == 0) { + slurm_container_signal(cont_id, SIGKILL); + sleep(delay); + if (delay < 120) { + delay *= 2; + } else { + error("Unable to destroy container %u", cont_id); + } + } + + return SLURM_SUCCESS; +} + +extern int +slurm_container_get_pids(uint32_t cont_id, pid_t **pids, int *npids) +{ + error("proctrack/aix does not implement slurm_container_get_pids"); + return SLURM_ERROR; +} diff --git a/executable_names/src/plugins/proctrack/rms/Makefile.am b/executable_names/src/plugins/proctrack/rms/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..a15492c50b20abbb246f9705a99cd3f936891720 --- /dev/null +++ b/executable_names/src/plugins/proctrack/rms/Makefile.am @@ -0,0 +1,17 @@ +# Makefile for proctrack/aix plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +if HAVE_ELAN +pkglib_LTLIBRARIES = proctrack_rms.la +else +pkglib_LTLIBRARIES = +endif + +proctrack_rms_la_SOURCES = proctrack_rms.c +proctrack_rms_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +proctrack_rms_la_LIBADD = -lrmscall diff --git a/executable_names/src/plugins/proctrack/rms/Makefile.in b/executable_names/src/plugins/proctrack/rms/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..79f159f18de4ad461dfd7bbadd393b4eb21c02dd --- /dev/null +++ b/executable_names/src/plugins/proctrack/rms/Makefile.in @@ -0,0 +1,559 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for proctrack/aix plugin + +SOURCES = $(proctrack_rms_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/proctrack/rms +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +proctrack_rms_la_DEPENDENCIES = +am_proctrack_rms_la_OBJECTS = proctrack_rms.lo +proctrack_rms_la_OBJECTS = $(am_proctrack_rms_la_OBJECTS) +@HAVE_ELAN_TRUE@am_proctrack_rms_la_rpath = -rpath $(pkglibdir) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(proctrack_rms_la_SOURCES) +DIST_SOURCES = $(proctrack_rms_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +@HAVE_ELAN_FALSE@pkglib_LTLIBRARIES = +@HAVE_ELAN_TRUE@pkglib_LTLIBRARIES = proctrack_rms.la +proctrack_rms_la_SOURCES = proctrack_rms.c +proctrack_rms_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +proctrack_rms_la_LIBADD = -lrmscall +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/proctrack/rms/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/proctrack/rms/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +proctrack_rms.la: $(proctrack_rms_la_OBJECTS) $(proctrack_rms_la_DEPENDENCIES) + $(LINK) $(am_proctrack_rms_la_rpath) $(proctrack_rms_la_LDFLAGS) $(proctrack_rms_la_OBJECTS) $(proctrack_rms_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proctrack_rms.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/proctrack/rms/proctrack_rms.c b/executable_names/src/plugins/proctrack/rms/proctrack_rms.c new file mode 100644 index 0000000000000000000000000000000000000000..5dd24c885cfd2d219c2387a2b06645a892203ffd --- /dev/null +++ b/executable_names/src/plugins/proctrack/rms/proctrack_rms.c @@ -0,0 +1,381 @@ +/*****************************************************************************\ + * proctrack_rms.c - process tracking via QsNet rms kernel module + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include "src/common/log.h" +#include "src/slurmd/common/proctrack.h" + +const char plugin_name[] = "Process tracking for QsNet via the rms module"; +const char plugin_type[] = "proctrack/rms"; +const uint32_t plugin_version = 1; + +static int _prg_destructor_fork(void); +static void _prg_destructor_send(int fd, int prgid); + +#define MAX_IDS 512 + +extern int init (void) +{ + /* close librmscall's internal fd to /proc/rms/control */ + pthread_atfork(NULL, NULL, rmsmod_fini); + return SLURM_SUCCESS; +} + +extern int fini (void) +{ + return SLURM_SUCCESS; +} + + +/* + * When proctrack/rms is used in conjunction with switch/elan, + * slurm_container_create will not normally create the program description. + * It just retrieves the prgid created in switch/elan. + * + * When the program description cannot be retrieved (switch/elan is not + * being used, the job step is a batch script, etc.) then rms_prgcreate() + * is called here. + */ +extern int slurm_container_create (slurmd_job_t *job) +{ + int prgid; + /* + * Return a handle to an existing prgid or create a new one + */ + if (rms_getprgid (job->jmgr_pid, &prgid) < 0) { + int fd = _prg_destructor_fork(); + /* Use slurmd job-step manager's pid as a unique identifier */ + prgid = job->jmgr_pid; + if ((rms_prgcreate (prgid, job->uid, 1)) < 0) { + error ("ptrack/rms: rms_prgcreate: %m"); + _prg_destructor_send(fd, -1); + return SLURM_ERROR; + } + _prg_destructor_send(fd, prgid); + } + debug3("proctrack/rms: prgid = %d", prgid); + + job->cont_id = (uint32_t)prgid; + return SLURM_SUCCESS; +} + +extern int slurm_container_add (slurmd_job_t *job, pid_t pid) +{ + return SLURM_SUCCESS; +} + +/* + * slurm_container_signal assumes that the slurmd jobstep manager + * is always the last process in the rms program description. + * No signals are sent to the last process. + */ +extern int slurm_container_signal (uint32_t id, int signal) +{ + pid_t *pids; + int nids = 0; + int i; + int rc; + + if (id <= 0) + return -1; + + pids = malloc(MAX_IDS * sizeof(pid_t)); + if (!pids) { + error("proctrack/rms container signal: malloc failed: %m"); + return -1; + } + if ((rc = rms_prginfo((int)id, MAX_IDS, pids, &nids)) < 0) { + error("proctrack/rms rms_prginfo failed %d: %m", rc); + free(pids); + /* + * Ignore errors, program desc has probably already + * been cleaned up. + */ + return -1; + } + + rc = -1; + for (i = nids-2; i >= 0 ; i--) { + debug2("proctrack/rms(pid %d) Sending signal %d to process %d", + getpid(), signal, pids[i]); + rc &= kill(pids[i], signal); + debug2(" rc = %d", rc); + } + free(pids); + debug3("proctrack/rms signal container returning %d", rc); + return rc; +} + + +/* + * The switch/elan plugin is really responsible for creating and + * destroying rms program descriptions. slurm_destroy_container simply + * returns SLURM_SUCCESS when the program description contains one and + * only one process, assumed to be the slurmd jobstep manager. + */ +extern int slurm_container_destroy (uint32_t id) +{ + debug2("proctrack/rms: destroying container %u\n", id); + if (id == 0) + return SLURM_SUCCESS; + + if (slurm_container_signal(id, 0) == -1) + return SLURM_SUCCESS; + + return SLURM_ERROR; +} + + +extern uint32_t slurm_container_find (pid_t pid) +{ + int prgid = 0; + + if (rms_getprgid ((int) pid, &prgid) < 0) + return (uint32_t) 0; + return (uint32_t) prgid; +} + +extern bool slurm_container_has_pid (uint32_t cont_id, pid_t pid) +{ + int prgid = 0; + + if (rms_getprgid ((int) pid, &prgid) < 0) + return false; + if ((uint32_t)prgid != cont_id) + return false; + + return true; +} + +extern int +slurm_container_wait(uint32_t cont_id) +{ + int delay = 1; + + if (cont_id == 0 || cont_id == 1) { + errno = EINVAL; + return SLURM_ERROR; + } + + /* Spin until the container is empty */ + while (slurm_container_signal(cont_id, 0) != -1) { + slurm_container_signal(cont_id, SIGKILL); + sleep(delay); + if (delay < 120) { + delay *= 2; + } else { + error("Unable to destroy container %u", cont_id); + } + } + + return SLURM_SUCCESS; +} + +/* + * This module assumes that the slurmstepd (running as root) is always the + * last process in the rms program description. We do not include + * the slurmstepd in the list of pids that we return. + */ +extern int +slurm_container_get_pids(uint32_t cont_id, pid_t **pids, int *npids) +{ + pid_t *p; + int np; + int len = 32; + + p = xmalloc(len * sizeof(pid_t)); + while(rms_prginfo((int)cont_id, len, p, &np) == -1) { + if (errno == EINVAL) { + /* array is too short, double its length */ + len *= 2; + xrealloc(p, len); + } else { + xfree(p); + *pids = NULL; + *npids = 0; + return SLURM_ERROR; + } + } + + /* Don't include the last pid (slurmstepd) in the list */ + if (np > 0) { + p[np-1] = 0; + np--; + } + + *npids = np; + *pids = p; + + return SLURM_SUCCESS; +} + +static void +_close_all_fd_except(int fd) +{ + int openmax; + int i; + + openmax = sysconf(_SC_OPEN_MAX); + for (i = 0; i <= openmax; i++) { + if (i != fd) + close(i); + } +} + + +/* + * Fork a child process that waits for a pipe to close, signalling that the + * parent process has exited. Then call rms_prgdestroy. + */ +static int +_prg_destructor_fork() +{ + pid_t pid; + int fdpair[2]; + int prgid; + int i; + int dummy; + + if (pipe(fdpair) < 0) { + error("_prg_destructor_fork: failed creating pipe"); + return -1; + } + + pid = fork(); + if (pid < 0) { + error("_prg_destructor_fork: failed to fork program destructor"); + } else if (pid > 0) { + /* parent */ + close(fdpair[0]); + waitpid(pid, (int *)NULL, 0); + return fdpair[1]; + } + + /****************************************/ + /* fork again so the destructor process + * will not be a child of the slurmd + */ + pid = fork(); + if (pid < 0) { + error("_prg_destructor_fork: second fork failed"); + } else if (pid > 0) { + exit(0); + } + + /* child */ + close(fdpair[1]); + + /* close librmscall's internal fd to /proc/rms/control */ + rmsmod_fini(); + + _close_all_fd_except(fdpair[0]); + /* Wait for the program description id from the child */ + if (read(fdpair[0], &prgid, sizeof(prgid)) != sizeof(prgid)) { + error("_prg_destructor_fork read failed: %m"); + exit(1); + } + + if (prgid == -1) + exit(1); + + /* + * Wait for the pipe to close, signalling that the parent + * has exited. + */ + while (read(fdpair[0], &dummy, sizeof(dummy)) > 0) {} + + /* + * Verify that program description is empty. If not, send a SIGKILL. + */ + for (i = 0; i < 30; i++) { + int maxids = 8; + pid_t pids[8]; + int nids = 0; + + if (rms_prginfo(prgid, maxids, pids, &nids) < 0) { + error("_prg_destructor_fork: rms_prginfo: %m"); + } + if (nids == 0) + break; + if (rms_prgsignal(prgid, SIGKILL) < 0) { + error("_prg_destructor_fork: rms_prgsignal: %m"); + } + sleep(1); + } + + if (rms_prgdestroy(prgid) < 0) { + error("rms_prgdestroy"); + } + exit(0); +} + + + +/* + * Send the prgid of the newly created program description to the process + * forked earlier by _prg_destructor_fork(), using the file descriptor + * "fd" which was returned by the call to _prg_destructor_fork(). + */ +static void +_prg_destructor_send(int fd, int prgid) +{ + debug3("_prg_destructor_send %d", prgid); + if (write (fd, &prgid, sizeof(prgid)) != sizeof(prgid)) { + error ("_prg_destructor_send failed: %m"); + } + /* Deliberately avoid closing fd. When this process exits, it + will close fd signalling to the child process that it is + time to call rms_prgdestroy */ + /*close(fd);*/ +} diff --git a/executable_names/src/plugins/proctrack/sgi_job/Makefile.am b/executable_names/src/plugins/proctrack/sgi_job/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..b01a1ef207e83c46fecc5d9f60471e86eaecab61 --- /dev/null +++ b/executable_names/src/plugins/proctrack/sgi_job/Makefile.am @@ -0,0 +1,14 @@ +# Makefile for proctrack/sgi_job plugin + +AUTOMAKE_OPTIONS = foreign + +PLUGIN_FLAGS = - -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = proctrack_sgi_job.la + +proctrack_sgi_job_la_SOURCES = proctrack_sgi_job.c +proctrack_sgi_job_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) $(OTHER_FLAGS) +# Don't need to add -ljob because we dlopen the .so to avoid +# symbol collisions with slurm functions diff --git a/executable_names/src/plugins/proctrack/sgi_job/Makefile.in b/executable_names/src/plugins/proctrack/sgi_job/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..498cb424ad65fde83bcb595adb64eef56365f8ba --- /dev/null +++ b/executable_names/src/plugins/proctrack/sgi_job/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for proctrack/sgi_job plugin + +SOURCES = $(proctrack_sgi_job_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/proctrack/sgi_job +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +proctrack_sgi_job_la_LIBADD = +am_proctrack_sgi_job_la_OBJECTS = proctrack_sgi_job.lo +proctrack_sgi_job_la_OBJECTS = $(am_proctrack_sgi_job_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(proctrack_sgi_job_la_SOURCES) +DIST_SOURCES = $(proctrack_sgi_job_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = - -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = proctrack_sgi_job.la +proctrack_sgi_job_la_SOURCES = proctrack_sgi_job.c +proctrack_sgi_job_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) $(OTHER_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/proctrack/sgi_job/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/proctrack/sgi_job/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +proctrack_sgi_job.la: $(proctrack_sgi_job_la_OBJECTS) $(proctrack_sgi_job_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(proctrack_sgi_job_la_LDFLAGS) $(proctrack_sgi_job_la_OBJECTS) $(proctrack_sgi_job_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proctrack_sgi_job.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Don't need to add -ljob because we dlopen the .so to avoid +# symbol collisions with slurm functions +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/proctrack/sgi_job/proctrack_sgi_job.c b/executable_names/src/plugins/proctrack/sgi_job/proctrack_sgi_job.c new file mode 100644 index 0000000000000000000000000000000000000000..5537b230b56b129f6dfe9445c12749a631edb4c1 --- /dev/null +++ b/executable_names/src/plugins/proctrack/sgi_job/proctrack_sgi_job.c @@ -0,0 +1,304 @@ +/*****************************************************************************\ + * proctrack_sgi_job.c - process tracking via SGI's "job" module. + ***************************************************************************** + * Copyright (C) 2005 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Mark Grondona + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include "src/common/log.h" + +#include "src/slurmd/slurmstepd/slurmstepd_job.h" + + +const char plugin_name[] = "Process tracking via SGI job module"; +const char plugin_type[] = "proctrack/sgi_job"; +const uint32_t plugin_version = 90; + +/* + * We can't include since its prototypes conflict with some + * of SLURM's. Instead, put important function protypes and + * the jid_t typedef here: + */ +typedef uint64_t jid_t; + +typedef jid_t (*create_f) (jid_t jid_requested, uid_t uid, int options); +typedef jid_t (*getjid_f) (pid_t pid); +typedef jid_t (*waitjid_f) (jid_t jid, int *status, int options); +typedef int (*killjid_f) (jid_t jid, int sig); +typedef jid_t (*detachpid_f) (pid_t pid); +typedef jid_t (*attachpid_f) (pid_t pid, jid_t jid_requested); +typedef int (*getpidlist_f)(jid_t jid, pid_t *pid, int bufsize); +typedef int (*getpidcnt_f) (jid_t jid); + +/* + * Handle to libjob.so + */ +static void *libjob_handle = NULL; + +/* + * libjob operations we'll need in this plugin + */ +static struct job_operations { + create_f create; + getjid_f getjid; + waitjid_f waitjid; + killjid_f killjid; + detachpid_f detachpid; + attachpid_f attachpid; + getpidlist_f getpidlist; + getpidcnt_f getpidcnt; +} job_ops; + + +/* + * init() is called when the plugin is loaded, before any other functions + * are called. Put global initialization here. + */ +int init (void) +{ + /* We dlopen() libjob.so instead of directly linking to it + * because of symbols like "job_create" in libjob which + * conflict with symbols in slurmd. dlopening the library + * prevents these symbols from going into the global namespace. + */ + if ((libjob_handle = dlopen ("libjob.so", RTLD_LAZY)) == NULL) { + error ("Unable to open libjob.so: %m"); + return SLURM_ERROR; + } + + job_ops.create = dlsym (libjob_handle, "job_create"); + job_ops.getjid = dlsym (libjob_handle, "job_getjid"); + job_ops.waitjid = dlsym (libjob_handle, "job_waitjid"); + job_ops.killjid = dlsym (libjob_handle, "job_killjid"); + job_ops.detachpid = dlsym (libjob_handle, "job_detachpid"); + job_ops.attachpid = dlsym (libjob_handle, "job_attachpid"); + job_ops.getpidlist= dlsym (libjob_handle, "job_getpidlist"); + job_ops.getpidcnt = dlsym (libjob_handle, "job_getpidcnt"); + + if (!job_ops.create) + error ("Unable to resolve job_create in libjob.so"); + if (!job_ops.getjid) + error ("Unable to resolve job_getjid in libjob.so"); + if (!job_ops.waitjid) + error ("Unable to resolve job_waitjid in libjob.so"); + if (!job_ops.killjid) + error ("Unable to resolve job_killjid in libjob.so"); + if (!job_ops.detachpid) + error ("Unable to resolve job_detachpid in libjob.so"); + if (!job_ops.attachpid) + error ("Unable to resolve job_attachpid in libjob.so"); + if (!job_ops.getpidlist) + error ("Unable to resolve job_getpidlist in libjob.so"); + if (!job_ops.getpidcnt) + error ("Unable to resolve job_getpidcnt in libjob.so"); + + info ("successfully loaded libjob.so"); + return SLURM_SUCCESS; +} + +int fini (void) +{ + dlclose (libjob_handle); + return SLURM_SUCCESS; +} + +jid_t _job_create (jid_t jid, uid_t uid, int options) +{ + return ((*job_ops.create) (jid, uid, options)); +} + +jid_t _job_getjid (pid_t pid) +{ + return ((*job_ops.getjid) (pid)); +} + +jid_t _job_waitjid (jid_t jid, int *status, int options) +{ + return ((*job_ops.waitjid) (jid, status, options)); +} + +int _job_killjid (jid_t jid, int sig) +{ + return ((*job_ops.killjid) (jid, sig)); +} + +int _job_detachpid (pid_t pid) +{ + return ((*job_ops.detachpid) (pid)); +} + +int _job_attachpid (pid_t pid, jid_t jid) +{ + return ((*job_ops.attachpid) (pid, jid)); +} + +int _job_getpidlist (jid_t jid, pid_t *pid, int bufsize) +{ + return ((*job_ops.getpidlist) (jid, pid, bufsize)); +} + +int _job_getpidcnt (jid_t jid) +{ + return ((*job_ops.getpidcnt) (jid)); +} + +int slurm_container_create (slurmd_job_t *job) +{ + jid_t jid; + job->cont_id = (uint32_t) -1; + + if (!libjob_handle) + init(); + + if ((jid = _job_create (0, job->uid, 0)) == (jid_t) -1) { + error ("Failed to create job container: %m"); + return SLURM_ERROR; + } + debug ("created jid 0x%08lx\n", jid); + + return SLURM_SUCCESS; +} + +int slurm_container_add (slurmd_job_t *job, pid_t pid) +{ + if (job->cont_id == (uint32_t) -1) { + job->cont_id = (uint32_t) _job_getjid (getpid()); + /* + * Detach ourselves from the job container now that there + * is at least one other process in it. + */ + if (_job_detachpid (getpid()) == (jid_t) -1) { + error ("Failed to detach from job container: %m"); + return SLURM_ERROR; + } + } + return SLURM_SUCCESS; +} + +int slurm_container_signal (uint32_t id, int sig) +{ + if ( (_job_killjid ((jid_t) id, sig) < 0) + && (errno != ENODATA) && (errno != EBADF) ) + return (SLURM_ERROR); + return (SLURM_SUCCESS); +} + +int slurm_container_destroy (uint32_t id) +{ + _job_waitjid ((jid_t) id, NULL, 0); + /* Assume any error means job doesn't exist. Therefore, + * return SUCCESS to slurmd so it doesn't retry continuously + */ + return SLURM_SUCCESS; +} + +uint32_t slurm_container_find (pid_t pid) +{ + jid_t jid; + + if ((jid = _job_getjid (pid)) == (jid_t) -1) + return ((uint32_t) 0); + + return ((uint32_t) jid); +} + +bool slurm_container_has_pid (uint32_t cont_id, pid_t pid) +{ + jid_t jid; + + if ((jid = _job_getjid (pid)) == (jid_t) -1) + return false; + if ((uint32_t)jid != cont_id) + return false; + + return true; +} + +int slurm_container_wait (uint32_t id) +{ + if (_job_waitjid ((jid_t) id, NULL, 0) == (jid_t)-1) + return SLURM_ERROR; + + return SLURM_SUCCESS; +} + +int slurm_container_get_pids(uint32_t cont_id, pid_t **pids, int *npids) +{ + int pidcnt, bufsize; + pid_t *p; + + pidcnt = _job_getpidcnt((jid_t)cont_id); + if (pidcnt > 0) { + /* + * FIXME - The "+ 128" is a rough attempt to allow for + * the fact that _job_getpidcnt() followed by _job_get_pidlist + * is not atomic. + */ + bufsize = sizeof(pid_t) * (pidcnt + 128); + p = (pid_t *)xmalloc(bufsize); + pidcnt = _job_getpidlist((jid_t)cont_id, p, bufsize); + if (pidcnt == -1) { + error("job_getpidlist() failed: %m"); + *pids = NULL; + *npids = 0; + xfree(p); + return SLURM_ERROR; + } + *pids = p; + *npids = pidcnt; + } else { + *pids = NULL; + *npids = 0; + } + + return SLURM_SUCCESS; +} diff --git a/executable_names/src/plugins/sched/Makefile.am b/executable_names/src/plugins/sched/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..0b3f99233c4ca9ee3d265147949bfa0e50ed4480 --- /dev/null +++ b/executable_names/src/plugins/sched/Makefile.am @@ -0,0 +1,3 @@ +# Makefile for scheduler plugins + +SUBDIRS = backfill builtin gang hold wiki2 diff --git a/executable_names/src/plugins/sched/Makefile.in b/executable_names/src/plugins/sched/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..fda18b02469cf7c4bdbda7fc488f521e6c4d8171 --- /dev/null +++ b/executable_names/src/plugins/sched/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for scheduler plugins +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/sched +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +SUBDIRS = backfill builtin gang hold wiki2 +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/sched/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/plugins/sched/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/sched/backfill/Makefile.am b/executable_names/src/plugins/sched/backfill/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..c1a316b65e56e5349c86d508da822081eca83fb6 --- /dev/null +++ b/executable_names/src/plugins/sched/backfill/Makefile.am @@ -0,0 +1,16 @@ +# Makefile for backfill scheduler plugin + +AUTOMAKE_OPTIONS = foreign + +CXXFLAGS = -fexceptions + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = sched_backfill.la + +sched_backfill_la_SOURCES = backfill_wrapper.c \ + backfill.c \ + backfill.h +sched_backfill_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/sched/backfill/Makefile.in b/executable_names/src/plugins/sched/backfill/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..b23754a1f36622ac98e26dc843a5b3b6029f16a5 --- /dev/null +++ b/executable_names/src/plugins/sched/backfill/Makefile.in @@ -0,0 +1,560 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for backfill scheduler plugin + +SOURCES = $(sched_backfill_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/sched/backfill +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +sched_backfill_la_LIBADD = +am_sched_backfill_la_OBJECTS = backfill_wrapper.lo backfill.lo +sched_backfill_la_OBJECTS = $(am_sched_backfill_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(sched_backfill_la_SOURCES) +DIST_SOURCES = $(sched_backfill_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = -fexceptions +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = sched_backfill.la +sched_backfill_la_SOURCES = backfill_wrapper.c \ + backfill.c \ + backfill.h + +sched_backfill_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/sched/backfill/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/sched/backfill/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +sched_backfill.la: $(sched_backfill_la_OBJECTS) $(sched_backfill_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(sched_backfill_la_LDFLAGS) $(sched_backfill_la_OBJECTS) $(sched_backfill_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backfill.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backfill_wrapper.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/sched/backfill/backfill.c b/executable_names/src/plugins/sched/backfill/backfill.c new file mode 100644 index 0000000000000000000000000000000000000000..fdcabfd0a5d76863bc0b9cb48bbcdab4746e4ab1 --- /dev/null +++ b/executable_names/src/plugins/sched/backfill/backfill.c @@ -0,0 +1,661 @@ +/*****************************************************************************\ + * backfill.c - simple backfill scheduler plugin. + * + * If a partition is does not have root only access and nodes are not shared + * then raise the priority of pending jobs if doing so does not adversely + * effect the expected initiation of any higher priority job. We do not alter + * a job's required or excluded node list, so this is a conservative + * algorithm. + * + * For example, consider a cluster "lx[01-08]" with one job executing on + * nodes "lx[01-04]". The highest priority pending job requires five nodes + * including "lx05". The next highest priority pending job requires any + * three nodes. Without explicitly forcing the second job to use nodes + * "lx[06-08]", we can't start it without possibly delaying the higher + * priority job. + ***************************************************************************** + * Copyright (C) 2003 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "slurm/slurm.h" +#include "slurm/slurm_errno.h" +#include "src/common/list.h" +#include "src/common/macros.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/xmalloc.h" +#include "src/common/xstring.h" +#include "src/slurmctld/locks.h" +#include "src/slurmctld/slurmctld.h" + +typedef struct part_specs { + uint32_t idle_node_cnt; + uint32_t max_cpus; + uint32_t min_cpus; + uint32_t min_mem; + uint32_t min_disk; +} part_specs_t; + +typedef struct node_space_map { + uint32_t idle_node_cnt; + time_t time; +} node_space_map_t; + +/*********************** local variables *********************/ +static bool altered_job = false; +static bool new_work = false; +static pthread_mutex_t thread_flag_mutex = PTHREAD_MUTEX_INITIALIZER; + +static List pend_job_list = NULL; +static List run_job_list = NULL; + +#define MAX_JOB_CNT 100 +static int node_space_recs; +static node_space_map_t node_space[MAX_JOB_CNT + 1]; + +/* Set __DEBUG to get detailed logging for this thread without + * detailed logging for the entire slurmctld daemon */ +#define __DEBUG 0 +#define SLEEP_TIME 2 + +/*********************** local functions *********************/ +static int _add_pending_job(struct job_record *job_ptr, + struct part_record *part_ptr, part_specs_t *part_specs); +static int _add_running_job(struct job_record *job_ptr); +static void _attempt_backfill(struct part_record *part_ptr); +static void _backfill_part(part_specs_t *part_specs); +static void _build_node_space_map(part_specs_t *part_specs); +static void _change_prio(struct job_record *job_ptr, uint32_t prio); +static void _diff_tv_str(struct timeval *tv1,struct timeval *tv2, + char *tv_str, int len_tv_str); +static void _dump_node_space_map(uint32_t job_id, uint32_t node_cnt); +static int _get_avail_node_cnt(struct job_record *job_ptr); +static void _get_part_specs(struct part_record *part_ptr, + part_specs_t *part_specs); +static bool _has_state_changed(void); +static bool _loc_restrict(struct job_record *job_ptr, part_specs_t *part_specs); +static bool _more_work(void); +static int _sort_by_prio(void *x, void *y); +static int _sort_by_end(void *x, void *y); +static int _update_node_space_map(struct job_record *job_ptr); + +/* list processing function, sort jobs by _decreasing_ priority */ +static int _sort_by_prio(void *x, void *y) +{ + struct job_record *job_ptr1 = (struct job_record *) x; + struct job_record *job_ptr2 = (struct job_record *) y; + double diff = job_ptr2->priority - job_ptr1->priority; + + if (diff > 0) + return 1; + else if (diff < 0) + return -1; + else + return 0; +} + +/* list processing function, sort jobs by _increasing_ end time */ +static int _sort_by_end(void *x, void *y) +{ + struct job_record *job_ptr1 = (struct job_record *) x; + struct job_record *job_ptr2 = (struct job_record *) y; + double diff = difftime(job_ptr1->end_time, job_ptr2->end_time); + + if (diff > 0) + return 1; + else if (diff < 0) + return -1; + else + return 0; +} + +/* + * _diff_tv_str - build a string showing the time difference between two times + * IN tv1 - start of event + * IN tv2 - end of event + * OUT tv_str - place to put delta time in format "usec=%ld" + * IN len_tv_str - size of tv_str in bytes + */ +static void _diff_tv_str(struct timeval *tv1,struct timeval *tv2, + char *tv_str, int len_tv_str) +{ + long delta_t; + delta_t = (tv2->tv_sec - tv1->tv_sec) * 1000000; + delta_t += tv2->tv_usec - tv1->tv_usec; + snprintf(tv_str, len_tv_str, "usec=%ld", delta_t); +} + +/* backfill_agent - detached thread periodically attempts to backfill jobs */ +extern void * +backfill_agent(void *args) +{ + struct timeval tv1, tv2; + char tv_str[20]; + bool filter_root = false; + /* Read config, node, and partitions; Write jobs */ + slurmctld_lock_t all_locks = { + READ_LOCK, WRITE_LOCK, READ_LOCK, READ_LOCK }; + + if (slurm_get_root_filter()) + filter_root = true; + while (1) { + sleep(SLEEP_TIME); /* don't run continuously */ + if (!_more_work()) + continue; + + gettimeofday(&tv1, NULL); + lock_slurmctld(all_locks); + if ( _has_state_changed() ) { + ListIterator part_iterator; + struct part_record *part_ptr; + + /* identify partitions eligible for backfill */ + part_iterator = list_iterator_create(part_list); + while ((part_ptr = (struct part_record *) + list_next(part_iterator))) { + if ( ((part_ptr->shared) || + (part_ptr->state_up == 0)) ) + continue; /* not under our control */ + if ((part_ptr->root_only) && filter_root) + continue; + _attempt_backfill(part_ptr); + } + list_iterator_destroy(part_iterator); + } + unlock_slurmctld(all_locks); + gettimeofday(&tv2, NULL); + _diff_tv_str(&tv1, &tv2, tv_str, 20); +#if __DEBUG + info("backfill: completed, %s", tv_str); +#endif + if (altered_job) { + altered_job = false; + schedule(); /* has own locks */ + } + } +} + +/* trigger the attempt of a backfill */ +extern void +run_backfill (void) +{ + pthread_mutex_lock( &thread_flag_mutex ); + new_work = true; + pthread_mutex_unlock( &thread_flag_mutex ); +} + +static bool +_more_work (void) +{ + static bool rc; + pthread_mutex_lock( &thread_flag_mutex ); + rc = new_work; + new_work = false; + pthread_mutex_unlock( &thread_flag_mutex ); + return rc; +} + +/* Report if any changes occurred to job, node or partition information */ +static bool +_has_state_changed(void) +{ + static time_t backfill_job_time = (time_t) 0; + static time_t backfill_node_time = (time_t) 0; + static time_t backfill_part_time = (time_t) 0; + + if ( (backfill_job_time == last_job_update ) && + (backfill_node_time == last_node_update) && + (backfill_part_time == last_part_update) ) + return false; + + backfill_job_time = last_job_update; + backfill_node_time = last_node_update; + backfill_part_time = last_part_update; + return true; +} + +/* Attempt to perform backfill scheduling on the specified partition */ +static void +_attempt_backfill(struct part_record *part_ptr) +{ + int i, error_code = 0; + uint32_t max_pending_prio = 0; + uint32_t min_pend_job_size = INFINITE; + struct job_record *job_ptr; + ListIterator job_iterator; + part_specs_t part_specs; + +#if __DEBUG + info("backfill: attempt on partition %s", part_ptr->name); +#endif + + _get_part_specs(part_ptr, &part_specs); + if (part_specs.idle_node_cnt == 0) + return; /* no idle nodes */ + + pend_job_list = list_create(NULL); + run_job_list = list_create(NULL); + + /* build lists of pending and running jobs in this partition */ + job_iterator = list_iterator_create(job_list); + while ((job_ptr = (struct job_record *) list_next(job_iterator))) { + if (job_ptr->part_ptr != part_ptr) + continue; /* job in different partition */ + + if (job_ptr->job_state & JOB_COMPLETING) { +#if __DEBUG + info("backfill: Job %u completing, skip partition", + job_ptr->job_id); +#endif + error_code = 1; + break; + } else if (job_ptr->job_state == JOB_RUNNING) { + if (_add_running_job(job_ptr)) { + error_code = 2; + break; + } + } else if (job_ptr->job_state == JOB_PENDING) { + max_pending_prio = MAX(max_pending_prio, + job_ptr->priority); + if (_add_pending_job(job_ptr, part_ptr, &part_specs)) { + error_code = 3; + break; + } + min_pend_job_size = MIN(min_pend_job_size, + job_ptr->node_cnt); + } + } + list_iterator_destroy(job_iterator); + if (error_code) + goto cleanup; + + i = list_count(run_job_list); + if ( (i == 0) || (i > MAX_JOB_CNT) ) + goto cleanup; /* no running jobs or already have many */ + if (list_is_empty(pend_job_list)) + goto cleanup; /* no pending jobs */ + if (min_pend_job_size > part_specs.idle_node_cnt) + goto cleanup; /* not enough free nodes for any pending job */ + + list_sort(pend_job_list, _sort_by_prio); + list_sort(run_job_list, _sort_by_end); + _build_node_space_map(&part_specs); + _backfill_part(&part_specs); + + cleanup: + list_destroy(pend_job_list); + list_destroy(run_job_list); +} + +/* get the specs on nodes within a partition */ +static void +_get_part_specs(struct part_record *part_ptr, part_specs_t *part_specs) +{ + int i, j; + + part_specs->idle_node_cnt = 0; + part_specs->max_cpus = 0; + part_specs->min_cpus = INFINITE; + part_specs->min_mem = INFINITE; + part_specs->min_disk = INFINITE; + + for (i=0; ipart_cnt; j++) { + if (node_ptr->part_pptr[j] != part_ptr) + continue; + found_part = true; + break; + } + if (found_part == false) + continue; /* different partition */ + if (node_ptr->node_state == NODE_STATE_IDLE) + part_specs->idle_node_cnt++; + if (slurmctld_conf.fast_schedule) { + part_specs->max_cpus = MAX(part_specs->max_cpus, + node_ptr->config_ptr->cpus); + part_specs->min_cpus = MIN(part_specs->min_cpus, + node_ptr->config_ptr->cpus); + part_specs->min_mem = MIN(part_specs->min_mem, + node_ptr->config_ptr->real_memory); + part_specs->min_disk = MIN(part_specs->min_disk, + node_ptr->config_ptr->tmp_disk); + } else { + part_specs->max_cpus = MAX(part_specs->max_cpus, + node_ptr->cpus); + part_specs->min_cpus = MIN(part_specs->min_cpus, + node_ptr->cpus); + part_specs->min_mem = MIN(part_specs->min_mem, + node_ptr->real_memory); + part_specs->min_disk = MIN(part_specs->min_disk, + node_ptr->tmp_disk); + } + } + +#if __DEBUG + info("backfill: partition %s cpus=%u:%u mem=%u+ disk=%u+", + part_ptr->name, part_specs->min_cpus, part_specs->max_cpus, + part_specs->min_mem, part_specs->min_disk); +#endif +} + +/* Add specified pending job to our records */ +static int +_add_pending_job(struct job_record *job_ptr, struct part_record *part_ptr, + part_specs_t *part_specs) +{ + int min_node_cnt; + struct job_details *detail_ptr = job_ptr->details; + + if (job_ptr->priority == 0) { +#if __DEBUG + info("backfill: pending job %u is held", job_ptr->job_id); +#endif + return 0; /* Skip this job */ + } + + if ((job_ptr->time_limit != NO_VAL) && + (job_ptr->time_limit > part_ptr->max_time)) { +#if __DEBUG + info("backfill: pending job %u exceeds partition time limit", + job_ptr->job_id); +#endif + return 0; /* Skip this job */ + } + + if (detail_ptr == NULL) { + error("backfill: pending job %u lacks details", + job_ptr->job_id); + return 1; + } + + /* figure out how many nodes this job needs */ + min_node_cnt = (job_ptr->num_procs + part_specs->max_cpus - 1) / + part_specs->max_cpus; /* round up */ + detail_ptr->min_nodes = MAX(min_node_cnt, detail_ptr->min_nodes); + if (detail_ptr->min_nodes > part_ptr->max_nodes) { +#if __DEBUG + info("backfill: pending job %u exceeds partition node limit", + job_ptr->job_id); +#endif + return 0; /* Skip this job */ + } + +#if __DEBUG + info("backfill: job %u pending on %d nodes", job_ptr->job_id, + detail_ptr->min_nodes); +#endif + + list_append(pend_job_list, (void *) job_ptr); + return 0; +} + +/* Add specified running job to our records */ +static int +_add_running_job(struct job_record *job_ptr) +{ +#if __DEBUG + info("backfill: job %u running on %d nodes: %s", job_ptr->job_id, + job_ptr->node_cnt, job_ptr->nodes); +#endif + + list_append(run_job_list, (void *) job_ptr); + return 0; +} + +/* build a map of how many nodes are free at any point in time + * based upon currently running jobs. pending jobs are added to + * the map as we execute the backfill algorithm */ +static void +_build_node_space_map(part_specs_t *part_specs) +{ + ListIterator run_job_iterate; + struct job_record *run_job_ptr; + int base_size = 0; + + node_space_recs = 0; + + if (part_specs->idle_node_cnt) { + base_size = part_specs->idle_node_cnt; + node_space[node_space_recs].idle_node_cnt = base_size; + node_space[node_space_recs++].time = time(NULL); + } + + run_job_iterate = list_iterator_create(run_job_list); + while ( (run_job_ptr = list_next(run_job_iterate)) ) { + uint32_t nodes2free = _get_avail_node_cnt(run_job_ptr); + if (nodes2free == 0) + continue; /* no nodes returning to service */ + base_size += nodes2free; + node_space[node_space_recs].idle_node_cnt = base_size; + node_space[node_space_recs++].time = run_job_ptr->end_time; + } + list_iterator_destroy(run_job_iterate); + + _dump_node_space_map(0, 0); +} + +static void +_dump_node_space_map(uint32_t job_id, uint32_t node_cnt) +{ +#if __DEBUG + int i; + time_t now; + + if (job_id == 0) + info("backfill: initial node_space_map"); + else + info("backfill: node_space_map after job %u allocated %u nodes", + job_id, node_cnt); + + now = time(NULL); + for (i=0; idetails == NULL) /* pending job lacks details */ + return 0; + + if (job_ptr->time_limit == NO_VAL) + fini_time = time(NULL) + job_ptr->part_ptr->max_time; + else + fini_time = time(NULL) + job_ptr->time_limit; + min_nodes = node_space[0].idle_node_cnt; + for (i=1; i fini_time) + break; + if (min_nodes > node_space[i].idle_node_cnt) + min_nodes = node_space[i].idle_node_cnt; + } + + nodes_needed = job_ptr->details->min_nodes; + if (nodes_needed <= min_nodes) + return 1; + + for (i=0; ijob_id, nodes_needed); + return 0; +} + +/* return the number of nodes to be returned to this partition when + * the specified job terminates. Don't count DRAIN or DOWN nodes */ +static int +_get_avail_node_cnt(struct job_record *job_ptr) +{ + int cnt = 0, i; + struct node_record *node_ptr; + uint16_t base_state; + + for (i=0; inode_bitmap, i) == 0) + continue; + node_ptr = node_record_table_ptr + i; + if (node_ptr->node_state & NODE_STATE_DRAIN) + continue; + base_state = node_ptr->node_state & NODE_STATE_BASE; + if (base_state == NODE_STATE_DOWN) + continue; + cnt++; + } + + return cnt; +} + + +/* scan pending job queue and change the priority of any that + * can run now without delaying the expected initiation time + * of any higher priority job */ +static void +_backfill_part(part_specs_t *part_specs) +{ + struct job_record *pend_job_ptr; + ListIterator pend_job_iterate; + struct job_record *first_job = NULL; /* just used as flag */ + + /* find job to possibly backfill */ + pend_job_iterate = list_iterator_create(pend_job_list); + while ( (pend_job_ptr = list_next(pend_job_iterate)) ) { + if (_loc_restrict(pend_job_ptr, part_specs)) { +#if __DEBUG + info("Job %u has locality restrictions", + pend_job_ptr->job_id); +#endif + break; + } + + if (first_job == NULL) { + if (pend_job_ptr->details == NULL) + break; + if (pend_job_ptr->details->min_nodes <= + part_specs->idle_node_cnt) { +#if __DEBUG + info("Job %u should start via FIFO", + pend_job_ptr->job_id); +#endif + break; + } + first_job = pend_job_ptr; + } + + if (_update_node_space_map(pend_job_ptr)) { + _change_prio(pend_job_ptr, + (first_job->priority + 1)); + break; + } + } + list_iterator_destroy(pend_job_iterate); +} + +/* Return true if job has locality restrictions, false otherwise */ +static bool +_loc_restrict(struct job_record *job_ptr, part_specs_t *part_specs) +{ + struct job_details *detail_ptr = job_ptr->details; + + if (detail_ptr == NULL) + return false; + + if ( (detail_ptr->contiguous) || (detail_ptr->features) || + (detail_ptr->req_nodes && detail_ptr->req_nodes[0]) || + (detail_ptr->exc_nodes && detail_ptr->exc_nodes[0]) ) + return true; + + if ( (detail_ptr->job_min_procs > part_specs->min_cpus) || + (detail_ptr->job_min_memory > part_specs->min_mem) || + (detail_ptr->job_min_tmp_disk > part_specs->min_disk) ) + return true; + + if (part_specs->max_cpus != part_specs->min_cpus) { + int max_node_cnt; + max_node_cnt = (job_ptr->num_procs + part_specs->min_cpus + - 1) / part_specs->min_cpus; + if (max_node_cnt > detail_ptr->min_nodes) + return true; + } + + return false; +} + +/* Change the priority of a pending job to get it running now */ +static void +_change_prio(struct job_record *job_ptr, uint32_t prio) +{ + info("backfill: set job %u to priority %u", job_ptr->job_id, prio); + job_ptr->priority = prio; + altered_job = true; + run_backfill(); + last_job_update = time(NULL); +} + diff --git a/executable_names/src/plugins/sched/backfill/backfill.h b/executable_names/src/plugins/sched/backfill/backfill.h new file mode 100644 index 0000000000000000000000000000000000000000..2db7e766bbd1903c438af1692d1ef84c7a395ec0 --- /dev/null +++ b/executable_names/src/plugins/sched/backfill/backfill.h @@ -0,0 +1,43 @@ +/*****************************************************************************\ + * backfill.h - header for simple backfill scheduler plugin. + ***************************************************************************** + * Copyright (C) 2003 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +/* backfill_agent - detached thread periodically attempts to backfill jobs */ +extern void *backfill_agent(void *args); + +/* trigger the attempt of a backfill */ +extern void run_backfill (void); + diff --git a/executable_names/src/plugins/sched/backfill/backfill_wrapper.c b/executable_names/src/plugins/sched/backfill/backfill_wrapper.c new file mode 100644 index 0000000000000000000000000000000000000000..dbf33c67cc7382d50cb1dc314949c69d2ae5430e --- /dev/null +++ b/executable_names/src/plugins/sched/backfill/backfill_wrapper.c @@ -0,0 +1,167 @@ +/*****************************************************************************\ + * backfill_wrapper.c - plugin for SLURM backfill scheduler. + * Operates like FIFO, but backfill scheduler daemon will explicitly modify + * the priority of jobs as needed to achieve backfill scheduling. + ***************************************************************************** + * Copyright (C) 2003 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Jay Windley , Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include +#include + +#include "src/common/plugin.h" +#include "src/common/log.h" +#include "src/common/macros.h" +#include "backfill.h" + +const char plugin_name[] = "SLURM Backfill Scheduler plugin"; +const char plugin_type[] = "sched/backfill"; +const uint32_t plugin_version = 90; + +/* A plugin-global errno. */ +static int plugin_errno = SLURM_SUCCESS; + +static pthread_t backfill_thread = 0; +static pthread_mutex_t thread_flag_mutex = PTHREAD_MUTEX_INITIALIZER; + +/**************************************************************************/ +/* TAG( init ) */ +/**************************************************************************/ +int init( void ) +{ +#ifdef HAVE_BG + /* Backfill scheduling on Blue Gene is possible, + * but difficult and would require substantial + * software development to accomplish. + * It would need to consider each job's geometry, + * ability to rotate, node-use (coprocessor or virtual) + * and conn-type (mesh, torus or nav). */ + fatal("Backfill scheduler incompatable with Blue Gene"); +#else + pthread_attr_t attr; + + verbose( "Backfill scheduler plugin loaded" ); + + pthread_mutex_lock( &thread_flag_mutex ); + if ( backfill_thread ) { + debug2( "Backfill thread already running, not starting another" ); + pthread_mutex_unlock( &thread_flag_mutex ); + return SLURM_ERROR; + } + + slurm_attr_init( &attr ); + pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED ); + if (pthread_create( &backfill_thread, &attr, backfill_agent, NULL)) + error("Unable to start backfill thread: %m"); + pthread_mutex_unlock( &thread_flag_mutex ); + slurm_attr_destroy( &attr ); +#endif + return SLURM_SUCCESS; +} + +/**************************************************************************/ +/* TAG( fini ) */ +/**************************************************************************/ +static void _cancel_thread (pthread_t thread_id) +{ + int i; + + for (i=0; i<4; i++) { + if (pthread_cancel(thread_id)) + return; + usleep(1000); + } + error("Could not kill backfill sched pthread"); +} + +void fini( void ) +{ + pthread_mutex_lock( &thread_flag_mutex ); + if ( backfill_thread ) { + verbose( "Backfill scheduler plugin shutting down" ); + _cancel_thread( backfill_thread ); + backfill_thread = false; + } + pthread_mutex_unlock( &thread_flag_mutex ); +} + + +/***************************************************************************/ +/* TAG( slurm_sched_plugin_schedule ) */ +/***************************************************************************/ +int +slurm_sched_plugin_schedule( void ) +{ + return SLURM_SUCCESS; +} + + +/**************************************************************************/ +/* TAG( slurm_sched_plugin_initial_priority ) */ +/**************************************************************************/ +u_int32_t +slurm_sched_plugin_initial_priority( u_int32_t last_prio ) +{ + if (last_prio >= 2) + return (last_prio - 1); + else + return 1; +} + +/**************************************************************************/ +/* TAG( slurm_sched_plugin_job_is_pending ) */ +/**************************************************************************/ +void slurm_sched_plugin_job_is_pending( void ) +{ + run_backfill(); +} + +/**************************************************************************/ +/* TAG( slurm_sched_get_errno ) */ +/**************************************************************************/ +int slurm_sched_get_errno( void ) +{ + return plugin_errno; +} + +/**************************************************************************/ +/* TAG( slurm_sched_strerror ) */ +/**************************************************************************/ +char *slurm_sched_strerror( int errnum ) +{ + return NULL; +} + diff --git a/executable_names/src/plugins/sched/builtin/Makefile.am b/executable_names/src/plugins/sched/builtin/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..7fa480d50f8e378630d9dfee7784637b35541a41 --- /dev/null +++ b/executable_names/src/plugins/sched/builtin/Makefile.am @@ -0,0 +1,14 @@ +# Makefile for builtin scheduler plugin + +AUTOMAKE_OPTIONS = foreign + +CXXFLAGS = -fexceptions + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = sched_builtin.la + +sched_builtin_la_SOURCES = builtin_wrapper.c +sched_builtin_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/sched/builtin/Makefile.in b/executable_names/src/plugins/sched/builtin/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..2f6a21cc737abfa71893bfcdd062ea657b647e2d --- /dev/null +++ b/executable_names/src/plugins/sched/builtin/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for builtin scheduler plugin + +SOURCES = $(sched_builtin_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/sched/builtin +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +sched_builtin_la_LIBADD = +am_sched_builtin_la_OBJECTS = builtin_wrapper.lo +sched_builtin_la_OBJECTS = $(am_sched_builtin_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(sched_builtin_la_SOURCES) +DIST_SOURCES = $(sched_builtin_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = -fexceptions +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = sched_builtin.la +sched_builtin_la_SOURCES = builtin_wrapper.c +sched_builtin_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/sched/builtin/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/sched/builtin/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +sched_builtin.la: $(sched_builtin_la_OBJECTS) $(sched_builtin_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(sched_builtin_la_LDFLAGS) $(sched_builtin_la_OBJECTS) $(sched_builtin_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/builtin_wrapper.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/sched/builtin/builtin_wrapper.c b/executable_names/src/plugins/sched/builtin/builtin_wrapper.c new file mode 100644 index 0000000000000000000000000000000000000000..92fb32254792ff4af9894dac6a5ac28ec535d55e --- /dev/null +++ b/executable_names/src/plugins/sched/builtin/builtin_wrapper.c @@ -0,0 +1,114 @@ +/*****************************************************************************\ + * builtin_wrapper.c - NO-OP plugin for SLURM's internal scheduler. + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Kevin Tew et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include + +#include "src/common/plugin.h" +#include "src/common/log.h" + +const char plugin_name[] = "SLURM Built-in Scheduler plugin"; +const char plugin_type[] = "sched/builtin"; +const uint32_t plugin_version = 90; + +/* A plugin-global errno. */ +static int plugin_errno = SLURM_SUCCESS; + +/**************************************************************************/ +/* TAG( init ) */ +/**************************************************************************/ +int init( void ) +{ + verbose( "Built-in scheduler plugin loaded" ); + return SLURM_SUCCESS; +} + +/**************************************************************************/ +/* TAG( fini ) */ +/**************************************************************************/ +void fini( void ) +{ + /* Empty. */ +} + + +/***************************************************************************/ +/* TAG( slurm_sched_plugin_schedule ) */ +/***************************************************************************/ +int +slurm_sched_plugin_schedule( void ) +{ + return SLURM_SUCCESS; +} + + +/**************************************************************************/ +/* TAG( slurm_sched_plugin_initial_priority ) */ +/**************************************************************************/ +u_int32_t +slurm_sched_plugin_initial_priority( u_int32_t last_prio ) +{ + if (last_prio >= 2) + return (last_prio - 1); + else + return 1; +} + +/**************************************************************************/ +/* TAG( slurm_sched_plugin_job_is_pending ) */ +/**************************************************************************/ +void slurm_sched_plugin_job_is_pending( void ) +{ + /* Empty. */ +} + +/**************************************************************************/ +/* TAG( slurm_sched_get_errno ) */ +/**************************************************************************/ +int slurm_sched_get_errno( void ) +{ + return plugin_errno; +} + +/**************************************************************************/ +/* TAG( slurm_sched_strerror ) */ +/**************************************************************************/ +char *slurm_sched_strerror( int errnum ) +{ + return NULL; +} + diff --git a/executable_names/src/plugins/sched/gang/Makefile.am b/executable_names/src/plugins/sched/gang/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..ec41427238cabe59751410d3bf7939f39aead436 --- /dev/null +++ b/executable_names/src/plugins/sched/gang/Makefile.am @@ -0,0 +1,17 @@ +# Makefile for gang scheduler plugin + +AUTOMAKE_OPTIONS = foreign + +CXXFLAGS = -fexceptions + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = sched_gang.la + +sched_gang_la_SOURCES = \ + gang.c \ + gang.h \ + sched_gang.c +sched_gang_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/sched/gang/Makefile.in b/executable_names/src/plugins/sched/gang/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..32c75ead62c8d7ed21044e4a32e9b214f2a666cd --- /dev/null +++ b/executable_names/src/plugins/sched/gang/Makefile.in @@ -0,0 +1,561 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for gang scheduler plugin + +SOURCES = $(sched_gang_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/sched/gang +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +sched_gang_la_LIBADD = +am_sched_gang_la_OBJECTS = gang.lo sched_gang.lo +sched_gang_la_OBJECTS = $(am_sched_gang_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(sched_gang_la_SOURCES) +DIST_SOURCES = $(sched_gang_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = -fexceptions +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = sched_gang.la +sched_gang_la_SOURCES = \ + gang.c \ + gang.h \ + sched_gang.c + +sched_gang_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/sched/gang/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/sched/gang/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +sched_gang.la: $(sched_gang_la_OBJECTS) $(sched_gang_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(sched_gang_la_LDFLAGS) $(sched_gang_la_OBJECTS) $(sched_gang_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gang.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_gang.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/sched/gang/gang.c b/executable_names/src/plugins/sched/gang/gang.c new file mode 100644 index 0000000000000000000000000000000000000000..0f13ba89219d39641e14aeabfd2e73e8a62ca95e --- /dev/null +++ b/executable_names/src/plugins/sched/gang/gang.c @@ -0,0 +1,197 @@ +/***************************************************************************** + * gang.c - Gang scheduler functions. + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include "./gang.h" +#include "src/common/slurm_protocol_defs.h" +#include "src/slurmctld/slurmctld.h" +#include "src/slurmctld/locks.h" + +static bool thread_running = false; +static bool thread_shutdown = false; +static pthread_mutex_t thread_flag_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_t gang_thread_id; + +/* Global configuration parameters */ +uint16_t multi_prog_level = 2; /* maximum multi-programming level */ +uint16_t slice_time = 10; /* seconds */ + +static bool _context_switch(void); +static void * _gang_thread(void *no_data); +static int _gang_resume_job(uint32_t jobid); +static int _gang_suspend_job(uint32_t jobid); +static void _parse_gang_config(void); + + +/* _parse_gang_config - load gang scheduler configuration parameters. + * To read gang.conf configuration file, see _parse_wiki_config + * code in src/wiki/msg.c, or add parameters to main config file */ +static void +_parse_gang_config(void) +{ + /* Reset multi_prog_level and slice_time as needed */ +} + +static int +_gang_resume_job(uint32_t jobid) +{ + int slurm_rc; + suspend_msg_t msg; + + msg.job_id = jobid; + msg.op = RESUME_JOB; + slurm_rc = job_suspend(&msg, 0, -1); + if (slurm_rc != SLURM_SUCCESS) + error("gang: Failed to resume job %u (%m)", jobid); + else + info("gang: Resumed job %u", jobid); + return slurm_rc; +} + +static int +_gang_suspend_job(uint32_t jobid) +{ + int slurm_rc; + suspend_msg_t msg; + + msg.job_id = jobid; + msg.op = SUSPEND_JOB; + slurm_rc = job_suspend(&msg, 0, -1); + if (slurm_rc != SLURM_SUCCESS) + error("gang: Failed to suspend job %u (%m)", jobid); + else + info("gang: Suspended job %u", jobid); + return slurm_rc; +} + +/* _context_switch - This is just a very simple proof of concept sample. + * The production version needs to maintain an Ousterhout matrix and + * make intelligent scheduling decisions. This version supports a + * multi-programming level of 2 only. In practice we'll want a + * time slice much larger than 10 seconds too, but that's fine for + * testing. - Moe */ +static bool +_context_switch(void) +{ + bool run_scheduler = false; + struct job_record *job_ptr; + ListIterator job_iterator; + + job_iterator = list_iterator_create(job_list); + while ((job_ptr = (struct job_record *) list_next(job_iterator))) { + if (job_ptr->job_state == JOB_RUNNING) + _gang_suspend_job(job_ptr->job_id); + else if (job_ptr->job_state == JOB_SUSPENDED) { + _gang_resume_job(job_ptr->job_id); + run_scheduler = true; + } + } + list_iterator_destroy(job_iterator); + return run_scheduler; +} + +/* _gang_thread - A pthread to periodically perform gang scheduler context + * switches. */ +static void * +_gang_thread(void *no_data) +{ + bool run_scheduler; + + /* Locks: write job and node info */ + slurmctld_lock_t job_write_lock = { + NO_LOCK, WRITE_LOCK, WRITE_LOCK, NO_LOCK }; + + while (!thread_shutdown) { + lock_slurmctld(job_write_lock); + run_scheduler = _context_switch(); + unlock_slurmctld(job_write_lock); + if (run_scheduler) + schedule(); /* has own locking */ + sleep(slice_time); + } + pthread_exit((void *) 0); +} + +/* + * spawn_gang_thread - Create a pthread to perform gang scheduler actions + * + * NOTE: Create only one pthread in any plugin. Some systems leak memory on + * each pthread_create from within a plugin + */ +extern int +spawn_gang_thread(void) +{ + pthread_attr_t thread_attr_msg; + + pthread_mutex_lock( &thread_flag_mutex ); + if (thread_running) { + error("gang thread already running, not starting another"); + pthread_mutex_unlock(&thread_flag_mutex); + return SLURM_ERROR; + } + + _parse_gang_config(); + slurm_attr_init(&thread_attr_msg); + if (pthread_create(&gang_thread_id, &thread_attr_msg, + _gang_thread, NULL)) + fatal("pthread_create %m"); + + slurm_attr_destroy(&thread_attr_msg); + thread_running = true; + pthread_mutex_unlock(&thread_flag_mutex); + return SLURM_SUCCESS; +} + +extern void +term_gang_thread(void) +{ + pthread_mutex_lock(&thread_flag_mutex); + if (thread_running) { + int i; + thread_shutdown = true; + for (i=0; i<4; i++) { + if (pthread_cancel(gang_thread_id)) { + gang_thread_id = 0; + break; + } + usleep(1000); + } + if (gang_thread_id) + error("Cound not kill gang pthread"); + } + pthread_mutex_unlock(&thread_flag_mutex); +} + diff --git a/executable_names/src/plugins/sched/gang/gang.h b/executable_names/src/plugins/sched/gang/gang.h new file mode 100644 index 0000000000000000000000000000000000000000..482f1d375c8f8fa4e78c5414ddf4bd3e9a408cfa --- /dev/null +++ b/executable_names/src/plugins/sched/gang/gang.h @@ -0,0 +1,50 @@ +/*****************************************************************************\ + * gang.h - Gang scheduler definitions + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#ifndef __SCHED_GANG_H +#define __SCHED_GANG_H + +#include +#include + +#include "src/common/plugin.h" +#include "src/common/log.h" + +extern int spawn_gang_thread(void); +extern void term_gang_thread(void); + +#endif diff --git a/executable_names/src/plugins/sched/gang/sched_gang.c b/executable_names/src/plugins/sched/gang/sched_gang.c new file mode 100644 index 0000000000000000000000000000000000000000..0a50969f2093d809ce07c7eecd46a8e5ce40c03b --- /dev/null +++ b/executable_names/src/plugins/sched/gang/sched_gang.c @@ -0,0 +1,108 @@ +/*****************************************************************************\ + * sched_gang.c - Gang scheduler plugin functions. + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include "./gang.h" + +const char plugin_name[] = "Gang Scheduler plugin"; +const char plugin_type[] = "sched/gang"; +const uint32_t plugin_version = 90; + +/* A plugin-global errno. */ +static int plugin_errno = SLURM_SUCCESS; + +/**************************************************************************/ +/* TAG( init ) */ +/**************************************************************************/ +extern int init( void ) +{ + verbose( "gang scheduler plugin loaded" ); + return spawn_gang_thread(); +} + +/**************************************************************************/ +/* TAG( fini ) */ +/**************************************************************************/ +extern void fini( void ) +{ + term_gang_thread(); +} + + +/***************************************************************************/ +/* TAG( slurm_sched_plugin_schedule ) */ +/***************************************************************************/ +extern int slurm_sched_plugin_schedule( void ) +{ + return SLURM_SUCCESS; +} + + +/**************************************************************************/ +/* TAG( slurm_sched_plugin_initial_priority ) */ +/**************************************************************************/ +extern uint32_t slurm_sched_plugin_initial_priority( uint32_t last_prio ) +{ + if (last_prio >= 2) + return (last_prio - 1); + else + return 1; +} + +/**************************************************************************/ +/* TAG( slurm_sched_plugin_job_is_pending ) */ +/**************************************************************************/ +void slurm_sched_plugin_job_is_pending( void ) +{ + /* No action required */ +} + +/**************************************************************************/ +/* TAG( slurm_sched_get_errno ) */ +/**************************************************************************/ +int slurm_sched_get_errno( void ) +{ + return plugin_errno; +} + +/**************************************************************************/ +/* TAG( slurm_sched_strerror ) */ +/**************************************************************************/ +char *slurm_sched_strerror( int errnum ) +{ + return NULL; +} + diff --git a/executable_names/src/plugins/sched/hold/Makefile.am b/executable_names/src/plugins/sched/hold/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..2058f2b5c4dc6395f4cc946fa9ec515b90dcaa8b --- /dev/null +++ b/executable_names/src/plugins/sched/hold/Makefile.am @@ -0,0 +1,14 @@ +# Makefile for hold scheduler plugin + +AUTOMAKE_OPTIONS = foreign + +CXXFLAGS = -fexceptions + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = sched_hold.la + +sched_hold_la_SOURCES = hold_wrapper.c +sched_hold_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/sched/hold/Makefile.in b/executable_names/src/plugins/sched/hold/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..897625a481f7902dc4965e14d678739caedae101 --- /dev/null +++ b/executable_names/src/plugins/sched/hold/Makefile.in @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for hold scheduler plugin + +SOURCES = $(sched_hold_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/sched/hold +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +sched_hold_la_LIBADD = +am_sched_hold_la_OBJECTS = hold_wrapper.lo +sched_hold_la_OBJECTS = $(am_sched_hold_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(sched_hold_la_SOURCES) +DIST_SOURCES = $(sched_hold_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = -fexceptions +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = sched_hold.la +sched_hold_la_SOURCES = hold_wrapper.c +sched_hold_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/sched/hold/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/sched/hold/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +sched_hold.la: $(sched_hold_la_OBJECTS) $(sched_hold_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(sched_hold_la_LDFLAGS) $(sched_hold_la_OBJECTS) $(sched_hold_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hold_wrapper.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/sched/hold/hold_wrapper.c b/executable_names/src/plugins/sched/hold/hold_wrapper.c new file mode 100644 index 0000000000000000000000000000000000000000..6eedd272325ece33d905cc42ee4930feec148ac8 --- /dev/null +++ b/executable_names/src/plugins/sched/hold/hold_wrapper.c @@ -0,0 +1,124 @@ +/*****************************************************************************\ + * hold_wrapper.c - Hold all newly arriving jobs if there is a file + * "/etc/slurm.hold", otherwise use SLURM's internal scheduler. + ***************************************************************************** + * Copyright (C) 2002 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette et. al. + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include +#include +#include + +#include + +#include "src/common/plugin.h" +#include "src/common/log.h" + +const char plugin_name[] = "SLURM Hold Scheduler plugin"; +const char plugin_type[] = "sched/hold"; +const uint32_t plugin_version = 90; + +/* A plugin-global errno. */ +static int plugin_errno = SLURM_SUCCESS; + +/**************************************************************************/ +/* TAG( init ) */ +/**************************************************************************/ +int init( void ) +{ + verbose( "Hold scheduler plugin loaded" ); + return SLURM_SUCCESS; +} + +/**************************************************************************/ +/* TAG( fini ) */ +/**************************************************************************/ +void fini( void ) +{ + /* Empty. */ +} + + +/***************************************************************************/ +/* TAG( slurm_sched_plugin_schedule ) */ +/***************************************************************************/ +int +slurm_sched_plugin_schedule( void ) +{ + return SLURM_SUCCESS; +} + + +/**************************************************************************/ +/* TAG( slurm_sched_plugin_initial_priority ) */ +/**************************************************************************/ +u_int32_t +slurm_sched_plugin_initial_priority( u_int32_t last_prio ) +{ + struct stat buf; + + if (stat("/etc/slurm.hold", &buf) == 0) + return 0; /* hold all new jobs */ + + if (last_prio >= 2) + return (last_prio - 1); + else + return 1; +} + +/**************************************************************************/ +/* TAG( slurm_sched_plugin_job_is_pending ) */ +/**************************************************************************/ +void slurm_sched_plugin_job_is_pending( void ) +{ + /* Empty. */ +} + +/**************************************************************************/ +/* TAG( slurm_sched_get_errno ) */ +/**************************************************************************/ +int slurm_sched_get_errno( void ) +{ + return plugin_errno; +} + +/**************************************************************************/ +/* TAG( slurm_sched_strerror ) */ +/**************************************************************************/ +char *slurm_sched_strerror( int errnum ) +{ + return NULL; +} + diff --git a/executable_names/src/plugins/sched/wiki2/Makefile.am b/executable_names/src/plugins/sched/wiki2/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..6ed2e8ad1149bc02b840dca663d4e4b2879c16d7 --- /dev/null +++ b/executable_names/src/plugins/sched/wiki2/Makefile.am @@ -0,0 +1,33 @@ +# Makefile for wiki scheduler plugin + +AUTOMAKE_OPTIONS = foreign + +CXXFLAGS = -fexceptions + +PLUGIN_FLAGS = -module -avoid-version --export-dynamic + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common + +pkglib_LTLIBRARIES = sched_wiki2.la + +sched_wiki2_la_SOURCES = \ + cancel_job.c \ + crypto.c \ + crypto.h \ + event.c \ + get_jobs.c \ + get_nodes.c \ + initialize.c \ + job_add_task.c \ + job_modify.c \ + job_release_task.c \ + job_requeue.c \ + job_signal.c \ + job_will_run.c \ + msg.c \ + msg.h \ + resume_job.c \ + sched_wiki.c \ + start_job.c \ + suspend_job.c +sched_wiki2_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) diff --git a/executable_names/src/plugins/sched/wiki2/Makefile.in b/executable_names/src/plugins/sched/wiki2/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..3ab3194e6c83a8a505ad12e9ffc78dc663f31cc7 --- /dev/null +++ b/executable_names/src/plugins/sched/wiki2/Makefile.in @@ -0,0 +1,596 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for wiki scheduler plugin + +SOURCES = $(sched_wiki2_la_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../../../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = src/plugins/sched/wiki2 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +sched_wiki2_la_LIBADD = +am_sched_wiki2_la_OBJECTS = cancel_job.lo crypto.lo event.lo \ + get_jobs.lo get_nodes.lo initialize.lo job_add_task.lo \ + job_modify.lo job_release_task.lo job_requeue.lo job_signal.lo \ + job_will_run.lo msg.lo resume_job.lo sched_wiki.lo \ + start_job.lo suspend_job.lo +sched_wiki2_la_OBJECTS = $(am_sched_wiki2_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir)/slurm +depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(sched_wiki2_la_SOURCES) +DIST_SOURCES = $(sched_wiki2_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = -fexceptions +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +AUTOMAKE_OPTIONS = foreign +PLUGIN_FLAGS = -module -avoid-version --export-dynamic +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/common +pkglib_LTLIBRARIES = sched_wiki2.la +sched_wiki2_la_SOURCES = \ + cancel_job.c \ + crypto.c \ + crypto.h \ + event.c \ + get_jobs.c \ + get_nodes.c \ + initialize.c \ + job_add_task.c \ + job_modify.c \ + job_release_task.c \ + job_requeue.c \ + job_signal.c \ + job_will_run.c \ + msg.c \ + msg.h \ + resume_job.c \ + sched_wiki.c \ + start_job.c \ + suspend_job.c + +sched_wiki2_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/sched/wiki2/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/plugins/sched/wiki2/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +sched_wiki2.la: $(sched_wiki2_la_OBJECTS) $(sched_wiki2_la_DEPENDENCIES) + $(LINK) -rpath $(pkglibdir) $(sched_wiki2_la_LDFLAGS) $(sched_wiki2_la_OBJECTS) $(sched_wiki2_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cancel_job.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_jobs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_nodes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/initialize.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_add_task.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_modify.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_release_task.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_requeue.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_signal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job_will_run.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msg.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resume_job.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_wiki.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/start_job.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/suspend_job.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-pkglibLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkglibLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-pkglibLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-pkglibLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/src/plugins/sched/wiki2/cancel_job.c b/executable_names/src/plugins/sched/wiki2/cancel_job.c new file mode 100644 index 0000000000000000000000000000000000000000..a842f47a4de05398d1932858430cbd70db8788f0 --- /dev/null +++ b/executable_names/src/plugins/sched/wiki2/cancel_job.c @@ -0,0 +1,147 @@ +/*****************************************************************************\ + * cancel_job.c - Process Wiki cancel job request + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include "./msg.h" +#include "src/slurmctld/locks.h" +#include "src/slurmctld/slurmctld.h" + +#define TYPE_ADMIN 0 +#define TYPE_TIMEOUT 1 + +static int _cancel_job(uint32_t jobid, int *err_code, char **err_msg); +static int _timeout_job(uint32_t jobid, int *err_code, char **err_msg); + +/* RET 0 on success, -1 on failure */ +extern int cancel_job(char *cmd_ptr, int *err_code, char **err_msg) +{ + char *arg_ptr, *tmp_char; + int cancel_type = TYPE_ADMIN; + uint32_t jobid; + static char reply_msg[128]; + + arg_ptr = strstr(cmd_ptr, "ARG="); + if (arg_ptr == NULL) { + *err_code = -300; + *err_msg = "CANCELJOB lacks ARG"; + error("wiki: CANCELJOB lacks ARG"); + return -1; + } + jobid = strtoul(arg_ptr+4, &tmp_char, 10); + if (!isspace(tmp_char[0])) { + *err_code = -300; + *err_msg = "Invalid ARG value"; + error("wiki: CANCELJOB has invalid jobid"); + return -1; + } + + if (strstr(cmd_ptr, "TYPE=TIMEOUT") != 0) + cancel_type = TYPE_TIMEOUT; + else if (strstr(cmd_ptr, "TYPE=WALLCLOCK") != 0) + cancel_type = TYPE_TIMEOUT; + else if (strstr(cmd_ptr, "TYPE=ADMIN") != 0) + cancel_type = TYPE_ADMIN; + else if (strstr(cmd_ptr, "TYPE=") != 0) { + *err_code = -300; + *err_msg = "Invalid TYPE value"; + error("wiki: CANCELJOB has invalid TYPE"); + return -1; + } + + if (cancel_type == TYPE_ADMIN) { + if (_cancel_job(jobid, err_code, err_msg) != 0) + return -1; + } else { + if (_timeout_job(jobid, err_code, err_msg) != 0) + return -1; + } + + snprintf(reply_msg, sizeof(reply_msg), + "job %u cancelled successfully", jobid); + *err_msg = reply_msg; + return 0; +} + +/* Cancel a job now */ +static int _cancel_job(uint32_t jobid, int *err_code, char **err_msg) +{ + int rc = 0, slurm_rc; + /* Write lock on job info */ + slurmctld_lock_t job_write_lock = { + NO_LOCK, WRITE_LOCK, NO_LOCK, NO_LOCK }; + + lock_slurmctld(job_write_lock); + slurm_rc = job_signal(jobid, SIGKILL, 0, 0); + if (slurm_rc != SLURM_SUCCESS) { + *err_code = -700; + *err_msg = slurm_strerror(slurm_rc); + error("wiki: Failed to signal job %u (%m)", jobid); + rc = -1; + goto fini; + } + + debug("wiki: cancel job %u", jobid); + + fini: unlock_slurmctld(job_write_lock); + return rc; +} + +/* Set timeout for specific job, the job will be purged soon */ +static int _timeout_job(uint32_t jobid, int *err_code, char **err_msg) +{ + int rc = 0; + struct job_record *job_ptr; + /* Write lock on job info */ + slurmctld_lock_t job_write_lock = { + NO_LOCK, WRITE_LOCK, NO_LOCK, NO_LOCK }; + + lock_slurmctld(job_write_lock); + job_ptr = find_job_record(jobid); + if (job_ptr == NULL) { + *err_code = -700; + *err_msg = "No such job"; + error("wiki: Failed to find job %u", jobid); + rc = -1; + goto fini; + } + + job_ptr->end_time = time(NULL); + debug("wiki: set end time for job %u", jobid); + + fini: unlock_slurmctld(job_write_lock); + return rc; +} + diff --git a/executable_names/src/plugins/sched/wiki2/crypto.c b/executable_names/src/plugins/sched/wiki2/crypto.c new file mode 100644 index 0000000000000000000000000000000000000000..153c2ef57bc6c4a0b75e602dbf26183127f5b9eb --- /dev/null +++ b/executable_names/src/plugins/sched/wiki2/crypto.c @@ -0,0 +1,134 @@ +/*****************************************************************************\ + * crypto.c - DES cryptographic routines. + ***************************************************************************** + * Produced by Cluster Resources, Inc., no rights reserved. +\*****************************************************************************/ +#include +#include +#include +#include + +#define MAX_ITERATION 4 + +/************************************************************** + * des + ************************************************************** + * DESCRIPTION + * Compute a DES digest for a CRC according to a particular + * key. + * + * ARGUMENTS + * lword (in/out) - The CRC to encode, which becomes the first + * lexical segment of the checksum. + * irword (in/out ) - The key with which to encode the CRC, + * which becomes the second lexical segment of + * the checksum. + * + * RETURNS + * None. + * + * SOURCE + * Cluster Resources, Inc., no rights reserved. + **************************************************************/ +static void des( uint32_t *lword, uint32_t *irword ) +{ + int idx; + uint32_t ia, ib, iswap, itmph, itmpl; + + static uint32_t c1[ MAX_ITERATION ] = { + 0xcba4e531, + 0x537158eb, + 0x145cdc3c, + 0x0d3fdeb2 + }; + static uint32_t c2[ MAX_ITERATION ] = { + 0x12be4590, + 0xab54ce58, + 0x6954c7a6, + 0x15a2ca46 + }; + + itmph = 0; + itmpl = 0; + + for ( idx = 0; idx < MAX_ITERATION; ++idx ) { + iswap = *irword; + ia = iswap ^ c1[ idx ]; + itmpl = ia & 0xffff; + itmph = ia >> 16; + ib = itmpl * itmpl + ~( itmph * itmph ); + ia = (ib >> 16) | ( (ib & 0xffff) << 16 ); + *irword = (*lword) ^ ( (ia ^c2[ idx ]) + (itmpl * itmph) ); + *lword = iswap; + } +} + +/************************************************************** + * compute_crc + ************************************************************** + * DESCRIPTION + * Compute a cyclic redundancy check (CRC) character-wise. + * + * ARGUMENTS + * crc (in) - The CRC computed thus far. + * onech (in) - The character to be added to the CRC. + * + * RETURNS + * The new CRC value. + * + * SOURCE + * Cluster Resources, Inc., no rights reserved. + **************************************************************/ +static uint16_t compute_crc( uint16_t crc, uint8_t onech ) +{ + int idx; + uint32_t ans = ( crc ^ onech << 8 ); + + for ( idx = 0; idx < 8; ++idx ) { + if ( ans & 0x8000 ) { + ans <<= 1; + ans = ans ^ 4129; + } else { + ans <<= 1; + } + } + + return ans; +} + +/************************************************************** + * checksum + ************************************************************** + * DESCRIPTION + * Compute a Wiki checksum for the current message contents + * and return the result as a Wiki name-value pair. + * + * ARGUMENTS + * sum (out) - The string in which to store the resulting + * checksum. + * key(in) - The seed value for the checksum. This must be + * coordinated with the scheduler so that they + * both use the same value. It is a string of + * ASCII decimal digits. + * + * RETURNS + * None. + **************************************************************/ +extern void checksum( char *sum, const char * key, const char * buf ) +{ + uint32_t crc = 0; + uint32_t lword, irword; + int idx, buf_len = strlen(buf); + uint32_t seed = (uint32_t) strtoul( key, NULL, 0 ); + + for ( idx = 0; idx < buf_len; ++idx ) { + crc = (uint32_t) compute_crc( crc, buf[idx] ); + } + + lword = crc; + irword = seed; + + des( &lword, &irword ); + + sprintf(sum, "CK=%08x%08x", lword, irword); +} diff --git a/executable_names/src/plugins/sched/wiki2/crypto.h b/executable_names/src/plugins/sched/wiki2/crypto.h new file mode 100644 index 0000000000000000000000000000000000000000..ddb989b96a9aaf90dccf18af85a88bc5174da5be --- /dev/null +++ b/executable_names/src/plugins/sched/wiki2/crypto.h @@ -0,0 +1,8 @@ +/*****************************************************************************\ + * crypto.h - DES cryptographic routines. + ***************************************************************************** + * Produced by Cluster Resources, Inc., no rights reserved. +\*****************************************************************************/ +#include + +extern void checksum( char *sum, const char *key, const char *buf ); diff --git a/executable_names/src/plugins/sched/wiki2/event.c b/executable_names/src/plugins/sched/wiki2/event.c new file mode 100644 index 0000000000000000000000000000000000000000..39d4eb0efc4f0c014b4a19c561dc49af64eb7598 --- /dev/null +++ b/executable_names/src/plugins/sched/wiki2/event.c @@ -0,0 +1,125 @@ +/*****************************************************************************\ + * event.c - Moab event notification + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include "./msg.h" +#include "src/common/fd.h" + +static pthread_mutex_t event_mutex = PTHREAD_MUTEX_INITIALIZER; +static time_t last_notify_time = (time_t) 0; +static slurm_addr moab_event_addr, moab_event_addr_bu; +static int event_addr_set = 0; + +/* + * event_notify - Notify Moab of some event + * msg IN - event type, NULL to close connection + * RET 0 on success, -1 on failure + */ +extern int event_notify(char *msg) +{ + time_t now = time(NULL); + int rc; + slurm_fd event_fd = (slurm_fd) -1; + + if (e_port == 0) { + /* Event notification disabled */ + return 0; + } + + if (job_aggregation_time + && (difftime(now, last_notify_time) < job_aggregation_time)) { + /* Already sent recent event notification */ + return 0; + } + + pthread_mutex_lock(&event_mutex); + if (event_addr_set == 0) { + /* Identify address for socket connection */ + slurm_set_addr(&moab_event_addr, e_port, e_host); + event_addr_set = 1; + if (e_host_bu[0] != '\0') { + slurm_set_addr(&moab_event_addr_bu, e_port, + e_host_bu); + event_addr_set = 2; + } + } + event_fd = slurm_open_msg_conn(&moab_event_addr); + if ((event_fd == -1) && (event_addr_set == 2)) { + debug("Unable to open wiki event port %s:%u: %m", + e_host, e_port); + event_fd = slurm_open_msg_conn(&moab_event_addr_bu); + } + if (event_fd == -1) { + char *host_name; + if (event_addr_set == 2) + host_name = e_host_bu; + else + host_name = e_host; + error("Unable to open wiki event port %s:%u: %m", + host_name, e_port); + pthread_mutex_unlock(&event_mutex); + /* Don't retry again for a while (10 mins) + * to avoid long delays from ETIMEDOUT */ + last_notify_time = now + 600; + return -1; + } + + /* We can't have the controller block on the following write() */ + fd_set_nonblocking(event_fd); + + /* Always send "1234\0" as the message + * (we do not care if all of the message is sent, just that + * some of it went through to wake up Moab) + */ + if (write(event_fd, "1234", 5) > 0) { + info("wiki event_notification sent: %s", msg); + last_notify_time = now; + rc = 0; + } else { + error("wiki event notification failure: %m"); + /* close socket, re-open later */ + (void) slurm_shutdown_msg_engine(event_fd); + event_fd = -1; + rc = -1; + } + + /* We disconnect and reconnect on every message to + * gracefully handle some failure modes of Moab */ + (void) slurm_shutdown_msg_conn(event_fd); + pthread_mutex_unlock(&event_mutex); + + return rc; +} diff --git a/executable_names/src/plugins/sched/wiki2/get_jobs.c b/executable_names/src/plugins/sched/wiki2/get_jobs.c new file mode 100644 index 0000000000000000000000000000000000000000..3178d8c9af92e84727507ba7e32018f19af1fab9 --- /dev/null +++ b/executable_names/src/plugins/sched/wiki2/get_jobs.c @@ -0,0 +1,359 @@ +/*****************************************************************************\ + * get_jobs.c - Process Wiki get job info request + ***************************************************************************** + * Copyright (C) 2006 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Morris Jette + * UCRL-CODE-217948. + * + * This file is part of SLURM, a resource management program. + * For details, see . + * + * SLURM 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. + * + * In addition, as a special exception, the copyright holders give permission + * to link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. You must obey the GNU + * General Public License in all respects for all of the code used other than + * OpenSSL. If you modify file(s) with this exception, you may extend this + * exception to your version of the file(s), but you are not obligated to do + * so. If you do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source files in + * the program, then also delete it here. + * + * SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +\*****************************************************************************/ + +#include +#include + +#include "./msg.h" +#include "src/common/list.h" +#include "src/common/uid.h" +#include "src/slurmctld/locks.h" +#include "src/slurmctld/slurmctld.h" + +static char * _dump_all_jobs(int *job_cnt, int state_info); +static char * _dump_job(struct job_record *job_ptr, int state_info); +static char * _get_group_name(gid_t gid); +static uint32_t _get_job_end_time(struct job_record *job_ptr); +static uint32_t _get_job_min_disk(struct job_record *job_ptr); +static uint32_t _get_job_min_mem(struct job_record *job_ptr); +static uint32_t _get_job_min_nodes(struct job_record *job_ptr); +static char * _get_job_state(struct job_record *job_ptr); +static uint32_t _get_job_submit_time(struct job_record *job_ptr); +static uint32_t _get_job_suspend_time(struct job_record *job_ptr); +static uint32_t _get_job_tasks(struct job_record *job_ptr); +static uint32_t _get_job_time_limit(struct job_record *job_ptr); + +#define SLURM_INFO_ALL 0 +#define SLURM_INFO_VOLITILE 1 +#define SLURM_INFO_STATE 2 + +/* + * get_jobs - get information on specific job(s) changed since some time + * cmd_ptr IN - CMD=GETJOBS ARG=[:[:]...] + * [:ALL] + * RET 0 on success, -1 on failure + * + * Response format + * ARG=#;UPDATE_TIME=;STATE=;UCLIMIT=; + * TASKS=;QUEUETIME=;STARTTIME=
  • "Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi>"Mmi +>"Mmi>"Mmi>"Mmi>"MmiLKX^$!.Y~> +"ooH!3%R$?r\sm/rAXd.rAXd.rAXd.rAY]H3%R$?3&ETG3%R$G3%R$?3&ETG3%R$G3%Xte!&XX6 +!&XX6!&XX6!&XX6!&XX6!\?;fjZ"#,3%R$K/3#1?3%R$?3&iHK/3#U?3%Xte!%e(.*@s0$3&ETG +3%R$G3%R$?3&ETG3%R$G3%R$G3&iJf2ukN.2ukN.2ukN.2ukMh2ukN.2ukN.2ukN.2ukN.2ukN. +2ukN-3&N6H/3#1?/3#1?/3#1?/3#1?/3#1?/3#1?/3#1?3&ETG3&i`S/3#UG3%R$K1cR$G3&ETG +`Afn83%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G3%R$G +3%Vs,!>b`d~> +"oo8f/Met7r[e++r@J"*r@J"*r@J"*r@JpD/Met7/L)i'/Met'/Met7/L)i'/Met'/Mm;V!$hFo +!$hFo!$hFo!$hFo!$hFo!])DQjXh6(/Met11G(C7/Met7/M/b11G(17/Mm;V!&OR**A]9'/L)i' +/Met'/Met7/L)i'/Met'/Met'/M/dW/H@U*/H@U*/H@U*/H@Td/H@U*/H@U*/H@U*/H@U*/H@U* +/H@U)/N#=91G(C71G(C71G(C71G(C71G(C71G(C71G(C7/L)i'/M/2!1G(1'/Met1,:t]'/L)i' +`@X+q/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met'/Met' +/Mk9r!=o0\~> +"oooP>"Vsjr`T:orE91nrE91nrE91nrE:+3>"Vsj>"Mmi>"Vsi>"Vsj>"Mmi>"Vsi>"\]r!(m,m +!(m,m!(m,m!(m,m!(m,m!_QWfj]WEl>"Vt%8m4hj>"Vsj>$=O%8m5Cj>"\]r!)!2n*D0L->"Mmi +>"Vsi>"Vsj>"Mmi>"Vsi>"Vsi>$=Ps=o_1n=o_1n=o_1n=o_1S=o_1n=o_1n=o_1n=o_1n=o_1n +=o_1m=uAoU8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj8m4hj>"Mmi>$=L$8m5Ci>"Vt%8Qn_i>"Mmi +`EG;o>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi>"Vsi +>"Z\9!?_Am~> +!< +!< +!<=DB=qjS4>"Vsj>$=O%8m5Cj>"Vt%8m4jJ=oq<"8cDln9)Von9)Von9)Von9)Von9)Dd18m4hj +8m4ei8m4hj8Qn_i8m4ei8m4hj8Qnab=o_.m=o_.m=o_.m=o_.m=pIZ'8Qo:i>"[m[1J1hS8m4hj +>"Vsj>$=O%8m5Cj>"Vt%8m4hj8Qn_i8m4ei8m4hj8Qn_i8m4ei8m4hj8c;fm9)Von9)Von9)Von +9)Von9)Vop8m4jI=o_1n=o_1n=o_1n=o_1n=o_1m=u])W8m5Ci>"Vsj>"Vsj>"Vsj>"Vsj>"Vsj +>"Vsj>"Vt%8Qn_i>"Mmi>$=L$8m5Ci>"Vt%8Qna(=u&ZQ8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei +8m4ei8m4ei8m4ei8m4ei8m4ei8m4ei9(uKi+96o~> +!WWZBJJWkRJJXIc!=]$Z~> +!rrW9')iCA')iCR&e>Tc%h]Bc%hB9`&e>Kc%hdt7#8.O[&e>Tc')iCA')`=@')`=@')`=@')N1H +&e>Tc&e>Tf%h]EP&crRV&,m1C%h]EP&ciLUrX]#ArX]#ArX]#ArX]#ArXT>K%h]Kc&e>Tc%he(: +!##8A'bV#i%hB9`&e>Kc%h]B`&e>Tc%h]EP&crRV&,m1C%h]EP&crRV&,m1C%h]EP')iCA')`=@ +')`=@')`=@')`=@')`=E&e>Tc%hdt7;A'KQ%hB9`&e>Kc%h]B`&e>Tc%h]Bc%hB9c%h]Bc&e>Tc +&e>Tc&e>Tc&e>Tc&e>Tc&e>Tc&e>Tc&eY]f%h]Kc&e>Tf%h]Bc&e>Tc&eY]f`"2k\0b4m-&eY]f +&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>Tc&eY]f&e>WL%flt:J,~> +!rrrP,lSnd,lSnu,Tn?T+=&'T+ +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +JH16$JH1Z0J,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/figures/README b/executable_names/doc/figures/README new file mode 100644 index 0000000000000000000000000000000000000000..a4305b9175ed56ab7925a97afcf75a0242e78cd5 --- /dev/null +++ b/executable_names/doc/figures/README @@ -0,0 +1,8 @@ +Most of these diagrams (with the ".dia" suffix) were built using the +tool "dia" (http://www.gnome.org/projects/dia/). + +gnuplot is used with "times.gpl" and ".dat" suffix files to build a +timing plot. + +The PostScript images of these can be built as needed by the Makefile +in "../jsspp" and "../pubdesign". diff --git a/executable_names/doc/figures/allocate-init.dia b/executable_names/doc/figures/allocate-init.dia new file mode 100644 index 0000000000000000000000000000000000000000..06aba5569368b40611f42e52567e714d0523103e --- /dev/null +++ b/executable_names/doc/figures/allocate-init.dia @@ -0,0 +1,3 @@ + +#A4##User##slurmctld##slurmd##allocate req##allocate reply##run job step req##job step reply##job_mgr##session_mgr##connect(stdout/err)##task exit msg##srun##exit +status####cmd##srun allocate##srun##job step req##sh##run job step reply##release allocation##run epilog req##run epilog reply##release job step##job/job step status##prolog##epilog# diff --git a/executable_names/doc/figures/allocate-init.eps b/executable_names/doc/figures/allocate-init.eps new file mode 100644 index 0000000000000000000000000000000000000000..32df45b3435c93118119a27ae170416b8f9c1c09 --- /dev/null +++ b/executable_names/doc/figures/allocate-init.eps @@ -0,0 +1,1068 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ../figures/allocate-init.dia +%%Creator: Dia v0.88.1 +%%CreationDate: Thu Apr 3 14:26:20 2003 +%%For: grondo +%%Magnification: 1.0000 +%%Orientation: Portrait +%%BoundingBox: 0 0 709 508 +%%Pages: 1 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/Times-Roman-latin1 + /Times-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Italic-latin1 + /Times-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Bold-latin1 + /Times-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-BoldItalic-latin1 + /Times-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Book-latin1 + /AvantGarde-Book findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-BookOblique-latin1 + /AvantGarde-BookOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Demi-latin1 + /AvantGarde-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-DemiOblique-latin1 + /AvantGarde-DemiOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Light-latin1 + /Bookman-Light findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-LightItalic-latin1 + /Bookman-LightItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Demi-latin1 + /Bookman-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-DemiItalic-latin1 + /Bookman-DemiItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-latin1 + /Courier findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Oblique-latin1 + /Courier-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Bold-latin1 + /Courier-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-BoldOblique-latin1 + /Courier-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-latin1 + /Helvetica findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Oblique-latin1 + /Helvetica-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Bold-latin1 + /Helvetica-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-BoldOblique-latin1 + /Helvetica-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-latin1 + /Helvetica-Narrow findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Oblique-latin1 + /Helvetica-Narrow-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Bold-latin1 + /Helvetica-Narrow-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-BoldOblique-latin1 + /Helvetica-Narrow-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Roman-latin1 + /NewCenturySchoolbook-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Italic-latin1 + /NewCenturySchoolbook-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Bold-latin1 + /NewCenturySchoolbook-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-BoldItalic-latin1 + /NewCenturySchoolbook-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Roman-latin1 + /Palatino-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Italic-latin1 + /Palatino-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Bold-latin1 + /Palatino-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-BoldItalic-latin1 + /Palatino-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Symbol-latin1 + /Symbol findfont +definefont pop +/ZapfChancery-MediumItalic-latin1 + /ZapfChancery-MediumItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/ZapfDingbats-latin1 + /ZapfDingbats findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +28.346000 -28.346000 scale +-0.479962 -18.550000 translate +%%EndProlog + + +0.100000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 21.750000 9.125000 m 21.750000 13.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.003922 0.003922 0.003922 srgb +n 1.500000 2.250000 m 0.912500 1.500000 l 0.625000 1.737500 l 1.387500 2.712500 l 0.975000 4.175000 l 1.437500 4.175000 l 1.687500 3.225000 l 1.925000 4.175000 l 2.350000 4.175000 l 2.025000 2.925000 l 2.662500 3.300000 l 2.837500 2.975000 l 1.962500 2.425000 l 1.925000 2.237500 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 1.725000 1.984686 0.338980 0.338980 121.081372 58.918628 ellipse s +/Helvetica-latin1 ff 0.650000 scf sf +0.000000 0.000000 0.000000 srgb +(User) dup sw 2 div 1.500000 ex sub 1.250000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.701961 0.701961 0.701961 srgb +n 14.500000 2.250000 m 14.500000 18.500000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.694118 0.694118 0.694118 srgb +n 19.750000 2.250000 m 19.750000 18.500000 l s +/Courier-Bold-latin1 ff 0.600000 scf sf +0.000000 0.000000 0.000000 srgb +(slurmctld) dup sw 2 div 14.500000 ex sub 1.750000 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.600000 scf sf +(slurmd) dup sw 2 div 19.750000 ex sub 1.750000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 9.000000 2.750000 m 14.250000 2.750010 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 13.850000 2.950009 m 14.250000 2.750010 l 13.850000 2.550009 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 13.850000 2.950009 m 14.250000 2.750010 l 13.850000 2.550009 l cp s +0.537255 0.537255 0.733333 srgb +n 14.250000 2.750010 m 14.250000 3.750010 l 14.750000 3.750010 l 14.750000 2.750010 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.250000 2.750010 m 14.250000 3.750010 l 14.750000 3.750010 l 14.750000 2.750010 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 14.250000 3.750010 m 9.000000 3.750000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 9.400000 3.550001 m 9.000000 3.750000 l 9.400000 3.950001 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.400000 3.550001 m 9.000000 3.750000 l 9.400000 3.950001 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(allocate req) dup sw 2 div 11.750000 ex sub 2.625000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.600000 scf sf +(allocate reply) dup sw 2 div 12.000000 ex sub 3.625000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 7.750000 7.500000 m 19.500000 7.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 19.100000 7.700000 m 19.500000 7.500000 l 19.100000 7.300000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.100000 7.700000 m 19.500000 7.500000 l 19.100000 7.300000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run job step req) dup sw 2 div 13.500000 ex sub 7.375000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 14.250000 6.500000 m 7.250000 6.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 7.650000 6.300000 m 7.250000 6.500000 l 7.650000 6.700000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.650000 6.300000 m 7.250000 6.500000 l 7.650000 6.700000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(job step reply) dup sw 2 div 11.250000 ex sub 6.375000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 19.500000 7.500000 m 19.500000 9.000000 l 20.000003 9.000000 l 20.000003 7.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.500000 7.500000 m 19.500000 9.000000 l 20.000003 9.000000 l 20.000003 7.500000 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +(job_mgr) 20.750000 8.375000 m gs 1 -1 sc sh gr +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.750000 9.000000 m 20.500000 9.000000 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 20.200000 9.150000 m 20.500000 9.000000 l 20.200000 8.850000 l s +/Courier-Bold-latin1 ff 0.500000 scf sf +(session_mgr) 21.500000 9.000000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 21.500000 9.750000 m 7.750000 9.749990 l s +0.080000 slw +[] 0 sd +0 slj +0 slc +n 21.500000 9.750000 m 21.500000 9.822500 21.427500 9.895000 21.355000 9.895000 c 21.282500 9.895000 21.210000 9.822500 21.210000 9.750000 c 21.210000 9.677500 21.282500 9.605000 21.355000 9.605000 c 21.427500 9.605000 21.500000 9.677500 21.500000 9.750000 c f +n 21.375000 9.500000 m 21.375000 10.000000 l s +0 slj +n 8.250000 9.499990 m 7.750000 9.749990 l 8.250000 9.999990 l f +/Helvetica-latin1 ff 0.600000 scf sf +(connect\(stdout/err\)) dup sw 2 div 14.500000 ex sub 9.625000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 21.500000 13.500000 m 7.750000 13.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 8.150000 13.300000 m 7.750000 13.500000 l 8.150000 13.700000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.150000 13.300000 m 7.750000 13.500000 l 8.150000 13.700000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(task exit msg) dup sw 2 div 17.000000 ex sub 13.375000 m gs 1 -1 sc sh gr +0.100000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 20.750000 8.625000 m 20.750000 14.000000 l s +0.537255 0.537255 0.749020 srgb +n 20.500000 9.000000 m 20.500000 9.500000 l 21.000000 9.500000 l 21.000000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 20.500000 9.000000 m 20.500000 9.500000 l 21.000000 9.500000 l 21.000000 9.000000 l cp s +0.537255 0.537255 0.749020 srgb +n 21.500000 9.500000 m 21.500000 10.500000 l 22.000000 10.500000 l 22.000000 9.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 21.500000 9.500000 m 21.500000 10.500000 l 22.000000 10.500000 l 22.000000 9.500000 l cp s +0.537255 0.537255 0.749020 srgb +n 20.500000 14.000000 m 20.500000 15.000000 l 21.000000 15.000000 l 21.000000 14.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 20.500000 14.000000 m 20.500000 15.000000 l 21.000000 15.000000 l 21.000000 14.000000 l cp s +0.537255 0.537255 0.749020 srgb +n 19.500000 15.000000 m 19.500000 15.500000 l 20.000000 15.500000 l 20.000000 15.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.500000 15.000000 m 19.500000 15.500000 l 20.000000 15.500000 l 20.000000 15.000000 l cp s +/Courier-Bold-latin1 ff 0.600000 scf sf +(srun) dup sw 2 div 9.250000 ex sub 1.750000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 8.500000 2.750000 m 8.500000 4.250000 l 9.000000 4.250000 l 9.000000 2.750000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.500000 2.750000 m 8.500000 4.250000 l 9.000000 4.250000 l 9.000000 2.750000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 3.000000 2.750000 m 8.500000 2.750000 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 7.900000 2.950000 m 8.500000 2.750000 l 7.900000 2.550000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 8.750000 16.500000 m 3.000000 16.500000 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 3.600000 16.300000 m 3.000000 16.500000 l 3.600000 16.700000 l s +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 14.500000 11.000000 m 8.750000 11.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 9.150000 10.800000 m 8.750000 11.000000 l 9.150000 11.200000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.150000 10.800000 m 8.750000 11.000000 l 9.150000 11.200000 l cp s +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 8.750000 11.125000 m 14.500000 11.125000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 14.100000 11.325000 m 14.500000 11.125000 l 14.100000 10.925000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.100000 11.325000 m 14.500000 11.125000 l 14.100000 10.925000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(exit ) dup sw 2 div 2.250000 ex sub 16.500000 m gs 1 -1 sc sh gr +(status) dup sw 2 div 2.250000 ex sub 17.100000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 22.500000 10.500000 m 22.500000 13.000000 l 23.000000 13.000000 l 23.000000 10.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 22.500000 10.500000 m 22.500000 13.000000 l 23.000000 13.000000 l 23.000000 10.500000 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +() 23.000000 9.500000 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.500000 scf sf +(cmd) 22.500000 10.250000 m gs 1 -1 sc sh gr +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 20.750000 9.500000 m 21.500000 9.500000 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 21.200000 9.650000 m 21.500000 9.500000 l 21.200000 9.350000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 20.750000 15.000000 m 20.000000 15.000000 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 20.300000 14.850000 m 20.000000 15.000000 l 20.300000 15.150000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 22.000000 10.500000 m 22.500000 10.500000 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 22.200000 10.650000 m 22.500000 10.500000 l 22.200000 10.350000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 22.500000 13.000000 m 22.000000 13.000000 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 22.300000 12.850000 m 22.000000 13.000000 l 22.300000 13.150000 l s +/Helvetica-Bold-latin1 ff 0.500000 scf sf +(srun allocate) dup sw 2 div 4.500000 ex sub 2.625000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 21.500000 13.000000 m 21.500000 14.000000 l 22.000000 14.000000 l 22.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 21.500000 13.000000 m 21.500000 14.000000 l 22.000000 14.000000 l 22.000000 13.000000 l cp s +0.100000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 8.750000 4.250000 m 8.750000 15.500000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 8.750000 4.250000 m 4.250000 4.250000 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 4.650000 4.050000 m 4.250000 4.250000 l 4.650000 4.450000 l s +0.537255 0.537255 0.749020 srgb +n 3.750000 4.250000 m 3.750000 5.250000 l 4.250000 5.250000 l 4.250000 4.250000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.750000 4.250000 m 3.750000 5.250000 l 4.250000 5.250000 l 4.250000 4.250000 l cp s +/Courier-Bold-latin1 ff 0.600000 scf sf +(srun) dup sw 2 div 7.500000 ex sub 5.000000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 4.250000 5.250000 m 7.250000 5.250000 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 6.850000 5.450000 m 7.250000 5.250000 l 6.850000 5.050000 l s +0.100000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 4.000000 5.250000 m 4.000000 14.500000 l s +0.537255 0.537255 0.749020 srgb +n 7.250000 5.250000 m 7.250000 14.500000 l 7.750000 14.500000 l 7.750000 5.250000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.250000 5.250000 m 7.250000 14.500000 l 7.750000 14.500000 l 7.750000 5.250000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 7.750000 5.500000 m 14.250000 5.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 13.850000 5.700000 m 14.250000 5.500000 l 13.850000 5.300000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 13.850000 5.700000 m 14.250000 5.500000 l 13.850000 5.300000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(job step req) dup sw 2 div 11.250000 ex sub 5.375000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.733333 srgb +n 14.250000 5.500000 m 14.250000 6.500000 l 14.750000 6.500000 l 14.750000 5.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.250000 5.500000 m 14.250000 6.500000 l 14.750000 6.500000 l 14.750000 5.500000 l cp s +/Courier-Bold-latin1 ff 0.600000 scf sf +(sh) dup sw 2 div 4.000000 ex sub 3.750000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 7.250000 14.500000 m 4.315000 14.500000 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 4.715000 14.300000 m 4.315000 14.500000 l 4.715000 14.700000 l s +0.537255 0.537255 0.749020 srgb +n 3.750000 14.500000 m 3.750000 15.500000 l 4.315000 15.500000 l 4.315000 14.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.750000 14.500000 m 3.750000 15.500000 l 4.315000 15.500000 l 4.315000 14.500000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.500000 8.500000 m 7.750000 8.499990 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 8.150000 8.299990 m 7.750000 8.499990 l 8.150000 8.699990 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.150000 8.299990 m 7.750000 8.499990 l 8.150000 8.699990 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run job step reply) dup sw 2 div 13.500000 ex sub 8.375000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 4.315000 15.500000 m 8.500000 15.500000 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 8.100000 15.700000 m 8.500000 15.500000 l 8.100000 15.300000 l s +0.537255 0.537255 0.749020 srgb +n 8.500000 15.500000 m 8.500000 16.500000 l 9.000000 16.500000 l 9.000000 15.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.500000 15.500000 m 8.500000 16.500000 l 9.000000 16.500000 l 9.000000 15.500000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(release allocation) dup sw 2 div 11.500000 ex sub 15.875000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 9.000000 16.000000 m 14.250000 16.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 13.850000 16.200000 m 14.250000 16.000000 l 13.850000 15.800000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 13.850000 16.200000 m 14.250000 16.000000 l 13.850000 15.800000 l cp s +0.537255 0.537255 0.749020 srgb +n 14.250000 16.000000 m 14.250000 18.250000 l 14.750000 18.250000 l 14.750000 16.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.250000 16.000000 m 14.250000 18.250000 l 14.750000 18.250000 l 14.750000 16.000000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 14.750000 16.500000 m 19.500000 16.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 19.100000 16.700000 m 19.500000 16.500000 l 19.100000 16.300000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.100000 16.700000 m 19.500000 16.500000 l 19.100000 16.300000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run epilog req) dup sw 2 div 17.000000 ex sub 16.375000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.500000 18.000000 m 14.750000 18.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 15.150000 17.800000 m 14.750000 18.000000 l 15.150000 18.200000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 15.150000 17.800000 m 14.750000 18.000000 l 15.150000 18.200000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run epilog reply) dup sw 2 div 17.500000 ex sub 17.875000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 19.500000 16.500000 m 19.500000 18.000000 l 20.000000 18.000000 l 20.000000 16.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.500000 16.500000 m 19.500000 18.000000 l 20.000000 18.000000 l 20.000000 16.500000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 7.750000 14.250000 m 14.500000 14.250000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 14.100000 14.450000 m 14.500000 14.250000 l 14.100000 14.050000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.100000 14.450000 m 14.500000 14.250000 l 14.100000 14.050000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(release job step) dup sw 2 div 11.250000 ex sub 14.125000 m gs 1 -1 sc sh gr +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 14.500000 11.750000 m 7.750000 11.750000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 8.150000 11.550000 m 7.750000 11.750000 l 8.150000 11.950000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.150000 11.550000 m 7.750000 11.750000 l 8.150000 11.950000 l cp s +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 7.750000 11.875000 m 14.500000 11.875000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 14.100000 12.075000 m 14.500000 11.875000 l 14.100000 11.675000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.100000 12.075000 m 14.500000 11.875000 l 14.100000 11.675000 l cp s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 1.250000 m 6.250000 18.500000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 1.250000 m 5.750000 1.750000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 1.920000 m 5.750000 2.420000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 2.590000 m 5.750000 3.090000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 3.260000 m 5.750000 3.760000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 3.930000 m 5.750000 4.430000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 4.600000 m 5.750000 5.100000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 5.270000 m 5.750000 5.770000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 5.940000 m 5.750000 6.440000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 6.610000 m 5.750000 7.110000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 7.280000 m 5.750000 7.780000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 7.950000 m 5.750000 8.450000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 8.620000 m 5.750000 9.120000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 9.290000 m 5.750000 9.790000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 9.960000 m 5.750000 10.460000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 10.630000 m 5.750000 11.130000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 11.300000 m 5.750000 11.800000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 11.970000 m 5.750000 12.470000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 12.640000 m 5.750000 13.140000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 13.310000 m 5.750000 13.810000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 13.980000 m 5.750000 14.480000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 14.650000 m 5.750000 15.150000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 15.320000 m 5.750000 15.820000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 15.990000 m 5.750000 16.490000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 16.660000 m 5.750000 17.160000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 17.330000 m 5.750000 17.830000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 18.000000 m 5.750000 18.500000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 21.500000 14.000000 m 21.000000 14.000000 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 21.300000 13.850000 m 21.000000 14.000000 l 21.300000 14.150000 l s +/Helvetica-latin1 ff 0.600000 scf sf +(job/job step status) dup sw 2 div 11.750000 ex sub 11.625000 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.500000 scf sf +(prolog) 21.185000 7.668330 m gs 1 -1 sc sh gr +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 20.000000 7.500000 m 21.000000 7.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 20.600000 7.700000 m 21.000000 7.500000 l 20.600000 7.300000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 20.600000 7.700000 m 21.000000 7.500000 l 20.600000 7.300000 l cp s +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 20.000000 16.500000 m 21.075000 16.535000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 20.668704 16.721878 m 21.075000 16.535000 l 20.681720 16.322090 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 20.668704 16.721878 m 21.075000 16.535000 l 20.681720 16.322090 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +(epilog) 21.285000 16.668300 m gs 1 -1 sc sh gr +showpage diff --git a/executable_names/doc/figures/arch.dia b/executable_names/doc/figures/arch.dia new file mode 100644 index 0000000000000000000000000000000000000000..d4347e0ae78856b27212701b8587646b1e1d5d2c --- /dev/null +++ b/executable_names/doc/figures/arch.dia @@ -0,0 +1,5 @@ + +#Letter##scancel##srun##squeue##sinfo##slurmctld +(primary)##slurmctld +(backup)##scontrol##slurmd##slurmd##slurmd##User +Commands##Controller##daemons##Compute node##daemons# diff --git a/executable_names/doc/figures/arch.eps b/executable_names/doc/figures/arch.eps new file mode 100644 index 0000000000000000000000000000000000000000..71f85ce0ba084f60bcbef9c503e257f49b60f633 --- /dev/null +++ b/executable_names/doc/figures/arch.eps @@ -0,0 +1,3929 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: arch.dia +%%Creator: Dia v0.91 +%%CreationDate: Wed Apr 9 06:48:11 2003 +%%For: grondo +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 784 613 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-0.555625 -22.565680 translate +%%EndProlog + + +0.498039 0.498039 0.498039 srgb +n 1.750000 4.625000 m 1.750000 6.375000 l 6.000000 6.375000 l 6.000000 4.625000 l f +n 1.750000 5.500000 m 1.750000 5.500000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 6.000000 5.500000 m 6.000000 5.500000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 0.875000 5.500000 m 0.875000 5.500000 l 6.875000 5.500000 l 6.875000 5.500000 l f +n 1.750000 5.500000 m 1.750000 5.500000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 6.000000 5.500000 m 6.000000 5.500000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 1.750000 4.625000 m 6.000000 4.625000 l s +n 1.750000 6.375000 m 6.000000 6.375000 l s +n 1.750000 5.500000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 6.000000 5.500000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 0.875000 5.500000 m 0.875000 5.500000 l s +n 6.875000 5.500000 m 6.875000 5.500000 l s +n 1.750000 5.500000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 6.000000 5.500000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 2.000000 7.375000 m 2.000000 9.125000 l 5.550000 9.125000 l 5.550000 7.375000 l f +n 2.000000 8.250000 m 2.000000 8.250000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 5.550000 8.250000 m 5.550000 8.250000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 1.125000 8.250000 m 1.125000 8.250000 l 6.425000 8.250000 l 6.425000 8.250000 l f +n 2.000000 8.250000 m 2.000000 8.250000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 5.550000 8.250000 m 5.550000 8.250000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 2.000000 7.375000 m 5.550000 7.375000 l s +n 2.000000 9.125000 m 5.550000 9.125000 l s +n 2.000000 8.250000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 5.550000 8.250000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 1.125000 8.250000 m 1.125000 8.250000 l s +n 6.425000 8.250000 m 6.425000 8.250000 l s +n 2.000000 8.250000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 5.550000 8.250000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 2.000000 10.125000 m 2.000000 11.875000 l 5.550000 11.875000 l 5.550000 10.125000 l f +n 2.000000 11.000000 m 2.000000 11.000000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 5.550000 11.000000 m 5.550000 11.000000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 1.125000 11.000000 m 1.125000 11.000000 l 6.425000 11.000000 l 6.425000 11.000000 l f +n 2.000000 11.000000 m 2.000000 11.000000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 5.550000 11.000000 m 5.550000 11.000000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 2.000000 10.125000 m 5.550000 10.125000 l s +n 2.000000 11.875000 m 5.550000 11.875000 l s +n 2.000000 11.000000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 5.550000 11.000000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 1.125000 11.000000 m 1.125000 11.000000 l s +n 6.425000 11.000000 m 6.425000 11.000000 l s +n 2.000000 11.000000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 5.550000 11.000000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 2.000000 12.875000 m 2.000000 14.625000 l 5.550000 14.625000 l 5.550000 12.875000 l f +n 2.000000 13.750000 m 2.000000 13.750000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 5.550000 13.750000 m 5.550000 13.750000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 1.125000 13.750000 m 1.125000 13.750000 l 6.425000 13.750000 l 6.425000 13.750000 l f +n 2.000000 13.750000 m 2.000000 13.750000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 5.550000 13.750000 m 5.550000 13.750000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 2.000000 12.875000 m 5.550000 12.875000 l s +n 2.000000 14.625000 m 5.550000 14.625000 l s +n 2.000000 13.750000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 5.550000 13.750000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 1.125000 13.750000 m 1.125000 13.750000 l s +n 6.425000 13.750000 m 6.425000 13.750000 l s +n 2.000000 13.750000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 5.550000 13.750000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 2.000000 15.375000 m 2.000000 17.125000 l 5.550000 17.125000 l 5.550000 15.375000 l f +n 2.000000 16.250000 m 2.000000 16.250000 0.875000 0.875000 180.000000 270.000000 ellipse f +n 5.550000 16.250000 m 5.550000 16.250000 0.875000 0.875000 270.000000 360.000000 ellipse f +n 1.125000 16.250000 m 1.125000 16.250000 l 6.425000 16.250000 l 6.425000 16.250000 l f +n 2.000000 16.250000 m 2.000000 16.250000 0.875000 0.875000 90.000000 180.000000 ellipse f +n 5.550000 16.250000 m 5.550000 16.250000 0.875000 0.875000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 2.000000 15.375000 m 5.550000 15.375000 l s +n 2.000000 17.125000 m 5.550000 17.125000 l s +n 2.000000 16.250000 0.875000 0.875000 180.000000 270.000000 ellipse s +n 5.550000 16.250000 0.875000 0.875000 270.000000 360.000000 ellipse s +n 1.125000 16.250000 m 1.125000 16.250000 l s +n 6.425000 16.250000 m 6.425000 16.250000 l s +n 2.000000 16.250000 0.875000 0.875000 90.000000 180.000000 ellipse s +n 5.550000 16.250000 0.875000 0.875000 0.000000 90.000000 ellipse s +n 12.005600 9.111450 m 12.005600 12.811450 l 20.205600 12.811450 l 20.205600 9.111450 l f +n 12.005600 9.511450 m 12.005600 9.511450 0.400000 0.400000 180.000000 270.000000 ellipse f +n 20.205600 9.511450 m 20.205600 9.511450 0.400000 0.400000 270.000000 360.000000 ellipse f +n 11.605600 9.511450 m 11.605600 12.411450 l 20.605600 12.411450 l 20.605600 9.511450 l f +n 12.005600 12.411450 m 12.005600 12.411450 0.400000 0.400000 90.000000 180.000000 ellipse f +n 20.205600 12.411450 m 20.205600 12.411450 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 12.005600 9.111450 m 20.205600 9.111450 l s +n 12.005600 12.811450 m 20.205600 12.811450 l s +n 12.005600 9.511450 0.400000 0.400000 180.000000 270.000000 ellipse s +n 20.205600 9.511450 0.400000 0.400000 270.000000 360.000000 ellipse s +n 11.605600 9.511450 m 11.605600 12.411450 l s +n 20.605600 9.511450 m 20.605600 12.411450 l s +n 12.005600 12.411450 0.400000 0.400000 90.000000 180.000000 ellipse s +n 20.205600 12.411450 0.400000 0.400000 0.000000 90.000000 ellipse s +n 16.005600 4.111450 m 16.005600 7.411450 l 22.155600 7.411450 l 22.155600 4.111450 l f +n 16.005600 4.511450 m 16.005600 4.511450 0.400000 0.400000 180.000000 270.000000 ellipse f +n 22.155600 4.511450 m 22.155600 4.511450 0.400000 0.400000 270.000000 360.000000 ellipse f +n 15.605600 4.511450 m 15.605600 7.011450 l 22.555600 7.011450 l 22.555600 4.511450 l f +n 16.005600 7.011450 m 16.005600 7.011450 0.400000 0.400000 90.000000 180.000000 ellipse f +n 22.155600 7.011450 m 22.155600 7.011450 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 16.005600 4.111450 m 22.155600 4.111450 l s +n 16.005600 7.411450 m 22.155600 7.411450 l s +n 16.005600 4.511450 0.400000 0.400000 180.000000 270.000000 ellipse s +n 22.155600 4.511450 0.400000 0.400000 270.000000 360.000000 ellipse s +n 15.605600 4.511450 m 15.605600 7.011450 l s +n 22.555600 4.511450 m 22.555600 7.011450 l s +n 16.005600 7.011450 0.400000 0.400000 90.000000 180.000000 ellipse s +n 22.155600 7.011450 0.400000 0.400000 0.000000 90.000000 ellipse s +n 9.105630 18.261500 m 9.105630 20.111500 l 12.555630 20.111500 l 12.555630 18.261500 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 9.105630 18.261500 m 9.105630 20.111500 l 12.555630 20.111500 l 12.555630 18.261500 l cp s +n 13.355600 18.261500 m 13.355600 20.111500 l 16.805600 20.111500 l 16.805600 18.261500 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 13.355600 18.261500 m 13.355600 20.111500 l 16.805600 20.111500 l 16.805600 18.261500 l cp s +n 19.405600 18.261500 m 19.405600 20.111500 l 22.855600 20.111500 l 22.855600 18.261500 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 19.405600 18.261500 m 19.405600 20.111500 l 22.855600 20.111500 l 22.855600 18.261500 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 19.029394 13.188297 m 19.818300 13.840200 20.818300 15.940200 21.032535 17.239360 c s +0 slj +n 19.188643 12.995580 m 18.412700 12.678700 l 18.870144 13.381014 l f +0 slj +n 20.785867 17.280037 m 21.162700 18.028700 l 21.279204 17.198684 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.932418 13.359263 m 15.055600 15.386500 15.205600 16.111500 15.231197 17.200221 c s +0 slj +n 16.161875 13.458507 m 16.250000 12.625000 l 15.702961 13.260018 l f +0 slj +n 14.981266 17.206097 m 15.250000 18.000000 l 15.481128 17.194345 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.847040 13.409272 m 14.970300 15.436500 15.120300 16.136500 15.145839 17.225220 c s +0 slj +n 16.076500 13.508510 m 16.164600 12.675000 l 15.617580 13.310035 l f +0 slj +n 14.895908 17.231083 m 15.164600 18.025000 l 15.395770 17.219357 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 13.260655 13.105887 m 11.679900 14.170500 10.974600 16.143100 10.942543 17.231946 c s +0 slj +n 13.400307 13.313245 m 13.924200 12.659000 l 13.121003 12.898529 l f +0 slj +n 10.692651 17.224589 m 10.919000 18.031600 l 11.192435 17.239304 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.899328 17.846934 m 3.935120 19.603400 6.933330 22.608500 10.254266 20.478941 c s +0 slj +n 4.149276 17.841841 m 3.883030 17.047100 l 3.649380 17.852027 l f +0 slj +n 10.389217 20.689389 m 10.927700 20.047100 l 10.119316 20.268493 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.898465 17.854111 m 3.981360 21.665700 11.542300 23.452200 14.602661 20.587416 c s +0 slj +n 4.148405 17.848675 m 3.881070 17.054300 l 3.648524 17.859547 l f +0 slj +n 14.773509 20.769928 m 15.186700 20.040700 l 14.431812 20.404903 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.881413 17.876497 m 3.968900 23.338000 17.036300 23.972900 20.548604 20.660390 c s +0 slj +n 4.131381 17.872493 m 3.868600 17.076600 l 3.631445 17.880502 l f +0 slj +n 20.720132 20.842264 m 21.130600 20.111500 l 20.377076 20.478516 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 6.994366 15.537278 m 7.461400 14.799600 9.511400 12.699600 10.914957 12.127613 c s +0 slj +n 6.783140 15.403548 m 6.566430 16.213200 l 7.205592 15.671008 l f +0 slj +n 11.009305 12.359127 m 11.655800 11.825700 l 10.820609 11.896100 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.193068 13.184354 m 8.568690 11.946400 9.779980 11.607100 10.935189 11.190750 c s +0 slj +n 7.025835 12.998523 m 6.598410 13.719500 l 7.360301 13.370184 l f +0 slj +n 11.019954 11.425941 m 11.687800 10.919500 l 10.850423 10.955559 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.332861 10.696473 m 8.509050 10.303300 10.259100 10.055800 10.864442 10.026404 c s +0 slj +n 7.253603 10.459370 m 6.574130 10.950100 l 7.412120 10.933577 l f +0 slj +n 10.876568 10.276109 m 11.663500 9.987600 l 10.852316 9.776698 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.749201 5.419536 m 9.313720 5.386450 13.789300 5.725000 13.884019 8.225573 c s +0 slj +n 7.743915 5.169592 m 6.949380 5.436450 l 7.754487 5.669480 l f +0 slj +n 13.634198 8.235036 m 13.914300 9.025000 l 14.133840 8.216110 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.348807 8.149207 m 8.738980 8.085710 10.332200 8.519290 11.043573 8.836039 c s +0 slj +n 7.337400 7.899468 m 6.549640 8.185710 l 7.360214 8.398947 l f +0 slj +n 10.941882 9.064422 m 11.774400 9.161450 l 11.145264 8.607656 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.175935 7.920991 m 19.181065 8.439619 l s +0 slj +n 19.425923 7.918518 m 19.170000 7.321020 l 18.925947 7.923464 l f +0 slj +n 18.931077 8.442092 m 19.187000 9.039590 l 19.431053 8.437146 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.521569 0.580392 0.839216 srgb +n 2.151777 12.750000 m 5.758883 12.750000 l 6.256921 12.750000 6.660660 13.141751 6.660660 13.625000 c 6.660660 14.108249 6.256921 14.500000 5.758883 14.500000 c 2.151777 14.500000 l 1.653739 14.500000 1.250000 14.108249 1.250000 13.625000 c 1.250000 13.141751 1.653739 12.750000 2.151777 12.750000 c f +0.000000 0.000000 0.000000 srgb +n 2.151777 12.750000 m 5.758883 12.750000 l 6.256921 12.750000 6.660660 13.141751 6.660660 13.625000 c 6.660660 14.108249 6.256921 14.500000 5.758883 14.500000 c 2.151777 14.500000 l 1.653739 14.500000 1.250000 14.108249 1.250000 13.625000 c 1.250000 13.141751 1.653739 12.750000 2.151777 12.750000 c s +gsave 2.524463 13.825000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 2.939330 13.825000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 3.354197 13.825000 translate 0.035278 -0.035278 scale +start_ol +1984 0 moveto +2583 0 lineto +2691 0 2762 12 2798 43 curveto +2875 99 2921 203 2921 308 curveto +2921 375 2880 438 2817 480 curveto +2766 510 2719 518 2579 518 curveto +2496 518 lineto +2496 1562 lineto +2496 1988 2112 2240 1473 2240 curveto +1213 2240 829 2173 580 2085 curveto +476 2048 424 1976 424 1867 curveto +424 1785 534 1722 681 1722 curveto +728 1722 801 1722 890 1722 curveto +1131 1722 1324 1722 1497 1722 curveto +1832 1722 1984 1660 1984 1519 curveto +1984 1423 lineto +1772 1457 1611 1472 1445 1472 curveto +984 1472 627 1346 394 1104 curveto +270 973 192 804 192 654 curveto +192 295 612 0 1124 0 curveto +1430 0 1735 51 1984 142 curveto +1984 0 lineto +1984 702 moveto +1692 579 1394 518 1108 518 curveto +879 518 704 595 704 694 curveto +704 866 1033 1024 1394 1024 curveto +1575 1024 1772 1003 1984 966 curveto +1984 702 lineto +end_ol grestore +gsave 3.769063 13.825000 translate 0.035278 -0.035278 scale +start_ol +1024 2240 moveto +541 2240 lineto +499 2240 489 2240 433 2228 curveto +283 2210 196 2103 196 1942 curveto +196 1760 310 1664 512 1658 curveto +512 492 lineto +481 492 lineto +351 492 310 482 263 458 curveto +186 413 139 330 139 246 curveto +139 172 180 93 241 49 curveto +293 15 354 0 477 0 curveto +1050 0 lineto +1158 0 1224 10 1265 34 curveto +1342 84 1388 162 1388 246 curveto +1388 325 1348 399 1282 448 curveto +1231 482 1191 492 1054 492 curveto +1024 492 lineto +1024 1387 lineto +1262 1638 1424 1722 1657 1722 curveto +1970 1722 2112 1609 2112 1368 curveto +2112 492 lineto +1914 492 1803 403 1803 246 curveto +1803 84 1916 0 2146 0 curveto +2602 0 lineto +2710 0 2776 10 2817 34 curveto +2894 79 2940 162 2940 246 curveto +2940 403 2826 492 2624 492 curveto +2624 1387 lineto +2624 1687 2527 1900 2324 2052 curveto +2157 2174 1948 2240 1720 2240 curveto +1441 2240 1268 2170 1024 1954 curveto +1024 2240 lineto +end_ol grestore +gsave 4.183930 13.825000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 4.598797 13.825000 translate 0.035278 -0.035278 scale +start_ol +2851 896 moveto +2851 1095 lineto +2851 1756 2281 2240 1509 2240 curveto +752 2240 171 1752 171 1120 curveto +171 463 736 0 1540 0 curveto +1908 0 2436 93 2670 197 curveto +2794 254 2851 326 2851 430 curveto +2851 559 2742 660 2602 660 curveto +2556 660 2494 651 2431 638 curveto +1954 535 1825 518 1586 518 curveto +1130 518 855 638 736 896 curveto +2851 896 lineto +752 1344 moveto +829 1571 1135 1722 1514 1722 curveto +1892 1722 2193 1575 2276 1344 curveto +752 1344 lineto +end_ol grestore +gsave 5.013663 13.825000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.521569 0.580392 0.839216 srgb +n 2.151777 15.250000 m 5.758883 15.250000 l 6.256921 15.250000 6.660660 15.641751 6.660660 16.125000 c 6.660660 16.608249 6.256921 17.000000 5.758883 17.000000 c 2.151777 17.000000 l 1.653739 17.000000 1.250000 16.608249 1.250000 16.125000 c 1.250000 15.641751 1.653739 15.250000 2.151777 15.250000 c f +0.000000 0.000000 0.000000 srgb +n 2.151777 15.250000 m 5.758883 15.250000 l 6.256921 15.250000 6.660660 15.641751 6.660660 16.125000 c 6.660660 16.608249 6.256921 17.000000 5.758883 17.000000 c 2.151777 17.000000 l 1.653739 17.000000 1.250000 16.608249 1.250000 16.125000 c 1.250000 15.641751 1.653739 15.250000 2.151777 15.250000 c s +gsave 3.138297 16.325000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 3.553163 16.325000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 3.968030 16.325000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 4.382897 16.325000 translate 0.035278 -0.035278 scale +start_ol +1024 2240 moveto +541 2240 lineto +499 2240 489 2240 433 2228 curveto +283 2210 196 2103 196 1942 curveto +196 1760 310 1664 512 1658 curveto +512 492 lineto +481 492 lineto +351 492 310 482 263 458 curveto +186 413 139 330 139 246 curveto +139 172 180 93 241 49 curveto +293 15 354 0 477 0 curveto +1050 0 lineto +1158 0 1224 10 1265 34 curveto +1342 84 1388 162 1388 246 curveto +1388 325 1348 399 1282 448 curveto +1231 482 1191 492 1054 492 curveto +1024 492 lineto +1024 1387 lineto +1262 1638 1424 1722 1657 1722 curveto +1970 1722 2112 1609 2112 1368 curveto +2112 492 lineto +1914 492 1803 403 1803 246 curveto +1803 84 1916 0 2146 0 curveto +2602 0 lineto +2710 0 2776 10 2817 34 curveto +2894 79 2940 162 2940 246 curveto +2940 403 2826 492 2624 492 curveto +2624 1387 lineto +2624 1687 2527 1900 2324 2052 curveto +2157 2174 1948 2240 1720 2240 curveto +1441 2240 1268 2170 1024 1954 curveto +1024 2240 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.521569 0.580392 0.839216 srgb +n 2.151777 10.000000 m 5.758883 10.000000 l 6.256921 10.000000 6.660660 10.391751 6.660660 10.875000 c 6.660660 11.358249 6.256921 11.750000 5.758883 11.750000 c 2.151777 11.750000 l 1.653739 11.750000 1.250000 11.358249 1.250000 10.875000 c 1.250000 10.391751 1.653739 10.000000 2.151777 10.000000 c f +0.000000 0.000000 0.000000 srgb +n 2.151777 10.000000 m 5.758883 10.000000 l 6.256921 10.000000 6.660660 10.391751 6.660660 10.875000 c 6.660660 11.358249 6.256921 11.750000 5.758883 11.750000 c 2.151777 11.750000 l 1.653739 11.750000 1.250000 11.358249 1.250000 10.875000 c 1.250000 10.391751 1.653739 10.000000 2.151777 10.000000 c s +gsave 2.727663 11.075000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 3.142530 11.075000 translate 0.035278 -0.035278 scale +start_ol +2240 -576 moveto +1941 -576 lineto +1817 -576 1766 -586 1725 -612 curveto +1647 -658 1601 -745 1601 -832 curveto +1601 -914 1637 -986 1704 -1037 curveto +1756 -1078 1812 -1088 1941 -1088 curveto +2837 -1088 lineto +2950 -1088 3012 -1078 3053 -1052 curveto +3131 -1001 3177 -919 3177 -832 curveto +3177 -750 3136 -673 3073 -622 curveto +3022 -586 2975 -576 2835 -576 curveto +2752 -576 lineto +2752 1722 lineto +2835 1722 lineto +2954 1722 3011 1730 3053 1749 curveto +3130 1783 3177 1849 3177 1914 curveto +3177 2018 3136 2116 3074 2181 curveto +3023 2227 2976 2240 2837 2240 curveto +2240 2240 lineto +2240 1940 lineto +1988 2157 1772 2240 1448 2240 curveto +727 2240 192 1765 192 1122 curveto +192 514 722 64 1437 64 curveto +1741 64 1972 146 2240 351 curveto +2240 -576 lineto +1467 1722 moveto +1926 1722 2240 1483 2240 1144 curveto +2240 991 2142 820 1993 714 curveto +1864 624 1688 576 1472 576 curveto +1256 576 1080 624 951 714 curveto +802 820 704 991 704 1149 curveto +704 1307 802 1478 951 1584 curveto +1085 1674 1256 1722 1467 1722 curveto +end_ol grestore +gsave 3.557397 11.075000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 3.972263 11.075000 translate 0.035278 -0.035278 scale +start_ol +2851 896 moveto +2851 1095 lineto +2851 1756 2281 2240 1509 2240 curveto +752 2240 171 1752 171 1120 curveto +171 463 736 0 1540 0 curveto +1908 0 2436 93 2670 197 curveto +2794 254 2851 326 2851 430 curveto +2851 559 2742 660 2602 660 curveto +2556 660 2494 651 2431 638 curveto +1954 535 1825 518 1586 518 curveto +1130 518 855 638 736 896 curveto +2851 896 lineto +752 1344 moveto +829 1571 1135 1722 1514 1722 curveto +1892 1722 2193 1575 2276 1344 curveto +752 1344 lineto +end_ol grestore +gsave 4.387130 11.075000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 4.801997 11.075000 translate 0.035278 -0.035278 scale +start_ol +2851 896 moveto +2851 1095 lineto +2851 1756 2281 2240 1509 2240 curveto +752 2240 171 1752 171 1120 curveto +171 463 736 0 1540 0 curveto +1908 0 2436 93 2670 197 curveto +2794 254 2851 326 2851 430 curveto +2851 559 2742 660 2602 660 curveto +2556 660 2494 651 2431 638 curveto +1954 535 1825 518 1586 518 curveto +1130 518 855 638 736 896 curveto +2851 896 lineto +752 1344 moveto +829 1571 1135 1722 1514 1722 curveto +1892 1722 2193 1575 2276 1344 curveto +752 1344 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.521569 0.580392 0.839216 srgb +n 2.151777 7.250000 m 5.758883 7.250000 l 6.256921 7.250000 6.660660 7.641751 6.660660 8.125000 c 6.660660 8.608249 6.256921 9.000000 5.758883 9.000000 c 2.151777 9.000000 l 1.653739 9.000000 1.250000 8.608249 1.250000 8.125000 c 1.250000 7.641751 1.653739 7.250000 2.151777 7.250000 c f +0.000000 0.000000 0.000000 srgb +n 2.151777 7.250000 m 5.758883 7.250000 l 6.256921 7.250000 6.660660 7.641751 6.660660 8.125000 c 6.660660 8.608249 6.256921 9.000000 5.758883 9.000000 c 2.151777 9.000000 l 1.653739 9.000000 1.250000 8.608249 1.250000 8.125000 c 1.250000 7.641751 1.653739 7.250000 2.151777 7.250000 c s +gsave 2.935097 8.325000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 3.349963 8.325000 translate 0.035278 -0.035278 scale +start_ol +1792 2240 moveto +855 2240 lineto +718 2240 676 2235 628 2204 curveto +549 2157 502 2069 502 1981 curveto +502 1898 544 1820 611 1774 curveto +658 1732 720 1722 850 1722 curveto +1280 1722 lineto +1280 518 lineto +621 518 lineto +486 518 450 513 403 482 curveto +326 435 279 347 279 259 curveto +279 176 321 98 389 52 curveto +431 16 504 0 624 0 curveto +2422 0 lineto +2527 0 2605 16 2642 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 2240 lineto +1728 3200 moveto +1088 3200 lineto +1088 2656 lineto +1728 2656 lineto +1728 3200 lineto +end_ol grestore +gsave 3.764830 8.325000 translate 0.035278 -0.035278 scale +start_ol +1024 2240 moveto +541 2240 lineto +499 2240 489 2240 433 2228 curveto +283 2210 196 2103 196 1942 curveto +196 1760 310 1664 512 1658 curveto +512 492 lineto +481 492 lineto +351 492 310 482 263 458 curveto +186 413 139 330 139 246 curveto +139 172 180 93 241 49 curveto +293 15 354 0 477 0 curveto +1050 0 lineto +1158 0 1224 10 1265 34 curveto +1342 84 1388 162 1388 246 curveto +1388 325 1348 399 1282 448 curveto +1231 482 1191 492 1054 492 curveto +1024 492 lineto +1024 1387 lineto +1262 1638 1424 1722 1657 1722 curveto +1970 1722 2112 1609 2112 1368 curveto +2112 492 lineto +1914 492 1803 403 1803 246 curveto +1803 84 1916 0 2146 0 curveto +2602 0 lineto +2710 0 2776 10 2817 34 curveto +2894 79 2940 162 2940 246 curveto +2940 403 2826 492 2624 492 curveto +2624 1387 lineto +2624 1687 2527 1900 2324 2052 curveto +2157 2174 1948 2240 1720 2240 curveto +1441 2240 1268 2170 1024 1954 curveto +1024 2240 lineto +end_ol grestore +gsave 4.179697 8.325000 translate 0.035278 -0.035278 scale +start_ol +1536 1722 moveto +2319 1722 lineto +2433 1722 2495 1732 2537 1758 curveto +2614 1810 2661 1893 2661 1981 curveto +2661 2064 2620 2142 2552 2193 curveto +2500 2230 2459 2240 2319 2240 curveto +1536 2240 lineto +1536 2430 lineto +1536 2600 1676 2682 1971 2682 curveto +2132 2682 2381 2682 2557 2682 curveto +2619 2682 2671 2682 2702 2682 curveto +2837 2682 2946 2765 2946 2874 curveto +2946 2993 2869 3081 2729 3117 curveto +2564 3164 2238 3200 2021 3200 curveto +1406 3200 1024 2920 1024 2467 curveto +1024 2240 lineto +786 2240 lineto +646 2240 609 2235 563 2204 curveto +485 2157 438 2069 438 1981 curveto +438 1898 479 1820 547 1774 curveto +593 1732 656 1722 780 1722 curveto +1024 1722 lineto +1024 518 lineto +723 518 lineto +588 518 552 513 505 482 curveto +428 435 381 347 381 259 curveto +381 181 422 98 484 52 curveto +531 16 603 0 722 0 curveto +2258 0 lineto +2361 0 2439 16 2475 36 curveto +2552 88 2599 171 2599 259 curveto +2599 342 2558 420 2495 471 curveto +2444 508 2397 518 2257 518 curveto +1536 518 lineto +1536 1722 lineto +end_ol grestore +gsave 4.594563 8.325000 translate 0.035278 -0.035278 scale +start_ol +1552 2240 moveto +781 2240 192 1755 192 1120 curveto +192 495 786 0 1536 0 curveto +2286 0 2880 495 2880 1120 curveto +2880 1740 2286 2240 1552 2240 curveto +1547 1722 moveto +2005 1722 2368 1455 2368 1120 curveto +2368 781 2005 518 1536 518 curveto +1067 518 704 781 704 1120 curveto +704 1464 1067 1722 1547 1722 curveto +end_ol grestore +0.462745 0.615686 0.462745 srgb +n 12.150000 9.000000 m 12.150000 12.650000 l 20.350000 12.650000 l 20.350000 9.000000 l f +n 12.150000 9.400000 m 12.150000 9.400000 0.400000 0.400000 180.000000 270.000000 ellipse f +n 20.350000 9.400000 m 20.350000 9.400000 0.400000 0.400000 270.000000 360.000000 ellipse f +n 11.750000 9.400000 m 11.750000 12.250000 l 20.750000 12.250000 l 20.750000 9.400000 l f +n 12.150000 12.250000 m 12.150000 12.250000 0.400000 0.400000 90.000000 180.000000 ellipse f +n 20.350000 12.250000 m 20.350000 12.250000 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 12.150000 9.000000 m 20.350000 9.000000 l s +n 12.150000 12.650000 m 20.350000 12.650000 l s +n 12.150000 9.400000 0.400000 0.400000 180.000000 270.000000 ellipse s +n 20.350000 9.400000 0.400000 0.400000 270.000000 360.000000 ellipse s +n 11.750000 9.400000 m 11.750000 12.250000 l s +n 20.750000 9.400000 m 20.750000 12.250000 l s +n 12.150000 12.250000 0.400000 0.400000 90.000000 180.000000 ellipse s +n 20.350000 12.250000 0.400000 0.400000 0.000000 90.000000 ellipse s +gsave 14.378867 10.575000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 14.793733 10.575000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 15.208600 10.575000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 15.623467 10.575000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 16.038333 10.575000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 16.453200 10.575000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 16.868067 10.575000 translate 0.035278 -0.035278 scale +start_ol +1088 1722 moveto +2026 1722 lineto +2140 1722 2202 1732 2244 1758 curveto +2321 1805 2368 1893 2368 1981 curveto +2368 2064 2327 2142 2264 2193 curveto +2207 2230 2166 2240 2026 2240 curveto +1088 2240 lineto +1088 2679 lineto +1088 2809 1083 2843 1052 2888 curveto +1006 2963 919 3008 832 3008 curveto +750 3008 673 2968 627 2908 curveto +586 2858 576 2809 576 2679 curveto +576 2240 lineto +395 2240 lineto +260 2240 224 2235 177 2204 curveto +99 2157 52 2069 52 1981 curveto +52 1903 94 1820 156 1774 curveto +208 1732 265 1722 395 1722 curveto +576 1722 lineto +576 699 lineto +576 268 943 0 1532 0 curveto +1801 0 2209 88 2463 207 curveto +2659 295 2721 363 2721 487 curveto +2721 622 2612 732 2472 732 curveto +2415 732 2379 722 2291 680 curveto +2057 570 1809 518 1534 518 curveto +1337 518 1192 551 1129 613 curveto +1098 646 1088 689 1088 789 curveto +1088 1722 lineto +end_ol grestore +gsave 17.282933 10.575000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 17.697800 10.575000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +gsave 14.472000 11.475000 translate 0.035278 -0.035278 scale +start_ol +2241 3276 moveto +2127 3276 2065 3230 1946 3043 curveto +1567 2478 1344 1814 1344 1260 curveto +1344 689 1531 93 1899 -492 curveto +2050 -736 2117 -793 2241 -793 curveto +2392 -793 2506 -679 2506 -539 curveto +2506 -477 2496 -446 2444 -363 curveto +2086 218 1920 715 1920 1244 curveto +1920 1768 2081 2265 2444 2846 curveto +2496 2929 2506 2960 2506 3022 curveto +2506 3162 2392 3276 2241 3276 curveto +end_ol grestore +gsave 14.886867 11.475000 translate 0.035278 -0.035278 scale +start_ol +896 351 moveto +1164 146 1391 64 1696 64 curveto +2413 64 2944 514 2944 1122 curveto +2944 1760 2407 2240 1685 2240 curveto +1365 2240 1149 2157 896 1940 curveto +896 2240 lineto +299 2240 lineto +175 2240 129 2227 83 2194 curveto +5 2136 -41 2025 -41 1914 curveto +-41 1853 0 1795 63 1757 curveto +114 1730 166 1722 301 1722 curveto +384 1722 lineto +384 -576 lineto +301 -576 lineto +177 -576 130 -581 83 -612 curveto +6 -658 -41 -745 -41 -832 curveto +-41 -914 0 -991 62 -1037 curveto +114 -1078 170 -1088 299 -1088 curveto +1197 -1088 lineto +1310 -1088 1372 -1078 1413 -1052 curveto +1491 -1001 1537 -919 1537 -832 curveto +1537 -750 1501 -673 1434 -622 curveto +1382 -586 1330 -576 1196 -576 curveto +896 -576 lineto +896 351 lineto +1667 1722 moveto +1879 1722 2049 1679 2184 1584 curveto +2334 1483 2432 1307 2432 1149 curveto +2432 815 2111 576 1667 576 curveto +1211 576 896 815 896 1154 curveto +896 1307 994 1483 1144 1584 curveto +1279 1679 1449 1722 1667 1722 curveto +end_ol grestore +gsave 15.301733 11.475000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 15.716600 11.475000 translate 0.035278 -0.035278 scale +start_ol +1792 2240 moveto +855 2240 lineto +718 2240 676 2235 628 2204 curveto +549 2157 502 2069 502 1981 curveto +502 1898 544 1820 611 1774 curveto +658 1732 720 1722 850 1722 curveto +1280 1722 lineto +1280 518 lineto +621 518 lineto +486 518 450 513 403 482 curveto +326 435 279 347 279 259 curveto +279 176 321 98 389 52 curveto +431 16 504 0 624 0 curveto +2422 0 lineto +2527 0 2605 16 2642 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 2240 lineto +1728 3200 moveto +1088 3200 lineto +1088 2656 lineto +1728 2656 lineto +1728 3200 lineto +end_ol grestore +gsave 16.131467 11.475000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 16.546333 11.475000 translate 0.035278 -0.035278 scale +start_ol +1984 0 moveto +2583 0 lineto +2691 0 2762 12 2798 43 curveto +2875 99 2921 203 2921 308 curveto +2921 375 2880 438 2817 480 curveto +2766 510 2719 518 2579 518 curveto +2496 518 lineto +2496 1562 lineto +2496 1988 2112 2240 1473 2240 curveto +1213 2240 829 2173 580 2085 curveto +476 2048 424 1976 424 1867 curveto +424 1785 534 1722 681 1722 curveto +728 1722 801 1722 890 1722 curveto +1131 1722 1324 1722 1497 1722 curveto +1832 1722 1984 1660 1984 1519 curveto +1984 1423 lineto +1772 1457 1611 1472 1445 1472 curveto +984 1472 627 1346 394 1104 curveto +270 973 192 804 192 654 curveto +192 295 612 0 1124 0 curveto +1430 0 1735 51 1984 142 curveto +1984 0 lineto +1984 702 moveto +1692 579 1394 518 1108 518 curveto +879 518 704 595 704 694 curveto +704 866 1033 1024 1394 1024 curveto +1575 1024 1772 1003 1984 966 curveto +1984 702 lineto +end_ol grestore +gsave 16.961200 11.475000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 17.376067 11.475000 translate 0.035278 -0.035278 scale +start_ol +1255 -15 moveto +969 -576 lineto +451 -576 lineto +327 -576 280 -586 233 -612 curveto +156 -658 109 -745 109 -832 curveto +109 -914 150 -991 218 -1037 curveto +264 -1078 321 -1088 451 -1088 curveto +1566 -1088 lineto +1680 -1088 1742 -1078 1783 -1052 curveto +1861 -1001 1908 -919 1908 -832 curveto +1908 -750 1866 -673 1804 -622 curveto +1752 -586 1700 -576 1566 -576 curveto +1540 -576 lineto +2732 1720 lineto +2903 1736 3002 1829 3002 1980 curveto +3002 2063 2965 2141 2893 2193 curveto +2846 2230 2794 2240 2659 2240 curveto +2182 2240 lineto +2141 2240 2131 2240 2074 2230 curveto +1923 2214 1835 2120 1835 1980 curveto +1835 1814 1954 1720 2167 1720 curveto +1545 562 lineto +954 1720 lineto +1151 1725 1260 1819 1260 1980 curveto +1260 2063 1218 2141 1156 2193 curveto +1104 2230 1052 2240 918 2240 curveto +451 2240 lineto +415 2240 404 2240 347 2230 curveto +197 2214 109 2120 109 1980 curveto +109 1834 202 1741 363 1720 curveto +1255 -15 lineto +end_ol grestore +gsave 17.790933 11.475000 translate 0.035278 -0.035278 scale +start_ol +895 3276 moveto +744 3276 630 3162 630 3022 curveto +630 2960 640 2929 692 2846 curveto +1050 2265 1216 1768 1216 1239 curveto +1216 715 1055 218 692 -363 curveto +640 -446 630 -477 630 -539 curveto +630 -679 744 -793 895 -793 curveto +1009 -793 1071 -746 1190 -565 curveto +1569 5 1792 669 1792 1223 curveto +1792 1794 1605 2390 1237 2976 curveto +1087 3219 1019 3276 895 3276 curveto +end_ol grestore +0.870588 0.870588 0.870588 srgb +n 16.150000 4.000000 m 16.150000 7.250000 l 22.350000 7.250000 l 22.350000 4.000000 l f +n 16.150000 4.400000 m 16.150000 4.400000 0.400000 0.400000 180.000000 270.000000 ellipse f +n 22.350000 4.400000 m 22.350000 4.400000 0.400000 0.400000 270.000000 360.000000 ellipse f +n 15.750000 4.400000 m 15.750000 6.850000 l 22.750000 6.850000 l 22.750000 4.400000 l f +n 16.150000 6.850000 m 16.150000 6.850000 0.400000 0.400000 90.000000 180.000000 ellipse f +n 22.350000 6.850000 m 22.350000 6.850000 0.400000 0.400000 0.000000 90.000000 ellipse f +0.050000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 16.150000 4.000000 m 22.350000 4.000000 l s +n 16.150000 7.250000 m 22.350000 7.250000 l s +n 16.150000 4.400000 0.400000 0.400000 180.000000 270.000000 ellipse s +n 22.350000 4.400000 0.400000 0.400000 270.000000 360.000000 ellipse s +n 15.750000 4.400000 m 15.750000 6.850000 l s +n 22.750000 4.400000 m 22.750000 6.850000 l s +n 16.150000 6.850000 0.400000 0.400000 90.000000 180.000000 ellipse s +n 22.350000 6.850000 0.400000 0.400000 0.000000 90.000000 ellipse s +gsave 17.378867 5.375000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 17.793733 5.375000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 18.208600 5.375000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 18.623467 5.375000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 19.038333 5.375000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 19.453200 5.375000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 19.868067 5.375000 translate 0.035278 -0.035278 scale +start_ol +1088 1722 moveto +2026 1722 lineto +2140 1722 2202 1732 2244 1758 curveto +2321 1805 2368 1893 2368 1981 curveto +2368 2064 2327 2142 2264 2193 curveto +2207 2230 2166 2240 2026 2240 curveto +1088 2240 lineto +1088 2679 lineto +1088 2809 1083 2843 1052 2888 curveto +1006 2963 919 3008 832 3008 curveto +750 3008 673 2968 627 2908 curveto +586 2858 576 2809 576 2679 curveto +576 2240 lineto +395 2240 lineto +260 2240 224 2235 177 2204 curveto +99 2157 52 2069 52 1981 curveto +52 1903 94 1820 156 1774 curveto +208 1732 265 1722 395 1722 curveto +576 1722 lineto +576 699 lineto +576 268 943 0 1532 0 curveto +1801 0 2209 88 2463 207 curveto +2659 295 2721 363 2721 487 curveto +2721 622 2612 732 2472 732 curveto +2415 732 2379 722 2291 680 curveto +2057 570 1809 518 1534 518 curveto +1337 518 1192 551 1129 613 curveto +1098 646 1088 689 1088 789 curveto +1088 1722 lineto +end_ol grestore +gsave 20.282933 5.375000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 20.697800 5.375000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +gsave 17.679433 6.275000 translate 0.035278 -0.035278 scale +start_ol +2241 3276 moveto +2127 3276 2065 3230 1946 3043 curveto +1567 2478 1344 1814 1344 1260 curveto +1344 689 1531 93 1899 -492 curveto +2050 -736 2117 -793 2241 -793 curveto +2392 -793 2506 -679 2506 -539 curveto +2506 -477 2496 -446 2444 -363 curveto +2086 218 1920 715 1920 1244 curveto +1920 1768 2081 2265 2444 2846 curveto +2496 2929 2506 2960 2506 3022 curveto +2506 3162 2392 3276 2241 3276 curveto +end_ol grestore +gsave 18.094300 6.275000 translate 0.035278 -0.035278 scale +start_ol +896 3137 moveto +299 3137 lineto +175 3137 129 3132 83 3101 curveto +5 3054 -41 2966 -41 2878 curveto +-41 2795 0 2717 63 2665 curveto +114 2628 166 2618 301 2618 curveto +384 2618 lineto +384 518 lineto +301 518 lineto +171 518 130 514 83 492 curveto +6 458 -41 395 -41 332 curveto +-41 226 0 126 62 60 curveto +108 20 175 0 299 0 curveto +896 0 lineto +896 254 lineto +1164 67 1371 0 1675 0 curveto +2057 0 2346 101 2583 313 curveto +2820 530 2944 804 2944 1118 curveto +2944 1436 2820 1715 2583 1927 curveto +2346 2139 2057 2240 1670 2240 curveto +1360 2240 1118 2157 896 1981 curveto +896 3137 lineto +1667 1722 moveto +1915 1722 2080 1667 2230 1540 curveto +2354 1427 2432 1272 2432 1122 curveto +2432 968 2360 813 2230 700 curveto +2085 577 1910 518 1667 518 curveto +1211 518 896 768 896 1127 curveto +896 1277 968 1427 1098 1540 curveto +1243 1667 1413 1722 1667 1722 curveto +end_ol grestore +gsave 18.509167 6.275000 translate 0.035278 -0.035278 scale +start_ol +1984 0 moveto +2583 0 lineto +2691 0 2762 12 2798 43 curveto +2875 99 2921 203 2921 308 curveto +2921 375 2880 438 2817 480 curveto +2766 510 2719 518 2579 518 curveto +2496 518 lineto +2496 1562 lineto +2496 1988 2112 2240 1473 2240 curveto +1213 2240 829 2173 580 2085 curveto +476 2048 424 1976 424 1867 curveto +424 1785 534 1722 681 1722 curveto +728 1722 801 1722 890 1722 curveto +1131 1722 1324 1722 1497 1722 curveto +1832 1722 1984 1660 1984 1519 curveto +1984 1423 lineto +1772 1457 1611 1472 1445 1472 curveto +984 1472 627 1346 394 1104 curveto +270 973 192 804 192 654 curveto +192 295 612 0 1124 0 curveto +1430 0 1735 51 1984 142 curveto +1984 0 lineto +1984 702 moveto +1692 579 1394 518 1108 518 curveto +879 518 704 595 704 694 curveto +704 866 1033 1024 1394 1024 curveto +1575 1024 1772 1003 1984 966 curveto +1984 702 lineto +end_ol grestore +gsave 18.924033 6.275000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 19.338900 6.275000 translate 0.035278 -0.035278 scale +start_ol +1088 843 moveto +1181 914 lineto +1715 451 lineto +1653 384 1632 332 1632 259 curveto +1632 88 1746 0 1974 0 curveto +2586 0 lineto +2701 0 2768 10 2810 36 curveto +2887 88 2934 171 2934 259 curveto +2934 342 2892 420 2825 471 curveto +2773 508 2731 518 2586 518 curveto +2415 518 lineto +1586 1234 lineto +2197 1722 lineto +2343 1722 lineto +2462 1722 2519 1732 2561 1758 curveto +2638 1810 2685 1893 2685 1981 curveto +2685 2064 2649 2142 2581 2193 curveto +2529 2230 2472 2240 2343 2240 curveto +1762 2240 lineto +1638 2240 1581 2230 1539 2204 curveto +1462 2152 1415 2069 1415 1981 curveto +1415 1908 1436 1862 1498 1789 curveto +1088 1468 lineto +1088 3209 lineto +476 3209 lineto +350 3209 302 3204 255 3173 curveto +175 3126 128 3038 128 2950 curveto +128 2867 172 2789 237 2738 curveto +292 2701 347 2691 489 2691 curveto +576 2691 lineto +576 518 lineto +489 518 lineto +352 518 308 513 259 482 curveto +177 435 128 347 128 259 curveto +128 88 244 0 476 0 curveto +1088 0 lineto +1088 843 lineto +end_ol grestore +gsave 19.753767 6.275000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 20.168633 6.275000 translate 0.035278 -0.035278 scale +start_ol +896 351 moveto +1164 146 1391 64 1696 64 curveto +2413 64 2944 514 2944 1122 curveto +2944 1760 2407 2240 1685 2240 curveto +1365 2240 1149 2157 896 1940 curveto +896 2240 lineto +299 2240 lineto +175 2240 129 2227 83 2194 curveto +5 2136 -41 2025 -41 1914 curveto +-41 1853 0 1795 63 1757 curveto +114 1730 166 1722 301 1722 curveto +384 1722 lineto +384 -576 lineto +301 -576 lineto +177 -576 130 -581 83 -612 curveto +6 -658 -41 -745 -41 -832 curveto +-41 -914 0 -991 62 -1037 curveto +114 -1078 170 -1088 299 -1088 curveto +1197 -1088 lineto +1310 -1088 1372 -1078 1413 -1052 curveto +1491 -1001 1537 -919 1537 -832 curveto +1537 -750 1501 -673 1434 -622 curveto +1382 -586 1330 -576 1196 -576 curveto +896 -576 lineto +896 351 lineto +1667 1722 moveto +1879 1722 2049 1679 2184 1584 curveto +2334 1483 2432 1307 2432 1149 curveto +2432 815 2111 576 1667 576 curveto +1211 576 896 815 896 1154 curveto +896 1307 994 1483 1144 1584 curveto +1279 1679 1449 1722 1667 1722 curveto +end_ol grestore +gsave 20.583500 6.275000 translate 0.035278 -0.035278 scale +start_ol +895 3276 moveto +744 3276 630 3162 630 3022 curveto +630 2960 640 2929 692 2846 curveto +1050 2265 1216 1768 1216 1239 curveto +1216 715 1055 218 692 -363 curveto +640 -446 630 -477 630 -539 curveto +630 -679 744 -793 895 -793 curveto +1009 -793 1071 -746 1190 -565 curveto +1569 5 1792 669 1792 1223 curveto +1792 1794 1605 2390 1237 2976 curveto +1087 3219 1019 3276 895 3276 curveto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +0.462745 0.619608 0.462745 srgb +n 2.001777 4.500000 m 6.008883 4.500000 l 6.562150 4.500000 7.010660 4.891751 7.010660 5.375000 c 7.010660 5.858249 6.562150 6.250000 6.008883 6.250000 c 2.001777 6.250000 l 1.448510 6.250000 1.000000 5.858249 1.000000 5.375000 c 1.000000 4.891751 1.448510 4.500000 2.001777 4.500000 c f +0.000000 0.000000 0.000000 srgb +n 2.001777 4.500000 m 6.008883 4.500000 l 6.562150 4.500000 7.010660 4.891751 7.010660 5.375000 c 7.010660 5.858249 6.562150 6.250000 6.008883 6.250000 c 2.001777 6.250000 l 1.448510 6.250000 1.000000 5.858249 1.000000 5.375000 c 1.000000 4.891751 1.448510 4.500000 2.001777 4.500000 c s +gsave 2.367030 5.575000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 2.781897 5.575000 translate 0.035278 -0.035278 scale +start_ol +2769 1898 moveto +2769 2136 2691 2240 2520 2240 curveto +2411 2240 2354 2194 2323 2085 curveto +2121 2188 1873 2240 1579 2240 curveto +799 2240 256 1759 256 1072 curveto +256 779 365 524 572 332 curveto +825 101 1146 0 1647 0 curveto +2025 0 2356 62 2568 165 curveto +2780 273 2899 407 2899 541 curveto +2899 667 2780 771 2640 771 curveto +2578 771 2531 753 2484 717 curveto +2349 622 2323 604 2225 577 curveto +2101 541 1888 518 1681 518 curveto +1074 518 768 704 768 1075 curveto +768 1247 841 1410 975 1527 curveto +1121 1659 1312 1722 1577 1722 curveto +1805 1722 1991 1681 2126 1609 curveto +2194 1568 2225 1528 2245 1446 curveto +2271 1347 2282 1319 2323 1292 curveto +2365 1256 2442 1229 2510 1229 curveto +2593 1229 2671 1265 2722 1324 curveto +2759 1364 2769 1410 2769 1527 curveto +2769 1898 lineto +end_ol grestore +gsave 3.196763 5.575000 translate 0.035278 -0.035278 scale +start_ol +1552 2240 moveto +781 2240 192 1755 192 1120 curveto +192 495 786 0 1536 0 curveto +2286 0 2880 495 2880 1120 curveto +2880 1740 2286 2240 1552 2240 curveto +1547 1722 moveto +2005 1722 2368 1455 2368 1120 curveto +2368 781 2005 518 1536 518 curveto +1067 518 704 781 704 1120 curveto +704 1464 1067 1722 1547 1722 curveto +end_ol grestore +gsave 3.611630 5.575000 translate 0.035278 -0.035278 scale +start_ol +1024 2240 moveto +541 2240 lineto +499 2240 489 2240 433 2228 curveto +283 2210 196 2103 196 1942 curveto +196 1760 310 1664 512 1658 curveto +512 492 lineto +481 492 lineto +351 492 310 482 263 458 curveto +186 413 139 330 139 246 curveto +139 172 180 93 241 49 curveto +293 15 354 0 477 0 curveto +1050 0 lineto +1158 0 1224 10 1265 34 curveto +1342 84 1388 162 1388 246 curveto +1388 325 1348 399 1282 448 curveto +1231 482 1191 492 1054 492 curveto +1024 492 lineto +1024 1387 lineto +1262 1638 1424 1722 1657 1722 curveto +1970 1722 2112 1609 2112 1368 curveto +2112 492 lineto +1914 492 1803 403 1803 246 curveto +1803 84 1916 0 2146 0 curveto +2602 0 lineto +2710 0 2776 10 2817 34 curveto +2894 79 2940 162 2940 246 curveto +2940 403 2826 492 2624 492 curveto +2624 1387 lineto +2624 1687 2527 1900 2324 2052 curveto +2157 2174 1948 2240 1720 2240 curveto +1441 2240 1268 2170 1024 1954 curveto +1024 2240 lineto +end_ol grestore +gsave 4.026497 5.575000 translate 0.035278 -0.035278 scale +start_ol +1088 1722 moveto +2026 1722 lineto +2140 1722 2202 1732 2244 1758 curveto +2321 1805 2368 1893 2368 1981 curveto +2368 2064 2327 2142 2264 2193 curveto +2207 2230 2166 2240 2026 2240 curveto +1088 2240 lineto +1088 2679 lineto +1088 2809 1083 2843 1052 2888 curveto +1006 2963 919 3008 832 3008 curveto +750 3008 673 2968 627 2908 curveto +586 2858 576 2809 576 2679 curveto +576 2240 lineto +395 2240 lineto +260 2240 224 2235 177 2204 curveto +99 2157 52 2069 52 1981 curveto +52 1903 94 1820 156 1774 curveto +208 1732 265 1722 395 1722 curveto +576 1722 lineto +576 699 lineto +576 268 943 0 1532 0 curveto +1801 0 2209 88 2463 207 curveto +2659 295 2721 363 2721 487 curveto +2721 622 2612 732 2472 732 curveto +2415 732 2379 722 2291 680 curveto +2057 570 1809 518 1534 518 curveto +1337 518 1192 551 1129 613 curveto +1098 646 1088 689 1088 789 curveto +1088 1722 lineto +end_ol grestore +gsave 4.441363 5.575000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 4.856230 5.575000 translate 0.035278 -0.035278 scale +start_ol +1552 2240 moveto +781 2240 192 1755 192 1120 curveto +192 495 786 0 1536 0 curveto +2286 0 2880 495 2880 1120 curveto +2880 1740 2286 2240 1552 2240 curveto +1547 1722 moveto +2005 1722 2368 1455 2368 1120 curveto +2368 781 2005 518 1536 518 curveto +1067 518 704 781 704 1120 curveto +704 1464 1067 1722 1547 1722 curveto +end_ol grestore +gsave 5.271097 5.575000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +0.462745 0.619608 0.462745 srgb +n 9.250000 18.000000 m 9.250000 20.000000 l 12.750000 20.000000 l 12.750000 18.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.250000 18.000000 m 9.250000 20.000000 l 12.750000 20.000000 l 12.750000 18.000000 l cp s +gsave 9.751167 19.200000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 10.166033 19.200000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 10.580900 19.200000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 10.995767 19.200000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 11.410633 19.200000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 11.825500 19.200000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +0.462745 0.619608 0.462745 srgb +n 19.500000 18.000000 m 19.500000 20.000000 l 23.000000 20.000000 l 23.000000 18.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.500000 18.000000 m 19.500000 20.000000 l 23.000000 20.000000 l 23.000000 18.000000 l cp s +gsave 20.001167 19.200000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 20.416033 19.200000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 20.830900 19.200000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 21.245767 19.200000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 21.660633 19.200000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 22.075500 19.200000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +0.462745 0.619608 0.462745 srgb +n 13.500000 18.000000 m 13.500000 20.000000 l 17.000000 20.000000 l 17.000000 18.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 13.500000 18.000000 m 13.500000 20.000000 l 17.000000 20.000000 l 17.000000 18.000000 l cp s +gsave 14.001167 19.200000 translate 0.035278 -0.035278 scale +start_ol +2138 1550 moveto +2214 1451 2302 1410 2435 1410 curveto +2530 1410 2632 1449 2695 1508 curveto +2739 1557 2752 1606 2752 1734 curveto +2752 1916 lineto +2752 2142 2655 2240 2448 2240 curveto +2351 2240 2293 2240 2241 2240 curveto +2032 2240 1813 2240 1551 2240 curveto +908 2240 448 1972 448 1595 curveto +448 1224 762 1036 1506 965 curveto +1793 937 1905 918 1995 885 curveto +2107 847 2176 781 2176 720 curveto +2176 612 1893 518 1551 518 curveto +1262 518 1038 577 883 695 curveto +845 831 776 894 666 894 curveto +593 894 533 856 491 781 curveto +457 727 448 679 448 533 curveto +448 355 lineto +448 226 456 178 476 129 curveto +517 43 581 0 654 0 curveto +706 0 739 0 783 0 curveto +995 0 1266 0 1568 0 curveto +2253 0 2752 278 2752 663 curveto +2752 880 2614 1082 2380 1195 curveto +2220 1275 2008 1327 1609 1374 curveto +1269 1416 1237 1421 1162 1444 curveto +1077 1473 1024 1515 1024 1557 curveto +1024 1642 1281 1722 1554 1722 curveto +1779 1722 1956 1681 2106 1591 curveto +2138 1550 lineto +end_ol grestore +gsave 14.416033 19.200000 translate 0.035278 -0.035278 scale +start_ol +1792 3200 moveto +874 3200 lineto +745 3200 698 3195 652 3164 curveto +574 3117 528 3034 528 2941 curveto +528 2858 564 2780 637 2734 curveto +684 2692 746 2682 876 2682 curveto +1280 2682 lineto +1280 518 lineto +648 518 lineto +513 518 477 513 430 482 curveto +352 435 305 347 305 259 curveto +305 181 346 98 414 52 curveto +455 16 527 0 646 0 curveto +2426 0 lineto +2529 0 2607 16 2643 36 curveto +2720 88 2767 171 2767 259 curveto +2767 342 2725 420 2658 471 curveto +2606 508 2564 518 2424 518 curveto +1792 518 lineto +1792 3200 lineto +end_ol grestore +gsave 14.830900 19.200000 translate 0.035278 -0.035278 scale +start_ol +2624 2240 moveto +1937 2240 lineto +1815 2240 1769 2235 1723 2203 curveto +1647 2156 1601 2067 1601 1978 curveto +1601 1901 1641 1819 1707 1773 curveto +1753 1732 1808 1722 1935 1722 curveto +2112 1722 lineto +2112 800 lineto +1849 572 1722 518 1469 518 curveto +1166 518 1024 614 1024 820 curveto +1024 2240 lineto +427 2240 lineto +298 2240 257 2235 211 2203 curveto +133 2156 87 2067 87 1978 curveto +87 1835 217 1722 372 1722 curveto +429 1722 lineto +512 1722 lineto +512 805 lineto +512 524 609 319 812 176 curveto +974 62 1188 0 1416 0 curveto +1695 0 1858 73 2112 316 curveto +2112 0 lineto +2601 0 lineto +2709 0 2775 13 2817 46 curveto +2894 111 2940 215 2940 326 curveto +2940 449 2826 518 2624 518 curveto +2624 2240 lineto +end_ol grestore +gsave 15.245767 19.200000 translate 0.035278 -0.035278 scale +start_ol +1408 2240 moveto +720 2240 lineto +634 2240 537 2224 506 2199 curveto +430 2152 384 2069 384 1981 curveto +384 1898 425 1820 491 1774 curveto +536 1732 592 1722 719 1722 curveto +896 1722 lineto +896 518 lineto +602 518 lineto +516 518 493 513 463 482 curveto +414 435 384 347 384 259 curveto +384 181 423 98 481 52 curveto +525 16 593 0 705 0 curveto +2150 0 lineto +2252 0 2325 16 2359 36 curveto +2432 83 2476 171 2476 259 curveto +2476 342 2435 420 2367 471 curveto +2315 508 2274 518 2129 518 curveto +1408 518 lineto +1408 1349 lineto +1901 1634 2098 1722 2263 1722 curveto +2336 1722 2388 1722 2466 1722 curveto +2543 1722 2595 1722 2668 1722 curveto +2808 1722 2927 1762 2927 1810 curveto +2927 1901 2891 1962 2782 2048 curveto +2621 2179 2455 2240 2274 2240 curveto +2020 2240 1823 2155 1408 1857 curveto +1408 2240 lineto +end_ol grestore +gsave 15.660633 19.200000 translate 0.035278 -0.035278 scale +start_ol +704 2240 moveto +226 2240 lineto +184 2240 174 2240 118 2227 curveto +-32 2207 -119 2084 -119 1914 curveto +-119 1755 -5 1663 192 1658 curveto +192 492 lineto +-5 492 -119 403 -119 246 curveto +-119 172 -78 93 -11 49 curveto +36 15 103 0 227 0 curveto +681 0 lineto +789 0 856 10 897 34 curveto +975 84 1021 162 1021 246 curveto +1021 403 907 492 704 492 curveto +704 1501 lineto +860 1668 958 1722 1098 1722 curveto +1228 1722 1280 1668 1280 1530 curveto +1280 0 lineto +1784 0 lineto +1897 0 1966 10 2009 34 curveto +2090 84 2138 162 2138 246 curveto +2138 399 2011 492 1792 492 curveto +1792 1501 lineto +1988 1678 2080 1722 2230 1722 curveto +2380 1722 2432 1673 2432 1530 curveto +2432 0 lineto +2916 0 lineto +3142 0 3255 84 3255 246 curveto +3255 403 3141 492 2944 492 curveto +2944 1569 lineto +2944 1953 2640 2240 2233 2240 curveto +2011 2240 1837 2162 1669 1986 curveto +1514 2157 1344 2240 1143 2240 curveto +988 2240 885 2199 704 2071 curveto +704 2240 lineto +end_ol grestore +gsave 16.075500 19.200000 translate 0.035278 -0.035278 scale +start_ol +2752 3137 moveto +2156 3137 lineto +2022 3137 1987 3132 1940 3101 curveto +1863 3054 1817 2966 1817 2883 curveto +1817 2800 1858 2722 1920 2671 curveto +1972 2634 2024 2624 2158 2624 curveto +2240 2624 lineto +2240 1981 lineto +2019 2157 1777 2240 1468 2240 curveto +1077 2240 789 2139 552 1927 curveto +315 1715 192 1436 192 1122 curveto +192 804 315 530 552 313 curveto +789 101 1077 0 1463 0 curveto +1767 0 1967 67 2240 254 curveto +2240 0 lineto +2837 0 lineto +2956 0 3012 13 3053 46 curveto +3131 106 3177 219 3177 332 curveto +3177 392 3136 447 3073 485 curveto +3022 511 2975 518 2835 518 curveto +2752 518 lineto +2752 3137 lineto +1467 1722 moveto +1725 1722 1890 1667 2039 1540 curveto +2168 1427 2240 1277 2240 1113 curveto +2240 968 2168 813 2039 700 curveto +1895 577 1719 518 1472 518 curveto +1225 518 1049 577 905 700 curveto +776 818 704 968 704 1122 curveto +704 1272 776 1427 905 1540 curveto +1049 1667 1219 1722 1467 1722 curveto +end_ol grestore +0.200000 slw +[1.000000] 0 sd +[0.200000] 0 sd +0 slc +n 17.500000 19.000000 m 19.000000 19.000000 l s +gsave 3.000000 2.500000 translate 0.035278 -0.035278 scale +start_ol +3200 4224 moveto +3200 1357 lineto +3200 808 2787 472 2106 472 curveto +1792 472 1536 545 1332 685 curveto +1123 842 1024 1049 1024 1357 curveto +1024 4224 lineto +512 4224 lineto +512 1348 lineto +512 517 1118 0 2106 0 curveto +3083 0 3712 528 3712 1348 curveto +3712 4224 lineto +3200 4224 lineto +end_ol grestore +gsave 3.550333 2.500000 translate 0.035278 -0.035278 scale +start_ol +2624 2128 moveto +2624 2691 2211 3008 1476 3008 curveto +736 3008 256 2675 256 2162 curveto +256 1729 496 1522 1204 1364 curveto +1649 1263 lineto +1981 1189 2112 1078 2112 878 curveto +2112 618 1835 444 1421 444 curveto +1167 444 952 512 833 626 curveto +759 704 725 782 697 974 curveto +256 974 lineto +256 316 638 0 1409 0 curveto +2152 0 2624 344 2624 878 curveto +2624 1290 2373 1517 1779 1649 curveto +1322 1750 lineto +934 1834 768 1951 768 2146 curveto +768 2400 1038 2564 1465 2564 curveto +1886 2564 2112 2413 2112 2128 curveto +2624 2128 lineto +end_ol grestore +gsave 3.931333 2.500000 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 4.354667 2.500000 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1561 lineto +896 1992 1005 2273 1236 2440 curveto +1386 2549 1530 2583 1864 2589 curveto +1864 3008 lineto +1781 3008 1740 3008 1675 3008 curveto +1357 3008 1115 2849 832 2463 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 3.000000 3.500000 translate 0.035278 -0.035278 scale +start_ol +3769 2899 moveto +3603 3790 3077 4224 2161 4224 curveto +1601 4224 1149 4053 840 3721 curveto +462 3323 256 2748 256 2095 curveto +256 1432 468 862 863 470 curveto +1183 149 1595 0 2138 0 curveto +3157 0 3729 533 3855 1604 curveto +3302 1604 lineto +3256 1331 3198 1145 3112 986 curveto +2939 658 2582 472 2133 472 curveto +1298 472 768 1106 768 2101 curveto +768 3123 1275 3752 2087 3752 curveto +2427 3752 2744 3654 2917 3500 curveto +3072 3364 3159 3194 3222 2899 curveto +3769 2899 lineto +end_ol grestore +gsave 3.550333 3.500000 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 3.973667 3.500000 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 4.608667 3.500000 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 5.243667 3.500000 translate 0.035278 -0.035278 scale +start_ol +3115 414 moveto +3063 420 3040 420 3011 420 curveto +2844 420 2752 492 2752 618 curveto +2752 2221 lineto +2752 2733 2333 3008 1538 3008 curveto +1070 3008 681 2888 466 2675 curveto +318 2528 256 2364 256 2080 curveto +881 2080 lineto +921 2413 1136 2564 1577 2564 curveto +2002 2564 2240 2416 2240 2152 curveto +2240 2035 lineto +2240 1850 2120 1771 1743 1729 curveto +1068 1649 965 1628 782 1560 curveto +433 1427 256 1179 256 819 curveto +256 317 634 0 1240 0 curveto +1618 0 1921 132 2259 441 curveto +2295 137 2451 0 2774 0 curveto +2876 0 2953 12 3115 54 curveto +3115 414 lineto +2240 1019 moveto +2240 873 2195 784 2053 665 curveto +1861 503 1629 420 1351 420 curveto +983 420 768 581 768 857 curveto +768 1144 977 1289 1481 1357 curveto +1980 1420 2081 1440 2240 1508 curveto +2240 1019 lineto +end_ol grestore +gsave 5.667000 3.500000 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 6.090333 3.500000 translate 0.035278 -0.035278 scale +start_ol +2880 4224 moveto +2368 4224 lineto +2368 2543 lineto +2165 2847 1840 3008 1434 3008 curveto +644 3008 128 2425 128 1531 curveto +128 583 621 0 1421 0 curveto +1829 0 2113 153 2368 522 curveto +2368 0 lineto +2880 0 lineto +2880 4224 lineto +1518 2559 moveto +2039 2559 2368 2143 2368 1494 curveto +2368 865 2033 449 1524 449 curveto +993 449 640 870 640 1504 curveto +640 2138 993 2559 1518 2559 curveto +end_ol grestore +gsave 6.513667 3.500000 translate 0.035278 -0.035278 scale +start_ol +2624 2128 moveto +2624 2691 2211 3008 1476 3008 curveto +736 3008 256 2675 256 2162 curveto +256 1729 496 1522 1204 1364 curveto +1649 1263 lineto +1981 1189 2112 1078 2112 878 curveto +2112 618 1835 444 1421 444 curveto +1167 444 952 512 833 626 curveto +759 704 725 782 697 974 curveto +256 974 lineto +256 316 638 0 1409 0 curveto +2152 0 2624 344 2624 878 curveto +2624 1290 2373 1517 1779 1649 curveto +1322 1750 lineto +934 1834 768 1951 768 2146 curveto +768 2400 1038 2564 1465 2564 curveto +1886 2564 2112 2413 2112 2128 curveto +2624 2128 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.003922 0.003922 0.003922 srgb +n 1.500000 1.750000 m 0.912500 1.000000 l 0.625000 1.237500 l 1.387500 2.212500 l 0.975000 3.675000 l 1.437500 3.675000 l 1.687500 2.725000 l 1.925000 3.675000 l 2.350000 3.675000 l 2.025000 2.425000 l 2.662500 2.800000 l 2.837500 2.475000 l 1.962500 1.925000 l 1.925000 1.737500 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 1.725000 1.484686 0.338980 0.338980 121.081372 58.918628 ellipse s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.000000 0.000000 0.000000 srgb +n 19.116694 13.159597 m 19.905600 13.811500 20.905600 15.911500 21.119835 17.210660 c s +0 slj +n 19.275943 12.966880 m 18.500000 12.650000 l 18.957444 13.352314 l f +0 slj +n 20.873167 17.251337 m 21.250000 18.000000 l 21.366504 17.169984 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.932418 13.384263 m 15.055600 15.411500 15.205600 16.111500 15.231197 17.200221 c s +0 slj +n 16.161875 13.483507 m 16.250000 12.650000 l 15.702961 13.285018 l f +0 slj +n 14.981266 17.206097 m 15.250000 18.000000 l 15.481128 17.194345 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 13.336446 13.096873 m 11.755600 14.161500 11.055600 16.111500 11.023543 17.200346 c s +0 slj +n 13.476094 13.304234 m 14.000000 12.650000 l 13.196798 12.889513 l f +0 slj +n 10.773651 17.192989 m 11.000000 18.000000 l 11.273435 17.207704 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.968143 17.799897 m 4.055630 23.261500 17.155600 23.861500 20.668004 20.548890 c s +0 slj +n 4.218111 17.795893 m 3.955330 17.000000 l 3.718175 17.803902 l f +0 slj +n 20.839532 20.730764 m 21.250000 20.000000 l 20.496476 20.367017 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.972726 17.799811 m 4.055630 21.611500 11.605600 23.411500 14.665961 20.546716 c s +0 slj +n 4.222667 17.794375 m 3.955330 17.000000 l 3.722785 17.805247 l f +0 slj +n 14.836809 20.729228 m 15.250000 20.000000 l 14.495112 20.364203 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.971625 17.799834 m 4.007410 19.556300 7.005630 22.561500 10.326574 20.431853 c s +0 slj +n 4.221573 17.794742 m 3.955330 17.000000 l 3.721677 17.804926 l f +0 slj +n 10.461528 20.642299 m 11.000000 20.000000 l 10.191620 20.221407 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.088617 15.449091 m 7.555630 14.711500 9.605630 12.611500 11.009171 12.039446 c s +0 slj +n 6.877396 15.315355 m 6.660660 16.125000 l 7.299839 15.582828 l f +0 slj +n 11.103529 12.270956 m 11.750000 11.737500 l 10.914812 11.807937 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.255303 13.089837 m 8.630940 11.851800 10.345700 11.324200 10.996210 11.092957 c s +0 slj +n 7.088065 12.904011 m 6.660660 13.625000 l 7.422542 13.275663 l f +0 slj +n 11.079947 11.328516 m 11.750000 10.825000 l 10.912474 10.857398 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.419391 10.621373 m 8.595580 10.228200 10.345700 9.980740 10.950943 9.951329 c s +0 slj +n 7.340133 10.384270 m 6.660660 10.875000 l 7.498650 10.858477 l f +0 slj +n 10.963077 10.201034 m 11.750000 9.912500 l 10.938809 9.701624 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.459827 8.088497 m 8.850000 8.025000 10.425000 8.475000 11.136373 8.791749 c s +0 slj +n 7.448420 7.838758 m 6.660660 8.125000 l 7.471234 8.338237 l f +0 slj +n 11.034682 9.020132 m 11.867200 9.117160 l 11.238064 8.563366 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.810481 5.358086 m 9.375000 5.325000 13.875000 5.700000 13.969719 8.200573 c s +0 slj +n 7.805195 5.108142 m 7.010660 5.375000 l 7.815767 5.608030 l f +0 slj +n 13.719898 8.210036 m 14.000000 9.000000 l 14.219540 8.191110 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.255935 7.849971 m 19.261065 8.368599 l s +0 slj +n 19.505923 7.847498 m 19.250000 7.250000 l 19.005947 7.852444 l f +0 slj +n 19.011077 8.371072 m 19.267000 8.968570 l 19.511053 8.366126 l f +gsave 21.329800 8.843570 translate 0.035278 -0.035278 scale +start_ol +3769 2899 moveto +3603 3790 3077 4224 2161 4224 curveto +1601 4224 1149 4053 840 3721 curveto +462 3323 256 2748 256 2095 curveto +256 1432 468 862 863 470 curveto +1183 149 1595 0 2138 0 curveto +3157 0 3729 533 3855 1604 curveto +3302 1604 lineto +3256 1331 3198 1145 3112 986 curveto +2939 658 2582 472 2133 472 curveto +1298 472 768 1106 768 2101 curveto +768 3123 1275 3752 2087 3752 curveto +2427 3752 2744 3654 2917 3500 curveto +3072 3364 3159 3194 3222 2899 curveto +3769 2899 lineto +end_ol grestore +gsave 21.880133 8.843570 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 22.303467 8.843570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 22.726800 8.843570 translate 0.035278 -0.035278 scale +start_ol +1519 3008 moveto +1024 3008 lineto +1024 3837 lineto +512 3837 lineto +512 3008 lineto +103 3008 lineto +103 2616 lineto +512 2616 lineto +512 469 lineto +512 170 727 0 1114 0 curveto +1233 0 1352 11 1519 40 curveto +1519 436 lineto +1456 420 1381 420 1289 420 curveto +1082 420 1024 474 1024 674 curveto +1024 2616 lineto +1519 2616 lineto +1519 3008 lineto +end_ol grestore +gsave 22.938467 8.843570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1561 lineto +896 1992 1005 2273 1236 2440 curveto +1386 2549 1530 2583 1864 2589 curveto +1864 3008 lineto +1781 3008 1740 3008 1675 3008 curveto +1357 3008 1115 2849 832 2463 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 23.192467 8.843570 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 23.615800 8.843570 translate 0.035278 -0.035278 scale +start_ol +896 4224 moveto +384 4224 lineto +384 0 lineto +896 0 lineto +896 4224 lineto +end_ol grestore +gsave 23.785133 8.843570 translate 0.035278 -0.035278 scale +start_ol +896 4224 moveto +384 4224 lineto +384 0 lineto +896 0 lineto +896 4224 lineto +end_ol grestore +gsave 23.954467 8.843570 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 24.377800 8.843570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1561 lineto +896 1992 1005 2273 1236 2440 curveto +1386 2549 1530 2583 1864 2589 curveto +1864 3008 lineto +1781 3008 1740 3008 1675 3008 curveto +1357 3008 1115 2849 832 2463 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 21.417600 9.593570 translate 0.035278 -0.035278 scale +start_ol +2880 4224 moveto +2368 4224 lineto +2368 2543 lineto +2165 2847 1840 3008 1434 3008 curveto +644 3008 128 2425 128 1531 curveto +128 583 621 0 1421 0 curveto +1829 0 2113 153 2368 522 curveto +2368 0 lineto +2880 0 lineto +2880 4224 lineto +1518 2559 moveto +2039 2559 2368 2143 2368 1494 curveto +2368 865 2033 449 1524 449 curveto +993 449 640 870 640 1504 curveto +640 2138 993 2559 1518 2559 curveto +end_ol grestore +gsave 21.840933 9.593570 translate 0.035278 -0.035278 scale +start_ol +3115 414 moveto +3063 420 3040 420 3011 420 curveto +2844 420 2752 492 2752 618 curveto +2752 2221 lineto +2752 2733 2333 3008 1538 3008 curveto +1070 3008 681 2888 466 2675 curveto +318 2528 256 2364 256 2080 curveto +881 2080 lineto +921 2413 1136 2564 1577 2564 curveto +2002 2564 2240 2416 2240 2152 curveto +2240 2035 lineto +2240 1850 2120 1771 1743 1729 curveto +1068 1649 965 1628 782 1560 curveto +433 1427 256 1179 256 819 curveto +256 317 634 0 1240 0 curveto +1618 0 1921 132 2259 441 curveto +2295 137 2451 0 2774 0 curveto +2876 0 2953 12 3115 54 curveto +3115 414 lineto +2240 1019 moveto +2240 873 2195 784 2053 665 curveto +1861 503 1629 420 1351 420 curveto +983 420 768 581 768 857 curveto +768 1144 977 1289 1481 1357 curveto +1980 1420 2081 1440 2240 1508 curveto +2240 1019 lineto +end_ol grestore +gsave 22.264267 9.593570 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 22.687600 9.593570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 23.322600 9.593570 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 23.745933 9.593570 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 24.169267 9.593570 translate 0.035278 -0.035278 scale +start_ol +2624 2128 moveto +2624 2691 2211 3008 1476 3008 curveto +736 3008 256 2675 256 2162 curveto +256 1729 496 1522 1204 1364 curveto +1649 1263 lineto +1981 1189 2112 1078 2112 878 curveto +2112 618 1835 444 1421 444 curveto +1167 444 952 512 833 626 curveto +759 704 725 782 697 974 curveto +256 974 lineto +256 316 638 0 1409 0 curveto +2152 0 2624 344 2624 878 curveto +2624 1290 2373 1517 1779 1649 curveto +1322 1750 lineto +934 1834 768 1951 768 2146 curveto +768 2400 1038 2564 1465 2564 curveto +1886 2564 2112 2413 2112 2128 curveto +2624 2128 lineto +end_ol grestore +gsave 23.320533 18.817300 translate 0.035278 -0.035278 scale +start_ol +3769 2899 moveto +3603 3790 3077 4224 2161 4224 curveto +1601 4224 1149 4053 840 3721 curveto +462 3323 256 2748 256 2095 curveto +256 1432 468 862 863 470 curveto +1183 149 1595 0 2138 0 curveto +3157 0 3729 533 3855 1604 curveto +3302 1604 lineto +3256 1331 3198 1145 3112 986 curveto +2939 658 2582 472 2133 472 curveto +1298 472 768 1106 768 2101 curveto +768 3123 1275 3752 2087 3752 curveto +2427 3752 2744 3654 2917 3500 curveto +3072 3364 3159 3194 3222 2899 curveto +3769 2899 lineto +end_ol grestore +gsave 23.870867 18.817300 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 24.294200 18.817300 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 24.929200 18.817300 translate 0.035278 -0.035278 scale +start_ol +320 -1270 moveto +832 -1270 lineto +832 449 lineto +1081 138 1358 0 1742 0 curveto +2505 0 3008 583 3008 1477 curveto +3008 2419 2517 3008 1722 3008 curveto +1317 3008 991 2827 768 2476 curveto +768 3008 lineto +320 3008 lineto +320 -1270 lineto +1647 2559 moveto +2161 2559 2496 2138 2496 1488 curveto +2496 870 2155 449 1647 449 curveto +1156 449 832 865 832 1504 curveto +832 2143 1156 2559 1647 2559 curveto +end_ol grestore +gsave 25.352533 18.817300 translate 0.035278 -0.035278 scale +start_ol +2816 0 moveto +2816 3008 lineto +2304 3008 lineto +2304 1386 lineto +2304 802 1990 420 1502 420 curveto +1132 420 896 638 896 982 curveto +896 3008 lineto +384 3008 lineto +384 786 lineto +384 308 749 0 1322 0 curveto +1754 0 2029 154 2304 546 curveto +2304 0 lineto +2816 0 lineto +end_ol grestore +gsave 25.775867 18.817300 translate 0.035278 -0.035278 scale +start_ol +1519 3008 moveto +1024 3008 lineto +1024 3837 lineto +512 3837 lineto +512 3008 lineto +103 3008 lineto +103 2616 lineto +512 2616 lineto +512 469 lineto +512 170 727 0 1114 0 curveto +1233 0 1352 11 1519 40 curveto +1519 436 lineto +1456 420 1381 420 1289 420 curveto +1082 420 1024 474 1024 674 curveto +1024 2616 lineto +1519 2616 lineto +1519 3008 lineto +end_ol grestore +gsave 25.987533 18.817300 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 26.410867 18.817300 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 26.622533 18.817300 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 27.045867 18.817300 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 27.469200 18.817300 translate 0.035278 -0.035278 scale +start_ol +2880 4224 moveto +2368 4224 lineto +2368 2543 lineto +2165 2847 1840 3008 1434 3008 curveto +644 3008 128 2425 128 1531 curveto +128 583 621 0 1421 0 curveto +1829 0 2113 153 2368 522 curveto +2368 0 lineto +2880 0 lineto +2880 4224 lineto +1518 2559 moveto +2039 2559 2368 2143 2368 1494 curveto +2368 865 2033 449 1524 449 curveto +993 449 640 870 640 1504 curveto +640 2138 993 2559 1518 2559 curveto +end_ol grestore +gsave 27.892533 18.817300 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 24.242400 19.514800 translate 0.035278 -0.035278 scale +start_ol +2880 4224 moveto +2368 4224 lineto +2368 2543 lineto +2165 2847 1840 3008 1434 3008 curveto +644 3008 128 2425 128 1531 curveto +128 583 621 0 1421 0 curveto +1829 0 2113 153 2368 522 curveto +2368 0 lineto +2880 0 lineto +2880 4224 lineto +1518 2559 moveto +2039 2559 2368 2143 2368 1494 curveto +2368 865 2033 449 1524 449 curveto +993 449 640 870 640 1504 curveto +640 2138 993 2559 1518 2559 curveto +end_ol grestore +gsave 24.665733 19.514800 translate 0.035278 -0.035278 scale +start_ol +3115 414 moveto +3063 420 3040 420 3011 420 curveto +2844 420 2752 492 2752 618 curveto +2752 2221 lineto +2752 2733 2333 3008 1538 3008 curveto +1070 3008 681 2888 466 2675 curveto +318 2528 256 2364 256 2080 curveto +881 2080 lineto +921 2413 1136 2564 1577 2564 curveto +2002 2564 2240 2416 2240 2152 curveto +2240 2035 lineto +2240 1850 2120 1771 1743 1729 curveto +1068 1649 965 1628 782 1560 curveto +433 1427 256 1179 256 819 curveto +256 317 634 0 1240 0 curveto +1618 0 1921 132 2259 441 curveto +2295 137 2451 0 2774 0 curveto +2876 0 2953 12 3115 54 curveto +3115 414 lineto +2240 1019 moveto +2240 873 2195 784 2053 665 curveto +1861 503 1629 420 1351 420 curveto +983 420 768 581 768 857 curveto +768 1144 977 1289 1481 1357 curveto +1980 1420 2081 1440 2240 1508 curveto +2240 1019 lineto +end_ol grestore +gsave 25.089067 19.514800 translate 0.035278 -0.035278 scale +start_ol +2955 1344 moveto +2955 1780 2920 2042 2834 2255 curveto +2638 2724 2177 3008 1613 3008 curveto +772 3008 230 2399 230 1463 curveto +230 558 755 0 1601 0 curveto +2292 0 2771 362 2892 969 curveto +2408 969 lineto +2275 624 2004 444 1619 444 curveto +1313 444 1054 564 893 784 curveto +778 934 737 1084 732 1344 curveto +2955 1344 lineto +743 1728 moveto +783 2235 1123 2564 1607 2564 curveto +2079 2564 2442 2209 2442 1759 curveto +2442 1749 2442 1739 2436 1728 curveto +743 1728 lineto +end_ol grestore +gsave 25.512400 19.514800 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1827 lineto +896 2249 1216 2588 1612 2588 curveto +1972 2588 2176 2377 2176 2005 curveto +2176 0 lineto +2688 0 lineto +2688 1827 lineto +2688 2249 2992 2588 3368 2588 curveto +3705 2588 3904 2371 3904 2005 curveto +3904 0 lineto +4416 0 lineto +4416 2193 lineto +4416 2718 4108 3008 3550 3008 curveto +3151 3008 2912 2888 2633 2549 curveto +2448 2870 2198 3008 1792 3008 curveto +1375 3008 1100 2859 832 2499 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 26.147400 19.514800 translate 0.035278 -0.035278 scale +start_ol +1562 3008 moveto +709 3008 192 2446 192 1504 curveto +192 562 703 0 1568 0 curveto +2421 0 2944 562 2944 1483 curveto +2944 2451 2439 3008 1562 3008 curveto +1568 2564 moveto +2109 2564 2432 2164 2432 1488 curveto +2432 849 2098 444 1568 444 curveto +1032 444 704 844 704 1504 curveto +704 2159 1032 2564 1568 2564 curveto +end_ol grestore +gsave 26.570733 19.514800 translate 0.035278 -0.035278 scale +start_ol +384 3008 moveto +384 0 lineto +896 0 lineto +896 1605 lineto +896 2199 1211 2588 1696 2588 curveto +2067 2588 2304 2366 2304 2016 curveto +2304 0 lineto +2816 0 lineto +2816 2210 lineto +2816 2695 2437 3008 1847 3008 curveto +1392 3008 1100 2837 832 2421 curveto +832 3008 lineto +384 3008 lineto +end_ol grestore +gsave 26.994067 19.514800 translate 0.035278 -0.035278 scale +start_ol +2624 2128 moveto +2624 2691 2211 3008 1476 3008 curveto +736 3008 256 2675 256 2162 curveto +256 1729 496 1522 1204 1364 curveto +1649 1263 lineto +1981 1189 2112 1078 2112 878 curveto +2112 618 1835 444 1421 444 curveto +1167 444 952 512 833 626 curveto +759 704 725 782 697 974 curveto +256 974 lineto +256 316 638 0 1409 0 curveto +2152 0 2624 344 2624 878 curveto +2624 1290 2373 1517 1779 1649 curveto +1322 1750 lineto +934 1834 768 1951 768 2146 curveto +768 2400 1038 2564 1465 2564 curveto +1886 2564 2112 2413 2112 2128 curveto +2624 2128 lineto +end_ol grestore +showpage diff --git a/executable_names/doc/figures/arch2.eps b/executable_names/doc/figures/arch2.eps new file mode 100644 index 0000000000000000000000000000000000000000..1af55df6b05f9edc9fa2a6750ea4b1e47e9fe78e --- /dev/null +++ b/executable_names/doc/figures/arch2.eps @@ -0,0 +1,2591 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /g/g0/jette/sigops/figure2.eps +%%CreationDate: Wed Feb 1 14:13:04 2006 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 663 460 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 444.960000 translate +648.000000 -444.960000 scale +% Image geometry +900 618 8 +% Transformation matrix +[ 900 0 0 618 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 900 string def +/gstr 900 string def +/bstr 900 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 128522 ASCII Bytes +colorimage +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$L]?$-JcC<$JcDABJ,~> +JcC<$L]?$-JcC<$JcDABJ,~> +JcC<$L]?$-JcC<$JcDABJ,~> +JcC<$OT3?$JcC<$JcD\KJ,~> +JcC<$OT3?$JcC<$JcD\KJ,~> +JcC<$OT3?$JcC<$JcD\KJ,~> +JcC<$QN+PsJcC<$JcDnQJ,~> +JcC<$QN+PsJcC<$JcDnQJ,~> +JcC<$QN+PsJcC<$JcDnQJ,~> +JcC<$S,_^QiW&-BJcC<$JcE(VJ,~> +JcC<$S,_^QiW&-BJcC<$JcE(VJ,~> +JcC<$S,_^QiW&-BJcC<$JcE(VJ,~> +JcC<$T)\<\bQ%)4JcC<$JcE1YJ,~> +JcC<$T)\<\bQ%)4JcC<$JcE1YJ,~> +JcC<$T)\<\bQ%)4JcC<$JcE1YJ,~> +JcC<$U&X`b^]3p+JcC<$JcE:\J,~> +JcC<$U&X`b^]3p+JcC<$JcE:\J,~> +JcC<$U&X`b^]3p+JcC<$JcE:\J,~> +JcC<$U]:&g[K#t$JcC<$JcE@^J,~> +JcC<$U]:&g[K#t$JcC<$JcE@^J,~> +JcC<$U]:&g[K#t$JcC<$JcE@^J,~> +JcC<$V>p>kXoJ1sJcC<$JcEF`J,~> +JcC<$V>p>kXoJ1sJcC<$JcEF`J,~> +JcC<$V>p>kXoJ1sJcC<$JcEF`J,~> +li3d]JcD,;qZ*PoqZ)3IJcC<$^Ai]~> +li3d]JcD,;qZ*PoqZ)3IJcC<$^Ai]~> +li3d]JcD,;qZ*PoqZ)3IJcC<$^Ai]~> +li3d]JcD,;r;`Vmr;_EKJcC<$^Ai]~> +li3d]JcD,;r;`Vmr;_EKJcC<$^Ai]~> +li3d]JcD,;r;`Vmr;_EKJcC<$^Ai]~> +li3d]JcD,;rW&Ylr;_EKJcC<$^]/f~> +li3d]JcD,;rW&Ylr;_EKJcC<$^]/f~> +li3d]JcD,;rW&Ylr;_EKJcC<$^]/f~> +li6qaX8i/!JcD/ +li6qaX8i/!JcD/ +li6qaX8i/!JcD/ +li6qaX8i/!JcD,;r;`VmquD +li6qaX8i/!JcD,;r;`VmquD +li6qaX8i/!JcD,;r;`VmquD +li6qaX8i/!JcD,;qZ*Poq>c*HJcC<$^]/f~> +li6qaX8i/!JcD,;qZ*Poq>c*HJcC<$^]/f~> +li6qaX8i/!JcD,;qZ*Poq>c*HJcC<$^]/f~> +li6qaX8i/!JcD,;p].GrpAfdEJcC<$^]/f~> +li6qaX8i/!JcD,;p].GrpAfdEJcC<$^]/f~> +li6qaX8i/!JcD,;p].GrpAfdEJcC<$^]/f~> +li6qaX8i/!JcD,;oDl +li6qaX8i/!JcD,;oDl +li6qaX8i/!JcD,;oDl +li6qaX8i/!JcD,;rW)uuoDlZ+oDnmjrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)uuoDlZ+oDnmjrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)uuoDlZ+oDnmjrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)lrnGpc4nGrIdrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)lrnGpc4nGrIdrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)lrnGpc4nGrIdrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)coklB]BklCMYrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)coklB]BklCMYrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)coklB]BklCMYrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)Tj])_I&rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)Tj])_I&rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)Tj])_I&rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)Bd`rPN,rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)Bd`rPN,rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)Bd`rPN,rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)'[f`:+5rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)'[f`:+5rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)'[f`:+5rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW(pWrrBq9rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW(pWrrBq9rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW(pWrrBq9rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)$ZquFV6rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)$ZquFV6rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)$ZquFV6rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)$ZquFV6rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)$ZquFV6rW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW)$ZquFV6rW%NLJcC<$^]/f~> +li6qa])Ma1oDediJcD,;rW(sXrW)9a!!(^PrW%NLJcC<$^]/f~> +li6qa])Ma1oDediJcD,;rW(sXrW)9a!!(^PrW%NLJcC<$^]/f~> +li6qa])Ma1oDediJcD,;rW(sXrW)9a!!(^PrW%NLJcC<$^]/f~> +li6qa]Dqm2oDediqYpNqJcDDCrW(sXrW) +li6qa]Dqm2oDediqYpNqJcDDCrW(sXrW) +li6qa]Dqm2oDediqYpNqJcDDCrW(sXrW) +li6qa]`7s2oDedir;Z`rJcDDCrW(sXrW)?crW(XOrW%NLJcC<$^]/f~> +li6qa]`7s2oDedir;Z`rJcDDCrW(sXrW)?crW(XOrW%NLJcC<$^]/f~> +li6qa]`7s2oDedir;Z`rJcDDCrW(sXrW)?crW(XOrW%NLJcC<$^]/f~> +li6qa]`7s2oDedirr;osJcDABrW(sXrW)?crW(XOrW%NLJcC<$^]/f~> +li6qa]`7s2oDedirr;osJcDABrW(sXrW)?crW(XOrW%NLJcC<$^]/f~> +li6qa]`7s2oDedirr;osJcDABrW(sXrW)?crW(XOrW%NLJcC<$^]/f~> +li6qaoDedip](0lo`+mjp&G!kqu?TpoDedi!<;rsJcD>ArW)-]rW)uurW)cor;c]or;cWmr;c![ +rW%NLJcC<$^]/f~> +li6qaoDedip](0lo`+mjp&G!kqu?TpoDedi!<;rsJcD>ArW)-]rW)uurW)cor;c]or;cWmr;c![ +rW%NLJcC<$^]/f~> +li6qaoDedip](0lo`+mjp&G!kqu?TpoDedi!<;rsJcD>ArW)-]rW)uurW)cor;c]or;cWmr;c![ +rW%NLJcC<$^]/f~> +li6qap&Fgfr;ZQmq>^6jqZ$?ks8ViopAamfJcD>ArW)3_pAk*jq#LEop]19mq#KXYrW%NLJcC<$ +^]/f~> +li6qap&Fgfr;ZQmq>^6jqZ$?ks8ViopAamfJcD>ArW)3_pAk*jq#LEop]19mq#KXYrW%NLJcC<$ +^]/f~> +li6qap&Fgfr;ZQmq>^6jqZ$?ks8ViopAamfJcD>ArW)3_pAk*jq#LEop]19mq#KXYrW%NLJcC<$ +^]/f~> +li6qapAb-mrVuisrVuisrVuisqu?Wqrr;osr;Z`rrr;oss8Voqp&FgfJcD;@rW)6`rW)osr;ccq +rW)osrW)rtq>gKorW)osrW)3_rW%NLJcC<$^]/f~> +li6qapAb-mrVuisrVuisrVuisqu?Wqrr;osr;Z`rrr;oss8Voqp&FgfJcD;@rW)6`rW)osr;ccq +rW)osrW)rtq>gKorW)osrW)3_rW%NLJcC<$^]/f~> +li6qapAb-mrVuisrVuisrVuisqu?Wqrr;osr;Z`rrr;oss8Voqp&FgfJcD;@rW)6`rW)osr;ccq +rW)osrW)rtq>gKorW)osrW)3_rW%NLJcC<$^]/f~> +li6qapAb-mr;ZcsrVuisrVuisr;Z`rr;Z]qrr;rtr;Z]qs8W#tp&BRCO9"VHrW)iqrW)lrrW)os +rW)osr;c`prW)osrW)3_rW%NLJcC<$^]/f~> +li6qapAb-mr;ZcsrVuisrVuisr;Z`rr;Z]qrr;rtr;Z]qs8W#tp&BRCO9"VHrW)iqrW)lrrW)os +rW)osr;c`prW)osrW)3_rW%NLJcC<$^]/f~> +li6qapAb-mr;ZcsrVuisrVuisr;Z`rr;Z]qrr;rtr;Z]qs8W#tp&BRCO9"VHrW)iqrW)lrrW)os +rW)osr;c`prW)osrW)3_rW%NLJcC<$^]/f~> +li6qap](3mr;Zcsrr;osrVufrrVultqu?Tprr;uuqu?Tps8W#tp]#dENWADFrW)iqrW)osr;cfr +r;cisr;ccqr;cfrr;c-_rW%NLJcC<$^]/f~> +li6qap](3mr;Zcsrr;osrVufrrVultqu?Tprr;uuqu?Tps8W#tp]#dENWADFrW)iqrW)osr;cfr +r;cisr;ccqr;cfrr;c-_rW%NLJcC<$^]/f~> +li6qap](3mr;Zcsrr;osrVufrrVultqu?Tprr;uuqu?Tps8W#tp]#dENWADFrW)iqrW)osr;cfr +r;cisr;ccqr;cfrr;c-_rW%NLJcC<$^]/f~> +li6qap](0lp](6nr;Z]qrr;rtqZ$Qqrr;rtqZ$Qqrr;osp]#dENWAGGrW)fprW)lrrrDusr;cis +r;c`prrDusr;c-_rW%NLJcC<$^]/f~> +li6qap](0lp](6nr;Z]qrr;rtqZ$Qqrr;rtqZ$Qqrr;osp]#dENWAGGrW)fprW)lrrrDusr;cis +r;c`prrDusr;c-_rW%NLJcC<$^]/f~> +li6qap](0lp](6nr;Z]qrr;rtqZ$Qqrr;rtqZ$Qqrr;osp]#dENWAGGrW)fprW)lrrrDusr;cis +r;c`prrDusr;c-_rW%NLJcC<$^]/f~> +li6qapAb$joDe^grr;rtp&G!kp&Fsjp&FadJcD;@rW) +li6qapAb$joDe^grr;rtp&G!kp&Fsjp&FadJcD;@rW) +li6qapAb$joDe^grr;rtp&G!kp&Fsjp&FadJcD;@rW) +li6qap&Fmhq#C-irr;rtp&G!kp&FsjoDeUdJcD;@rW) +li6qap&Fmhq#C-irr;rtp&G!kp&FsjoDeUdJcD;@rW) +li6qap&Fmhq#C-irr;rtp&G!kp&FsjoDeUdJcD;@rW) +li6qao`+dgqZ$Nps8W#ts8W#tpAb'kp&FsjoDeRcJcD>ArW)?cr;c]orW)fprW)uur;cisr;cZn +rW)uur;c-_rW%NLJcC<$^]/f~> +li6qao`+dgqZ$Nps8W#ts8W#tpAb'kp&FsjoDeRcJcD>ArW)?cr;c]orW)fprW)uur;cisr;cZn +rW)uur;c-_rW%NLJcC<$^]/f~> +li6qao`+dgqZ$Nps8W#ts8W#tpAb'kp&FsjoDeRcJcD>ArW)?cr;c]orW)fprW)uur;cisr;cZn +rW)uur;c-_rW%NLJcC<$^]/f~> +li6qaoDe[frVuisrVufrs8W#tpAb'kp&FsjoDedi!<;rsJcD>ArW)?cr;c]orW)lrrW)osr;cis +r;c`prW)osr;c-_rW%NLJcC<$^]/f~> +li6qaoDe[frVuisrVufrs8W#tpAb'kp&FsjoDedi!<;rsJcD>ArW)?cr;c]orW)lrrW)osr;cis +r;c`prW)osr;c-_rW%NLJcC<$^]/f~> +li6qaoDe[frVuisrVufrs8W#tpAb'kp&FsjoDedi!<;rsJcD>ArW)?cr;c]orW)lrrW)osr;cis +r;c`prW)osr;c-_rW%NLJcC<$^]/f~> +li6qapAY*mrVucqrr;rtrVufrrr;rtp&G!kp&FsjoDedirr;osJcDABrW) +li6qapAY*mrVucqrr;rtrVufrrr;rtp&G!kp&FsjoDedirr;osJcDABrW) +li6qapAY*mrVucqrr;rtrVufrrr;rtp&G!kp&FsjoDedirr;osJcDABrW) +li6qapAY*mr;Z]qs8W#trVufrrr;osqZ$Qqs8W#tqZ$Qqs8W#toDedir;Z`rJcDDCrW) +li6qapAY*mr;Z]qs8W#trVufrrr;osqZ$Qqs8W#tqZ$Qqs8W#toDedir;Z`rJcDDCrW) +li6qapAY*mr;Z]qs8W#trVufrrr;osqZ$Qqs8W#tqZ$Qqs8W#toDedir;Z`rJcDDCrW) +li6qapAY*mqu?Wqs8W#trVufrrr;lrqu6Wrrr;lrqu6Wrrr;osoDediqYpNqJcDDCrW) +li6qapAY*mqu?Wqs8W#trVufrrr;lrqu6Wrrr;lrqu6Wrrr;osoDediqYpNqJcDDCrW) +li6qapAY*mqu?Wqs8W#trVufrrr;lrqu6Wrrr;lrqu6Wrrr;osoDediqYpNqJcDDCrW) +li6qapAY*mqu?Wqs8W#trr;lrrVuQkrVuQkrr;oss8N'!pAb*lJcD,;rW)9ar;ccqr;cisr;cis +quH`rr;clt!W`9#r;cisquH$^rW%NLJcC<$^]/f~> +li6qapAY*mqu?Wqs8W#trr;lrrVuQkrVuQkrr;oss8N'!pAb*lJcD,;rW)9ar;ccqr;cisr;cis +quH`rr;clt!W`9#r;cisquH$^rW%NLJcC<$^]/f~> +li6qapAY*mqu?Wqs8W#trr;lrrVuQkrVuQkrr;oss8N'!pAb*lJcD,;rW)9ar;ccqr;cisr;cis +quH`rr;clt!W`9#r;cisquH$^rW%NLJcC<$^]/f~> +li6qapAb-mr;Zcsrr;Qirr;`nqu?EkrVu]opAb*lJcD,;rW)6`oDnpko)Jdjq>gQqo)S.WrW%NL +JcC<$^]/f~> +li6qapAb-mr;Zcsrr;Qirr;`nqu?EkrVu]opAb*lJcD,;rW)6`oDnpko)Jdjq>gQqo)S.WrW%NL +JcC<$^]/f~> +li6qapAb-mr;Zcsrr;Qirr;`nqu?EkrVu]opAb*lJcD,;rW)6`oDnpko)Jdjq>gQqo)S.WrW%NL +JcC<$^]/f~> +li6qapAapgr;ZWos8W#tr;ZTnq>^9kqu?Qop&G!kJcD,;rW)3_qZ$Wrr;cfrqZ-Zrr;cisquH]q +qZ-Zrr;c0`rW%NLJcC<$^]/f~> +li6qapAapgr;ZWos8W#tr;ZTnq>^9kqu?Qop&G!kJcD,;rW)3_qZ$Wrr;cfrqZ-Zrr;cisquH]q +qZ-Zrr;c0`rW%NLJcC<$^]/f~> +li6qapAapgr;ZWos8W#tr;ZTnq>^9kqu?Qop&G!kJcD,;rW)3_qZ$Wrr;cfrqZ-Zrr;cisquH]q +qZ-Zrr;c0`rW%NLJcC<$^]/f~> +li6qapAY0os8W&uq#C?or;Q`sq#C +li6qapAY0os8W&uq#C?or;Q`sq#C +li6qapAY0os8W&uq#C?or;Q`sq#C +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li6qaX8i/!JcD,;rW&VkrW%NLJcC<$^]/f~> +li3d]JcD,;rW&VkrW%NLJcC<$^]/f~> +li3d]JcD,;rW&VkrW%NLJcC<$^]/f~> +li3d]JcD,;rW&VkrW%NLJcC<$^]/f~> +li3d]JcD,;rW&VkrW%NLJcC<$^]/f~> +li3d]JcD,;rW&VkrW%NLJcC<$^]/f~> +li3d]JcD,;rW&VkrW%NLJcC<$^]/f~> +li3d]JcD,;rW(mVquHcsrW)fprrCRKrW%NLJcC<$^]/f~> +li3d]JcD,;rW(mVquHcsrW)fprrCRKrW%NLJcC<$^]/f~> +li3d]JcD,;rW(mVquHcsrW)fprrCRKrW%NLJcC<$^]/f~> +JcC<$VZ6VqirAZOrVucqeGoLJJcC<$JcELbJ,~> +JcC<$VZ6VqirAZOrVucqeGoLJJcC<$JcELbJ,~> +JcC<$VZ6VqirAZOrVucqeGoLJJcC<$JcELbJ,~> +JcC<$VZ6Vqj8])Yrr;fprr;iqeGoLJJcC<$JcELbJ,~> +JcC<$VZ6Vqj8])Yrr;fprr;iqeGoLJJcC<$JcELbJ,~> +JcC<$VZ6Vqj8])Yrr;fprr;iqeGoLJJcC<$JcELbJ,~> +JcC<$VZ6Vqj8])Yrr;uus8W&uqu?WqeGoLJJcC<$JcELbJ,~> +JcC<$VZ6Vqj8])Yrr;uus8W&uqu?WqeGoLJJcC<$JcELbJ,~> +JcC<$VZ6Vqj8])Yrr;uus8W&uqu?WqeGoLJJcC<$JcELbJ,~> +JcC<$VZ6Vqj8])Ync/RgeGoLJJcC<$JcELbJ,~> +JcC<$VZ6Vqj8])Ync/RgeGoLJJcC<$JcELbJ,~> +JcC<$VZ6Vqj8])Ync/RgeGoLJJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Ync/RgeGoLJJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Ync/RgeGoLJJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Ync/RgeGoLJJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Ync/RgeGoLJJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Ync/RgeGoLJJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Ync/RgeGoLJJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Ync/Rgq#C +JcC<$VZ6VqjT#/Ync/Rgq#C +JcC<$VZ6VqjT#/Ync/Rgq#C +JcC<$VZ6Vqk5Y/Urr;rtqu?WqqZ$BlirAuXJcC<$JcELbJ,~> +JcC<$VZ6Vqk5Y/Urr;rtqu?WqqZ$BlirAuXJcC<$JcELbJ,~> +JcC<$VZ6Vqk5Y/Urr;rtqu?WqqZ$BlirAuXJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Yr;ZZpqu?Wqqu?Zrrr;osj8])YJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Yr;ZZpqu?Wqqu?Zrrr;osj8])YJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/Yr;ZZpqu?Wqqu?Zrrr;osj8])YJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqr;Zcsr;Z]qjT#2ZJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqr;Zcsr;Z]qjT#2ZJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqr;Zcsr;Z]qjT#2ZJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuisr;Z]qjT#2ZJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuisr;Z]qjT#2ZJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuisr;Z]qjT#2ZJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuKijo>;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuKijo>;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuKijo>;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuKijo>;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuKijo>;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuKijo>;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;rtgAh-PJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;rtgAh-PJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;rtgAh-PJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;osg].6QJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;osg].6QJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;osg].6QJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;osg].6QJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;osg].6QJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;osg].6QJcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;osq#:;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;osq#:;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?Wqrr;osq#:;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuisq#:;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuisq#:;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVuisq#:;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVufrqZ$Qqjo>;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVufrqZ$Qqjo>;[JcC<$JcELbJ,~> +JcC<$VZ6VqjT#/YqZ$Npqu?WqrVufrqZ$Qqjo>;[JcC<$JcELbJ,~> +li2M9quDjK7jT#/YqZ$Npqu?Wqr;ZZprr;rtjT#2ZJcC<$JcELbJ,~> +li2M9quDjK7jT#/YqZ$Npqu?Wqr;ZZprr;rtjT#2ZJcC<$JcELbJ,~> +li2M9quDjK7jT#/YqZ$Npqu?Wqr;ZZprr;rtjT#2ZJcC<$JcELbJ,~> +li2M9quDjK7jT#/YqZ$Kor;Z]qrVuTlj8])YJcC<$JcELbJ,~> +li2M9quDjK7jT#/YqZ$Kor;Z]qrVuTlj8])YJcC<$JcELbJ,~> +li2M9quDjK7jT#/YqZ$Kor;Z]qrVuTlj8])YJcC<$JcELbJ,~> +li2M9quDjK7k5Y5Wrr;fps8VoqrVuZnirAuXJcC<$JcELbJ,~> +li2M9quDjK7k5Y5Wrr;fps8VoqrVuZnirAuXJcC<$JcELbJ,~> +li2M9quDjK7k5Y5Wrr;fps8VoqrVuZnirAuXJcC<$JcELbJ,~> +li6qaK)bfMJcERdrW'q;r;bdUrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW'q;r;bdUrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW'q;r;bdUrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&VkrW%NLJcC<$^]/f~> +li6qaK)bfMJcERdrW&Ylr;_EKJcC<$^]/f~> +li6qaK)bfMJcERdrW&Ylr;_EKJcC<$^]/f~> +li6qaK)bfMJcERdrW&Ylr;_EKJcC<$^]/f~> +li6qaK)bfMJcERdrW&YlrW%NLJcC<$^Ai]~> +li6qaK)bfMJcERdrW&YlrW%NLJcC<$^Ai]~> +li6qaK)bfMJcERdrW&YlrW%NLJcC<$^Ai]~> +li6qaK)bfMJcERdquESnquD +li6qaK)bfMJcERdquESnquD +li6qaK)bfMJcERdquESnquD +li6qaK)bfMJcEOcqZ*VqqZ)3IJcC<$^&NT~> +li6qaK)bfMJcEOcqZ*VqqZ)3IJcC<$^&NT~> +li6qaK)bfMJcEOcqZ*VqqZ)3IJcC<$^&NT~> +li6qaK)bfMJcELbq#IVuq#H!GJcC<$]`3K~> +li6qaK)bfMJcELbq#IVuq#H!GJcC<$]`3K~> +li6qaK)bfMJcELbq#IVuq#H!GJcC<$]`3K~> +li6qaK)bfMJcEIap&MT%p&K[DJcC<$]DmB~> +li6qaK)bfMJcEIap&MT%p&K[DJcC<$]DmB~> +li6qaK)bfMJcEIap&MT%p&K[DJcC<$]DmB~> +li6qaK)bfMJcE@^o)Q].o)O@AJcC<$\Gq'~> +li6qaK)bfMJcE@^o)Q].o)O@AJcC<$\Gq'~> +li6qaK)bfMJcE@^o)Q].o)O@AJcC<$\Gq'~> +li6qaP5kO^oDediJcE7[mf:c8mf7q=JcC<$[Jta~> +li6qaP5kO^oDediJcE7[mf:c8mf7q=JcC<$[Jta~> +li6qaP5kO^oDediJcE7[mf:c8mf7q=JcC<$[Jta~> +li6qaQ2ga^oDediJcE+WjoF`IjoBu4JcC<$Z2]=~> +li6qaQ2ga^oDediJcE+WjoF`IjoBu4JcC<$Z2]=~> +li6qaQ2ga^oDediJcE+WjoF`IjoBu4JcC<$Z2]=~> +li6qaQN-g^oDediJcDqR^B!6mJH4p7JcC<$jSs`~> +li6qaQN-g^oDediJcDqR^B!6mJH4p7JcC<$jSs`~> +li6qaQN-g^oDediJcDqR^B!6mJH4p7JcC<$jSs`~> +li6qa[f6=-huEZUoDediJcD\KblHJtJH4p7JcC<$jSs`~> +li6qa[f6=-huEZUoDediJcD\KblHJtJH4p7JcC<$jSs`~> +li6qa[f6=-huEZUoDediJcD\KblHJtJH4p7JcC<$jSs`~> +li6qa\,ZI.huEZUoDediJcD8?jT*U+JH4p7JcC<$jSs`~> +li6qa\,ZI.huEZUoDediJcD8?jT*U+JH4p7JcC<$jSs`~> +li6qa\,ZI.huEZUoDediJcD8?jT*U+JH4p7JcC<$jSs`~> +li6qa\GuO.huEZUoDediJcCf2rW'h8rW%NLn,N@eJcC<$jSs`~> +li6qa\GuO.huEZUoDediJcCf2rW'h8rW%NLn,N@eJcC<$jSs`~> +li6qa\GuO.huEZUoDediJcCf2rW'h8rW%NLn,N@eJcC<$jSs`~> +li6qa\GuO.huEZUoDediJcCi3r;a_7rW%NLn,N@eJcC<$jSs`~> +li6qa\GuO.huEZUoDediJcCi3r;a_7rW%NLn,N@eJcC<$jSs`~> +li6qa\GuO.huEZUoDediJcCi3r;a_7rW%NLn,N@eJcC<$jSs`~> +li6qaoDedip&G!kp&G!kp&>!lrr;uuqZ$Koq#:Hss8N'!q>^Eoq#C +li6qaoDedip&G!kp&G!kp&>!lrr;uuqZ$Koq#:Hss8N'!q>^Eoq#C +li6qaoDedip&G!kp&G!kp&>!lrr;uuqZ$Koq#:Hss8N'!q>^Eoq#C +li6qap&Fgfqu?HlqZ$?kqZ$Ko!<;orrr;`nrr;os!<;utrVuZnqZ$NpoDediJcCl4qZ+P6rW%NL +n,N@eJcC<$jSs`~> +li6qap&Fgfqu?HlqZ$?kqZ$Ko!<;orrr;`nrr;os!<;utrVuZnqZ$NpoDediJcCl4qZ+P6rW%NL +n,N@eJcC<$jSs`~> +li6qap&Fgfqu?HlqZ$?kqZ$Ko!<;orrr;`nrr;os!<;utrVuZnqZ$NpoDediJcCl4qZ+P6rW%NL +n,N@eJcC<$jSs`~> +li6qapAb-mrVuisr;Z`rrr;osr;Z`rrVuisrVuHhrr;fps8V`ls8W&urVuisqu?WqoDediJcCl4 +q>eJ6rW%NLn,N@eJcC<$jSs`~> +li6qapAb-mrVuisr;Z`rrr;osr;Z`rrVuisrVuHhrr;fps8V`ls8W&urVuisqu?WqoDediJcCl4 +q>eJ6rW%NLn,N@eJcC<$jSs`~> +li6qapAb-mrVuisr;Z`rrr;osr;Z`rrVuisrVuHhrr;fps8V`ls8W&urVuisqu?WqoDediJcCl4 +q>eJ6rW%NLn,N@eJcC<$jSs`~> +li6qapAb-mr;ZcsrVuisr;Z]qrr;rtqu?Wqr;ZZprVuisrVufrqu?Qo!<<#us8W&uqu?Wqr;Z`r +oDediJcCo5q#JA5rW%NLn,N@eJcC<$jSs`~> +li6qapAb-mr;ZcsrVuisr;Z]qrr;rtqu?Wqr;ZZprVuisrVufrqu?Qo!<<#us8W&uqu?Wqr;Z`r +oDediJcCo5q#JA5rW%NLn,N@eJcC<$jSs`~> +li6qapAb-mr;ZcsrVuisr;Z]qrr;rtqu?Wqr;ZZprVuisrVufrqu?Qo!<<#us8W&uqu?Wqr;Z`r +oDediJcCo5q#JA5rW%NLn,N@eJcC<$jSs`~> +li6qap](3mr;ZcsrVultqu?Tps8W#tqu?TprVufrr;Z`rrVufrqu?Tpqu?Tpqu?TprVuisoDedi +JcCo5p]/;5rW%NLn,N@eJcC<$jSs`~> +li6qap](3mr;ZcsrVultqu?Tps8W#tqu?TprVufrr;Z`rrVufrqu?Tpqu?Tpqu?TprVuisoDedi +JcCo5p]/;5rW%NLn,N@eJcC<$jSs`~> +li6qap](3mr;ZcsrVultqu?Tps8W#tqu?TprVufrr;Z`rrVufrqu?Tpqu?Tpqu?TprVuisoDedi +JcCo5p]/;5rW%NLn,N@eJcC<$jSs`~> +li6qap](0lq#C^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rtp]($hJcCu7 +pAi24rW%NLn,N@eJcC<$jSs`~> +li6qap](0lq#C^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rtp]($hJcCu7 +pAi24rW%NLn,N@eJcC<$jSs`~> +li6qap](0lq#C^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rtp]($hJcCu7 +pAi24rW%NLn,N@eJcC<$jSs`~> +li6qapAb$jqZ$Npp&G!kq>^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rtpAaX_JcD;@p&N,4 +rW%NLn,N@eJcC<$jSs`~> +li6qapAb$jqZ$Npp&G!kq>^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rtpAaX_JcD;@p&N,4 +rW%NLn,N@eJcC<$jSs`~> +li6qapAb$jqZ$Npp&G!kq>^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rtpAaX_JcD;@p&N,4 +rW%NLn,N@eJcC<$jSs`~> +li6qap&Fmhr;Z`rp&G!kq>^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rtpAa[`JcD8?p&N,4 +rW%NLn,N@eJcC<$jSs`~> +li6qap&Fmhr;Z`rp&G!kq>^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rtpAa[`JcD8?p&N,4 +rW%NLn,N@eJcC<$jSs`~> +li6qap&Fmhr;Z`rp&G!kq>^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rtpAa[`JcD8?p&N,4 +rW%NLn,N@eJcC<$jSs`~> +li6qao`+dgrr;ospAb'kq>^BnrVuisr;Z]qrr;osqu?Tpr;Z]qq>^Bnrr;rtp&F[bJcD5>oDlr3 +rW%NLn,N@eJcC<$jSs`~> +li6qao`+dgrr;ospAb'kq>^BnrVuisr;Z]qrr;osqu?Tpr;Z]qq>^Bnrr;rtp&F[bJcD5>oDlr3 +rW%NLn,N@eJcC<$jSs`~> +li6qao`+dgrr;ospAb'kq>^BnrVuisr;Z]qrr;osqu?Tpr;Z]qq>^Bnrr;rtp&F[bJcD5>oDlr3 +rW%NLn,N@eJcC<$jSs`~> +li6qaoDe[fs8W#tp&G!kq>^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rto`+[dJcD/ +li6qaoDe[fs8W#tp&G!kq>^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rto`+[dJcD/ +li6qaoDe[fs8W#tp&G!kq>^BnrVuisr;Z]qrr;osqu?Tpqu?Wqq>^Bnrr;rto`+[dJcD/ +li6qapAY*mrVucqs8W&up&FsjqZ$KorVuisr;Z]qrr;osqu?Tpqu?TpqZ$Korr;rto`+XcJcD5> +rW)rtrW)rtrW(%>rW)*\rrB2$rrDThrrD]krW%NLJcFg2J,~> +li6qapAY*mrVucqs8W&up&FsjqZ$KorVuisr;Z]qrr;osqu?Tpqu?TpqZ$Korr;rto`+XcJcD5> +rW)rtrW)rtrW(%>rW)*\rrB2$rrDThrrD]krW%NLJcFg2J,~> +li6qapAY*mrVucqs8W&up&FsjqZ$KorVuisr;Z]qrr;osqu?Tpqu?TpqZ$Korr;rto`+XcJcD5> +rW)rtrW)rtrW(%>rW)*\rrB2$rrDThrrD]krW%NLJcFg2J,~> +li6qapAY*mr;Z]qs8W#tqZ$Qqs8W#tqZ$Npr;Z`rr;Z]qrr;osqu?Tpqu?TpqZ$NprVuisoDeLa +JcD;@!!)rsrW)lr!!(+?rW)3_quEu$quHBhquHBhrW%NLJcFg2J,~> +li6qapAY*mr;Z]qs8W#tqZ$Qqs8W#tqZ$Npr;Z`rr;Z]qrr;osqu?Tpqu?TpqZ$NprVuisoDeLa +JcD;@!!)rsrW)lr!!(+?rW)3_quEu$quHBhquHBhrW%NLJcFg2J,~> +li6qapAY*mr;Z]qs8W#tqZ$Qqs8W#tqZ$Npr;Z`rr;Z]qrr;osqu?Tpqu?TpqZ$NprVuisoDeLa +JcD;@!!)rsrW)lr!!(+?rW)3_quEu$quHBhquHBhrW%NLJcFg2J,~> +li6qapAY*mqu?Wqs8Vusqu6Wrrr;osqZ$Npr;Z`rr;Z]qrr;osqu?Tpqu?TpqZ$NprVuisoDe^g +!<;orJcD,;rW'h8rW)6`qZ*o$qZ-9gquHBhrW%NLJcFg2J,~> +li6qapAY*mqu?Wqs8Vusqu6Wrrr;osqZ$Npr;Z`rr;Z]qrr;osqu?Tpqu?TpqZ$NprVuisoDe^g +!<;orJcD,;rW'h8rW)6`qZ*o$qZ-9gquHBhrW%NLJcFg2J,~> +li6qapAY*mqu?Wqs8Vusqu6Wrrr;osqZ$Npr;Z`rr;Z]qrr;osqu?Tpqu?TpqZ$NprVuisoDe^g +!<;orJcD,;rW'h8rW)6`qZ*o$qZ-9gquHBhrW%NLJcFg2J,~> +li6qapAY*mqu?Wqrr;ZlrVufrqu?Zrr;Z]qr;Z]qrr;oss8N'!rr;osqZ$Koqu?Zrr;Z`roDe[f +!<;lqJcD2=rW'h8rW)-]rW'A+!!)orrW)NhrW)TjrW%NLJcFg2J,~> +li6qapAY*mqu?Wqrr;ZlrVufrqu?Zrr;Z]qr;Z]qrr;oss8N'!rr;osqZ$Koqu?Zrr;Z`roDe[f +!<;lqJcD2=rW'h8rW)-]rW'A+!!)orrW)NhrW)TjrW%NLJcFg2J,~> +li6qapAY*mqu?Wqrr;ZlrVufrqu?Zrr;Z]qr;Z]qrr;oss8N'!rr;osqZ$Koqu?Zrr;Z`roDe[f +!<;lqJcD2=rW'h8rW)-]rW'A+!!)orrW)NhrW)TjrW%NLJcFg2J,~> +li6qapAb-mr;Zcsr;ZNlqu?TprVultqu?Tpr;Z]qrr;fprr;osq>^BnrVultqu?Tpo`+dgrr;fp +JcD8?rW'h8rW)-]rW'D,rrDrrrW)NhrW)TjrW%NLJcFg2J,~> +li6qapAb-mr;Zcsr;ZNlqu?TprVultqu?Tpr;Z]qrr;fprr;osq>^BnrVultqu?Tpo`+dgrr;fp +JcD8?rW'h8rW)-]rW'D,rrDrrrW)NhrW)TjrW%NLJcFg2J,~> +li6qapAb-mr;Zcsr;ZNlqu?TprVultqu?Tpr;Z]qrr;fprr;osq>^BnrVultqu?Tpo`+dgrr;fp +JcD8?rW'h8rW)-]rW'D,rrDrrrW)NhrW)TjrW%NLJcFg2J,~> +li6qapAapgqZ$Blq>^6jqu?Kms8Vrrrr;lrs8VlpqZ$?kr;ZTnp&Fmhr;ZWoJcD;@rW'h8rW)-] +rW'G-rW)iqrW)NhrW)TjrW%NLJcFg2J,~> +li6qapAapgqZ$Blq>^6jqu?Kms8Vrrrr;lrs8VlpqZ$?kr;ZTnp&Fmhr;ZWoJcD;@rW'h8rW)-] +rW'G-rW)iqrW)NhrW)TjrW%NLJcFg2J,~> +li6qapAapgqZ$Blq>^6jqu?Kms8Vrrrr;lrs8VlpqZ$?kr;ZTnp&Fmhr;ZWoJcD;@rW'h8rW)-] +rW'G-rW)iqrW)NhrW)TjrW%NLJcFg2J,~> +li6qapAY0os8W&upAb*lp&FpikPtP^m/Qt`kl:M[qu?KmJcDABrW'h8rW)-]rW'G-rW)iqrW)Nh +rW)TjrW%NLJcFg2J,~> +li6qapAY0os8W&upAb*lp&FpikPtP^m/Qt`kl:M[qu?KmJcDABrW'h8rW)-]rW'G-rW)iqrW)Nh +rW)TjrW%NLJcFg2J,~> +li6qapAY0os8W&upAb*lp&FpikPtP^m/Qt`kl:M[qu?KmJcDABrW'h8rW)-]rW'G-rW)iqrW)Nh +rW)TjrW%NLJcFg2J,~> +li6qaK)bfM!ri6#q>^ +li6qaK)bfM!ri6#q>^ +li6qaK)bfM!ri6#q>^ +li6qaK)bfM!ri6#p](*jJcDJErW'h8rW)Tjq#L?mrW)rtqZ-WqquHZpr;Zitr;cltr;ZitqZ-Wq +qZ-Hlq#LHpp]1 +li6qaK)bfM!ri6#p](*jJcDJErW'h8rW)Tjq#L?mrW)rtqZ-WqquHZpr;Zitr;cltr;ZitqZ-Wq +qZ-Hlq#LHpp]1 +li6qaK)bfM!ri6#p](*jJcDJErW'h8rW)Tjq#L?mrW)rtqZ-WqquHZpr;Zitr;cltr;ZitqZ-Wq +qZ-Hlq#LHpp]1 +li6qaK)bfMs8N'!pAashJcDPGrW'h8rW)WkrrE#trW)lrrW)lrr;ccqrW)rtkPtV_q#LgKorW)fprW)osr;cKirW%NLJcFg2J,~> +li6qaK)bfMs8N'!pAashJcDPGrW'h8rW)WkrrE#trW)lrrW)lrr;ccqrW)rtkPtV_q#LgKorW)fprW)osr;cKirW%NLJcFg2J,~> +li6qaK)bfMs8N'!pAashJcDPGrW'h8rW)WkrrE#trW)lrrW)lrr;ccqrW)rtkPtV_q#LgKorW)fprW)osr;cKirW%NLJcFg2J,~> +li6qaK)bfMnc/IdJcDSHrW'h8rW)WkrrDusrrDusrW)lrr;ccqrW)lrqu?`srW)uuquH]qquH]q +r;cfrrW)lrr;cltr;c`prW)iqrW)iqrW)TjrW%NLJcFg2J,~> +li6qaK)bfMnc/IdJcDSHrW'h8rW)WkrrDusrrDusrW)lrr;ccqrW)lrqu?`srW)uuquH]qquH]q +r;cfrrW)lrr;cltr;c`prW)iqrW)iqrW)TjrW%NLJcFg2J,~> +li6qaK)bfMnc/IdJcDSHrW'h8rW)WkrrDusrrDusrW)lrr;ccqrW)lrqu?`srW)uuquH]qquH]q +r;cfrrW)lrr;cltr;c`prW)iqrW)iqrW)TjrW%NLJcFg2J,~> +li6qaK)bfMn,N7bJcDYJrW'h8rW)ZlrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfr +rrDrrr;cltr;c`prW)iqrW)iqrW)TjrW%NLJcFg2J,~> +li6qaK)bfMn,N7bJcDYJrW'h8rW)ZlrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfr +rrDrrr;cltr;c`prW)iqrW)iqrW)TjrW%NLJcFg2J,~> +li6qaK)bfMn,N7bJcDYJrW'h8rW)ZlrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfr +rrDrrr;cltr;c`prW)iqrW)iqrW)TjrW%NLJcFg2J,~> +li6qaK)bfMmf3+`JcD_LrW'h8rW)Zlr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fp +rrE&ur;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMmf3+`JcD_LrW'h8rW)Zlr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fp +rrE&ur;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMmf3+`JcD_LrW'h8rW)Zlr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fp +rrE&ur;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMm/Qq_JcDbMrW'h8rW)WkquHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)Wk +r;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMm/Qq_JcDbMrW'h8rW)WkquHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)Wk +r;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMm/Qq_JcDbMrW'h8rW)WkquHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)Wk +r;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMlMp_]JcDhOrW'h8rW)TjqZ-KmrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)Wk +r;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMlMp_]JcDhOrW'h8rW)TjqZ-KmrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)Wk +r;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMlMp_]JcDhOrW'h8rW)TjqZ-KmrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)Wk +r;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMl2US[JcDnQrW'h8rW)QiqZ-NnrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNj +r;c`prW)osr;c]orW)TjrW%NLJcFg2J,~> +li6qaK)bfMl2US[JcDnQrW'h8rW)QiqZ-NnrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNj +r;c`prW)osr;c]orW)TjrW%NLJcFg2J,~> +li6qaK)bfMl2US[JcDnQrW'h8rW)QiqZ-NnrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNj +r;c`prW)osr;c]orW)TjrW%NLJcFg2J,~> +li6qaK)bfMkPtDZJcDqRrW'h8rW)NhqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNj +r;c`prW)osr;c]orW)TjrW%NLJcFg2J,~> +li6qaK)bfMkPtDZJcDqRrW'h8rW)NhqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNj +r;c`prW)osr;c]orW)TjrW%NLJcFg2J,~> +li6qaK)bfMkPtDZJcDqRrW'h8rW)NhqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNj +r;c`prW)osr;c]orW)TjrW%NLJcFg2J,~> +li6qaK)bfMk5Y8XJcE"TrW'h8rW)Wk!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +rW)Wkr;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMk5Y8XJcE"TrW'h8rW)Wk!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +rW)Wkr;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMk5Y8XJcE"TrW'h8rW)Wk!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +rW)Wkr;c`prW)lrrW)fprW)TjrW%NLJcFg2J,~> +li6qaK)bfMjT#&VJcE(VrW'h8rW)Wk!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +r;c]orrE*!r;c`prW)lrr;c`prW)TjrW%NLJcFg2J,~> +li6qaK)bfMjT#&VJcE(VrW'h8rW)Wk!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +r;c]orrE*!r;c`prW)lrr;c`prW)TjrW%NLJcFg2J,~> +li6qaK)bfMjT#&VJcE(VrW'h8rW)Wk!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +r;c]orrE*!r;c`prW)lrr;c`prW)TjrW%NLJcFg2J,~> +li6qaK)bfMirAlUJcE+WrW'h8rW)Wk!!)orrW)osrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +quHWo!!*#ur;c`prW)lrr;c`prW)TjrW%NLJcFg2J,~> +li6qaK)bfMirAlUJcE+WrW'h8rW)Wk!!)orrW)osrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +quHWo!!*#ur;c`prW)lrr;c`prW)TjrW%NLJcFg2J,~> +li6qaK)bfMirAlUJcE+WrW'h8rW)Wk!!)orrW)osrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +quHWo!!*#ur;c`prW)lrr;c`prW)TjrW%NLJcFg2J,~> +li6qaK)bfMiW&`SJcE1YrW'h8rW)Wk!!)orrW)osrW)lrr;cfrr;ccqr;cZnrW)lrr;ccqr;cfr +p&P*lr;clt!!*#urW)iqr;ccqr;cNjrW%NLJcFg2J,~> +li6qaK)bfMiW&`SJcE1YrW'h8rW)Wk!!)orrW)osrW)lrr;cfrr;ccqr;cZnrW)lrr;ccqr;cfr +p&P*lr;clt!!*#urW)iqr;ccqr;cNjrW%NLJcFg2J,~> +li6qaK)bfMiW&`SJcE1YrW'h8rW)Wk!!)orrW)osrW)lrr;cfrr;ccqr;cZnrW)lrr;ccqr;cfr +p&P*lr;clt!!*#urW)iqr;ccqr;cNjrW%NLJcFg2J,~> +li2M9quGXSqZ)3I\,ZF-_Z0T8p&G$lr;Zcsr;Z]qr;ZTn!<;rsrr;osqZ$Kor;Z]qr;Z]qr;ZNl +rVu]orr;osqu?9gpAb*lJcC<$jSs`~> +li2M9quGXSqZ)3I\,ZF-_Z0T8p&G$lr;Zcsr;Z]qr;ZTn!<;rsrr;osqZ$Kor;Z]qr;Z]qr;ZNl +rVu]orr;osqu?9gpAb*lJcC<$jSs`~> +li2M9quGXSqZ)3I\,ZF-_Z0T8p&G$lr;Zcsr;Z]qr;ZTn!<;rsrr;osqZ$Kor;Z]qr;Z]qr;ZNl +rVu]orr;osqu?9gpAb*lJcC<$jSs`~> +li2M9quGRQqZ)3I\c;X/_Z0T8p&FgfrVu]or;ZZps8W&urr;corVu]os8Voqs8VoqrVu]oqu?Qo +s8Voqqu?Nn!<;utp&G!kJcC<$jSs`~> +li2M9quGRQqZ)3I\c;X/_Z0T8p&FgfrVu]or;ZZps8W&urr;corVu]os8Voqs8VoqrVu]oqu?Qo +s8Voqqu?Nn!<;utp&G!kJcC<$jSs`~> +li2M9quGRQqZ)3I\c;X/_Z0T8p&FgfrVu]or;ZZps8W&urr;corVu]os8Voqs8VoqrVu]oqu?Qo +s8Voqqu?Nn!<;utp&G!kJcC<$jSs`~> +li2M9quGOPq>c*H]Dqj1_Z0T8p&>'ns8W&umf37drr2rudJs1Gq#C?omf3:err2ruo)J[hJcC<$ +jSs`~> +li2M9quGOPq>c*H]Dqj1_Z0T8p&>'ns8W&umf37drr2rudJs1Gq#C?omf3:err2ruo)J[hJcC<$ +jSs`~> +li2M9quGOPq>c*H]Dqj1_Z0T8p&>'ns8W&umf37drr2rudJs1Gq#C?omf3:err2ruo)J[hJcC<$ +jSs`~> +JcELbqZ)3I]`7s2_Z0T8JcG3=rW%NLJcFg2J,~> +JcELbqZ)3I]`7s2_Z0T8JcG3=rW%NLJcFg2J,~> +JcELbqZ)3I]`7s2_Z0T8JcG3=rW%NLJcFg2J,~> +JcEF`qZ)3I^An04_Z0T8JcG3=rW%NLJcFg2J,~> +JcEF`qZ)3I^An04_Z0T8JcG3=rW%NLJcFg2J,~> +JcEF`qZ)3I^An04_Z0T8JcG3=rW%NLJcFg2J,~> +JcEC_q>c*H_#OB6_Z0T8JcG3=rW%NLJcFg2J,~> +JcEC_q>c*H_#OB6_Z0T8JcG3=rW%NLJcFg2J,~> +JcEC_q>c*H_#OB6_Z0T8JcG3=rW%NLJcFg2J,~> +JcE=]qZ)3I_>jK7_Z0T8JcG3=rW%NLJcFg2J,~> +JcE=]qZ)3I_>jK7_Z0T8JcG3=rW%NLJcFg2J,~> +JcE=]qZ)3I_>jK7_Z0T8JcG3=rW%NLJcFg2J,~> +JcE7[qZ)3I_uK]9_Z0T8JcG3=rW%NLJcFg2J,~> +JcE7[qZ)3I_uK]9_Z0T8JcG3=rW%NLJcFg2J,~> +JcE7[qZ)3I_uK]9_Z0T8JcG3=rW%NLJcFg2J,~> +JcE4Zq>c*H`W,o;_Z0T8JcG3=rW%NLJcFg2J,~> +JcE4Zq>c*H`W,o;_Z0T8JcG3=rW%NLJcFg2J,~> +JcE4Zq>c*H`W,o;_Z0T8JcG3=rW%NLJcFg2J,~> +JcE.XqZ)3I`rH#<_Z0T8JcG3=rW%NLJcFg2J,~> +JcE.XqZ)3I`rH#<_Z0T8JcG3=rW%NLJcFg2J,~> +JcE.XqZ)3I`rH#<_Z0T8JcG3=rW%NLJcFg2J,~> +JcE+Wq>c*HaT)5>_Z0T8JcG3=rW%NLJcFg2J,~> +JcE+Wq>c*HaT)5>_Z0T8JcG3=rW%NLJcFg2J,~> +JcE+Wq>c*HaT)5>_Z0T8JcG3=rW%NLJcFg2J,~> +JcE%Uq>c*Hb5_G@_Z0T8JcG3=rW%NLJcFg2J,~> +JcE%Uq>c*Hb5_G@_Z0T8JcG3=rW%NLJcFg2J,~> +JcE%Uq>c*Hb5_G@_Z0T8JcG3=rW%NLJcFg2J,~> +JcDtSqZ)3IbQ%PA_Z0T8JcG3=rW%NLJcFg2J,~> +JcDtSqZ)3IbQ%PA_Z0T8JcG3=rW%NLJcFg2J,~> +JcDtSqZ)3IbQ%PA_Z0T8JcG3=rW%NLJcFg2J,~> +JcDqRq>c*Hc2[bC_Z0T8JcG3=rW%NLJcFg2J,~> +JcDqRq>c*Hc2[bC_Z0T8JcG3=rW%NLJcFg2J,~> +JcDqRq>c*Hc2[bC_Z0T8JcG3=rW%NLJcFg2J,~> +JcDkPq>c*Hci +JcDkPq>c*Hci +JcDkPq>c*Hci +JcDeNqZ)3Id/X(F_Z0T8JcG3=rW%NLJcFg2J,~> +JcDeNqZ)3Id/X(F_Z0T8JcG3=rW%NLJcFg2J,~> +JcDeNqZ)3Id/X(F_Z0T8JcG3=rW%NLJcFg2J,~> +JcDbMq>c*Hdf9:H_Z0T8JcG3=rW%NLJcFg2J,~> +JcDbMq>c*Hdf9:H_Z0T8JcG3=rW%NLJcFg2J,~> +JcDbMq>c*Hdf9:H_Z0T8JcG3=rW%NLJcFg2J,~> +JcD\KqZ)3Ie,TCI_Z0T8JcG3=rW%NLJcFg2J,~> +JcD\KqZ)3Ie,TCI_Z0T8JcG3=rW%NLJcFg2J,~> +JcD\KqZ)3Ie,TCI_Z0T8JcG3=rW%NLJcFg2J,~> +JcDVIqZ)3Iec5UK_Z0T8JcG3=rW%NLJcFg2J,~> +JcDVIqZ)3Iec5UK_Z0T8JcG3=rW%NLJcFg2J,~> +JcDVIqZ)3Iec5UK_Z0T8JcG3=rW%NLJcFg2J,~> +JcDSHq>c*HfDkgM_Z0T8mf*7erVulteGoOKeGfLKk5YD\JcC<$jSs`~> +JcDSHq>c*HfDkgM_Z0T8mf*7erVulteGoOKeGfLKk5YD\JcC<$jSs`~> +JcDSHq>c*HfDkgM_Z0T8mf*7erVulteGoOKeGfLKk5YD\JcC<$jSs`~> +JcDMFqZ)3If`1pN_Z0T8n,NCf!<;rsf`1gKeGoOKkPtM]JcC<$jSs`~> +JcDMFqZ)3If`1pN_Z0T8n,NCf!<;rsf`1gKeGoOKkPtM]JcC<$jSs`~> +JcDMFqZ)3If`1pN_Z0T8n,NCf!<;rsf`1gKeGoOKkPtM]JcC<$jSs`~> +JcDGDqZ)3IgAh-P_Z0T8nGiLgs8Vusf`1gKe,TFJkl:V^JcC<$jSs`~> +JcDGDqZ)3IgAh-P_Z0T8nGiLgs8Vusf`1gKe,TFJkl:V^JcC<$jSs`~> +JcDGDqZ)3IgAh-P_Z0T8nGiLgs8Vusf`1gKe,TFJkl:V^JcC<$jSs`~> +li3d]P5k@YJcFO*rW'h8rW)KgrrDusrW(OLr;b:GrrD<`rW%NLJcFg2J,~> +li3d]P5k@YJcFO*rW'h8rW)KgrrDusrW(OLr;b:GrrD<`rW%NLJcFg2J,~> +li3d]P5k@YJcFO*rW'h8rW)KgrrDusrW(OLr;b:GrrD<`rW%NLJcFg2J,~> +li3d]OT51XJcFR+rW'h8rW)NhrrDrrrW(OLr;b7FrrD?arW%NLJcFg2J,~> +li3d]OT51XJcFR+rW'h8rW)NhrrDrrrW(OLr;b7FrrD?arW%NLJcFg2J,~> +li3d]OT51XJcFR+rW'h8rW)NhrrDrrrW(OLr;b7FrrD?arW%NLJcFg2J,~> +li3d]NrStVJcFX-rW'h8rW)QirrDoqrW(OLr;b7FrW)9arW%NLJcFg2J,~> +li3d]NrStVJcFX-rW'h8rW)QirrDoqrW(OLr;b7FrW)9arW%NLJcFg2J,~> +li3d]NrStVJcFX-rW'h8rW)QirrDoqrW(OLr;b7FrW)9arW%NLJcFg2J,~> +li6qaX8i/!NW8hTJcF^/rW'h8rW)TjrW)fprW(OLr;b4ErW) +li6qaX8i/!NW8hTJcF^/rW'h8rW)TjrW)fprW(OLr;b4ErW) +li6qaX8i/!NW8hTJcF^/rW'h8rW)TjrW)fprW(OLr;b4ErW) +li6qaX8i/!MuWYSJcFa0rW'h8rW)TjrW)fprW)rtrW)Zlr;cNjrW)fpr;bgV!!*#urW)]mrW) +li6qaX8i/!MuWYSJcFa0rW'h8rW)TjrW)fprW)rtrW)Zlr;cNjrW)fpr;bgV!!*#urW)]mrW) +li6qaX8i/!MuWYSJcFa0rW'h8rW)TjrW)fprW)rtrW)Zlr;cNjrW)fpr;bgV!!*#urW)]mrW) +li6qaX8i/!MZ^NqqZ-WqquH]q +r;ZitqZ-BjrW)?crW%NLJcFg2J,~> +li6qaX8i/!MZ^NqqZ-WqquH]q +r;ZitqZ-BjrW)?crW%NLJcFg2J,~> +li6qaX8i/!MZ^NqqZ-WqquH]q +r;ZitqZ-BjrW)?crW%NLJcFg2J,~> +li6qaX8i/!M#[;OJcFm4rW'h8rW)WkrW)coo`4pirW)osrW)lrrW)rtr;cfrr;cfrrW)iqr;ccq +rW)uuo)SRcrW)?crW%NLJcFg2J,~> +li6qaX8i/!M#[;OJcFm4rW'h8rW)WkrW)coo`4pirW)osrW)lrrW)rtr;cfrr;cfrrW)iqr;ccq +rW)uuo)SRcrW)?crW%NLJcFg2J,~> +li6qaX8i/!M#[;OJcFm4rW'h8rW)WkrW)coo`4pirW)osrW)lrrW)rtr;cfrr;cfrrW)iqr;ccq +rW)uuo)SRcrW)?crW%NLJcFg2J,~> +li6qaX8i/!LB%,NJcFp5rW'h8rW)WkrW)coquH`rquH]qrW)osrW)osrW)lrr;cisr;cisrrDlp +r;ccqrW)osquH`rquHQmrW)?crW%NLJcFg2J,~> +li6qaX8i/!LB%,NJcFp5rW'h8rW)WkrW)coquH`rquH]qrW)osrW)osrW)lrr;cisr;cisrrDlp +r;ccqrW)osquH`rquHQmrW)?crW%NLJcFg2J,~> +li6qaX8i/!LB%,NJcFp5rW'h8rW)WkrW)coquH`rquH]qrW)osrW)osrW)lrr;cisr;cisrrDlp +r;ccqrW)osquH`rquHQmrW)?crW%NLJcFg2J,~> +li6qaX8i/!L&^uLJcG!7rW'h8rW)Zlr;cZnr;ccqr;cisr;cfrr;cisrrDrrr;cisr;cltrrDio +r;ccqrW)osr;c`prW)cor;c9crW%NLJcFg2J,~> +li6qaX8i/!L&^uLJcG!7rW'h8rW)Zlr;cZnr;ccqr;cisr;cfrr;cisrrDrrr;cisr;cltrrDio +r;ccqrW)osr;c`prW)cor;c9crW%NLJcFg2J,~> +li6qaX8i/!L&^uLJcG!7rW'h8rW)Zlr;cZnr;ccqr;cisr;cfrr;cisrrDrrr;cisr;cltrrDio +r;ccqrW)osr;c`prW)cor;c9crW%NLJcFg2J,~> +li6qaX8i/!KE(cJJcG'9rW'h8rW)Zlr;cZnrW)fpr;cisrrDusr;cltrW)fprrE#tr;Zp!!!)cn +r;ccqrW)osr;c`pr;c]or;c9crW%NLJcFg2J,~> +li6qaX8i/!KE(cJJcG'9rW'h8rW)Zlr;cZnrW)fpr;cisrrDusr;cltrW)fprrE#tr;Zp!!!)cn +r;ccqrW)osr;c`pr;c]or;c9crW%NLJcFg2J,~> +li6qaX8i/!KE(cJJcG'9rW'h8rW)Zlr;cZnrW)fpr;cisrrDusr;cltrW)fprrE#tr;Zp!!!)cn +r;ccqrW)osr;c`pr;c]or;c9crW%NLJcFg2J,~> +li6qaX8i/!JcGTIJcG*:rW'h8rW)Zlr;cZnrW)fpr;cWmquHcsrW)TjqZ-?ir;ccqrW)osr;c`p +r;c]or;c9crW%NLJcFg2J,~> +li6qaX8i/!JcGTIJcG*:rW'h8rW)Zlr;cZnrW)fpr;cWmquHcsrW)TjqZ-?ir;ccqrW)osr;c`p +r;c]or;c9crW%NLJcFg2J,~> +li6qaX8i/!JcGTIJcG*:rW'h8rW)Zlr;cZnrW)fpr;cWmquHcsrW)TjqZ-?ir;ccqrW)osr;c`p +r;c]or;c9crW%NLJcFg2J,~> +li6qaX8i/!Jc>`Mq>c*Hmf37d_Z0T8pAb'kq>^EoqZ$Koqu?Hls8W&uo`+afp](0lr;Z`rrVufr +qu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!Jc>`Mq>c*Hmf37d_Z0T8pAb'kq>^EoqZ$Koqu?Hls8W&uo`+afp](0lr;Z`rrVufr +qu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!Jc>`Mq>c*Hmf37d_Z0T8pAb'kq>^EoqZ$Koqu?Hls8W&uo`+afp](0lr;Z`rrVufr +qu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!JcG`LqZ)3In,N@e_Z0T8pAb'kq>^EoqZ$Kor;Z`rs8W#t!<;uto`+afp](0lr;Z`r +rVufrqu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!JcG`LqZ)3In,N@e_Z0T8pAb'kq>^EoqZ$Kor;Z`rs8W#t!<;uto`+afp](0lr;Z`r +rVufrqu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!JcG`LqZ)3In,N@e_Z0T8pAb'kq>^EoqZ$Kor;Z`rs8W#t!<;uto`+afp](0lr;Z`r +rVufrqu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!JcGZJqZ)3Inc/Rg_Z0T8pAb'kq>^EoqZ$Korr;rtrVufr!<;uto`+^eq#C9mr;Z`r +rVufrqu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!JcGZJqZ)3Inc/Rg_Z0T8pAb'kq>^EoqZ$Korr;rtrVufr!<;uto`+^eq#C9mr;Z`r +rVufrqu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!JcGZJqZ)3Inc/Rg_Z0T8pAb'kq>^EoqZ$Korr;rtrVufr!<;uto`+^eq#C9mr;Z`r +rVufrqu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!JcGWIq>c*HoDedi_Z0T8pAb'kq>^EoqZ$Korr;rtrVufrs8W&uo`+ji!<;utq>^Bn +r;Z`rrVufrqu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!JcGWIq>c*HoDedi_Z0T8pAb'kq>^EoqZ$Korr;rtrVufrs8W&uo`+ji!<;utq>^Bn +r;Z`rrVufrqu?TpqZ$Komf37dJcC<$jSs`~> +li6qaX8i/!JcGWIq>c*HoDedi_Z0T8pAb'kq>^EoqZ$Korr;rtrVufrs8W&uo`+ji!<;utq>^Bn +r;Z`rrVufrqu?TpqZ$Komf37dJcC<$jSs`~> +li6qakl:V^k5Y>ZkPtM]JcGQGqZ)3Io`+mj_Z0T8p&G!kq>^EoqZ$Nprr;osrVufrs8W#tqZ$Qq +rr;oss8W#tqZ$Kor;Z`rrVufrqu?Wqq>^EomJm.cJcC<$jSs`~> +li6qakl:V^k5Y>ZkPtM]JcGQGqZ)3Io`+mj_Z0T8p&G!kq>^EoqZ$Nprr;osrVufrs8W#tqZ$Qq +rr;oss8W#tqZ$Kor;Z`rrVufrqu?Wqq>^EomJm.cJcC<$jSs`~> +li6qakl:V^k5Y>ZkPtM]JcGQGqZ)3Io`+mj_Z0T8p&G!kq>^EoqZ$Nprr;osrVufrs8W#tqZ$Qq +rr;oss8W#tqZ$Kor;Z`rrVufrqu?Wqq>^EomJm.cJcC<$jSs`~> +li6qal2U\^kl:GYkl:V^JcGKEqZ)3IpAb*l_Z0T8p&G!kq>^EoqZ$Nprr;osrVufrs8Vusqu6Wr +rVufrrr;osqu?Tpr;Z`rrVufrqu?Wqq>^EomJm.cJcC<$jSs`~> +li6qal2U\^kl:GYkl:V^JcGKEqZ)3IpAb*l_Z0T8p&G!kq>^EoqZ$Nprr;osrVufrs8Vusqu6Wr +rVufrrr;osqu?Tpr;Z`rrVufrqu?Wqq>^EomJm.cJcC<$jSs`~> +li6qal2U\^kl:GYkl:V^JcGKEqZ)3IpAb*l_Z0T8p&G!kq>^EoqZ$Nprr;osrVufrs8Vusqu6Wr +rVufrrr;osqu?Tpr;Z`rrVufrqu?Wqq>^EomJm.cJcC<$jSs`~> +li6qal2U\^l2U__rr;rtkl:V^JcGHDq>c*Hq#C^Eoqu?WqrVufrrr;lrrr;Zl +rVufrrr;osqu?TprVufrrVufrr;Z`rq#C +li6qal2U\^l2U__rr;rtkl:V^JcGHDq>c*Hq#C^Eoqu?WqrVufrrr;lrrr;Zl +rVufrrr;osqu?TprVufrrVufrr;Z`rq#C +li6qal2U\^l2U__rr;rtkl:V^JcGHDq>c*Hq#C^Eoqu?WqrVufrrr;lrrr;Zl +rVufrrr;osqu?TprVufrrVufrr;Z`rq#C +li6qakl:V^l2U__rr;uukPtM]JcGBBqZ)3Iq>^Eo_Z0T8o`+mjqZ$KorVuisr;Z?gs8Vior;Z]q +rVucqr;ZTn!<;rss8Vusrr;rtq#C +li6qakl:V^l2U__rr;uukPtM]JcGBBqZ)3Iq>^Eo_Z0T8o`+mjqZ$KorVuisr;Z?gs8Vior;Z]q +rVucqr;ZTn!<;rss8Vusrr;rtq#C +li6qakl:V^l2U__rr;uukPtM]JcGBBqZ)3Iq>^Eo_Z0T8o`+mjqZ$KorVuisr;Z?gs8Vior;Z]q +rVucqr;ZTn!<;rss8Vusrr;rtq#C +li6qac2[bCirAuXJcG<@qZ)3Iqu?Wq_Z0T8o`+mjq>^3iqZ$Ems8W#trVu]orVuZns8VoqrVucq +s8W&urVuTlp](3mm/R%bJcC<$jSs`~> +li6qac2[bCirAuXJcG<@qZ)3Iqu?Wq_Z0T8o`+mjq>^3iqZ$Ems8W#trVu]orVuZns8VoqrVucq +s8W&urVuTlp](3mm/R%bJcC<$jSs`~> +li6qac2[bCirAuXJcG<@qZ)3Iqu?Wq_Z0T8o`+mjq>^3iqZ$Ems8W#trVu]orVuZns8VoqrVucq +s8W&urVuTlp](3mm/R%bJcC<$jSs`~> +li6qacN!hCirAuXJcG9?q>c*HrVuis_Z0T8oDegjpAb*lp&G$lr;Q`sq>^Eojo>;[rr2ruqu?Tp +!<<#up&G$lli6qaJcC<$jSs`~> +li6qacN!hCirAuXJcG9?q>c*HrVuis_Z0T8oDegjpAb*lp&G$lr;Q`sq>^Eojo>;[rr2ruqu?Tp +!<<#up&G$lli6qaJcC<$jSs`~> +li6qacN!hCirAuXJcG9?q>c*HrVuis_Z0T8oDegjpAb*lp&G$lr;Q`sq>^Eojo>;[rr2ruqu?Tp +!<<#up&G$lli6qaJcC<$jSs`~> +li6qacN!hCirAuXJcG3=qZ)3Irr;rt_Z0T8o)J^iXT/5!o)J[hli6qaJcC<$jSs`~> +li6qacN!hCirAuXJcG3=qZ)3Irr;rt_Z0T8o)J^iXT/5!o)J[hli6qaJcC<$jSs`~> +li6qacN!hCirAuXJcG3=qZ)3Irr;rt_Z0T8o)J^iXT/5!o)J[hli6qaJcC<$jSs`~> +li6qaoDedimJd.drr;uuq>^BnpAb*lnGiIfJcG0c*H!<<#u_Z0T8o)J^iXT/5!o)J^ilMph` +JcC<$jSs`~> +li6qaoDedimJd.drr;uuq>^BnpAb*lnGiIfJcG0c*H!<<#u_Z0T8o)J^iXT/5!o)J^ilMph` +JcC<$jSs`~> +li6qaoDedimJd.drr;uuq>^BnpAb*lnGiIfJcG0c*H!<<#u_Z0T8o)J^iXT/5!o)J^ilMph` +JcC<$jSs`~> +li6qap&Fgfr;Z`rqu?Tp!<;orrVuTlrVuZno)J[hJcG*:q>c-IrW'h8rW)KgrrB2$r;cHhrrD<` +rW%NLJcFg2J,~> +li6qap&Fgfr;Z`rqu?Tp!<;orrVuTlrVuZno)J[hJcG*:q>c-IrW'h8rW)KgrrB2$r;cHhrrD<` +rW%NLJcFg2J,~> +li6qap&Fgfr;Z`rqu?Tp!<;orrVuTlrVuZno)J[hJcG*:q>c-IrW'h8rW)KgrrB2$r;cHhrrD<` +rW%NLJcFg2J,~> +li6qapAb-mrVuisrr;lrrVuHhr;Z]qqZ$NprVuisoDedioDeahJcGZJqZ)9KrW'h8rW)HfrrB5% +r;cKirrD9_rW%NLJcFg2J,~> +li6qapAb-mrVuisrr;lrrVuHhr;Z]qqZ$NprVuisoDedioDeahJcGZJqZ)9KrW'h8rW)HfrrB5% +r;cKirrD9_rW%NLJcFg2J,~> +li6qapAb-mrVuisrr;lrrVuHhr;Z]qqZ$NprVuisoDedioDeahJcGZJqZ)9KrW'h8rW)HfrrB5% +r;cKirrD9_rW%NLJcFg2J,~> +li6qapAb-mr;Zcsr;Z`rqu?QorVuisr;Z]qqu?Wqqu?Wqo`+mjqZ$9iJcGTHq>c6LrW'h8rW)Bd +!!'5&r;cNj!!)0]rW%NLJcFg2J,~> +li6qapAb-mr;Zcsr;Z`rqu?QorVuisr;Z]qqu?Wqqu?Wqo`+mjqZ$9iJcGTHq>c6LrW'h8rW)Bd +!!'5&r;cNj!!)0]rW%NLJcFg2J,~> +li6qapAb-mr;Zcsr;Z`rqu?QorVuisr;Z]qqu?Wqqu?Wqo`+mjqZ$9iJcGTHq>c6LrW'h8rW)Bd +!!'5&r;cNj!!)0]rW%NLJcFg2J,~> +li6qap](3mr;Zcsr;Z`rqu?Tpr;Z`rr;Z]qr;Z]qqu?Tpp&G!k!<;TiJcGKEqZ)BNrW'h8rW&Mh +q#K1LrW%NLJcFg2J,~> +li6qap](3mr;Zcsr;Z`rqu?Tpr;Z`rr;Z]qr;Z]qqu?Tpp&G!k!<;TiJcGKEqZ)BNrW'h8rW&Mh +q#K1LrW%NLJcFg2J,~> +li6qap](3mr;Zcsr;Z`rqu?Tpr;Z`rr;Z]qr;Z]qqu?Tpp&G!k!<;TiJcGKEqZ)BNrW'h8rW&Mh +q#K1LrW%NLJcFg2J,~> +li6qap](0lpAb*lqZ$Npr;Z]qrVufrr;Z`rq>^BnpAb*l!<;WjJcGBBqZ)HPrW'h8rW&Mhp]0+L +rW%NLJcFg2J,~> +li6qap](0lpAb*lqZ$Npr;Z]qrVufrr;Z`rq>^BnpAb*l!<;WjJcGBBqZ)HPrW'h8rW&Mhp]0+L +rW%NLJcFg2J,~> +li6qap](0lpAb*lqZ$Npr;Z]qrVufrr;Z`rq>^BnpAb*l!<;WjJcGBBqZ)HPrW'h8rW&Mhp]0+L +rW%NLJcFg2J,~> +li6qapAb$jq#C^BnpAb*ls8V`lJcG<@q>cEQrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qapAb$jq#C^BnpAb*ls8V`lJcG<@q>cEQrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qapAb$jq#C^BnpAb*ls8V`lJcG<@q>cEQrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qap&FmhqZ$NpqZ$Npr;Z]qrVufrr;Z`rq>^BnpAb*lrr;WkJcG9?qZ)QSrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qap&FmhqZ$NpqZ$Npr;Z]qrVufrr;Z`rq>^BnpAb*lrr;WkJcG9?qZ)QSrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qap&FmhqZ$NpqZ$Npr;Z]qrVufrr;Z`rq>^BnpAb*lrr;WkJcG9?qZ)QSrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qao`+dgqu?WqqZ$Npr;Z]qrVufrrVufrq>^BnpAb*lrVuEgJcG?AqZ)WUrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qao`+dgqu?WqqZ$Npr;Z]qrVufrrVufrq>^BnpAb*lrVuEgJcG?AqZ)WUrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qao`+dgqu?WqqZ$Npr;Z]qrVufrrVufrq>^BnpAb*lrVuEgJcG?AqZ)WUrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qaoDe[fr;Z`rqZ$Npr;Z]qrVufrr;Z`rq>^BnpAb*lr;Z6dJcGECq>cTVrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qaoDe[fr;Z`rqZ$Npr;Z]qrVufrr;Z`rq>^BnpAb*lr;Z6dJcGECq>cTVrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qaoDe[fr;Z`rqZ$Npr;Z]qrVufrr;Z`rq>^BnpAb*lr;Z6dJcGECq>cTVrW'h8rW%NLn,N@e +JcC<$jSs`~> +li6qapAY*mrVucqrVuisqZ$Npr;Z]qrVufrr;Z]qqZ$KopAb*lqu?Nns8VcmJcGHDqZ)`XrW'h8 +rW%NLn,N@eJcC<$jSs`~> +li6qapAY*mrVucqrVuisqZ$Npr;Z]qrVufrr;Z]qqZ$KopAb*lqu?Nns8VcmJcGHDqZ)`XrW'h8 +rW%NLn,N@eJcC<$jSs`~> +li6qapAY*mrVucqrVuisqZ$Npr;Z]qrVufrr;Z]qqZ$KopAb*lqu?Nns8VcmJcGHDqZ)`XrW'h8 +rW%NLn,N@eJcC<$jSs`~> +li6qapAY*mr;Z]qrVuisqZ$Npr;Z]qrVufrr;Z]qqZ$Npp&G!kqZ$Hnr;ZHjJcGKEqZ)fZrW'h8 +rW%NLn,N@eJcC<$jSs`~> +li6qapAY*mr;Z]qrVuisqZ$Npr;Z]qrVufrr;Z]qqZ$Npp&G!kqZ$Hnr;ZHjJcGKEqZ)fZrW'h8 +rW%NLn,N@eJcC<$jSs`~> +li6qapAY*mr;Z]qrVuisqZ$Npr;Z]qrVufrr;Z]qqZ$Npp&G!kqZ$Hnr;ZHjJcGKEqZ)fZrW'h8 +rW%NLn,N@eJcC<$jSs`~> +li6qapAY*mqu?WqrVuisqZ$Npr;Z]qrVufrr;Z]qqZ$Npp&G!kq>^?mqZ$6hJcGQGq>cc[rW'h8 +JH4p7JcC<$jSs`~> +li6qapAY*mqu?WqrVuisqZ$Npr;Z]qrVufrr;Z]qqZ$Npp&G!kq>^?mqZ$6hJcGQGq>cc[rW'h8 +JH4p7JcC<$jSs`~> +li6qapAY*mqu?WqrVuisqZ$Npr;Z]qrVufrr;Z]qqZ$Npp&G!kq>^?mqZ$6hJcGQGq>cc[rW'h8 +JH4p7JcC<$jSs`~> +li6qapAY*mqu?WqrVuisqu?Tpr;Z]qrVufrqu?Tpqu?Zro`+mjq#C9mp]'mdJcGWIqZ)o]rW'h8 +JH4p7JcC<$jSs`~> +li6qapAY*mqu?WqrVuisqu?Tpr;Z]qrVufrqu?Tpqu?Zro`+mjq#C9mp]'mdJcGWIqZ)o]rW'h8 +JH4p7JcC<$jSs`~> +li6qapAY*mqu?WqrVuisqu?Tpr;Z]qrVufrqu?Tpqu?Zro`+mjq#C9mp]'mdJcGWIqZ)o]rW'h8 +JH4p7JcC<$jSs`~> +li6qapAb-mr;Zcsr;Z]qr;Z]qr;Z]qrVufrqZ$KorVultoDedipAb-moDeLaJcG]Kq>cl^rW'h8 +JH4p7JcC<$jSs`~> +li6qapAb-mr;Zcsr;Z]qr;Z]qr;Z]qrVufrqZ$KorVultoDedipAb-moDeLaJcG]Kq>cl^rW'h8 +JH4p7JcC<$jSs`~> +li6qapAb-mr;Zcsr;Z]qr;Z]qr;Z]qrVufrqZ$KorVultoDedipAb-moDeLaJcG]Kq>cl^rW'h8 +JH4p7JcC<$jSs`~> +li6qapAapgrVu]orr;fps8Vrr!<;ipqu?Hlo)J[hp&>!lnGi1^JcG`Lq>cr`rW&&[rW%NLJcC<$ +J,~> +li6qapAapgrVu]orr;fps8Vrr!<;ipqu?Hlo)J[hp&>!lnGi1^JcG`Lq>cr`rW&&[rW%NLJcC<$ +J,~> +li6qapAapgrVu]orr;fps8Vrr!<;ipqu?Hlo)J[hp&>!lnGi1^JcG`Lq>cr`rW&&[rW%NLJcC<$ +J,~> +li6qapAY0os8W&udJs+Enc/Rgo`"mkmf2t\JcGcMqZ*)brW&&[r;_EKJcC?%J,~> +li6qapAY0os8W&udJs+Enc/Rgo`"mkmf2t\JcGcMqZ*)brW&&[r;_EKJcC?%J,~> +li6qapAY0os8W&udJs+Enc/Rgo`"mkmf2t\JcGcMqZ*)brW&&[r;_EKJcC?%J,~> +li6qaX8i/!h>d0KJcGQHSH&QgOT57ZJcC<$K)^?~> +li6qaX8i/!h>d0KJcGQHSH&QgOT57ZJcC<$K)^?~> +li6qaX8i/!h>d0KJcGQHSH&QgOT57ZJcC<$K)^?~> +li6qaX8i/!gAgjHK)bZIT)\ciOoP:YJcC<$KE$H~> +li6qaX8i/!gAgjHK)bZIT)\ciOoP:YJcC<$KE$H~> +li6qaX8i/!gAgjHK)bZIT)\ciOoP:YJcC<$KE$H~> +li6qaX8i/!f)PFDK`CoLTE"ljOoP:YJcC<$KE$H~> +li6qaX8i/!f)PFDK`CoLTE"ljOoP:YJcC<$KE$H~> +li6qaX8i/!f)PFDK`CoLTE"ljOoP:YJcC<$KE$H~> +li6qaX8i/!e,T+ALB%)MU&Y)lP5k=XJcC<$K`?Q~> +li6qaX8i/!e,T+ALB%)MU&Y)lP5k=XJcC<$K`?Q~> +li6qaX8i/!e,T+ALB%)MU&Y)lP5k=XJcC<$K`?Q~> +li6qaX8i/!d/We>L]@5OUAt2mP5k=XJcC<$K`?Q~> +li6qaX8i/!d/We>L]@5OUAt2mP5k=XJcC<$K`?Q~> +li6qaX8i/!d/We>L]@5OUAt2mP5k=XJcC<$K`?Q~> +li6qaX8i/!c2[J;M#[>PV#UDoPQ1@WJcC<$L&ZZ~> +li6qaX8i/!c2[J;M#[>PV#UDoPQ1@WJcC<$L&ZZ~> +li6qaX8i/!c2[J;M#[>PV#UDoPQ1@WJcC<$L&ZZ~> +li6qaX8i/!b5_/8MZ +li6qaX8i/!b5_/8MZ +li6qaX8i/!b5_/8MZ +li6qaX8i/!`rG`4N;rbTVuQ_rPlLCVJcC<$LAuc~> +li6qaX8i/!`rG`4N;rbTVuQ_rPlLCVJcC<$LAuc~> +li6qaX8i/!`rG`4N;rbTVuQ_rPlLCVJcC<$LAuc~> +li6qaX8i/!_uKE1NW8kUWW2qtPlLR[!<;utJcC<$LAuc~> +li6qaX8i/!_uKE1NW8kUWW2qtPlLR[!<;utJcC<$LAuc~> +li6qaX8i/!_uKE1NW8kUWW2qtPlLR[!<;utJcC<$LAuc~> +li6qaX8i/!_#O*.O8o%VX8i/!Q2gg`s8W&urr;rtJcC<$L];l~> +li6qaX8i/!_#O*.O8o%VX8i/!Q2gg`s8W&urr;rtJcC<$L];l~> +li6qaX8i/!_#O*.O8o%VX8i/!Q2gg`s8W&urr;rtJcC<$L];l~> +li6qaX8i/!^&Rd+OT51XXT/8"Q2gjarr;rtrVultJcC<$L];l~> +li6qaX8i/!^&Rd+OT51XXT/8"Q2gjarr;rtrVultJcC<$L];l~> +li6qaX8i/!^&Rd+OT51XXT/8"Q2gjarr;rtrVultJcC<$L];l~> +li6qaX8i/!])VI(OoP:YY5eJ$QN$pbr;Z`rqu6WrJcC<$M#Vu~> +li6qaX8i/!])VI(OoP:YY5eJ$QN$pbr;Z`rqu6WrJcC<$M#Vu~> +li6qaX8i/!])VI(OoP:YY5eJ$QN$pbr;Z`rqu6WrJcC<$M#Vu~> +li6qaX8i/![f?%$PlLR[YlF\&OT5:[JcC<$JcC6~> +li6qaX8i/![f?%$PlLR[YlF\&OT5:[JcC<$JcC6~> +li6qaX8i/![f?%$PlLR[YlF\&OT5:[JcC<$JcC6~> +li6qaX8i/!ZiB_!Q2g^]Z2ae'OT5:[JcC<$JcC6~> +li6qaX8i/!ZiB_!Q2g^]Z2ae'OT5:[JcC<$JcC6~> +li6qaX8i/!ZiB_!Q2g^]Z2ae'OT5:[JcC<$JcC6~> +li3d]YlFCsQiHm^ZiC")OT5:[JcC<$JcC6~> +li3d]YlFCsQiHm^ZiC")OT5:[JcC<$JcC6~> +li3d]YlFCsQiHm^ZiC")OT5:[JcC<$JcC6~> +li3d]XoJ(pR/d!_[K$4+OT5:[JcC<$JcC6~> +li3d]XoJ(pR/d!_[K$4+OT5:[JcC<$JcC6~> +li3d]XoJ(pR/d!_[K$4+OT5:[JcC<$JcC6~> +li3d]WrMbmRK*-a[f?=,OT5:[JcC<$JcC6~> +li3d]WrMbmRK*-a[f?=,OT5:[JcC<$JcC6~> +li3d]WrMbmRK*-a[f?=,OT5:[JcC<$JcC6~> +JcE+Wp&LW_q>e&*rW&&[rW%NLJcC<$J,~> +JcE+Wp&LW_q>e&*rW&&[rW%NLJcC<$J,~> +JcE+Wp&LW_q>e&*rW&&[rW%NLJcC<$J,~> +JcE"Tp&LZ`qZ+2,rW&&[rW%NLJcC<$J,~> +JcE"Tp&LZ`qZ+2,rW&&[rW%NLJcC<$J,~> +JcE"Tp&LZ`qZ+2,rW&&[rW%NLJcC<$J,~> +JcDnQp&L]aqZ+8.rW&&[rW%NLJcC<$J,~> +JcDnQp&L]aqZ+8.rW&&[rW%NLJcC<$J,~> +JcDnQp&L]aqZ+8.rW&&[rW%NLJcC<$J,~> +JcDeNp&Lccq>e5/rW&&[rW%NLJcC<$J,~> +JcDeNp&Lccq>e5/rW&&[rW%NLJcC<$J,~> +JcDeNp&Lccq>e5/rW&&[rW%NLJcC<$J,~> +JcD\Kp&LfdqZ+A1rW&&[rW%NLJcC<$J,~> +JcD\Kp&LfdqZ+A1rW&&[rW%NLJcC<$J,~> +JcD\Kp&LfdqZ+A1rW&&[rW%NLJcC<$J,~> +JcDPGp&LlfqZ+G3rW&&[rW%NLJcC<$J,~> +JcDPGp&LlfqZ+G3rW&&[rW%NLJcC<$J,~> +JcDPGp&LlfqZ+G3rW&&[rW%NLJcC<$J,~> +JcDGDp&Lrhq>eD4rW&8arrE#trW)lrrr@WMJcCQ+J,~> +JcDGDp&Lrhq>eD4rW&8arrE#trW)lrrr@WMJcCQ+J,~> +JcDGDp&Lrhq>eD4rW&8arrE#trW)lrrr@WMJcCQ+J,~> +JcD>Ap&LuiqZ+P6rW&5`rW)uurW)rtrW%NLJcCN*J,~> +JcD>Ap&LuiqZ+P6rW&5`rW)uurW)rtrW%NLJcCN*J,~> +JcD>Ap&LuiqZ+P6rW&5`rW)uurW)rtrW%NLJcCN*J,~> +JcD5>p&M#jqZ+V8rW&5`r;ZitrVuruquD +JcD5>p&M#jqZ+V8rW&5`r;ZitrVuruquD +JcD5>p&M#jqZ+V8rW&5`r;ZitrVuruquD +JcD,;p&M)lq>eS9rW&2_o`0RCJcCK)J,~> +JcD,;p&M)lq>eS9rW&2_o`0RCJcCK)J,~> +JcD,;p&M)lq>eS9rW&2_o`0RCJcCK)J,~> +JcCu7p&M/nqZ+_;rW&2_p&K[DJcCH(J,~> +JcCu7p&M/nqZ+_;rW&2_p&K[DJcCH(J,~> +JcCu7p&M/nqZ+_;rW&2_p&K[DJcCH(J,~> +JcCl4p&M5pq>e\ +JcCl4p&M5pq>e\ +JcCl4p&M5pq>e\ +JcCc1p&M8qq>eb>rW&/^p],mFJcCE'J,~> +JcCc1p&M8qq>eb>rW&/^p],mFJcCE'J,~> +JcCc1p&M8qq>eb>rW&/^p],mFJcCE'J,~> +JcCZ.p&M;rqZ+n@rW&,]q#H!GJcCE'J,~> +JcCZ.p&M;rqZ+n@rW&,]q#H!GJcCE'J,~> +JcCZ.p&M;rqZ+n@rW&,]q#H!GJcCE'J,~> +JcCQ+p&MAtq>ekArW&,]q>c*HJcCB&J,~> +JcCQ+p&MAtq>ekArW&,]q>c*HJcCB&J,~> +JcCQ+p&MAtq>ekArW&,]q>c*HJcCB&J,~> +JcCE'p&MH!q>eqCrW&)\qZ)3IJcCB&J,~> +JcCE'p&MH!q>eqCrW&)\qZ)3IJcCB&J,~> +JcCE'p&MH!q>eqCrW&)\qZ)3IJcCB&J,~> +JcC<$p&MK"qZ,(ErW&)\quD +JcC<$p&MK"qZ,(ErW&)\quD +JcC<$p&MK"qZ,(ErW&)\quD +JcC<$rr;Zl[f?1(kPp)5kQ$26JcCi3J,~> +JcC<$rr;Zl[f?1(kPp)5kQ$26JcCi3J,~> +JcC<$rr;Zl[f?1(kPp)5kQ$26JcCi3J,~> +JcC<$qu??i\,Z=*kl626kQ$26JcCi3J,~> +JcC<$qu??i\,Z=*kl626kQ$26JcCi3J,~> +JcC<$qu??i\,Z=*kl626kQ$26JcCi3J,~> +li2kCK`C`G\GuF+lMlD8kQ$26JcCi3J,~> +li2kCK`C`G\GuF+lMlD8kQ$26JcCi3J,~> +li2kCK`C`G\GuF+lMlD8kQ$26JcCi3J,~> +li2kCJc>`Mp&M`)q>fm^rW)KgrW&#Z!!)ZkrW%NLJcCi3J,~> +li2kCJc>`Mp&M`)q>fm^rW)KgrW&#Z!!)ZkrW%NLJcCi3J,~> +li2kCJc>`Mp&M`)q>fm^rW)KgrW&#Z!!)ZkrW%NLJcCi3J,~> +li2kCJcG]Kp&Mc*qZ-$`rW%NLmf37dJcC<$OT0h~> +li2kCJcG]Kp&Mc*qZ-$`rW%NLmf37dJcC<$OT0h~> +li2kCJcG]Kp&Mc*qZ-$`rW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcGTHp&Mf+qZ-*brW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcGTHp&Mf+qZ-*brW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcGTHp&Mf+qZ-*brW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcGKEp&Ml-q>g9i!!)rsrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcGKEp&Ml-q>g9i!!)rsrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcGKEp&Ml-q>g9i!!)rsrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcGBBp&Mo.qZ-EkrrE#trW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcGBBp&Mo.qZ-EkrrE#trW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcGBBp&Mo.qZ-EkrrE#trW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcG6>p&Mu0qZ-KmrrE#trW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcG6>p&Mu0qZ-KmrrE#trW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcG6>p&Mu0qZ-KmrrE#trW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcG-;p&N&2q>gHnrW)rtrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcG-;p&N&2q>gHnrW)rtrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcG-;p&N&2q>gHnrW)rtrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcG$8p&N)3qZ-Tpr;cltrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcG$8p&N)3qZ-Tpr;cltrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcG$8p&N)3qZ-Tpr;cltrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcFp5p&N/5q>gQqr;cltrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcFp5p&N/5q>gQqr;cltrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcFp5p&N/5q>gQqr;cltrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcFg2p&N26o`,!lrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcFg2p&N26o`,!lrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcFg2p&N26o`,!lrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcF[.p&N88o)O@Amf37dJcC<$OT0h~> +li6qaOoPC\JcF[.p&N88o)O@Amf37dJcC<$OT0h~> +li6qaOoPC\JcF[.p&N88o)O@Amf37dJcC<$OT0h~> +li6qaOoPC\JcFR+p&N>:oDjIBmf37dJcC<$OT0h~> +li6qaOoPC\JcFR+p&N>:oDjIBmf37dJcC<$OT0h~> +li6qaOoPC\JcFR+p&N>:oDjIBmf37dJcC<$OT0h~> +li6qaOoPC\JcFI(p&NA;p&O7TrrB2$rrDThrrDZjrW%NLJcCi3J,~> +li6qaOoPC\JcFI(p&NA;p&O7TrrB2$rrDThrrDZjrW%NLJcCi3J,~> +li6qaOoPC\JcFI(p&NA;p&O7TrrB2$rrDThrrDZjrW%NLJcCi3J,~> +li6qaOoPC\JcF@%p&NM?o`47VquEu$quHBhquH?grW%NLJcCi3J,~> +li6qaOoPC\JcF@%p&NM?o`47VquEu$quHBhquH?grW%NLJcCi3J,~> +li6qaOoPC\JcF@%p&NM?o`47VquEu$quHBhquH?grW%NLJcCi3J,~> +li6qaOoPC\JcF7"p&N\Do)S(UqZ*o$qZ-9gquH?grW%NLJcCi3J,~> +li6qaOoPC\JcF7"p&N\Do)S(UqZ*o$qZ-9gquH?grW%NLJcCi3J,~> +li6qaOoPC\JcF7"p&N\Do)S(UqZ*o$qZ-9gquH?grW%NLJcCi3J,~> +li6qaOoPC\JcF*sp&NnJnGqbPrW'A+!!)orrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcF*sp&NnJnGqbPrW'A+!!)orrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcF*sp&NnJnGqbPrW'A+!!)orrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcF!pp&O"MnGqbPrW'D,rrDrrrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcF!pp&O"MnGqbPrW'D,rrDrrrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcF!pp&O"MnGqbPrW'D,rrDrrrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcEmmp&NYCr;c']rW'G-rW)iqrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcEmmp&NYCr;c']rW'G-rW)iqrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcEmmp&NYCr;c']rW'G-rW)iqrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcEdjp&NbFrW)-]rW'G-rW)iqrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcEdjp&NbFrW)-]rW'G-rW)iqrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\JcEdjp&NbFrW)-]rW'G-rW)iqrW)NhrW)QirW%NLJcCi3J,~> +li6qaOoPC\o)A[iJcF7"p&NkIrW)NhrW)corW)0^"9AK%!!)`mrrDoq!!)ZkrW)iqr;c`prW)]m +rW)uurW)QirW%NLJcCi3J,~> +li6qaOoPC\o)A[iJcF7"p&NkIrW)NhrW)corW)0^"9AK%!!)`mrrDoq!!)ZkrW)iqr;c`prW)]m +rW)uurW)QirW%NLJcCi3J,~> +li6qaOoPC\o)A[iJcF7"p&NkIrW)NhrW)corW)0^"9AK%!!)`mrrDoq!!)ZkrW)iqr;c`prW)]m +rW)uurW)QirW%NLJcCi3J,~> +li6qaOoPC\o`+mjJcF*sp&O"MrW)Tjq#L?mrW)rtqZ-WqquHZpr;Zitr;cltr;ZitqZ-WqqZ-Hl +q#LHpp]1 +li6qaOoPC\o`+mjJcF*sp&O"MrW)Tjq#L?mrW)rtqZ-WqquHZpr;Zitr;cltr;ZitqZ-WqqZ-Hl +q#LHpp]1 +li6qaOoPC\o`+mjJcF*sp&O"MrW)Tjq#L?mrW)rtqZ-WqquHZpr;Zitr;cltr;ZitqZ-WqqZ-Hl +q#LHpp]1 +li6qaoDedip&G!krVlitl2U__jT#2Znc/Rgp](-kJcEsop&O+PrW)WkrrE#trW)lrrW)lrr;ccq +rW)rtkPtV_q#LgKorW)fprW)osr;cHhrW%NLJcCi3J,~> +li6qaoDedip&G!krVlitl2U__jT#2Znc/Rgp](-kJcEsop&O+PrW)WkrrE#trW)lrrW)lrr;ccq +rW)rtkPtV_q#LgKorW)fprW)osr;cHhrW%NLJcCi3J,~> +li6qaoDedip&G!krVlitl2U__jT#2Znc/Rgp](-kJcEsop&O+PrW)WkrrE#trW)lrrW)lrr;ccq +rW)rtkPtV_q#LgKorW)fprW)osr;cHhrW%NLJcCi3J,~> +li6qap&Fgfqu??is8Vrrrr;lrqu?KmrVu`prr;lrqZ$BloDediq>^ +li6qap&Fgfqu??is8Vrrrr;lrqu?KmrVu`prr;lrqZ$BloDediq>^ +li6qap&Fgfqu??is8Vrrrr;lrqu?KmrVu`prr;lrqZ$BloDediq>^ +li6qapAb-mrVuisr;Z`rrVucqrVufrr;Z`rr;Zcsrr;osr;Z]qr;Z`rqu?Zrrr;oso`+mjqu?Km +JcE[gp&OX_rrDoqrW)ZlrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfrrrDrrr;clt +r;c`prW)iqrW)iqrW)QirW%NLJcCi3J,~> +li6qapAb-mrVuisr;Z`rrVucqrVufrr;Z`rr;Zcsrr;osr;Z]qr;Z`rqu?Zrrr;oso`+mjqu?Km +JcE[gp&OX_rrDoqrW)ZlrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfrrrDrrr;clt +r;c`prW)iqrW)iqrW)QirW%NLJcCi3J,~> +li6qapAb-mrVuisr;Z`rrVucqrVufrr;Z`rr;Zcsrr;osr;Z]qr;Z`rqu?Zrrr;oso`+mjqu?Km +JcE[gp&OX_rrDoqrW)ZlrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfrrrDrrr;clt +r;c`prW)iqrW)iqrW)QirW%NLJcCi3J,~> +li6qapAb-mr;ZcsrVuisqu?TprVufrr;Z`rrVultr;Z]qrVufrr;Z`rr;Zcsr;Z]qp&G!krr;]m +JcERdp&OabrW)iqrW)Zlr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fprrE&ur;c`p +rW)lrrW)fprW)QirW%NLJcCi3J,~> +li6qapAb-mr;ZcsrVuisqu?TprVufrr;Z`rrVultr;Z]qrVufrr;Z`rr;Zcsr;Z]qp&G!krr;]m +JcERdp&OabrW)iqrW)Zlr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fprrE&ur;c`p +rW)lrrW)fprW)QirW%NLJcCi3J,~> +li6qapAb-mr;ZcsrVuisqu?TprVufrr;Z`rrVultr;Z]qrVufrr;Z`rr;Zcsr;Z]qp&G!krr;]m +JcERdp&OabrW)iqrW)Zlr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fprrE&ur;c`p +rW)lrrW)fprW)QirW%NLJcCi3J,~> +li6qap](3mr;ZcsrVuisqu?TprVufrr;Z`rrr;rtr;Z]qrVufrr;Z`rrVuisr;Z]qp&G!k!<;Ed +JcE^hp&OjerW)lrrW)WkquHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)Wkr;c`prW)lr +rW)fprW)QirW%NLJcCi3J,~> +li6qap](3mr;ZcsrVuisqu?TprVufrr;Z`rrr;rtr;Z]qrVufrr;Z`rrVuisr;Z]qp&G!k!<;Ed +JcE^hp&OjerW)lrrW)WkquHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)Wkr;c`prW)lr +rW)fprW)QirW%NLJcCi3J,~> +li6qap](3mr;ZcsrVuisqu?TprVufrr;Z`rrr;rtr;Z]qrVufrr;Z`rrVuisr;Z]qp&G!k!<;Ed +JcE^hp&OjerW)lrrW)WkquHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)Wkr;c`prW)lr +rW)fprW)QirW%NLJcCi3J,~> +li6qap](0lq#C +li6qap](0lq#C +li6qap](0lq#C +li6qapAb$jqZ$NpqZ$KorVufrr;Z`rrr;Tjrr;osr;Z`rrVuKipAb*ls8UIHJcFO*p&P'kquH`r +rW)QiqZ-NnrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNjr;c`prW)osr;c]orW)QirW%NL +JcCi3J,~> +li6qapAb$jqZ$NpqZ$KorVufrr;Z`rrr;Tjrr;osr;Z`rrVuKipAb*ls8UIHJcFO*p&P'kquH`r +rW)QiqZ-NnrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNjr;c`prW)osr;c]orW)QirW%NL +JcCi3J,~> +li6qapAb$jqZ$NpqZ$KorVufrr;Z`rrr;Tjrr;osr;Z`rrVuKipAb*ls8UIHJcFO*p&P'kquH`r +rW)QiqZ-NnrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNjr;c`prW)osr;c]orW)QirW%NL +JcCi3J,~> +li6qap&Fmhr;Z`rqZ$KorVufrr;Z`rs8W&uoDeahr;Z`rrr;rtli6qarVuZnqu>+FJcFp5p&G*m +qZ-ZrrW)NhqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNjr;c`prW)osr;c]orW)Qi +rW%NLJcCi3J,~> +li6qap&Fmhr;Z`rqZ$KorVufrr;Z`rs8W&uoDeahr;Z`rrr;rtli6qarVuZnqu>+FJcFp5p&G*m +qZ-ZrrW)NhqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNjr;c`prW)osr;c]orW)Qi +rW%NLJcCi3J,~> +li6qap&Fmhr;Z`rqZ$KorVufrr;Z`rs8W&uoDeahr;Z`rrr;rtli6qarVuZnqu>+FJcFp5p&G*m +qZ-ZrrW)NhqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cNjr;c`prW)osr;c]orW)Qi +rW%NLJcCi3J,~> +li6qao`+dgrr;osqZ$KorVufrr;Z`rs8W#to`+jir;Z`rrr;osm/R%br;ZTnm/PN7JcG?AnGiRh +rW)Wk!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)Wkr;c`prW)lrrW)fprW)Qi +rW%NLJcCi3J,~> +li6qao`+dgrr;osqZ$KorVufrr;Z`rs8W#to`+jir;Z`rrr;osm/R%br;ZTnm/PN7JcG?AnGiRh +rW)Wk!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)Wkr;c`prW)lrrW)fprW)Qi +rW%NLJcCi3J,~> +li6qao`+dgrr;osqZ$KorVufrr;Z`rs8W#to`+jir;Z`rrr;osm/R%br;ZTnm/PN7JcG?AnGiRh +rW)Wk!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)Wkr;c`prW)lrrW)fprW)Qi +rW%NLJcCi3J,~> +li6qaoDe[fs8W#tqZ$KorVufrr;Z`rs8W#to`+jir;Z`rrr;osm/R%bqZ$EmhuD.*JcG]KnGr7^ +!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtr;c]orrE*!r;c`prW)lrr;c`prW)Qi +rW%NLJcCi3J,~> +li6qaoDe[fs8W#tqZ$KorVufrr;Z`rs8W#to`+jir;Z`rrr;osm/R%bqZ$EmhuD.*JcG]KnGr7^ +!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtr;c]orrE*!r;c`prW)lrr;c`prW)Qi +rW%NLJcCi3J,~> +li6qaoDe[fs8W#tqZ$KorVufrr;Z`rs8W#to`+jir;Z`rrr;osm/R%bqZ$EmhuD.*JcG]KnGr7^ +!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtr;c]orrE*!r;c`prW)lrr;c`prW)Qi +rW%NLJcCi3J,~> +li6qapAY*mrVucqs8W&uqZ$KorVufrr;Z`rs8W#tq#:!lqu?WqrVuisr;Z]qr;Z`rr;Z]qq>^Eoqu?Wqqu?Wqrr;lrqu6Wrrr;osqu?Wq +r;Z]qqu?WqoDediJcC<$OT0h~> +li6qapAY*mrVucqs8W&uqZ$KorVufrr;Z`rs8W#tq#:!lqu?WqrVuisr;Z]qr;Z`rr;Z]qq>^Eoqu?Wqqu?Wqrr;lrqu6Wrrr;osqu?Wq +r;Z]qqu?WqoDediJcC<$OT0h~> +li6qapAY*mrVucqs8W&uqZ$KorVufrr;Z`rs8W#tq#:!lqu?WqrVuisr;Z]qr;Z`rr;Z]qq>^Eoqu?Wqqu?Wqrr;lrqu6Wrrr;osqu?Wq +r;Z]qqu?WqoDediJcC<$OT0h~> +li6qapAY*mr;Z]qs8W#tqu?TprVufrr;Z`rrr;rtq#:!lqu?WqrVuisr;Z]qrVufrr;Z]qq>^Eor;Z]qr;Z]qrVuQkrr;oss8N'!rr;rt +qu?Tpr;Z]qo`+mjJcC<$OT0h~> +li6qapAY*mr;Z]qs8W#tqu?TprVufrr;Z`rrr;rtq#:!lqu?WqrVuisr;Z]qrVufrr;Z]qq>^Eor;Z]qr;Z]qrVuQkrr;oss8N'!rr;rt +qu?Tpr;Z]qo`+mjJcC<$OT0h~> +li6qapAY*mr;Z]qs8W#tqu?TprVufrr;Z`rrr;rtq#:!lqu?WqrVuisr;Z]qrVufrr;Z]qq>^Eor;Z]qr;Z]qrVuQkrr;oss8N'!rr;rt +qu?Tpr;Z]qo`+mjJcC<$OT0h~> +li6qapAY*mqu?Wqs8W#tqu?TprVufrr;Z`rrr;osqZ$Qqrr;osr;Z`rrVufrqZ$QqpAb*lp&G!k +[f=eVV>p/fp&G$lr;Zcsr;Z]qr;ZTn!<;rsrr;osqZ$Kor;Z]qr;Z]qr;ZNlrVu]orr;osqu?9g +p&G!kJcC<$OT0h~> +li6qapAY*mqu?Wqs8W#tqu?TprVufrr;Z`rrr;osqZ$Qqrr;osr;Z`rrVufrqZ$QqpAb*lp&G!k +[f=eVV>p/fp&G$lr;Zcsr;Z]qr;ZTn!<;rsrr;osqZ$Kor;Z]qr;Z]qr;ZNlrVu]orr;osqu?9g +p&G!kJcC<$OT0h~> +li6qapAY*mqu?Wqs8W#tqu?TprVufrr;Z`rrr;osqZ$Qqrr;osr;Z`rrVufrqZ$QqpAb*lp&G!k +[f=eVV>p/fp&G$lr;Zcsr;Z]qr;ZTn!<;rsrr;osqZ$Kor;Z]qr;Z]qr;ZNlrVu]orr;osqu?9g +p&G!kJcC<$OT0h~> +li6qapAY*mqu?Wqs8VusrVucqrVufrrVufrrVucqrr;rtrVufrrVufrr;ZZprr;rtp&G!koD\dj +VuP3G[K#gup&FgfrVu]or;ZZps8W&urr;corVu]os8Voqs8VoqrVu]oqu?Qos8Voqqu?Nn!<;ut +o`+mjJcC<$OT0h~> +li6qapAY*mqu?Wqs8VusrVucqrVufrrVufrrVucqrr;rtrVufrrVufrr;ZZprr;rtp&G!koD\dj +VuP3G[K#gup&FgfrVu]or;ZZps8W&urr;corVu]os8Voqs8VoqrVu]oqu?Qos8Voqqu?Nn!<;ut +o`+mjJcC<$OT0h~> +li6qapAY*mqu?Wqs8VusrVucqrVufrrVufrrVucqrr;rtrVufrrVufrr;ZZprr;rtp&G!koD\dj +VuP3G[K#gup&FgfrVu]or;ZZps8W&urr;corVu]os8Voqs8VoqrVu]oqu?Qos8Voqqu?Nn!<;ut +o`+mjJcC<$OT0h~> +li6qapAb-mr;ZcsrVuKir;ZTn!<;rss8Vfnqu?Km!<;rsrr;]mo`+mjMZ;-*`;fQ3s8W&up&>'n +s8W&umf37drr2rudJs1Gq#C?omf3:err2runc/RgJcC<$OT0h~> +li6qapAb-mr;ZcsrVuKir;ZTn!<;rss8Vfnqu?Km!<;rsrr;]mo`+mjMZ;-*`;fQ3s8W&up&>'n +s8W&umf37drr2rudJs1Gq#C?omf3:err2runc/RgJcC<$OT0h~> +li6qapAb-mr;ZcsrVuKir;ZTn!<;rss8Vfnqu?Km!<;rsrr;]mo`+mjMZ;-*`;fQ3s8W&up&>'n +s8W&umf37drr2rudJs1Gq#C?omf3:err2runc/RgJcC<$OT0h~> +li6qapAapgqu?Km!<;utqu?Qos8W&ur;ZQmq>^?ms8W&uqu?HloDediJcGZJdK%esqZ-KmrW%NL +mf37dJcC<$OT0h~> +li6qapAapgqu?Km!<;utqu?Qos8W&ur;ZQmq>^?ms8W&uqu?HloDediJcGZJdK%esqZ-KmrW%NL +mf37dJcC<$OT0h~> +li6qapAapgqu?Km!<;utqu?Qos8W&ur;ZQmq>^?ms8W&uqu?HloDediJcGZJdK%esqZ-KmrW%NL +mf37dJcC<$OT0h~> +li6qapAY0os8W&up](3mrr;osqZ$Nprr2ruq#C9mpAb*lrr2rup](0lnc/RgJcG-;dfA;*quHZp +rW%NLmf37dJcC<$OT0h~> +li6qapAY0os8W&up](3mrr;osqZ$Nprr2ruq#C9mpAb*lrr2rup](0lnc/RgJcG-;dfA;*quHZp +rW%NLmf37dJcC<$OT0h~> +li6qapAY0os8W&up](3mrr;osqZ$Nprr2ruq#C9mpAb*lrr2rup](0lnc/RgJcG-;dfA;*quHZp +rW%NLmf37dJcC<$OT0h~> +li6qai;``U[f?=,JcFX-dfAb7qZ-WqrW%NLmf37dJcC<$OT0h~> +li6qai;``U[f?=,JcFX-dfAb7qZ-WqrW%NLmf37dJcC<$OT0h~> +li6qai;``U[f?=,JcFX-dfAb7qZ-WqrW%NLmf37dJcC<$OT0h~> +li6qai;``U[f?=,JcF*sdfB:Fq#CEprW%NLmf37dJcC<$OT0h~> +li6qai;``U[f?=,JcF*sdfB:Fq#CEprW%NLmf37dJcC<$OT0h~> +li6qai;``U[f?=,JcF*sdfB:Fq#CEprW%NLmf37dJcC<$OT0h~> +li6qai;``U[f?=,JcEUecN&Ormf37dJcC<$OT0h~> +li6qai;``U[f?=,JcEUecN&Ormf37dJcC<$OT0h~> +li6qai;``U[f?=,JcEUecN&Ormf37dJcC<$OT0h~> +li6qai;``U[f?=,JcE+Wh#N$+mf37dJcC<$OT0h~> +li6qai;``U[f?=,JcE+Wh#N$+mf37dJcC<$OT0h~> +li6qai;``U[f?=,JcE+Wh#N$+mf37dJcC<$OT0h~> +li6qai;``U[f?=,JcDSHli;V:mf37dJcC<$OT0h~> +li6qai;``U[f?=,JcDSHli;V:mf37dJcC<$OT0h~> +li6qai;``U[f?=,JcDSHli;V:mf37dJcC<$OT0h~> +li6qairAiT\,ZF-JcD5>p&K[Dmf37dJcC<$OT0h~> +li6qairAiT\,ZF-JcD5>p&K[Dmf37dJcC<$OT0h~> +li6qairAiT\,ZF-JcD5>p&K[Dmf37dJcC<$OT0h~> +li6qaj8\lS\GuO.JcD8?o`0RCmf37dJcC<$OT0h~> +li6qaj8\lS\GuO.JcD8?o`0RCmf37dJcC<$OT0h~> +li6qaj8\lS\GuO.JcD8?o`0RCmf37dJcC<$OT0h~> +li6qaOoPC\JcD;@q#LHprW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcD;@q#LHprW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcD;@q#LHprW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcD>AqZ-QorW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcD>AqZ-QorW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcD>AqZ-QorW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcD>Ar;c]orW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcD>Ar;c]orW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcD>Ar;c]orW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcDABrrDfnrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcDABrrDfnrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcDABrrDfnrW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcCr6rW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcCr6rW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcCr6rW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcCr6rW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcCr6rW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcCr6rW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcCr6rW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcCr6rW%NLmf37dJcC<$OT0h~> +li6qaOoPC\JcCr6rW%NLmf37dJcC<$OT0h~> +li2kCJcCr6rW)Bd!!)!XrW'M/!!)HerW%NLJcCi3J,~> +li2kCJcCr6rW)Bd!!)!XrW'M/!!)HerW%NLJcCi3J,~> +li2kCJcCr6rW)Bd!!)!XrW'M/!!)HerW%NLJcCi3J,~> +li2kCJcCr6rW)EerrD'Yr;aD.rrDNfrW%NLJcCi3J,~> +li2kCJcCr6rW)EerrD'Yr;aD.rrDNfrW%NLJcCi3J,~> +li2kCJcCr6rW)EerrD'Yr;aD.rrDNfrW%NLJcCi3J,~> +li2kCJcDDCrrDcmrW)HfrrD$Xr;aA-rrDQgrW%NLJcCi3J,~> +li2kCJcDDCrrDcmrW)HfrrD$Xr;aA-rrDQgrW%NLJcCi3J,~> +li2kCJcDDCrrDcmrW)HfrrD$Xr;aA-rrDQgrW%NLJcCi3J,~> +JcC<$PQ1R]q>^Eonc/UhhuEZU\,ZI.nc/RgJcC<$OT0h~> +JcC<$PQ1R]q>^Eonc/UhhuEZU\,ZI.nc/RgJcC<$OT0h~> +JcC<$PQ1R]q>^Eonc/UhhuEZU\,ZI.nc/RgJcC<$OT0h~> +JcC<$P5kCZr;Z`ro)J^iOT5=\o)J[hJcC<$OT0h~> +JcC<$P5kCZr;Z`ro)J^iOT5=\o)J[hJcC<$OT0h~> +JcC<$P5kCZr;Z`ro)J^iOT5=\o)J[hJcC<$OT0h~> +JcC<$OoP4Ws8W&uoDegjO8o1ZoDediJcC<$OT0h~> +JcC<$OoP4Ws8W&uoDegjO8o1ZoDediJcC<$OT0h~> +JcC<$OoP4Ws8W&uoDegjO8o1ZoDediJcC<$OT0h~> +JcC<$OoP%Ro`+mjNrT(Yo`+mjJcC<$OT0h~> +JcC<$OoP%Ro`+mjNrT(Yo`+mjJcC<$OT0h~> +JcC<$OoP%Ro`+mjNrT(Yo`+mjJcC<$OT0h~> +JcC<$OoP%Ro`+mjp\t3nrr;rtp\t?rs8N'!mJm1dqYpNqpAb'kpAY6qs8N'!li6qao`+mjJcC<$ +OT0h~> +JcC<$OoP%Ro`+mjp\t3nrr;rtp\t?rs8N'!mJm1dqYpNqpAb'kpAY6qs8N'!li6qao`+mjJcC<$ +OT0h~> +JcC<$OoP%Ro`+mjp\t3nrr;rtp\t?rs8N'!mJm1dqYpNqpAb'kpAY6qs8N'!li6qao`+mjJcC<$ +OT0h~> +JcC<$QiHIRp&G!kq>^Bn!<;orqu?Tp!<;utrr;rtr;Z]q!<;orrr;iqqZ$?kqu?Tp!<;ut!<;or +r;Z]qqu?Wqp&G!kJcC<$OT0h~> +JcC<$QiHIRp&G!kq>^Bn!<;orqu?Tp!<;utrr;rtr;Z]q!<;orrr;iqqZ$?kqu?Tp!<;ut!<;or +r;Z]qqu?Wqp&G!kJcC<$OT0h~> +JcC<$QiHIRp&G!kq>^Bn!<;orqu?Tp!<;utrr;rtr;Z]q!<;orrr;iqqZ$?kqu?Tp!<;ut!<;or +r;Z]qqu?Wqp&G!kJcC<$OT0h~> +JcC<$SH%gRp&G!kqu?6frr;HfrVuKi!<;ipr;Z`rrVuisrr;Wk!<;utqu?WqqZ$Npp&G!kJcC<$ +OT0h~> +JcC<$SH%gRp&G!kqu?6frr;HfrVuKi!<;ipr;Z`rrVuisrr;Wk!<;utqu?WqqZ$Npp&G!kJcC<$ +OT0h~> +JcC<$SH%gRp&G!kqu?6frr;HfrVuKi!<;ipr;Z`rrVuisrr;Wk!<;utqu?WqqZ$Npp&G!kJcC<$ +OT0h~> +JcC<$UAs6Rp&G!kq>^?mrr;lrrVucq!<<#urr;rtr;ZZprVucqrVufrrVuisrVuisr;ZZp!<<#u +s8W#tqu?Zrq>^Eop&G!kJcC<$OT0h~> +JcC<$UAs6Rp&G!kq>^?mrr;lrrVucq!<<#urr;rtr;ZZprVucqrVufrrVuisrVuisr;ZZp!<<#u +s8W#tqu?Zrq>^Eop&G!kJcC<$OT0h~> +JcC<$UAs6Rp&G!kq>^?mrr;lrrVucq!<<#urr;rtr;ZZprVucqrVufrrVuisrVuisr;ZZp!<<#u +s8W#tqu?Zrq>^Eop&G!kJcC<$OT0h~> +JcC<$W;l8cqu?Nns8W&upAb'kq>^Bnqu?WqrVufrq>^Eoqu?Wqr;Z]qr;Z]qrr;osrVufrrVufr +q>^Eoqu?Zrq>^BnpAb*lJcC<$OT0h~> +JcC<$W;l8cqu?Nns8W&upAb'kq>^Bnqu?WqrVufrq>^Eoqu?Wqr;Z]qr;Z]qrr;osrVufrrVufr +q>^Eoqu?Zrq>^BnpAb*lJcC<$OT0h~> +JcC<$W;l8cqu?Nns8W&upAb'kq>^Bnqu?WqrVufrq>^Eoqu?Wqr;Z]qr;Z]qrr;osrVufrrVufr +q>^Eoqu?Zrq>^BnpAb*lJcC<$OT0h~> +JcC<$Y5dnipAb!irr;rtpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqr;Z]qr;Z]qrVultr;Z]qrVufr +q>^Bnr;Zcsq>^BnpAb*lJcC<$OT0h~> +JcC<$Y5dnipAb!irr;rtpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqr;Z]qr;Z]qrVultr;Z]qrVufr +q>^Bnr;Zcsq>^BnpAb*lJcC<$OT0h~> +JcC<$Y5dnipAb!irr;rtpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqr;Z]qr;Z]qrVultr;Z]qrVufr +q>^Bnr;Zcsq>^BnpAb*lJcC<$OT0h~> +JcC<$ZiBFnnc/LerVuispAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqr;Z]qqu?Wqp](-krVufrq#C +JcC<$ZiBFnnc/LerVuispAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqr;Z]qqu?Wqp](-krVufrq#C +JcC<$ZiBFnnc/LerVuispAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqr;Z]qqu?Wqp](-krVufrq#C +JcC<$\c;'tnGi:aqu?WqpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?WqqZ$?krVufrq#C9m +rr;uuq#C9mpAb*lJcC<$OT0h~> +JcC<$\c;'tnGi:aqu?WqpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?WqqZ$?krVufrq#C9m +rr;uuq#C9mpAb*lJcC<$OT0h~> +JcC<$\c;'tnGi:aqu?WqpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?WqqZ$?krVufrq#C9m +rr;uuq#C9mpAb*lJcC<$OT0h~> +JcC<$^]3^%l2U8RpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?Wqqu?Wqs8W#trVufrp](3m +rr2rup](0lpAb*lJcC<$OT0h~> +JcC<$^]3^%l2U8RpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?Wqqu?Wqs8W#trVufrp](3m +rr2rup](0lpAb*lJcC<$OT0h~> +JcC<$^]3^%l2U8RpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?Wqqu?Wqs8W#trVufrp](3m +rr2rup](0lpAb*lJcC<$OT0h~> +JcC<$`W,?+iW&KLpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?WqrVuisrVufrrVufrp](0l +!ri6#p](0lpAb*lJcC<$OT0h~> +JcC<$`W,?+iW&KLpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?WqrVuisrVufrrVufrp](0l +!ri6#p](0lpAb*lJcC<$OT0h~> +JcC<$`W,?+iW&KLpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?WqrVuisrVufrrVufrp](0l +!ri6#p](0lpAb*lJcC<$OT0h~> +JcC<$b5^l0g]-mGpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?WqrVuisrVufrrVufrpAb*l +!ri6#p](0lpAb*lJcC<$OT0h~> +JcC<$b5^l0g]-mGpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?WqrVuisrVufrrVufrpAb*l +!ri6#p](0lpAb*lJcC<$OT0h~> +JcC<$b5^l0g]-mGpAb'kq>^Bnqu?Tprr;osq>^Eoqu?Wqqu?Wqqu?WqrVuisrVufrrVufrpAb*l +!ri6#p](0lpAb*lJcC<$OT0h~> +JcC<$d/WM6e,T+Ap&G!kq>^Bnqu?WqrVufrq>^Eoqu?Wqqu?Wqqu?Wqrr;osrVufrrVufrpAb$j +pAb*lp&G!kJcC<$OT0h~> +JcC<$d/WM6e,T+Ap&G!kq>^Bnqu?WqrVufrq>^Eoqu?Wqqu?Wqqu?Wqrr;osrVufrrVufrpAb$j +pAb*lp&G!kJcC<$OT0h~> +JcC<$d/WM6e,T+Ap&G!kq>^Bnqu?WqrVufrq>^Eoqu?Wqqu?Wqqu?Wqrr;osrVufrrVufrpAb$j +pAb*lp&G!kJcC<$OT0h~> +JcC<$f)P.^Bnqu?WqrVufrq>^Eoqu?Wqqu?Wqqu?Wqrr;osrVufrrVufrpAb$j +pAb*lp&G!kJcC<$OT0h~> +JcC<$f)P.^Bnqu?WqrVufrq>^Eoqu?Wqqu?Wqqu?Wqrr;osrVufrrVufrpAb$j +pAb*lp&G!kJcC<$OT0h~> +JcC<$f)P.^Bnqu?WqrVufrq>^Eoqu?Wqqu?Wqqu?Wqrr;osrVufrrVufrpAb$j +pAb*lp&G!kJcC<$OT0h~> +JcC<$h#HdBbQ%,5p&G!kq>^Bnr;Z`rr;Z]qq>^Eoqu?Wqr;Z]qr;Z]qrr;osrr;lrrVufrp&Fsj +pAb*lp&G!kJcC<$OT0h~> +JcC<$h#HdBbQ%,5p&G!kq>^Bnr;Z`rr;Z]qq>^Eoqu?Wqr;Z]qr;Z]qrr;osrr;lrrVufrp&Fsj +pAb*lp&G!kJcC<$OT0h~> +JcC<$h#HdBbQ%,5p&G!kq>^Bnr;Z`rr;Z]qq>^Eoqu?Wqr;Z]qr;Z]qrr;osrr;lrrVufrp&Fsj +pAb*lp&G!kJcC<$OT0h~> +JcC<$iW&^BnrVufrr;Z]qr;Z]qrr;Qis8W#tp&G!k +pAb*lo`+mjJcC<$OT0h~> +JcC<$iW&^BnrVufrr;Z]qr;Z]qrr;Qis8W#tp&G!k +pAb*lo`+mjJcC<$OT0h~> +JcC<$iW&^BnrVufrr;Z]qr;Z]qrr;Qis8W#tp&G!k +pAb*lo`+mjJcC<$OT0h~> +li2\>JcGNFmJt6+q#LHpquHcsrW)TjrW)fppAk-kq#LBnq>gQqq>gQqq>gQqq>gQqqZ-Zrr;Zit +q#L-grrDcmrW)TjrW%NLJcCi3J,~> +li2\>JcGNFmJt6+q#LHpquHcsrW)TjrW)fppAk-kq#LBnq>gQqq>gQqq>gQqq>gQqqZ-Zrr;Zit +q#L-grrDcmrW)TjrW%NLJcCi3J,~> +li2\>JcGNFmJt6+q#LHpquHcsrW)TjrW)fppAk-kq#LBnq>gQqq>gQqq>gQqq>gQqqZ-Zrr;Zit +q#L-grrDcmrW)TjrW%NLJcCi3J,~> +li2\>JcG`LmJt*'q#LBnr;cisrW)QirrDoqr;ZitrW(%>rrDus!!)BcrrD`lrrDZjrW%NLJcCi3 +J,~> +li2\>JcG`LmJt*'q#LBnr;cisrW)QirrDoqr;ZitrW(%>rrDus!!)BcrrD`lrrDZjrW%NLJcCi3 +J,~> +li2\>JcG`LmJt*'q#LBnr;cisrW)QirrDoqr;ZitrW(%>rrDus!!)BcrrD`lrrDZjrW%NLJcCi3 +J,~> +li2\>K`CH?^Ams.qu?Tprr;rto)J^iqu?TpVuQbspAb*loDediJcC<$OT0h~> +li2\>K`CH?^Ams.qu?Tprr;rto)J^iqu?TpVuQbspAb*loDediJcC<$OT0h~> +li2\>K`CH?^Ams.qu?Tprr;rto)J^iqu?TpVuQbspAb*loDediJcC<$OT0h~> +li6qaN;rkWMZ<)E])VR+q#C +li6qaN;rkWMZ<)E])VR+q#C +li6qaN;rkWMZ<)E])VR+q#C +li6qaN;rkWO8nVJ\,Z7(pAb-mr;Z`rnc/Uhr;Z]qW;lktpAb-mnc/RgJcC<$OT0h~> +li6qaN;rkWO8nVJ\,Z7(pAb-mr;Z`rnc/Uhr;Z]qW;lktpAb-mnc/RgJcC<$OT0h~> +li6qaN;rkWO8nVJ\,Z7(pAb-mr;Z`rnc/Uhr;Z]qW;lktpAb-mnc/RgJcC<$OT0h~> +li6qaN;rkWQ2g7P[/]n$p&G$lqu?WqnGiLgrVufrXoJ4tp](6nnGiIfJcC<$OT0h~> +li6qaN;rkWQ2g7P[/]n$p&G$lqu?WqnGiLgrVufrXoJ4tp](6nnGiIfJcC<$OT0h~> +li6qaN;rkWQ2g7P[/]n$p&G$lqu?WqnGiLgrVufrXoJ4tp](6nnGiIfJcC<$OT0h~> +li6qaN;rkWS,_mVYlFIuoD\djqZ$Npmf*7err;osXoJ7up\t3nmf37dJcC<$OT0h~> +li6qaN;rkWS,_mVYlFIuoD\djqZ$Npmf*7err;osXoJ7up\t3nmf37dJcC<$OT0h~> +li6qaN;rkWS,_mVYlFIuoD\djqZ$Npmf*7err;osXoJ7up\t3nmf37dJcC<$OT0h~> +li6qaN;rkWU&XN\XT/(rkl:V^m/Qk]YQ+M#irAuXJcC<$OT0h~> +li6qaN;rkWU&XN\XT/(rkl:V^m/Qk]YQ+M#irAuXJcC<$OT0h~> +li6qaN;rkWU&XN\XT/(rkl:V^m/Qk]YQ+M#irAuXJcC<$OT0h~> +li6qaN;rkWVZ6&aWW2bok5YD\m/Qh\Y5\J%i;`cVJcC<$OT0h~> +li6qaN;rkWVZ6&aWW2bok5YD\m/Qh\Y5\J%i;`cVJcC<$OT0h~> +li6qaN;rkWVZ6&aWW2bok5YD\m/Qh\Y5\J%i;`cVJcC<$OT0h~> +li6qaN;rkWXT.\gVZ6DkjT#2ZJcG0 +li6qaN;rkWXT.\gVZ6DkjT#2ZJcG0 +li6qaN;rkWXT.\gVZ6DkjT#2ZJcG0 +li6qaN;rkWZN'=mUAt#hjT#&VJcG3=rW%NLJcCi3J,~> +li6qaN;rkWZN'=mUAt#hjT#&VJcG3=rW%NLJcCi3J,~> +li6qaN;rkWZN'=mUAt#hjT#&VJcG3=rW%NLJcCi3J,~> +li6qaN;rkW\GtssT)\Tdm/QSUJcG0 +li6qaN;rkW\GtssT)\Tdm/QSUJcG0 +li6qaN;rkW\GtssT)\Tdm/QSUJcG0 +li6qaN;rkW^&RL#SH&?alMpASJcG0 +li6qaN;rkW^&RL#SH&?alMpASJcG0 +li6qaN;rkW^&RL#SH&?alMpASJcG0 +li6qaN;rkW_uK-)R/cs^jo=oPJcG0 +li6qaN;rkW_uK-)R/cs^jo=oPJcG0 +li6qaN;rkW_uK-)R/cs^jo=oPJcG0 +li6qaN;rkWaoCc/PlLOZiW&QNJcG0 +li6qaN;rkWaoCc/PlLOZiW&QNJcG0 +li6qaN;rkWaoCc/PlLOZiW&QNJcG0 +li6qaS,`Kgo`+mjci +li6qaS,`Kgo`+mjci +li6qaS,`Kgo`+mjci +li6qaT)\]go`+mjeGnt;NW8bRhuA6-h#N$+JcCi3J,~> +li6qaT)\]go`+mjeGnt;NW8bRhuA6-h#N$+JcCi3J,~> +li6qaT)\]go`+mjeGnt;NW8bRhuA6-h#N$+JcCi3J,~> +li6qaTE"cgo`+mjq>UEpj8\NIMZd?P!<;ut!<7TMkQ$26JcCi3J,~> +li6qaTE"cgo`+mjq>UEpj8\NIMZd?P!<;ut!<7TMkQ$26JcCi3J,~> +li6qaTE"cgo`+mjq>UEpj8\NIMZd?P!<;ut!<7TMkQ$26JcCi3J,~> +li6qaSH&Qgo`+mjqu?Wql2U/OLB%&Lh>d +li6qaSH&Qgo`+mjqu?Wql2U/OLB%&Lh>d +li6qaSH&Qgo`+mjqu?Wql2U/OLB%&Lh>d +li6qaSH&Qgo`+mjr;Z`rmf2\TKE(]Hh#I6Orr;osm/I%cd/X+Gl2U__oDe@]JcC<$JcGHDJ,~> +li6qaSH&Qgo`+mjr;Z`rmf2\TKE(]Hh#I6Orr;osm/I%cd/X+Gl2U__oDe@]JcC<$JcGHDJ,~> +li6qaSH&Qgo`+mjr;Z`rmf2\TKE(]Hh#I6Orr;osm/I%cd/X+Gl2U__oDe@]JcC<$JcGHDJ,~> +li6qaSH&Qgo`+mjrVufro`+=ZJcGcMq#K1LqZ-Qor;c9crW(=FrrD9_quHEio`0RCJcC<$o`'F~> +li6qaSH&Qgo`+mjrVufro`+=ZJcGcMq#K1LqZ-Qor;c9crW(=FrrD9_quHEio`0RCJcC<$o`'F~> +li6qaSH&Qgo`+mjrVufro`+=ZJcGcMq#K1LqZ-Qor;c9crW(=FrrD9_quHEio`0RCJcC<$o`'F~> +li6qaSH&Qgo`+mjs8Vusq#Ba^JcGZJq#K1Lq>gEmrW)Bdr;b7Fr;c*^q>g6hpAfdEJcC<$oDa=~> +li6qaSH&Qgo`+mjs8Vusq#Ba^JcGZJq#K1Lq>gEmrW)Bdr;b7Fr;c*^q>g6hpAfdEJcC<$oDa=~> +li6qaSH&Qgo`+mjs8Vusq#Ba^JcGZJq#K1Lq>gEmrW)Bdr;b7Fr;c*^q>g6hpAfdEJcC<$oDa=~> +li6qaoDedip&G!kp](0lpAY*mrr;uup&G!kpAb*lq#C +li6qaoDedip&G!kp](0lpAY*mrr;uup&G!kpAb*lq#C +li6qaoDedip&G!kp](0lpAY*mrr;uup&G!kpAb*lq#C +li6qap&Fgfqu?Hlqu?Hlqu?Tp!<;orqZ$?kqZ$BlqZ$Npo`+(SJcGECp]0%JqZ-BjrrDQgq>eqC +quH!]o`4jgp&K[DJcC<$pA]X~> +li6qap&Fgfqu?Hlqu?Hlqu?Tp!<;orqZ$?kqZ$BlqZ$Npo`+(SJcGECp]0%JqZ-BjrrDQgq>eqC +quH!]o`4jgp&K[DJcC<$pA]X~> +li6qap&Fgfqu?Hlqu?Hlqu?Tp!<;orqZ$?kqZ$BlqZ$Npo`+(SJcGECp]0%JqZ-BjrrDQgq>eqC +quH!]o`4jgp&K[DJcC<$pA]X~> +li6qapAb-mrVuisr;Z`rrr;osrVuisrVuisrr;Qir;Z`rrr;osr;Zcsrr;osqu?Wqo`+:YJcG9? +q#K+Jq>g6h!!)Ngq#JkCqZ,m\o)S^go)O@AJcC<$q>Ys~> +li6qapAb-mrVuisr;Z`rrr;osrVuisrVuisrr;Qir;Z`rrr;osr;Zcsrr;osqu?Wqo`+:YJcG9? +q#K+Jq>g6h!!)Ngq#JkCqZ,m\o)S^go)O@AJcC<$q>Ys~> +li6qapAb-mrVuisr;Z`rrr;osrVuisrVuisrr;Qir;Z`rrr;osr;Zcsrr;osqu?Wqo`+:YJcG9? +q#K+Jq>g6h!!)Ngq#JkCqZ,m\o)S^go)O@AJcC<$q>Ys~> +li6qapAb-mr;ZcsrVuisr;Z]qrr;rtrVuisr;ZZprVuisrVuisr;Z]qrr;uur;Z]qr;Z`rp&FO^ +JcG0fg\o`4gfquHcsq#H!GJcC<$qu;0~> +li6qapAb-mr;ZcsrVuisr;Z]qrr;rtrVuisr;ZZprVuisrVuisr;Z]qrr;uur;Z]qr;Z`rp&FO^ +JcG0fg\o`4gfquHcsq#H!GJcC<$qu;0~> +li6qapAb-mr;ZcsrVuisr;Z]qrr;rtrVuisr;ZZprVuisrVuisr;Z]qrr;uur;Z]qr;Z`rp&FO^ +JcG0fg\o`4gfquHcsq#H!GJcC<$qu;0~> +li6qap](3mr;ZcsrVultqu?Tps8W#trVufrrVufrr;Z`rrVultqu?Tps8W&ur;Z]qr;Z`rpAadc +JcG*:p]/tHq>fUVp&NSAq#K^[q#L'er;cfrq#H!GJcC<$rVqB~> +li6qap](3mr;ZcsrVultqu?Tps8W#trVufrrVufrr;Z`rrVultqu?Tps8W&ur;Z]qr;Z`rpAadc +JcG*:p]/tHq>fUVp&NSAq#K^[q#L'er;cfrq#H!GJcC<$rVqB~> +li6qap](3mr;ZcsrVultqu?Tps8W#trVufrrVufrr;Z`rrVultqu?Tps8W&ur;Z]qr;Z`rpAadc +JcG*:p]/tHq>fUVp&NSAq#K^[q#L'er;cfrq#H!GJcC<$rVqB~> +li6qap](0lq#C +li6qap](0lq#C +li6qap](0lq#C +li6qapAb$jqZ$Npmf31br;Z`rr;Z]qs8W&up&FXarVuiso`+RaJcG<@q#K"GqZ,[Vo)R;?pAjLY +q#L$drW)coq#H!GJcC?%J,~> +li6qapAb$jqZ$Npmf31br;Z`rr;Z]qs8W&up&FXarVuiso`+RaJcG<@q#K"GqZ,[Vo)R;?pAjLY +q#L$drW)coq#H!GJcC?%J,~> +li6qapAb$jqZ$Npmf31br;Z`rr;Z]qs8W&up&FXarVuiso`+RaJcG<@q#K"GqZ,[Vo)R;?pAjLY +q#L$drW)coq#H!GJcC?%J,~> +li6qap&Fmhr;Z`rnc/Cbr;Z`rr;Z]qs8W&upAb*lo)J[ho`+mjs8VlpJcGECq#K"Gq>f=Nq#JqE +p&OFYr;Zitr;cHhrrDfnq#H!GJcCE'J,~> +li6qap&Fmhr;Z`rnc/Cbr;Z`rr;Z]qs8W&upAb*lo)J[ho`+mjs8VlpJcGECq#K"Gq>f=Nq#JqE +p&OFYr;Zitr;cHhrrDfnq#H!GJcCE'J,~> +li6qap&Fmhr;Z`rnc/Cbr;Z`rr;Z]qs8W&upAb*lo)J[ho`+mjs8VlpJcGECq#K"Gq>f=Nq#JqE +p&OFYr;Zitr;cHhrrDfnq#H!GJcCE'J,~> +li6qao`+dgrr;oso)J[hs8W#tr;Z`rr;Z]q!<;utpAb'koDedio`+mjr;ZWoJcGQGp]/kEqZ,@M +r;ZitrW(LKoDn4WrW)uur;cHh!!)]lq#H!GJcCK)J,~> +li6qao`+dgrr;oso)J[hs8W#tr;Z`rr;Z]q!<;utpAb'koDedio`+mjr;ZWoJcGQGp]/kEqZ,@M +r;ZitrW(LKoDn4WrW)uur;cHh!!)]lq#H!GJcCK)J,~> +li6qao`+dgrr;oso)J[hs8W#tr;Z`rr;Z]q!<;utpAb'koDedio`+mjr;ZWoJcGQGp]/kEqZ,@M +r;ZitrW(LKoDn4WrW)uur;cHh!!)]lq#H!GJcCK)J,~> +li6qaoDe[fs8W#to`+mjrVufrr;Z`rr;Z]q!<;utpAb'koDedio`+mjq>^EoJcGWIq#JqEq>f7L +r;cltrW(LKrW)uurVurur;c0`rrE#tr;cKi!!)Wjp],mFJcCT,J,~> +li6qaoDe[fs8W#to`+mjrVufrr;Z`rr;Z]q!<;utpAb'koDedio`+mjq>^EoJcGWIq#JqEq>f7L +r;cltrW(LKrW)uurVurur;c0`rrE#tr;cKi!!)Wjp],mFJcCT,J,~> +li6qaoDe[fs8W#to`+mjrVufrr;Z`rr;Z]q!<;utpAb'koDedio`+mjq>^EoJcGWIq#JqEq>f7L +r;cltrW(LKrW)uurVurur;c0`rrE#tr;cKi!!)Wjp],mFJcCT,J,~> +li6qapAY*mrVucqs8W&uo`+mjrVufrr;Z`rr;Z]qs8W&upAb'kq#: +li6qapAY*mrVucqs8W&uo`+mjrVufrr;Z`rr;Z]qs8W&upAb'kq#: +li6qapAY*mrVucqs8W&uo`+mjrVufrr;Z`rr;Z]qs8W&upAb'kq#: +li6qapAY*mr;Z]qs8W#tqZ$Qqs8W#trVufrr;Z`rr;Z]qs8W#tqZ$Qqs8W&uq#: +li6qapAY*mr;Z]qs8W#tqZ$Qqs8W#trVufrr;Z`rr;Z]qs8W#tqZ$Qqs8W&uq#: +li6qapAY*mr;Z]qs8W#tqZ$Qqs8W#trVufrr;Z`rr;Z]qs8W#tqZ$Qqs8W&uq#: +li6qapAY*mqu?Wqs8Vusqu6Wrrr;osrVufrr;Z`rr;Z]qs8Vusqu6Wrrr;osqZ$QqrVuiso`+mj +JcGKEq#JkCq>f+Hr;ccq!!(CGrW)'[!!)orquG^Up],mFJcCi3J,~> +li6qapAY*mqu?Wqs8Vusqu6Wrrr;osrVufrr;Z`rr;Z]qs8Vusqu6Wrrr;osqZ$QqrVuiso`+mj +JcGKEq#JkCq>f+Hr;ccq!!(CGrW)'[!!)orquG^Up],mFJcCi3J,~> +li6qapAY*mqu?Wqs8Vusqu6Wrrr;osrVufrr;Z`rr;Z]qs8Vusqu6Wrrr;osqZ$QqrVuiso`+mj +JcGKEq#JkCq>f+Hr;ccq!!(CGrW)'[!!)orquG^Up],mFJcCi3J,~> +li6qapAY*mqu?Wqrr;Zlrr;osrr;lrrVufrr;Z]qrr;ZlrVucqrr;rtr;Z`ro`+mjJcGQGq#JhB +qZ,1Hr;at>rW(dSquGXSq#H!GJcCo5J,~> +li6qapAY*mqu?Wqrr;Zlrr;osrr;lrrVufrr;Z]qrr;ZlrVucqrr;rtr;Z`ro`+mjJcGQGq#JhB +qZ,1Hr;at>rW(dSquGXSq#H!GJcCo5J,~> +li6qapAY*mqu?Wqrr;Zlrr;osrr;lrrVufrr;Z]qrr;ZlrVucqrr;rtr;Z`ro`+mjJcGQGq#JhB +qZ,1Hr;at>rW(dSquGXSq#H!GJcCo5J,~> +li6qapAb-mr;Zcsr;ZNlrVuHhs8W#tr;Z]qrVuWmr;ZKkqu?Tpp&G!kJcGWIq#JhBqZ,+Fr;at> +rW(aRquGURq#H!GJcCu7J,~> +li6qapAb-mr;Zcsr;ZNlrVuHhs8W#tr;Z]qrVuWmr;ZKkqu?Tpp&G!kJcGWIq#JhBqZ,+Fr;at> +rW(aRquGURq#H!GJcCu7J,~> +li6qapAb-mr;Zcsr;ZNlrVuHhs8W#tr;Z]qrVuWmr;ZKkqu?Tpp&G!kJcGWIq#JhBqZ,+Fr;at> +rW(aRquGURq#H!GJcCu7J,~> +li6qapAapgqZ$Blqu?Nns8W#ts8Voqs8VrrrVu]oqZ$?kr;ZTnpAb*lJcG`Lp]/_Aq>f"Er;aq= +rW(^Qr;bXQq#H!GJcD&9J,~> +li6qapAapgqZ$Blqu?Nns8W#ts8Voqs8VrrrVu]oqZ$?kr;ZTnpAb*lJcG`Lp]/_Aq>f"Er;aq= +rW(^Qr;bXQq#H!GJcD&9J,~> +li6qapAapgqZ$Blqu?Nns8W#ts8Voqs8VrrrVu]oqZ$?kr;ZTnpAb*lJcG`Lp]/_Aq>f"Er;aq= +rW(^Qr;bXQq#H!GJcD&9J,~> +li6qapAY0os8W&upAb*lp](6nr;Q`skl:V^pAb'kkl:V^Jc>`Mq#Jb@qZ,%Dr;aq=rW([Pr;bUP +p],mFJcD/ +li6qapAY0os8W&upAb*lp](6nr;Q`skl:V^pAb'kkl:V^Jc>`Mq#Jb@qZ,%Dr;aq=rW([Pr;bUP +p],mFJcD/ +li6qapAY0os8W&upAb*lp](6nr;Q`skl:V^pAb'kkl:V^Jc>`Mq#Jb@qZ,%Dr;aq=rW([Pr;bUP +p],mFJcD/ +li6qaN;rkWK)bWHci +li6qaN;rkWK)bWHci +li6qaN;rkWK)bWHci +li6qaN;rkWL&^oJcN!bAci +li6qaN;rkWL&^oJcN!bAci +li6qaN;rkWL&^oJcN!bAci +li6qaN;rkWL]@/Mc2[Y@cN!hC`rH# +li6qaN;rkWL]@/Mc2[Y@cN!hC`rH# +li6qaN;rkWL]@/Mc2[Y@cN!hC`rH# +li6qaN;rkWM?!AOc2[V?c2[_B`rH# +li6qaN;rkWM?!AOc2[V?c2[_B`rH# +li6qaN;rkWM?!AOc2[V?c2[_B`rH# +li6qaN;rkWMuWSQbl@P?bl@VA`W,o;f)PXJeGo=EJcC<$V#Pr~> +li6qaN;rkWMuWSQbl@P?bl@VA`W,o;f)PXJeGo=EJcC<$V#Pr~> +li6qaN;rkWMuWSQbl@P?bl@VA`W,o;f)PXJeGo=EJcC<$V#Pr~> +li6qaN;rkWNrSkSbl@M>bQ%M@`W,o;ec5OIe,T4DJcC<$VZ2/~> +li6qaN;rkWNrSkSbl@M>bQ%M@`W,o;ec5OIe,T4DJcC<$VZ2/~> +li6qaN;rkWNrSkSbl@M>bQ%M@`W,o;ec5OIe,T4DJcC<$VZ2/~> +li6qaN;rkWOT5+Vb5_>=b5_D?`;ff:eGoFHdf9(BJcC<$WW.J~> +li6qaN;rkWOT5+Vb5_>=b5_D?`;ff:eGoFHdf9(BJcC<$WW.J~> +li6qaN;rkWOT5+Vb5_>=b5_D?`;ff:eGoFHdf9(BJcC<$WW.J~> +li6qaN;rkWP5k=Xb5_>=aT)2=`;ff:e,T@Hci +li6qaN;rkWP5k=Xb5_>=aT)2=`;ff:e,T@Hci +li6qaN;rkWP5k=Xb5_>=aT)2=`;ff:e,T@Hci +li6qaN;rkWQ2gUZb5_; +li6qaN;rkWQ2gUZb5_; +li6qaN;rkWQ2gUZb5_; +li6qaN;rkWQiHj]aT),;`rGu;_uK]9dJs.Fc2[S>JcC<$YQ'+~> +li6qaN;rkWQiHj]aT),;`rGu;_uK]9dJs.Fc2[S>JcC<$YQ'+~> +li6qaN;rkWQiHj]aT),;`rGu;_uK]9dJs.Fc2[S>JcC<$YQ'+~> +li6qaN;rkWRK*'_aT),;`W,l:_Z0T8d/X%Ebl@G +li6qaN;rkWRK*'_aT),;`W,l:_Z0T8d/X%Ebl@G +li6qaN;rkWRK*'_aT),;`W,l:_Z0T8d/X%Ebl@G +li6qaN;rkWS,`9aaT)):`;fc9_Z0T8d/X"Db5_8;JcC<$[/YX~> +li6qaN;rkWS,`9aaT)):`;fc9_Z0T8d/X"Db5_8;JcC<$[/YX~> +li6qaN;rkWS,`9aaT)):`;fc9_Z0T8d/X"Db5_8;JcC<$[/YX~> +li6qaN;rkWT)\Qca8c#:_uKZ8_>jK7ci +li6qaN;rkWT)\Qca8c#:_uKZ8_>jK7ci +li6qaN;rkWT)\Qca8c#:_uKZ8_>jK7ci +li6qaN;rkWT`=ff`rGl8_Z0Q7_>jK7cN!eBaT)#8JcC<$\c70~> +li6qaN;rkWT`=ff`rGl8_Z0Q7_>jK7cN!eBaT)#8JcC<$\c70~> +li6qaN;rkWT`=ff`rGl8_Z0Q7_>jK7cN!eBaT)#8JcC<$\c70~> +li2\>UAt#h`W,f8_>jH6_#OB6c2[\A`rGi7JcC<$]DmB~> +li2\>UAt#h`W,f8_>jH6_#OB6c2[\A`rGi7JcC<$]DmB~> +li2\>UAt#h`W,f8_>jH6_#OB6c2[\A`rGi7JcC<$]DmB~> +li2\>V>p;j`W,f8^]464_#OB6bl@VA`;fW5JcC<$^&NT~> +li2\>V>p;j`W,f8^]464_#OB6bl@VA`;fW5JcC<$^&NT~> +li2\>V>p;j`W,f8^]464_#OB6bl@VA`;fW5JcC<$^&NT~> +li2\>VuQPm`;fZ6^]464^]495bQ%M@_uKN4JcC<$^]/f~> +li2\>VuQPm`;fZ6^]464^]495bQ%M@_uKN4JcC<$^]/f~> +li2\>VuQPm`;fZ6^]464^]495bQ%M@_uKN4JcC<$^]/f~> +JcD,;q#J>4qZ+>0r;aV4rW(+@r;a_7p],mFJcEUeJ,~> +JcD,;q#J>4qZ+>0r;aV4rW(+@r;a_7p],mFJcEUeJ,~> +JcD,;q#J>4qZ+>0r;aV4rW(+@r;a_7p],mFJcEUeJ,~> +JcD2=q#J>4q>e5/r;aS3rW((?r;aY5q#H!GJcE[gJ,~> +JcD2=q#J>4q>e5/r;aS3rW((?r;aY5q#H!GJcE[gJ,~> +JcD2=q#J>4q>e5/r;aS3rW((?r;aY5q#H!GJcE[gJ,~> +JcD;@p]/22qZ+8.r;aS3rW(%>r;aV4q#H!GJcEaiJ,~> +JcD;@p]/22qZ+8.r;aS3rW(%>r;aV4q#H!GJcEaiJ,~> +JcD;@p]/22qZ+8.r;aS3rW(%>r;aV4q#H!GJcEaiJ,~> +JcDABq#J82qZ+5-r;aP2rW(%>quFJ2p],mFJcEjlJ,~> +JcDABq#J82qZ+5-r;aP2rW(%>quFJ2p],mFJcEjlJ,~> +JcDABq#J82qZ+5-r;aP2rW(%>quFJ2p],mFJcEjlJ,~> +JcDGDq#J82q>e)+r;aP2rW("=quFD0q#H!GJcEpnJ,~> +JcDGDq#J82q>e)+r;aP2rW("=quFD0q#H!GJcEpnJ,~> +JcDGDq#J82q>e)+r;aP2rW("=quFD0q#H!GJcEpnJ,~> +JcDPGp]/,0qZ+/+r;aM1rW't +JcDPGp]/,0qZ+/+r;aM1rW't +JcDPGp]/,0qZ+/+r;aM1rW't +JcDVIq#J20qZ+))r;aM1rW'q;quF>.q#H!GJcF'rJ,~> +JcDVIq#J20qZ+))r;aM1rW'q;quF>.q#H!GJcF'rJ,~> +JcDVIq#J20qZ+))r;aM1rW'q;quF>.q#H!GJcF'rJ,~> +JcD\Kq#J20q>du(r;aJ0rW'n:r;aA-p],mFJcF0uJ,~> +JcD\Kq#J20q>du(r;aJ0rW'n:r;aA-p],mFJcF0uJ,~> +JcD\Kq#J20q>du(r;aJ0rW'n:r;aA-p],mFJcF0uJ,~> +JcDeNp]/&.qZ+#'r;aJ0rW'k9r;a;+q#H!GJcF7"J,~> +JcDeNp]/&.qZ+#'r;aJ0rW'k9r;a;+q#H!GJcF7"J,~> +JcDeNp]/&.qZ+#'r;aJ0rW'k9r;a;+q#H!GJcF7"J,~> +JcDkPq#J,.q>do&r;aG/rW'h8r;a8*q#H!GJcF=$J,~> +JcDkPq#J,.q>do&r;aG/rW'h8r;a8*q#H!GJcF=$J,~> +JcDkPq#J,.q>do&r;aG/rW'h8r;a8*q#H!GJcF=$J,~> +JcDqRq#J)-qZ*r%r;aG/rW'e7r;a5)q#H!GJcFC&J,~> +JcDqRq#J)-qZ*r%r;aG/rW'e7r;a5)q#H!GJcFC&J,~> +JcDqRq#J)-qZ*r%r;aG/rW'e7r;a5)q#H!GJcFC&J,~> +JcE"Tq#J)-qZ*o$r;aD.rW'b6r;a2(p],mFJcFL)J,~> +JcE"Tq#J)-qZ*o$r;aD.rW'b6r;a2(p],mFJcFL)J,~> +JcE"Tq#J)-qZ*o$r;aD.rW'b6r;a2(p],mFJcFL)J,~> +JcE+Wp].u,q>dc"r;aD.rW'b6quF#%q#H!GJcFR+J,~> +JcE+Wp].u,q>dc"r;aD.rW'b6quF#%q#H!GJcFR+J,~> +JcE+Wp].u,q>dc"r;aD.rW'b6quF#%q#H!GJcFR+J,~> +JcE1Yq#J#+qZ*i"r;aA-rW'_5quEu$q#H!GJcFX-J,~> +JcE1Yq#J#+qZ*i"r;aA-rW'_5quEu$q#H!GJcFX-J,~> +JcE1Yq#J#+qZ*i"r;aA-rW'_5quEu$q#H!GJcFX-J,~> +JcE7[q#J#+qZ*bur;aA-rW'\4quEr#p],mFJcFa0J,~> +JcE7[q#J#+qZ*bur;aA-rW'\4quEr#p],mFJcFa0J,~> +JcE7[q#J#+qZ*bur;aA-rW'\4quEr#p],mFJcFa0J,~> +JcE@^p].o*q>dYtr;a>,rW'Y3quEl!q#H!GJcFg2J,~> +JcE@^p].o*q>dYtr;a>,rW'Y3quEl!q#H!GJcFg2J,~> +JcE@^p].o*q>dYtr;a>,rW'Y3quEl!q#H!GJcFg2J,~> +JcEF`q#Ir)qZ*\sr;a>,rW'V2r;`nuq#H!GJcFm4J,~> +JcEF`q#Ir)qZ*\sr;a>,rW'V2r;`nuq#H!GJcFm4J,~> +JcEF`q#Ir)qZ*\sr;a>,rW'V2r;`nuq#H!GJcFm4J,~> +JcELbq#Ir)q>dPqrW'D,rW'S1r;`ktq#H!GJcFs6J,~> +JcELbq#Ir)q>dPqrW'D,rW'S1r;`ktq#H!GJcFs6J,~> +JcELbq#Ir)q>dPqrW'D,rW'S1r;`ktq#H!GJcFs6J,~> +JcERdq#Io(qZ*Vqr;a;+rW'P0r;`hsp],mFJcG'9J,~> +JcERdq#Io(qZ*Vqr;a;+rW'P0r;`hsp],mFJcG'9J,~> +JcERdq#Io(qZ*Vqr;a;+rW'P0r;`hsp],mFJcG'9J,~> +JcE[gp].f'qZ*PorW'A+rW'M/r;`bqq#H!GJcG-;J,~> +JcE[gp].f'qZ*PorW'A+rW'M/r;`bqq#H!GJcG-;J,~> +JcE[gp].f'qZ*PorW'A+rW'M/r;`bqq#H!GJcG-;J,~> +JcEaiq#Il'q>dGnr;a8*rW'M/quEVoq#H!GJcG3=J,~> +JcEaiq#Il'q>dGnr;a8*rW'M/quEVoq#H!GJcG3=J,~> +JcEaiq#Il'q>dGnr;a8*rW'M/quEVoq#H!GJcG3=J,~> +JcEgkq#Ii&qZ*JmrW'>*rW'J.quESnp],mFJcG<@J,~> +JcEgkq#Ii&qZ*JmrW'>*rW'J.quESnp],mFJcG<@J,~> +JcEgkq#Ii&qZ*JmrW'>*rW'J.quESnp],mFJcG<@J,~> +JcEpnp].`%q>dAlr;a5)rW'G-quEMlq#H!GJcGBBJ,~> +JcEpnp].`%q>dAlr;a5)rW'G-quEMlq#H!GJcGBBJ,~> +JcEpnp].`%q>dAlr;a5)rW'G-quEMlq#H!GJcGBBJ,~> +JcF!pq#Ic$qZ*DkrW';)rW'D,quEJkq#H!GJcGHDJ,~> +JcF!pq#Ic$qZ*DkrW';)rW'D,quEJkq#H!GJcGHDJ,~> +JcF!pq#Ic$qZ*DkrW';)rW'D,quEJkq#H!GJcGHDJ,~> +JcF'rq#Ic$qZ*Ajr;a2(rW'A+quEGjq#H!GJcGNFJ,~> +JcF'rq#Ic$qZ*Ajr;a2(rW'A+quEGjq#H!GJcGNFJ,~> +JcF'rq#Ic$qZ*Ajr;a2(rW'A+quEGjq#H!GJcGNFJ,~> +JcF-tq#Ic$q>d5hrW'8(rW'>*r;`Jip],mFJcGWIJ,~> +JcF-tq#Ic$q>d5hrW'8(rW'>*r;`Jip],mFJcGWIJ,~> +JcF-tq#Ic$q>d5hrW'8(rW'>*r;`Jip],mFJcGWIJ,~> +JcF7"p].W"qZ*;hr;a/'rW';)r;`Dgq#H!GJcG]KJ,~> +JcF7"p].W"qZ*;hr;a/'rW';)r;`Dgq#H!GJcG]KJ,~> +JcF7"p].W"qZ*;hr;a/'rW';)r;`Dgq#H!GJcG]KJ,~> +li3XYbl@J=Z2a\$T)\ciZ2ae'ZN'k'SH&BbJcC<$s8RT~> +li3XYbl@J=Z2a\$T)\ciZ2ae'ZN'k'SH&BbJcC<$s8RT~> +li3XYbl@J=Z2a\$T)\ciZ2ae'ZN'k'SH&BbJcC<$s8RT~> +li3XYcN!\?Z2aY#T)\`hZ2ae'Z2ab&S,`6`JcC?%J,~> +li3XYcN!\?Z2aY#T)\`hZ2ae'Z2ab&S,`6`JcC?%J,~> +li3XYcN!\?Z2aY#T)\`hZ2ae'Z2ab&S,`6`JcC?%J,~> +li3XYdJrtAYlFS#SH&QgYlF\&Z2a_%RK*'_JcCE'J,~> +li3XYdJrtAYlFS#SH&QgYlF\&Z2a_%RK*'_JcCE'J,~> +li3XYdJrtAYlFS#SH&QgYlF\&Z2a_%RK*'_JcCE'J,~> +li6qaVuQ_re,T4DYQ+G!SH&NfYlF\&YlFV$R/cs^JcCK)J,~> +li6qaVuQ_re,T4DYQ+G!SH&NfYlF\&YlFV$R/cs^JcCK)J,~> +li6qaVuQ_re,T4DYQ+G!SH&NfYlF\&YlFV$R/cs^JcCK)J,~> +li6qaVuQ_rec5FFY5eA!RfE?eYQ+S%YQ+M#QiHj]JcCQ+J,~> +li6qaVuQ_rec5FFY5eA!RfE?eYQ+S%YQ+M#QiHj]JcCQ+J,~> +li6qaVuQ_rec5FFY5eA!RfE?eYQ+S%YQ+M#QiHj]JcCQ+J,~> +li6qaVuQ_rfDkXHY5eA!RK*3cYQ+S%Y5eD"QN-^[JcCZ.J,~> +li6qaVuQ_rfDkXHY5eA!RK*3cYQ+S%Y5eD"QN-^[JcCZ.J,~> +li6qaVuQ_rfDkXHY5eA!RK*3cYQ+S%Y5eD"QN-^[JcCZ.J,~> +li6qaVuQ_rgAgpJY5e=uR/d-cY5eJ$XoJ;!PlLOZJcC`0J,~> +li6qaVuQ_rgAgpJY5e=uR/d-cY5eJ$XoJ;!PlLOZJcC`0J,~> +li6qaVuQ_rgAgpJY5e=uR/d-cY5eJ$XoJ;!PlLOZJcC`0J,~> +li6qaVuQ_rh#I0MXT/.tQiI!aY5eJ$XT/5!P5k=XJcCf2J,~> +li6qaVuQ_rh#I0MXT/.tQiI!aY5eJ$XT/5!P5k=XJcCf2J,~> +li6qaVuQ_rh#I0MXT/.tQiI!aY5eJ$XT/5!P5k=XJcCf2J,~> +li6qaVuQ_rhZ*BOXT/+sQN-paXoJA#X8i+uOoP4WJcCl4J,~> +li6qaVuQ_rhZ*BOXT/+sQN-paXoJA#X8i+uOoP4WJcCl4J,~> +li6qaVuQ_rhZ*BOXT/+sQN-paXoJA#X8i+uOoP4WJcCl4J,~> +li6qaVuQ_riW&ZQX8i%sQ2gd_XoJA#WrN"tOT5(UJcCu7J,~> +li6qaVuQ_riW&ZQX8i%sQ2gd_XoJA#WrN"tOT5(UJcCu7J,~> +li6qaVuQ_riW&ZQX8i%sQ2gd_XoJA#WrN"tOT5(UJcCu7J,~> +li6qaVuQ_rj8\oTWrMqrPQ1U^XT/8"WW2nsNrSnTJcD&9J,~> +li6qaVuQ_rj8\oTWrMqrPQ1U^XT/8"WW2nsNrSnTJcD&9J,~> +li6qaVuQ_rj8\oTWrMqrPQ1U^XT/8"WW2nsNrSnTJcD&9J,~> +li6qaVuQ_rjo>,VWrMnqPQ1R]XT/8"WW2krNW8eSJcD,;J,~> +li6qaVuQ_rjo>,VWrMnqPQ1R]XT/8"WW2krNW8eSJcD,;J,~> +li6qaVuQ_rjo>,VWrMnqPQ1R]XT/8"WW2krNW8eSJcD,;J,~> +li6qaVuQ_rkPt>XWW2hqOoPC\X8i/!W;lbqN;rYQJcD5>J,~> +li6qaVuQ_rkPt>XWW2hqOoPC\X8i/!W;lbqN;rYQJcD5>J,~> +li6qaVuQ_rkPt>XWW2hqOoPC\X8i/!W;lbqN;rYQJcD5>J,~> +li6qaVuQ_rlMpVZWW2hqOT57ZX8i/!VuQYpMZ +li6qaVuQ_rlMpVZWW2hqOT57ZX8i/!VuQYpMZ +li6qaVuQ_rlMpVZWW2hqOT57ZX8i/!VuQYpMZ +li6qaVuQ_rqYpNqo`+^eW;l\oO8o1ZWrN%uVZ6PoM?!AOJcDABJ,~> +li6qaVuQ_rqYpNqo`+^eW;l\oO8o1ZWrN%uVZ6PoM?!AOJcDABJ,~> +li6qaVuQ_rqYpNqo`+^eW;l\oO8o1ZWrN%uVZ6PoM?!AOJcDABJ,~> +li6qaVuQ_rqYpNqpAapgVuQVoNrT%XWrN%uV>pGnM#[8NJcDGDJ,~> +li6qaVuQ_rqYpNqpAapgVuQVoNrT%XWrN%uV>pGnM#[8NJcDGDJ,~> +li6qaVuQ_rqYpNqpAapgVuQVoNrT%XWrN%uV>pGnM#[8NJcDGDJ,~> +li6qaVuQ_rqu?Zrq>^3iVuQSnNW8tXWW2qtV#UAnLB%#KJcDPGJ,~> +li6qaVuQ_rqu?Zrq>^3iVuQSnNW8tXWW2qtV#UAnLB%#KJcDPGJ,~> +li6qaVuQ_rqu?Zrq>^3iVuQSnNW8tXWW2qtV#UAnLB%#KJcDPGJ,~> +li6qaVuQ_rr;Z`rqu?HlV>pDmN;rhVWW2qtU]:8mK`CiJJcDVIJ,~> +li6qaVuQ_rr;Z`rqu?HlV>pDmN;rhVWW2qtU]:8mK`CiJJcDVIJ,~> +li6qaVuQ_rr;Z`rqu?HlV>pDmN;rhVWW2qtU]:8mK`CiJJcDVIJ,~> +li6qaVuQ_rrVufrrVuZnV>pDmMZ +li6qaVuQ_rrVufrrVuZnV>pDmMZ +li6qaVuQ_rrVufrrVuZnV>pDmMZ +li6qaVuQ_rrr;osrr;coV>pAlMZ +li6qaVuQ_rrr;osrr;coV>pAlMZ +li6qaVuQ_rrr;osrr;coV>pAlMZ +li6qaVuQ_rs8VZjV#U;lM#[GSVuQ_rU&Y#jJc>`Mq#H!GXoEn~> +li6qaVuQ_rs8VZjV#U;lM#[GSVuQ_rU&Y#jJc>`Mq#H!GXoEn~> +li6qaVuQ_rs8VZjV#U;lM#[GSVuQ_rU&Y#jJc>`Mq#H!GXoEn~> +li6qaVuQ_r!<;]lU]:/jM#[DRVuQ_rT`=oiJcGcMq#H!GYQ'+~> +li6qaVuQ_r!<;]lU]:/jM#[DRVuQ_rT`=oiJcGcMq#H!GYQ'+~> +li6qaVuQ_r!<;]lU]:/jM#[DRVuQ_rT`=oiJcGcMq#H!GYQ'+~> +li6qaoDedio)J^iqYpNqpAb'kpAY*mrr;rto)J:]UAt)jLB%5QVZ6VqTE"fhJcG`Lq#H!GZ2]=~> +li6qaoDedio)J^iqYpNqpAb'kpAY*mrr;rto)J:]UAt)jLB%5QVZ6VqTE"fhJcG`Lq#H!GZ2]=~> +li6qaoDedio)J^iqYpNqpAb'kpAY*mrr;rto)J:]UAt)jLB%5QVZ6VqTE"fhJcG`Lq#H!GZ2]=~> +li6qap&FgfrVufr!<;orrr;iqqZ$?kqu?Tp!<;oroDeI`UAt)jL&_)OVZ6VqT)\]gJcG]Kp],mF +[/YX~> +li6qap&FgfrVufr!<;orrr;iqqZ$?kqu?Tp!<;oroDeI`UAt)jL&_)OVZ6VqT)\]gJcG]Kp],mF +[/YX~> +li6qap&FgfrVufr!<;orrr;iqqZ$?kqu?Tp!<;oroDeI`UAt)jL&_)OVZ6VqT)\]gJcG]Kp],mF +[/YX~> +li6qapAb-mrVuisrr;Tj!<;ipr;Z`rrVuisrr;Qio`+RaV#U8kK`D#OV>pMpScAWgJcGTHq#H!G +[f:j~> +li6qapAb-mrVuisrr;Tj!<;ipr;Z`rrVuisrr;Qio`+RaV#U8kK`D#OV>pMpScAWgJcGTHq#H!G +[f:j~> +li6qapAb-mrVuisrr;Tj!<;ipr;Z`rrVuisrr;Qio`+RaV#U8kK`D#OV>pMpScAWgJcGTHq#H!G +[f:j~> +li6qapAb-mr;ZcsrVucqrVucqrVufrrVuisrVuisr;ZZprr;lrp&FXaVZ6MnKE(lMV>pMpSH&Nf +JcGQGq#H!G\Gq'~> +li6qapAb-mr;ZcsrVucqrVucqrVufrrVuisrVuisr;ZZprr;lrp&FXaVZ6MnKE(lMV>pMpSH&Nf +JcGQGq#H!G\Gq'~> +li6qapAb-mr;ZcsrVucqrVucqrVufrrVuisrVuisr;ZZprr;lrp&FXaVZ6MnKE(lMV>pMpSH&Nf +JcGQGq#H!G\Gq'~> +li6qap](3mr;Zcsr;Z`rr;Z]qr;Z]qrr;osrVufrrVufrqu?Wqp&FR_WrMqrJcG]LV#UDoS,`Ee +JcGNFq#H!G])R9~> +li6qap](3mr;Zcsr;Z`rr;Z]qr;Z]qrr;osrVufrrVufrqu?Wqp&FR_WrMqrJcG]LV#UDoS,`Ee +JcGNFq#H!G])R9~> +li6qap](3mr;Zcsr;Z`rr;Z]qr;Z]qrr;osrVufrrVufrqu?Wqp&FR_WrMqrJcG]LV#UDoS,`Ee +JcGNFq#H!G])R9~> +li6qap](0lpAb*lr;Z]qr;Z]qrVultr;Z]qrVufrqu?TppAaX_XoJ4tJcGZKV#UDoRfE +li6qap](0lpAb*lr;Z]qr;Z]qrVultr;Z]qrVufrqu?TppAaX_XoJ4tJcGZKV#UDoRfE +li6qap](0lpAb*lr;Z]qr;Z]qrVultr;Z]qrVufrqu?TppAaX_XoJ4tJcGZKV#UDoRfE +li6qapAb$jq#C +li6qapAb$jq#C +li6qapAb$jq#C +li6qap&FmhqZ$Npqu?Wqqu?WqqZ$?krVufrqu?TppAb*lU]:/jJcGcMr;`VmrW&AdquD +li6qap&FmhqZ$Npqu?Wqqu?WqqZ$?krVufrqu?TppAb*lU]:/jJcGcMr;`VmrW&AdquD +li6qap&FmhqZ$Npqu?Wqqu?WqqZ$?krVufrqu?TppAb*lU]:/jJcGcMr;`VmrW&AdquD +li6qao`+dgqu?Wqqu?Wqqu?Wqqu?Wqs8W#trVufrqu?TppAb*lV#U;lJcG]KrW&\mrW&>cquD +li6qao`+dgqu?Wqqu?Wqqu?Wqqu?Wqs8W#trVufrqu?TppAb*lV#U;lJcG]KrW&\mrW&>cquD +li6qao`+dgqu?Wqqu?Wqqu?Wqqu?Wqs8W#trVufrqu?TppAb*lV#U;lJcG]KrW&\mrW&>cquD +li6qaoDe[fr;Z`rqu?Wqqu?WqrVuisrVufrrVufrqu?TppAb*lVZ6MnJcGZJr;`SlrW&;bquD +li6qaoDe[fr;Z`rqu?Wqqu?WqrVuisrVufrrVufrqu?TppAb*lVZ6MnJcGZJr;`SlrW&;bquD +li6qaoDe[fr;Z`rqu?Wqqu?WqrVuisrVufrrVufrqu?TppAb*lVZ6MnJcGZJr;`SlrW&;bquD +li6qapAY*mrVucqrVuisqu?Wqqu?WqrVuisrVufrrVufrqu?TppAb*lW;l\oJcGWIrW&YlrW&8a +quD +li6qapAY*mrVucqrVuisqu?Wqqu?WqrVuisrVufrrVufrqu?TppAb*lW;l\oJcGWIrW&YlrW&8a +quD +li6qapAY*mrVucqrVuisqu?Wqqu?WqrVuisrVufrrVufrqu?TppAb*lW;l\oJcGWIrW&YlrW&8a +quD +li6qapAY*mr;Z]qrVuisqu?Wqqu?Wqrr;osrVufrrVufrqu?Wqp&G!kWW2hqJcGTHr;`PkrW&5` +r;_EKmf3(_JcEmmJ,~> +li6qapAY*mr;Z]qrVuisqu?Wqqu?Wqrr;osrVufrrVufrqu?Wqp&G!kWW2hqJcGTHr;`PkrW&5` +r;_EKmf3(_JcEmmJ,~> +li6qapAY*mr;Z]qrVuisqu?Wqqu?Wqrr;osrVufrrVufrqu?Wqp&G!kWW2hqJcGTHr;`PkrW&5` +r;_EKmf3(_JcEmmJ,~> +li6qapAY*mqu?WqrVuisqu?Wqqu?Wqrr;osrVufrrVufrqu?Wqp&G!kX8i"rJcGQGrW&VkrW&2_ +r;_EKmJlq]JcF!pJ,~> +li6qapAY*mqu?WqrVuisqu?Wqqu?Wqrr;osrVufrrVufrqu?Wqp&G!kX8i"rJcGQGrW&VkrW&2_ +r;_EKmJlq]JcF!pJ,~> +li6qapAY*mqu?WqrVuisqu?Wqqu?Wqrr;osrVufrrVufrqu?Wqp&G!kX8i"rJcGQGrW&VkrW&2_ +r;_EKmJlq]JcF!pJ,~> +li6qapAY*mqu?WqrVuisr;Z]qr;Z]qrr;osrr;lrrVufrr;Z`ro`+mjXT/.tJcGNFr;`MjrW&/^ +r;_EKli6b\JcF'rJ,~> +li6qapAY*mqu?WqrVuisr;Z]qr;Z]qrr;osrr;lrrVufrr;Z`ro`+mjXT/.tJcGNFr;`MjrW&/^ +r;_EKli6b\JcF'rJ,~> +li6qapAY*mqu?WqrVuisr;Z]qr;Z]qrr;osrr;lrrVufrr;Z`ro`+mjXT/.tJcGNFr;`MjrW&/^ +r;_EKli6b\JcF'rJ,~> +li6qapAb-mr;ZcsrVufrr;Z]qr;Z]qrr;Qis8Vusrr;rtoDediY5eA!JcGHDrW&SjrW&,]r;_EK +lMpY[JcF-tJ,~> +li6qapAb-mr;ZcsrVufrr;Z]qr;Z]qrr;Qis8Vusrr;rtoDediY5eA!JcGHDrW&SjrW&,]r;_EK +lMpY[JcF-tJ,~> +li6qapAb-mr;ZcsrVufrr;Z]qr;Z]qrr;Qis8Vusrr;rtoDediY5eA!JcGHDrW&SjrW&,]r;_EK +lMpY[JcF-tJ,~> +li6qapAapgrVu]os8Voqs8Voqs8Vrrs8W#trr;]mo)J[hYlFP"JcGHDr;`JirW&)\r;_EKl2UMY +JcF7"J,~> +li6qapAapgrVu]os8Voqs8Voqs8Vrrs8W#trr;]mo)J[hYlFP"JcGHDr;`JirW&)\r;_EKl2UMY +JcF7"J,~> +li6qapAapgrVu]os8Voqs8Voqs8Vrrs8W#trr;]mo)J[hYlFP"JcGHDr;`JirW&)\r;_EKl2UMY +JcF7"J,~> +li6qapAY0os8W&uhZ*TUr;Q`sr;Z]q!<<#unGiIfZ2a\$JcGBBrW&PirW&)\quDXJcF=$ +J,~> +li6qapAY0os8W&uhZ*TUr;Q`sr;Z]q!<<#unGiIfZ2a\$JcGBBrW&PirW&)\quDXJcF=$ +J,~> +li6qapAY0os8W&uhZ*TUr;Q`sr;Z]q!<<#unGiIfZ2a\$JcGBBrW&PirW&)\quDXJcF=$ +J,~> +li6qa_#O?5m/R%bZiBn&JcG?Ar;`GhrW&&[quD +li6qa_#O?5m/R%bZiBn&JcG?Ar;`GhrW&&[quD +li6qa_#O?5m/R%bZiBn&JcG?Ar;`GhrW&&[quD +li6qa_#O?5m/R%b[K$('JcG<@rW&MhrW&#ZquD,VJcFI(J,~> +li6qa_#O?5m/R%b[K$('JcG<@rW&MhrW&#ZquD,VJcFI(J,~> +li6qa_#O?5m/R%b[K$('JcG<@rW&MhrW&#ZquD,VJcFI(J,~> +li6qa_#O?5m/R%b[f?4)JcG9?r;`DgrW%uYquD +li6qa_#O?5m/R%b[f?4)JcG9?r;`DgrW%uYquD +li6qa_#O?5m/R%b[f?4)JcG9?r;`DgrW%uYquD +li6qa_#O?5m/R%b\GuC*JcG6>rW&JgrW%rXr;_EKiW&]RJcFX-J,~> +li6qa_#O?5m/R%b\GuC*JcG6>rW&JgrW%rXr;_EKiW&]RJcFX-J,~> +li6qa_#O?5m/R%b\GuC*JcG6>rW&JgrW%rXr;_EKiW&]RJcFX-J,~> +li6qa_#O?5m/R%b\c;O,JcG3=r;`AfrW%oWr;_EKi;`TQJcF^/J,~> +li6qa_#O?5m/R%b\c;O,JcG3=r;`AfrW%oWr;_EKi;`TQJcF^/J,~> +li6qa_#O?5m/R%b\c;O,JcG3=r;`AfrW%oWr;_EKi;`TQJcF^/J,~> +li6qa_Z0E3mf37d]Dqa.JcG-;rW&GfrW%lVr;_EKhuEHOJcFg2J,~> +li6qa_Z0E3mf37d]Dqa.JcG-;rW&GfrW%lVr;_EKhuEHOJcFg2J,~> +li6qa_Z0E3mf37d]Dqa.JcG-;rW&GfrW%lVr;_EKhuEHOJcFg2J,~> +li6qa_Z0B2n,N@e^&Rp/JcG-;r;`>erW%iUr;_EKh>d9NJcFm4J,~> +li6qa_Z0B2n,N@e^&Rp/JcG-;r;`>erW%iUr;_EKh>d9NJcFm4J,~> +li6qa_Z0B2n,N@e^&Rp/JcG-;r;`>erW%iUr;_EKh>d9NJcFm4J,~> +li6qaVuQ_r^An'1JcG'9rW&DerW%iUquD +li6qaVuQ_r^An'1JcG'9rW&DerW%iUquD +li6qaVuQ_r^An'1JcG'9rW&DerW%iUquD +li6qaVuQ_r_#O62JcG'9r;`;drW%fTquD +li6qaVuQ_r_#O62JcG'9r;`;drW%fTquD +li6qaVuQ_r_#O62JcG'9r;`;drW%fTquD +li6qaVuQ_r_>jB4JcG!7rW&AdrW%cSquD +li6qaVuQ_r_>jB4JcG!7rW&AdrW%cSquD +li6qaVuQ_r_>jB4JcG!7rW&AdrW%cSquD +li6qaVuQ_r_uKT6JcFs6r;`8crW%`RquD +li6qaVuQ_r_uKT6JcFs6r;`8crW%`RquD +li6qaVuQ_r_uKT6JcFs6r;`8crW%`RquD +li6qaVuQ_r`W,c7JcFp5rW&>crW%]QquD +li6qaVuQ_r`W,c7JcFp5rW&>crW%]QquD +li6qaVuQ_r`W,c7JcFp5rW&>crW%]QquD +li6qaVuQ_r`rGo9JcFm4r;`5brW%ZPr;_EKec5FFJcG?AJ,~> +li6qaVuQ_r`rGo9JcFm4r;`5brW%ZPr;_EKec5FFJcG?AJ,~> +li6qaVuQ_r`rGo9JcFm4r;`5brW%ZPr;_EKec5FFJcG?AJ,~> +li6qaVuQ_raT),;JcFg2rW&;brW%WOr;_EKeGo:DJcGHDJ,~> +li6qaVuQ_raT),;JcFg2rW&;brW%WOr;_EKeGo:DJcGHDJ,~> +li6qaVuQ_raT),;JcFg2rW&;brW%WOr;_EKeGo:DJcGHDJ,~> +li3XYb5_; +li3XYb5_; +li3XYb5_; +li3XYbQ%G>JcFa0rW&8arW%QMr;_EKdJs"BJcGTHJ,~> +li3XYbQ%G>JcFa0rW&8arW%QMr;_EKdJs"BJcGTHJ,~> +li3XYbQ%G>JcFa0rW&8arW%QMr;_EKdJs"BJcGTHJ,~> +li3XYc2[V?JcFa0r;`/`rW%QMquD +li3XYc2[V?JcFa0r;`/`rW%QMquD +li3XYc2[V?JcFa0r;`/`rW%QMquD +JcFC&qZ)3Ii;`cVQ2gg`JcGWJJcF$qq#H!Gs8RT~> +JcFC&qZ)3Ii;`cVQ2gg`JcGWJJcF$qq#H!Gs8RT~> +JcFC&qZ)3Ii;`cVQ2gg`JcGWJJcF$qq#H!Gs8RT~> +JcFI(qZ)3IhuEWTQ2gg`Jc>`MquDJcC6~> +JcFI(qZ)3IhuEWTQ2gg`Jc>`MquDJcC6~> +JcFI(qZ)3IhuEWTQ2gg`Jc>`MquDJcC6~> +JcFO*q>c*HhZ*QTPlL^_JcGcMquD +JcFO*q>c*HhZ*QTPlL^_JcGcMquD +JcFO*q>c*HhZ*QTPlL^_JcGcMquD +JcFR+qZ)3Ih>dERPlL^_JcG`LquD;LAuc~> +JcFR+qZ)3Ih>dERPlL^_JcG`LquD;LAuc~> +JcFR+qZ)3Ih>dERPlL^_JcG`LquD;LAuc~> +JcFX-q>c*Hh#I?RPQ1U^JcG]Kr;_EKaT)&9M#Vu~> +JcFX-q>c*Hh#I?RPQ1U^JcG]Kr;_EKaT)&9M#Vu~> +JcFX-q>c*Hh#I?RPQ1U^JcG]Kr;_EKaT)&9M#Vu~> +JcF[.qZ)3Ig].3PPQ1U^JcGZJr;_EKa8br8MZ82~> +JcF[.qZ)3Ig].3PPQ1U^JcGZJr;_EKa8br8MZ82~> +JcF[.qZ)3Ig].3PPQ1U^JcGZJr;_EKa8br8MZ82~> +JcFa0qZ)3Ig&M$OP5kL]JcGWIr;_EK`rGf6NW4M~> +JcFa0qZ)3Ig&M$OP5kL]JcGWIr;_EK`rGf6NW4M~> +JcFa0qZ)3Ig&M$OP5kL]JcGWIr;_EK`rGf6NW4M~> +JcFg2q>c*Hg&M!NP5kL]JcGTHr;_EK`;fW5O8j_~> +JcFg2q>c*Hg&M!NP5kL]JcGTHr;_EK`;fW5O8j_~> +JcFg2q>c*Hg&M!NP5kL]JcGTHr;_EK`;fW5O8j_~> +JcFj3qZ)3IfDkgMOoPC\JcGTHquD +JcFj3qZ)3IfDkgMOoPC\JcGTHquD +JcFj3qZ)3IfDkgMOoPC\JcGTHquD +JcFp5qZ)3If)P[KOoPC\JcGQGquD +JcFp5qZ)3If)P[KOoPC\JcGQGquD +JcFp5qZ)3If)P[KOoPC\JcGQGquD +JcG!7q>c*Hec5UKOT5:[JcGNFquDj91QN)I~> +JcG!7q>c*Hec5UKOT5:[JcGNFquDj91QN)I~> +JcG!7q>c*Hec5UKOT5:[JcGNFquDj91QN)I~> +JcG$8qZ)3IeGoIIOT5:[JcGKEquD +JcG$8qZ)3IeGoIIOT5:[JcGKEquD +JcG$8qZ)3IeGoIIOT5:[JcGKEquD +JcG*:q>c*HgA_-Qqu?WqO8o1ZJcGHDr;_EK^&Rm.Rf@m~> +JcG*:q>c*HgA_-Qqu?WqO8o1ZJcGHDr;_EK^&Rm.Rf@m~> +JcG*:q>c*HgA_-Qqu?WqO8o1ZJcGHDr;_EK^&Rm.Rf@m~> +JcG-;qZ)3If`1sOrVufrO8o1ZJcGECr;c]o!!%TM`;fW5SH"*~> +JcG-;qZ)3If`1sOrVufrO8o1ZJcGECr;c]o!!%TM`;fW5SH"*~> +JcG-;qZ)3If`1sOrVufrO8o1ZJcGECr;c]o!!%TM`;fW5SH"*~> +JcG3=qZ)3If)PaMrVuisNrT(Yr;Q`sJcGTHr;c`prr@WM_Z0E3TDsE~> +JcG3=qZ)3If)PaMrVuisNrT(Yr;Q`sJcGTHr;c`prr@WM_Z0E3TDsE~> +JcG3=qZ)3If)PaMrVuisNrT(Yr;Q`sJcGTHr;c`prr@WM_Z0E3TDsE~> +JcG9?q>c*Hec5UKs8W#tPlLa`rVuisrVultJcGQGr;ccqrr@WM_#O31U&TW~> +JcG9?q>c*Hec5UKs8W#tPlLa`rVuisrVultJcGQGr;ccqrr@WM_#O31U&TW~> +JcG9?q>c*Hec5UKs8W#tPlLa`rVuisrVultJcGQGr;ccqrr@WM_#O31U&TW~> +JcG<@qZ)3Ie,TCIs8W&uPQ1R]s8W&us8W&uJcGKEr;cfrrr@WM^An!/oD\djZN#F~> +JcG<@qZ)3Ie,TCIs8W&uPQ1R]s8W&us8W&uJcGKEr;cfrrr@WM^An!/oD\djZN#F~> +JcG<@qZ)3Ie,TCIs8W&uPQ1R]s8W&us8W&uJcGKEr;cfrrr@WM^An!/oD\djZN#F~> +JcGBBq>c*Hdf9+CP5kI\!<;ipJcGKEquHcsrW%NL]`7a,pAb-mZi>O~> +JcGBBq>c*Hdf9+CP5kI\!<;ipJcGKEquHcsrW%NL]`7a,pAb-mZi>O~> +JcGBBq>c*Hdf9+CP5kI\!<;ipJcGKEquHcsrW%NL]`7a,pAb-mZi>O~> +JcGECqZ)3Id/WqBOoP(SJcGECqu?`sr;_EK])VR+p](6n[/YX~> +JcGECqZ)3Id/WqBOoP(SJcGECqu?`sr;_EK])VR+p](6n[/YX~> +JcGECqZ)3Id/WqBOoP(SJcGECqu?`sr;_EK])VR+p](6n[/YX~> +li4*fi;`ZSJcF$qq>gKorW&;bp&K[Do`+[dJcE7[q#L6jrrBG+J,~> +li4*fi;`ZSJcF$qq>gKorW&;bp&K[Do`+[dJcE7[q#L6jrrBG+J,~> +li4*fi;`ZSJcF$qq>gKorW&;bp&K[Do`+[dJcE7[q#L6jrrBG+J,~> +li4*firAiTJcF!poDk3WpAfdEo)JLcJcE1Yq#L +li4*firAiTJcF!poDk3WpAfdEo)JLcJcE1Yq#L +li4*firAiTJcF!poDk3WpAfdEo)JLcJcE1Yq#L +li4*fj8\uVJcEpno`16Vp],mFnc/CbJcE.Xp]1 +li4*fj8\uVJcEpno`16Vp],mFnc/CbJcE.Xp]1 +li4*fj8\uVJcEpno`16Vp],mFnc/CbJcE.Xp]1 +li6qa[/^+*jo>2XJcEjlp&L +li6qa[/^+*jo>2XJcEjlp&L +li6qa[/^+*jo>2XJcEjlp&L +li6qa[/^+*kPtAYJcEgkp]-EUq>c*HpAa^aJcDtSoDlE$J,~> +li6qa[/^+*kPtAYJcEgkp]-EUq>c*HpAa^aJcDtSoDlE$J,~> +li6qa[/^+*kPtAYJcEgkp]-EUq>c*HpAa^aJcDtSoDlE$J,~> +li6qa[/^+*kl:M[JcEaiq#HKUqZ)3Io`+L_JcDqRo`2Q&J,~> +li6qa[/^+*kl:M[JcEaiq#HKUqZ)3Io`+L_JcDqRo`2Q&J,~> +li6qa[/^+*kl:M[JcEaiq#HKUqZ)3Io`+L_JcDqRo`2Q&J,~> +li6qa[/^+*lMp\\JcE^hq>cNTquD +li6qa[/^+*lMp\\JcE^hq>cNTquD +li6qa[/^+*lMp\\JcE^hq>cNTquD +li6qa[/^+*li6h^JcEXfquDZTr;_EKmJlt^JcDeNp].o*J,~> +li6qa[/^+*li6h^JcEXfquDZTr;_EKmJlt^JcDeNp].o*J,~> +li6qa[/^+*li6h^JcEXfquDZTr;_EKmJlt^JcDeNp].o*J,~> +li6qa[/^+*mJm%`JcERdr;_]SrW%NLli6h^JcDhOp&M`)J,~> +li6qa[/^+*mJm%`JcERdr;_]SrW%NLli6h^JcDhOp&M`)J,~> +li6qa[/^+*mJm%`JcERdr;_]SrW%NLli6h^JcDhOp&M`)J,~> +li6qa[/^+*n,N4aN;ne9iW"f9iW"f9NrP";s8RT~> +li6qa[/^+*n,N4aN;ne9iW"f9iW"f9NrP";s8RT~> +li6qa[/^+*n,N4aN;ne9iW"f9iW"f9NrP";s8RT~> +li6qa[/^+*nGi@cMZ8S7iW"f9iW"f9NrP";s8RT~> +li6qa[/^+*nGi@cMZ8S7iW"f9iW"f9NrP";s8RT~> +li6qa[/^+*nGi@cMZ8S7iW"f9iW"f9NrP";s8RT~> +li6qa[/^+*o)JReM#WA5iW"f9iW"f9NrP";s8RT~> +li6qa[/^+*o)JReM#WA5iW"f9iW"f9NrP";s8RT~> +li6qa[/^+*o)JReM#WA5iW"f9iW"f9NrP";s8RT~> +li6qa[/^+*o`+afL]@>ROoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^+*o`+afL]@>ROoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^+*o`+afL]@>ROoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^+*s8N'!q#C3kL&_,POoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^+*s8N'!q#C3kL&_,POoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^+*s8N'!q#C3kL&_,POoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^+*!ri6#qZ$BlK`D#OOoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^+*!ri6#qZ$BlK`D#OOoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^+*!ri6#qZ$BlK`D#OOoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^"'qu?NnK)bfMOoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^"'qu?NnK)bfMOoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^"'qu?NnK)bfMOoPC\iW&lWOoPC\iW&lWOoPC\NrT(YOoPC\s8RT~> +li6qa[/^"'rVu`pJc>`MrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^"'rVu`pJc>`MrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^"'rVu`pJc>`MrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^"'s8VoqJcGcMrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^"'s8VoqJcGcMrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^"'s8VoqJcGcMrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^"'!<;orJcG]KrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^"'!<;orJcG]KrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^"'!<;orJcG]KrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/]e!JcGZJrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/]e!JcGZJrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/]e!JcGZJrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/]k#JcGTHrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/]k#JcGTHrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/]k#JcGTHrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/]q%JcGNFrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/]q%JcGNFrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/]q%JcGNFrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qaoDedip\t?rs8N'!lMgharr;uuo)JLcJcGKErW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\ +rW)uuJ,~> +li6qaoDedip\t?rs8N'!lMgharr;uuo)JLcJcGKErW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\ +rW)uuJ,~> +li6qaoDedip\t?rs8N'!lMgharr;uuo)JLcJcGKErW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\ +rW)uuJ,~> +li6qap&FgfrVufr!<;cnrr;lrr;Z]q!<;orp&F^cJcGQGrW&)\rW(pWrW&)\rW(pWrW&)\rW%uY +rW&)\rW)uuJ,~> +li6qap&FgfrVufr!<;cnrr;lrr;Z]q!<;orp&F^cJcGQGrW&)\rW(pWrW&)\rW(pWrW&)\rW%uY +rW&)\rW)uuJ,~> +li6qap&FgfrVufr!<;cnrr;lrr;Z]q!<;orp&F^cJcGQGrW&)\rW(pWrW&)\rW(pWrW&)\rW%uY +rW&)\rW)uuJ,~> +li6qapAb-mrVuiss8V`l!<;utr;Z`rrr;QipAaabJcGWIrW)-]rrB_3rrD]krW(pWrW)-]rrB_3 +rrD]krW(pWrW)-]rrB_3rrD]krW%uYrW)*\rrB_3rrD`lrW)uuJ,~> +li6qapAb-mrVuiss8V`l!<;utr;Z`rrr;QipAaabJcGWIrW)-]rrB_3rrD]krW(pWrW)-]rrB_3 +rrD]krW(pWrW)-]rrB_3rrD]krW%uYrW)*\rrB_3rrD`lrW)uuJ,~> +li6qapAb-mrVuiss8V`l!<;utr;Z`rrr;QipAaabJcGWIrW)-]rrB_3rrD]krW(pWrW)-]rrB_3 +rrD]krW(pWrW)-]rrB_3rrD]krW%uYrW)*\rrB_3rrD`lrW)uuJ,~> +li6qapAb-mr;ZcsrVucq!<<#us8W#tr;Z`rr;ZZprVuisp]'a`JcG]KrW)6`quFM3quHBhrW(pW +rW)6`quFM3quHBhrW(pWrW)6`quFM3quHBhrW%uYrW)3_quFM3quHEirW)uuJ,~> +li6qapAb-mr;ZcsrVucq!<<#us8W#tr;Z`rr;ZZprVuisp]'a`JcG]KrW)6`quFM3quHBhrW(pW +rW)6`quFM3quHBhrW(pWrW)6`quFM3quHBhrW%uYrW)3_quFM3quHEirW)uuJ,~> +li6qapAb-mr;ZcsrVucq!<<#us8W#tr;Z`rr;ZZprVuisp]'a`JcG]KrW)6`quFM3quHBhrW(pW +rW)6`quFM3quHBhrW(pWrW)6`quFM3quHBhrW%uYrW)3_quFM3quHEirW)uuJ,~> +li6qap](3mr;ZcsrVufrqZ$Kor;Z`rr;Z]qr;Z`rq#BsdJcGQGrW)9aqZ+D2quHBhrW(pWrW)9a +qZ+D2quHBhrW(pWrW)9aqZ+D2quHBhrW%uYrW)6`qZ+D2quHEirW)uuJ,~> +li6qap](3mr;ZcsrVufrqZ$Kor;Z`rr;Z]qr;Z`rq#BsdJcGQGrW)9aqZ+D2quHBhrW(pWrW)9a +qZ+D2quHBhrW(pWrW)9aqZ+D2quHBhrW%uYrW)6`qZ+D2quHEirW)uuJ,~> +li6qap](3mr;ZcsrVufrqZ$Kor;Z`rr;Z]qr;Z`rq#BsdJcGQGrW)9aqZ+D2quHBhrW(pWrW)9a +qZ+D2quHBhrW(pWrW)9aqZ+D2quHBhrW%uYrW)6`qZ+D2quHEirW)uuJ,~> +li6qap](0lp](0lqZ$Kor;Z`rqu?Wqr;Z]qq>^Eo!<<#uJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^ +rW'Y3rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qap](0lp](0lqZ$Kor;Z`rqu?Wqr;Z]qq>^Eo!<<#uJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^ +rW'Y3rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qap](0lp](0lqZ$Kor;Z`rqu?Wqr;Z]qq>^Eo!<<#uJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^ +rW'Y3rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qapAb$jq>^BnqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^rW'Y3 +rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qapAb$jq>^BnqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^rW'Y3 +rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qapAb$jq>^BnqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^rW'Y3 +rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qap&Fmhqu?TpqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^rW'Y3 +rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qap&Fmhqu?TpqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^rW'Y3 +rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qap&Fmhqu?TpqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^rW'Y3 +rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qao`+dgr;Z]qqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^rW'Y3 +rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qao`+dgr;Z]qqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^rW'Y3 +rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qao`+dgr;Z]qqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)0^rW'Y3rW)TjrW(pWrW)0^rW'Y3 +rW)TjrW(pWrW)0^rW'Y3rW)TjrW%uYrW)-]rW'Y3rW)WkrW)uuJ,~> +li6qaoDe[frVufrqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)QirW)corW)0^"9AK%!!)`mrrDoq +!!)]lrW)uurW)TjrW(pWrW)QirW)corW)0^"9AK%!!)`mrrDoq!!)]lrW)uurW)TjrW(pWrW)Qi +rW)corW)0^"9AK%!!)`mrrDoq!!)]lrW)uurW)TjrW%uYrW)NhrW)corW)0^"9AK%!!)`mrrDoq +!!)]lrW)uurW)WkrW)uuJ,~> +li6qaoDe[frVufrqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)QirW)corW)0^"9AK%!!)`mrrDoq +!!)]lrW)uurW)TjrW(pWrW)QirW)corW)0^"9AK%!!)`mrrDoq!!)]lrW)uurW)TjrW(pWrW)Qi +rW)corW)0^"9AK%!!)`mrrDoq!!)]lrW)uurW)TjrW%uYrW)NhrW)corW)0^"9AK%!!)`mrrDoq +!!)]lrW)uurW)WkrW)uuJ,~> +li6qaoDe[frVufrqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)QirW)corW)0^"9AK%!!)`mrrDoq +!!)]lrW)uurW)TjrW(pWrW)QirW)corW)0^"9AK%!!)`mrrDoq!!)]lrW)uurW)TjrW(pWrW)Qi +rW)corW)0^"9AK%!!)`mrrDoq!!)]lrW)uurW)TjrW%uYrW)NhrW)corW)0^"9AK%!!)`mrrDoq +!!)]lrW)uurW)WkrW)uuJ,~> +li6qapAY*mrVucqrr;osqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)Wkq#L?mrW)osqZ-WqquH]q +r;Zitr;cltr;ZitqZ-WqqZ-HlpAjjcrW(pWrW)Wkq#L?mrW)osqZ-WqquH]qr;Zitr;cltr;Zit +qZ-WqqZ-HlpAjjcrW(pWrW)Wkq#L?mrW)osqZ-WqquH]qr;Zitr;cltr;ZitqZ-WqqZ-HlpAjjc +rW%uYrW)Tjq#L?mrW)rtqZ-WqquHZpr;Zitr;cltr;ZitqZ-WqqZ-HlpAjmdrW)uuJ,~> +li6qapAY*mrVucqrr;osqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)Wkq#L?mrW)osqZ-WqquH]q +r;Zitr;cltr;ZitqZ-WqqZ-HlpAjjcrW(pWrW)Wkq#L?mrW)osqZ-WqquH]qr;Zitr;cltr;Zit +qZ-WqqZ-HlpAjjcrW(pWrW)Wkq#L?mrW)osqZ-WqquH]qr;Zitr;cltr;ZitqZ-WqqZ-HlpAjjc +rW%uYrW)Tjq#L?mrW)rtqZ-WqquHZpr;Zitr;cltr;ZitqZ-WqqZ-HlpAjmdrW)uuJ,~> +li6qapAY*mrVucqrr;osqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)Wkq#L?mrW)osqZ-WqquH]q +r;Zitr;cltr;ZitqZ-WqqZ-HlpAjjcrW(pWrW)Wkq#L?mrW)osqZ-WqquH]qr;Zitr;cltr;Zit +qZ-WqqZ-HlpAjjcrW(pWrW)Wkq#L?mrW)osqZ-WqquH]qr;Zitr;cltr;ZitqZ-WqqZ-HlpAjjc +rW%uYrW)Tjq#L?mrW)rtqZ-WqquHZpr;Zitr;cltr;ZitqZ-WqqZ-HlpAjmdrW)uuJ,~> +li6qapAY*mr;Z]qrr;osqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)ZlrrE#trW)lrrW)iqr;ccq +rW)uukPtV_q#L +li6qapAY*mr;Z]qrr;osqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)ZlrrE#trW)lrrW)iqr;ccq +rW)uukPtV_q#L +li6qapAY*mr;Z]qrr;osqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)ZlrrE#trW)lrrW)iqr;ccq +rW)uukPtV_q#L +li6qapAY*mqu?Wqrr;osqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)ZlrrDusrrDusrW)iqr;ccq +rW)osqu?`srW)uuquH]qquH]qr;cfrrW)iqrW)TjrW(pWrW)ZlrrDusrrDusrW)iqr;ccqrW)os +qu?`srW)uuquH]qquH]qr;cfrrW)iqrW)TjrW(pWrW)ZlrrDusrrDusrW)iqr;ccqrW)osqu?`s +rW)uuquH]qquH]qr;cfrrW)iqrW)TjrW%uYrW)WkrrDusrrDusrW)lrr;ccqrW)lrqu?`srW)uu +quH]qquH]qr;cfrrW)iqrW)WkrW)uuJ,~> +li6qapAY*mqu?Wqrr;osqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)ZlrrDusrrDusrW)iqr;ccq +rW)osqu?`srW)uuquH]qquH]qr;cfrrW)iqrW)TjrW(pWrW)ZlrrDusrrDusrW)iqr;ccqrW)os +qu?`srW)uuquH]qquH]qr;cfrrW)iqrW)TjrW(pWrW)ZlrrDusrrDusrW)iqr;ccqrW)osqu?`s +rW)uuquH]qquH]qr;cfrrW)iqrW)TjrW%uYrW)WkrrDusrrDusrW)lrr;ccqrW)lrqu?`srW)uu +quH]qquH]qr;cfrrW)iqrW)WkrW)uuJ,~> +li6qapAY*mqu?Wqrr;osqZ$Kor;Z`rqu?Wqr;Z]qp&G!kJcG?ArW)ZlrrDusrrDusrW)iqr;ccq +rW)osqu?`srW)uuquH]qquH]qr;cfrrW)iqrW)TjrW(pWrW)ZlrrDusrrDusrW)iqr;ccqrW)os +qu?`srW)uuquH]qquH]qr;cfrrW)iqrW)TjrW(pWrW)ZlrrDusrrDusrW)iqr;ccqrW)osqu?`s +rW)uuquH]qquH]qr;cfrrW)iqrW)TjrW%uYrW)WkrrDusrrDusrW)lrr;ccqrW)lrqu?`srW)uu +quH]qquH]qr;cfrrW)iqrW)WkrW)uuJ,~> +li6qapAY*mqu?Wqrr;osqZ$KorVufrr;Z]qr;Z]qp&G!kJcG?ArW)]mrW)lrrrDusrW)iqr;ccq +rW)osr;cZnrW)lrr;ccqr;cfrrW)iqrW)TjrW(pWrW)]mrW)lrrrDusrW)iqr;ccqrW)osr;cZn +rW)lrr;ccqr;cfrrW)iqrW)TjrW(pWrW)]mrW)lrrrDusrW)iqr;ccqrW)osr;cZnrW)lrr;ccq +r;cfrrW)iqrW)TjrW%uYrW)ZlrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfrrW)iq +rW)WkrW)uuJ,~> +li6qapAY*mqu?Wqrr;osqZ$KorVufrr;Z]qr;Z]qp&G!kJcG?ArW)]mrW)lrrrDusrW)iqr;ccq +rW)osr;cZnrW)lrr;ccqr;cfrrW)iqrW)TjrW(pWrW)]mrW)lrrrDusrW)iqr;ccqrW)osr;cZn +rW)lrr;ccqr;cfrrW)iqrW)TjrW(pWrW)]mrW)lrrrDusrW)iqr;ccqrW)osr;cZnrW)lrr;ccq +r;cfrrW)iqrW)TjrW%uYrW)ZlrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfrrW)iq +rW)WkrW)uuJ,~> +li6qapAY*mqu?Wqrr;osqZ$KorVufrr;Z]qr;Z]qp&G!kJcG?ArW)]mrW)lrrrDusrW)iqr;ccq +rW)osr;cZnrW)lrr;ccqr;cfrrW)iqrW)TjrW(pWrW)]mrW)lrrrDusrW)iqr;ccqrW)osr;cZn +rW)lrr;ccqr;cfrrW)iqrW)TjrW(pWrW)]mrW)lrrrDusrW)iqr;ccqrW)osr;cZnrW)lrr;ccq +r;cfrrW)iqrW)TjrW%uYrW)ZlrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfrrW)iq +rW)WkrW)uuJ,~> +li6qapAb-mr;ZcsrVufrq>^9k!<;rsrr;osr;Z]qp&G!kJcG?ArW)]mr;cQkrW)iqr;ccqrW)os +r;cZnrW)lrr;ccqr;cisrW)fprW)TjrW(pWrW)]mr;cQkrW)iqr;ccqrW)osr;cZnrW)lrr;ccq +r;cisrW)fprW)TjrW(pWrW)]mr;cQkrW)iqr;ccqrW)osr;cZnrW)lrr;ccqr;cisrW)fprW)Tj +rW%uYrW)Zlr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fprW)WkrW)uuJ,~> +li6qapAb-mr;ZcsrVufrq>^9k!<;rsrr;osr;Z]qp&G!kJcG?ArW)]mr;cQkrW)iqr;ccqrW)os +r;cZnrW)lrr;ccqr;cisrW)fprW)TjrW(pWrW)]mr;cQkrW)iqr;ccqrW)osr;cZnrW)lrr;ccq +r;cisrW)fprW)TjrW(pWrW)]mr;cQkrW)iqr;ccqrW)osr;cZnrW)lrr;ccqr;cisrW)fprW)Tj +rW%uYrW)Zlr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fprW)WkrW)uuJ,~> +li6qapAb-mr;ZcsrVufrq>^9k!<;rsrr;osr;Z]qp&G!kJcG?ArW)]mr;cQkrW)iqr;ccqrW)os +r;cZnrW)lrr;ccqr;cisrW)fprW)TjrW(pWrW)]mr;cQkrW)iqr;ccqrW)osr;cZnrW)lrr;ccq +r;cisrW)fprW)TjrW(pWrW)]mr;cQkrW)iqr;ccqrW)osr;cZnrW)lrr;ccqr;cisrW)fprW)Tj +rW%uYrW)Zlr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fprW)WkrW)uuJ,~> +li6qapAapgrr;coqZ$Hns8W&urVu]os8VrrpAb*lJcG?ArW)ZlquHNlrW)iqr;ccqrW)osr;cZn +rW)lrr;c`prW)rtrW)fprW)TjrW(pWrW)ZlquHNlrW)iqr;ccqrW)osr;cZnrW)lrr;c`prW)rt +rW)fprW)TjrW(pWrW)ZlquHNlrW)iqr;ccqrW)osr;cZnrW)lrr;c`prW)rtrW)fprW)TjrW%uY +rW)WkquHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)fprW)WkrW)uuJ,~> +li6qapAapgrr;coqZ$Hns8W&urVu]os8VrrpAb*lJcG?ArW)ZlquHNlrW)iqr;ccqrW)osr;cZn +rW)lrr;c`prW)rtrW)fprW)TjrW(pWrW)ZlquHNlrW)iqr;ccqrW)osr;cZnrW)lrr;c`prW)rt +rW)fprW)TjrW(pWrW)ZlquHNlrW)iqr;ccqrW)osr;cZnrW)lrr;c`prW)rtrW)fprW)TjrW%uY +rW)WkquHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)fprW)WkrW)uuJ,~> +li6qapAapgrr;coqZ$Hns8W&urVu]os8VrrpAb*lJcG?ArW)ZlquHNlrW)iqr;ccqrW)osr;cZn +rW)lrr;c`prW)rtrW)fprW)TjrW(pWrW)ZlquHNlrW)iqr;ccqrW)osr;cZnrW)lrr;c`prW)rt +rW)fprW)TjrW(pWrW)ZlquHNlrW)iqr;ccqrW)osr;cZnrW)lrr;c`prW)rtrW)fprW)TjrW%uY +rW)WkquHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)fprW)WkrW)uuJ,~> +li6qapAY0os8W&um/R%brr2ruiW&lWJcG?ArW)WkqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iq +rW)rtrW)fprW)TjrW(pWrW)WkqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)Tj +rW(pWrW)WkqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)TjrW%uYrW)TjqZ-Km +rW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)fprW)WkrW)uuJ,~> +li6qapAY0os8W&um/R%brr2ruiW&lWJcG?ArW)WkqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iq +rW)rtrW)fprW)TjrW(pWrW)WkqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)Tj +rW(pWrW)WkqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)TjrW%uYrW)TjqZ-Km +rW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)fprW)WkrW)uuJ,~> +li6qapAY0os8W&um/R%brr2ruiW&lWJcG?ArW)WkqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iq +rW)rtrW)fprW)TjrW(pWrW)WkqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)Tj +rW(pWrW)WkqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)TjrW%uYrW)TjqZ-Km +rW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)fprW)WkrW)uuJ,~> +li6qa[/^+*JcG?ArW)TjqZ-NnrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pW +rW)TjqZ-NnrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pWrW)TjqZ-NnrW)iq +r;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW%uYrW)QiqZ-NnrW)lrr;ccqrW)lrr;cZn +rW)iqrW)iqrW)uur;c]orW)WkrW)uuJ,~> +li6qa[/^+*JcG?ArW)TjqZ-NnrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pW +rW)TjqZ-NnrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pWrW)TjqZ-NnrW)iq +r;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW%uYrW)QiqZ-NnrW)lrr;ccqrW)lrr;cZn +rW)iqrW)iqrW)uur;c]orW)WkrW)uuJ,~> +li6qa[/^+*JcG?ArW)TjqZ-NnrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pW +rW)TjqZ-NnrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pWrW)TjqZ-NnrW)iq +r;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW%uYrW)QiqZ-NnrW)lrr;ccqrW)lrr;cZn +rW)iqrW)iqrW)uur;c]orW)WkrW)uuJ,~> +li6qa[/^+*JcG?ArW)QiqZ-QorW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pW +rW)QiqZ-QorW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pWrW)QiqZ-QorW)iq +r;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW)!Y!!)cn!!)cnrrDio!!)cn!!)cnrrD0\ +rW)NhqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;c]orW)WkrW)uuJ,~> +li6qa[/^+*JcG?ArW)QiqZ-QorW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pW +rW)QiqZ-QorW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pWrW)QiqZ-QorW)iq +r;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW)!Y!!)cn!!)cnrrDio!!)cn!!)cnrrD0\ +rW)NhqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;c]orW)WkrW)uuJ,~> +li6qa[/^+*JcG?ArW)QiqZ-QorW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pW +rW)QiqZ-QorW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW(pWrW)QiqZ-QorW)iq +r;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)TjrW)!Y!!)cn!!)cnrrDio!!)cn!!)cnrrD0\ +rW)NhqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;c]orW)WkrW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)Tj +rW(pWrW)Zl!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)TjrW(pWrW)Zl +!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)TjrW)$ZrW)corW)cor;c]o +rW)corW)cor;c![rW)Wk!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)fprW)Wk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)Tj +rW(pWrW)Zl!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)TjrW(pWrW)Zl +!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)TjrW)$ZrW)corW)cor;c]o +rW)corW)cor;c![rW)Wk!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)fprW)Wk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)Tj +rW(pWrW)Zl!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)TjrW(pWrW)Zl +!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)TjrW)$ZrW)corW)cor;c]o +rW)corW)cor;c![rW)Wk!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)fprW)Wk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)Tj +rW(pWrW)Zl!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW(pWrW)Zl +!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW)'[quHWoquHTnr;c`p +quHWoquHTnr;c![rW)Wk!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtr;c`prW)Wk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)Tj +rW(pWrW)Zl!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW(pWrW)Zl +!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW)'[quHWoquHTnr;c`p +quHWoquHTnr;c![rW)Wk!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtr;c`prW)Wk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)Tj +rW(pWrW)Zl!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW(pWrW)Zl +!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW)'[quHWoquHTnr;c`p +quHWoquHTnr;c![rW)Wk!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtr;c`prW)Wk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)Tj +rW(pWrW)Zl!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW(pWrW)Zl +!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW)$ZrW)cor;c]or;c]o +rW)cor;c]or;c![rW)Wk!!)orrW)osrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtr;c`prW)Wk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)Tj +rW(pWrW)Zl!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW(pWrW)Zl +!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW)$ZrW)cor;c]or;c]o +rW)cor;c]or;c![rW)Wk!!)orrW)osrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtr;c`prW)Wk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)Tj +rW(pWrW)Zl!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW(pWrW)Zl +!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)TjrW)$ZrW)cor;c]or;c]o +rW)cor;c]or;c![rW)Wk!!)orrW)osrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtr;c`prW)Wk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;cNj +rW(pWrW)Zl!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;cNjrW(pWrW)Zl +!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;cNjrW)!Y!!)cn!!)cnrrDio +!!)cn!!)cnrrD0\rW)Wk!!)orrW)osrW)lrr;cfrr;ccqr;cZnrW)lrr;ccqr;cfrr;ccqr;cQk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;cNj +rW(pWrW)Zl!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;cNjrW(pWrW)Zl +!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;cNjrW)!Y!!)cn!!)cnrrDio +!!)cn!!)cnrrD0\rW)Wk!!)orrW)osrW)lrr;cfrr;ccqr;cZnrW)lrr;ccqr;cfrr;ccqr;cQk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;cNj +rW(pWrW)Zl!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;cNjrW(pWrW)Zl +!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;cNjrW)!Y!!)cn!!)cnrrDio +!!)cn!!)cnrrD0\rW)Wk!!)orrW)osrW)lrr;cfrr;ccqr;cZnrW)lrr;ccqr;cfrr;ccqr;cQk +rW)uuJ,~> +li6qa[/^+*JcG?ArW)ZlrrDusrrDusr;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDnUbrW(pW +rW)ZlrrDusrrDusr;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDnUbrW(pWrW)ZlrrDusrrDus +r;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDnUbrW%uYrW)WkrrDusrrDusr;ccqq>^NqquH`r +r;c]or;ccqr;ccqr;ccqoDnXcrW)uuJ,~> +li6qa[/^+*JcG?ArW)ZlrrDusrrDusr;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDnUbrW(pW +rW)ZlrrDusrrDusr;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDnUbrW(pWrW)ZlrrDusrrDus +r;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDnUbrW%uYrW)WkrrDusrrDusr;ccqq>^NqquH`r +r;c]or;ccqr;ccqr;ccqoDnXcrW)uuJ,~> +li6qa[/^+*JcG?ArW)ZlrrDusrrDusr;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDnUbrW(pW +rW)ZlrrDusrrDusr;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDnUbrW(pWrW)ZlrrDusrrDus +r;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDnUbrW%uYrW)WkrrDusrrDusr;ccqq>^NqquH`r +r;c]or;ccqr;ccqr;ccqoDnXcrW)uuJ,~> +li6qa[/^+*JcG?ArW)Zlq#LBnq>gEmquHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;cNjrW(pW +rW)Zlq#LBnq>gEmquHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;cNjrW(pWrW)Zlq#LBnq>gEm +quHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;cNjrW%uYrW)Wkq#LBnq>gHnquHcsrW)rtq#LBn +q>gQqq>gQqq>gKoqZ$Wrr;cQkrW)uuJ,~> +li6qa[/^+*JcG?ArW)Zlq#LBnq>gEmquHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;cNjrW(pW +rW)Zlq#LBnq>gEmquHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;cNjrW(pWrW)Zlq#LBnq>gEm +quHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;cNjrW%uYrW)Wkq#LBnq>gHnquHcsrW)rtq#LBn +q>gQqq>gQqq>gKoqZ$Wrr;cQkrW)uuJ,~> +li6qa[/^+*JcG?ArW)Zlq#LBnq>gEmquHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;cNjrW(pW +rW)Zlq#LBnq>gEmquHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;cNjrW(pWrW)Zlq#LBnq>gEm +quHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;cNjrW%uYrW)Wkq#LBnq>gHnquHcsrW)rtq#LBn +q>gQqq>gQqq>gKoqZ$Wrr;cQkrW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!W`9#rW)?crW)rt!!(IIrrE&u!!)TirW(pWrW)Zl!W`9#rW)?crW)rt +!!(IIrrE&u!!)TirW(pWrW)Zl!W`9#rW)?crW)rt!!(IIrrE&u!!)TirW%uYrW)Wk!W`9#rW)Bd +rW)rt!!(FHrrE&u!!)WjrW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!W`9#rW)?crW)rt!!(IIrrE&u!!)TirW(pWrW)Zl!W`9#rW)?crW)rt +!!(IIrrE&u!!)TirW(pWrW)Zl!W`9#rW)?crW)rt!!(IIrrE&u!!)TirW%uYrW)Wk!W`9#rW)Bd +rW)rt!!(FHrrE&u!!)WjrW)uuJ,~> +li6qa[/^+*JcG?ArW)Zl!W`9#rW)?crW)rt!!(IIrrE&u!!)TirW(pWrW)Zl!W`9#rW)?crW)rt +!!(IIrrE&u!!)TirW(pWrW)Zl!W`9#rW)?crW)rt!!(IIrrE&u!!)TirW%uYrW)Wk!W`9#rW)Bd +rW)rt!!(FHrrE&u!!)WjrW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qa[/^+*JcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qair8uYeGoLJJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qair8uYeGoLJJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li6qair8uYeGoLJJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li4*fJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li4*fJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li4*fJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li4*fJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li4*fJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li4*fJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li4*fJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li4*fJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +li4*fJcG?ArW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +b5_A>JcEairW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +b5_A>JcEairW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +b5_A>JcEairW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +bQ%D=JcEdjrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +bQ%D=JcEdjrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +bQ%D=JcEdjrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +bQ%D=JcEdjrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +bQ%D=JcEdjrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +bQ%D=JcEdjrW&)\rW(pWrW&)\rW(pWrW&)\rW%uYrW&)\rW)uuJ,~> +bQ%A +bQ%A +bQ%A +bl@G +bl@G +bl@G +bl@D;JcEjlMZD`9MZD`9MZAe;MZEeWJ,~> +bl@D;JcEjlMZD`9MZD`9MZAe;MZEeWJ,~> +bl@D;JcEjlMZD`9MZD`9MZAe;MZEeWJ,~> +c2[G:JcEmmMZD`9MZD`9MZAe;MZEeWJ,~> +c2[G:JcEmmMZD`9MZD`9MZAe;MZEeWJ,~> +c2[G:JcEmmMZD`9MZD`9MZAe;MZEeWJ,~> +c2[G:JcEmmMZD`9MZD`9MZAe;MZEeWJ,~> +c2[G:JcEmmMZD`9MZD`9MZAe;MZEeWJ,~> +c2[G:JcEmmMZD`9MZD`9MZAe;MZEeWJ,~> +c2[D9JcCo5r;_EKn,N=dJcG3=r;_EKSH&Kea8^Y~> +c2[D9JcCo5r;_EKn,N=dJcG3=r;_EKSH&Kea8^Y~> +c2[D9JcCo5r;_EKn,N=dJcG3=r;_EKSH&Kea8^Y~> +cN!hCs8W&us8W&uJcCr6qZ)3Inc/IdJcG9?qZ)3IScATfa8^Y~> +cN!hCs8W&us8W&uJcCr6qZ)3Inc/IdJcG9?qZ)3IScATfa8^Y~> +cN!hCs8W&us8W&uJcCr6qZ)3Inc/IdJcG9?qZ)3IScATfa8^Y~> +cN!nErVuisrVultJcD#8q>c*Ho)JOdJcG<@q>c*HT)\Zfa8^Y~> +cN!nErVuisrVultJcD#8q>c*Ho)JOdJcG<@q>c*HT)\Zfa8^Y~> +cN!nErVuisrVultJcD#8q>c*Ho)JOdJcG<@q>c*HT)\Zfa8^Y~> +ci="Fr;Z]qJcCl4q#H!Go)JOdJcG<@q>c*HTE"]eaT$b~> +ci="Fr;Z]qJcCl4q#H!Go)JOdJcG<@q>c*HTE"]eaT$b~> +ci="Fr;Z]qJcCl4q#H!Go)JOdJcG<@q>c*HTE"]eaT$b~> +a8c,=JcCl4p],mFo`+[dJcGBBp],mFU&XlfaT$b~> +a8c,=JcCl4p],mFo`+[dJcGBBp],mFU&XlfaT$b~> +a8c,=JcCl4p],mFo`+[dJcGBBp],mFU&XlfaT$b~> +a8c,=JcCo5pAfdEp&FadJcGECpAfdEU&XlfaT$b~> +a8c,=JcCo5pAfdEp&FadJcGECpAfdEU&XlfaT$b~> +a8c,=JcCo5pAfdEp&FadJcGECpAfdEU&XlfaT$b~> +a8c) +a8c) +a8c) +a8c) +a8c) +a8c) +`rH#^NqquD +`rH#^NqquD +`rH#^NqquD +`rH#pMp!<;uts8W#t +b5Zt~> +`rH#pMp!<;uts8W#t +b5Zt~> +`rH#pMp!<;uts8W#t +b5Zt~> +`rGu;JcD,;!!*#ur;cfrrW%NLq>^Hps8W#trVuisJcGTHrrE&urW)osrW%NLVuQbsrr;rtrVuis +b5Zt~> +`rGu;JcD,;!!*#ur;cfrrW%NLq>^Hps8W#trVuisJcGTHrrE&urW)osrW%NLVuQbsrr;rtrVuis +b5Zt~> +`rGu;JcD,;!!*#ur;cfrrW%NLq>^Hps8W#trVuisJcGTHrrE&urW)osrW%NLVuQbsrr;rtrVuis +b5Zt~> +`W,o;JcCu7r;ccqrW%NLpAb'kr;ZcsJcGHDr;ccqrr@WMU]:8mr;Zcsb5Zt~> +`W,o;JcCu7r;ccqrW%NLpAb'kr;ZcsJcGHDr;ccqrr@WMU]:8mr;Zcsb5Zt~> +`W,o;JcCu7r;ccqrW%NLpAb'kr;ZcsJcGHDr;ccqrr@WMU]:8mr;Zcsb5Zt~> +`W,l:JcD&9r;cZn!!%TMpAb*lqYpNqJcGHDrW)fp!!%TMU]:8mqYpNqbQ!(~> +`W,l:JcD&9r;cZn!!%TMpAb*lqYpNqJcGHDrW)fp!!%TMU]:8mqYpNqbQ!(~> +`W,l:JcD&9r;cZn!!%TMpAb*lqYpNqJcGHDrW)fp!!%TMU]:8mqYpNqbQ!(~> +`;ff:JcD&9r;_EKmf34cJcG3=r;_EKS,`Hf_Z,,~> +`;ff:JcD&9r;_EKmf34cJcG3=r;_EKS,`Hf_Z,,~> +`;ff:JcD&9r;_EKmf34cJcG3=r;_EKS,`Hf_Z,,~> +`;fc9JcD,;r;_EKmJm.cJcG0 +`;fc9JcD,;r;_EKmJm.cJcG0 +`;fc9JcD,;r;_EKmJm.cJcG0 +_uKZ8JcD/f#~> +_uKZ8JcD/f#~> +_uKZ8JcD/f#~> +_uKZ8JcD2=r;_EKmJm.cJcG0f#~> +_uKZ8JcD2=r;_EKmJm.cJcG0f#~> +_uKZ8JcD2=r;_EKmJm.cJcG0f#~> +_Z0Q7JcD8?r;_EKmJm+bJcG0f#~> +_Z0Q7JcD8?r;_EKmJm+bJcG0f#~> +_Z0Q7JcD8?r;_EKmJm+bJcG0f#~> +_Z0Q7JcD;@quD +_Z0Q7JcD;@quD +_Z0Q7JcD;@quD +_>jH6JcDABquD +_>jH6JcDABquD +_>jH6JcDABquD +_#OB6JcDDCquD +_#OB6JcDDCquD +_#OB6JcDDCquD +_#O?5JcDJEquD +_#O?5JcDJEquD +_#O?5JcDJEquD +^]464JcDPGquD +^]464JcDPGquD +^]464JcDPGquD +^]464JcDSHquD +^]464JcDSHquD +^]464JcDSHquD +^An-3JcDYJquD +^An-3JcDYJquD +^An-3JcDYJquD +^&S$2JcD_LquD +^&S$2JcD_LquD +^&S$2JcD_LquD +]`7p1JcDeNquD +]`7p1JcDeNquD +]`7p1JcDeNquD +]`7m0JcDkPquD +]`7m0JcDkPquD +]`7m0JcDkPquD +]Dqd/JcDqRquD +]Dqd/JcDqRquD +]Dqd/JcDqRquD +])V[.JcE%UqZ)3Im/Qt`JcG3=quD +])V[.JcE%UqZ)3Im/Qt`JcG3=quD +])V[.JcE%UqZ)3Im/Qt`JcG3=quD +\c;R-JcE+WqZ)3Im/Qt`JcG3=quD +\c;R-JcE+WqZ)3Im/Qt`JcG3=quD +\c;R-JcE+WqZ)3Im/Qt`JcG3=quD +\GuL-JcE1YqZ)3Ili6k_JcG3=quD +\GuL-JcE1YqZ)3Ili6k_JcG3=quD +\GuL-JcE1YqZ)3Ili6k_JcG3=quD +\,ZC,JcE7[qZ)3Ili6k_JcG3=quD +\,ZC,JcE7[qZ)3Ili6k_JcG3=quD +\,ZC,JcE7[qZ)3Ili6k_JcG3=quD +[f?:+JcE@^qZ)3Ili6h^JcG3=quD +[f?:+JcE@^qZ)3Ili6h^JcG3=quD +[f?:+JcE@^qZ)3Ili6h^JcG3=quD +[K$1*JcEF`qZ)3Ili6k_JcG0O~> +[K$1*JcEF`qZ)3Ili6k_JcG0O~> +[K$1*JcEF`qZ)3Ili6k_JcG0O~> +[/^%(JcERdqZ)3IlMpb^JcG3=quD +[/^%(JcERdqZ)3IlMpb^JcG3=quD +[/^%(JcERdqZ)3IlMpb^JcG3=quD +ZiBq'JcE[gq>c*HlMpb^JcG3=quD +ZiBq'JcE[gq>c*HlMpb^JcG3=quD +ZiBq'JcE[gq>c*HlMpb^JcG3=quD +ZN'h&JcEaiqZ)3IlMp_]JcG3=quD +ZN'h&JcEaiqZ)3IlMp_]JcG3=quD +ZN'h&JcEaiqZ)3IlMp_]JcG3=quD +Z2a\$JcEpnq#H!GlMp_]JcG6>qZ)3IScAQeYQ'+~> +Z2a\$JcEpnq#H!GlMp_]JcG6>qZ)3IScAQeYQ'+~> +Z2a\$JcEpnq#H!GlMp_]JcG6>qZ)3IScAQeYQ'+~> +YlFS#JcF$qq#H!GlMp_]JcG3=qZ)3IT)\ZfXoEn~> +YlFS#JcF$qq#H!GlMp_]JcG3=qZ)3IT)\ZfXoEn~> +YlFS#JcF$qq#H!GlMp_]JcG3=qZ)3IT)\ZfXoEn~> +Y5eD"JcF-tq#H!GlMp\\JcG6>q>c*HT)\ZfXT*e~> +Y5eD"JcF-tq#H!GlMp\\JcG6>q>c*HT)\ZfXT*e~> +Y5eD"JcF-tq#H!GlMp\\JcG6>q>c*HT)\ZfXT*e~> +XoJ;!JcF7"q#H!Gl2UV\JcG3=qZ)3IT)\ZfWrIS~> +XoJ;!JcF7"q#H!Gl2UV\JcG3=qZ)3IT)\ZfWrIS~> +XoJ;!JcF7"q#H!Gl2UV\JcG3=qZ)3IT)\ZfWrIS~> +XT/.tJcFC&q#H!Gl2UV\JcG3=qZ)3IScAQeWW.J~> +XT/.tJcFC&q#H!Gl2UV\JcG3=qZ)3IScAQeWW.J~> +XT/.tJcFC&q#H!Gl2UV\JcG3=qZ)3IScAQeWW.J~> +X8i%sJcFL)q>c*Hkl:JZJcG3=qZ)3IT)\ZfVuM8~> +X8i%sJcFL)q>c*Hkl:JZJcG3=qZ)3IT)\ZfVuM8~> +X8i%sJcFL)q>c*Hkl:JZJcG3=qZ)3IT)\ZfVuM8~> +WW2hqJcF[.q#H!GkPtDZJcG3=qZ)3IT)\WeVZ2/~> +WW2hqJcF[.q#H!GkPtDZJcG3=qZ)3IT)\WeVZ2/~> +WW2hqJcF[.q#H!GkPtDZJcG3=qZ)3IT)\WeVZ2/~> +W;l\oJcFg2q#H!Gkl:JZJcG3=q>c*HT)\ZfV#Pr~> +W;l\oJcFg2q#H!Gkl:JZJcG3=q>c*HT)\ZfV#Pr~> +W;l\oJcFg2q#H!Gkl:JZJcG3=q>c*HT)\ZfV#Pr~> +VZ6JmJcG!7p],mFkl:GYJcG6>q>c*HTE"`fUAo`~> +VZ6JmJcG!7p],mFkl:GYJcG6>q>c*HTE"`fUAo`~> +VZ6JmJcG!7p],mFkl:GYJcG6>q>c*HTE"`fUAo`~> +V>pAlJcG-;pAfdEkl:GYJcG6>q#H!GT`=ffU&TW~> +V>pAlJcG-;pAfdEkl:GYJcG6>q#H!GT`=ffU&TW~> +V>pAlJcG-;pAfdEkl:GYJcG6>q#H!GT`=ffU&TW~> +U]:/jJcG<@pAfdEkl:DXJcG6>q#H!GT`=ffTDsE~> +U]:/jJcG<@pAfdEkl:DXJcG6>q#H!GT`=ffTDsE~> +U]:/jJcG<@pAfdEkl:DXJcG6>q#H!GT`=ffTDsE~> +U&XrhJcGKEpAfdEkPt;WJcG9?q#H!GTE"]eSc=3~> +U&XrhJcGKEpAfdEkPt;WJcG9?q#H!GTE"]eSc=3~> +U&XrhJcGKEpAfdEkPt;WJcG9?q#H!GTE"]eSc=3~> +TE"`fJcG]Kp&K[Dk5Y5WJcG6>q#H!GT`=ceS,\!~> +TE"`fJcG]Kp&K[Dk5Y5WJcG6>q#H!GT`=ceS,\!~> +TE"`fJcG]Kp&K[Dk5Y5WJcG6>q#H!GT`=ceS,\!~> +ScANdK)bNEJcFm4p],mFnGi:aJcDDCq#Hf^J,~> +ScANdK)bNEJcFm4p],mFnGi:aJcDDCq#Hf^J,~> +ScANdK)bNEJcFm4p],mFnGi:aJcDDCq#Hf^J,~> +S,`9aM?!5KJcFm4p],mFnGi7`JcDGDp]-W[J,~> +S,`9aM?!5KJcFm4p],mFnGi7`JcDGDp]-W[J,~> +S,`9aM?!5KJcFm4p],mFnGi7`JcDGDp]-W[J,~> +RfE*^OT4qQJcFp5p&K[Dnc/=`JcDJEpAgHXJ,~> +RfE*^OT4qQJcFp5p&K[Dnc/=`JcDJEpAgHXJ,~> +RfE*^OT4qQJcFp5p&K[Dnc/=`JcDJEpAgHXJ,~> +QiHd[R/c^WJcFp5o`0RCoDeLaJcDJEp&L9UJ,~> +QiHd[R/c^WJcFp5o`0RCoDeLaJcDJEp&L9UJ,~> +QiHd[R/c^WJcFp5o`0RCoDeLaJcDJEp&L9UJ,~> +PlLLYT)\?]JcFp5o`0RCo)J@_JcDPGo`1'QJ,~> +PlLLYT)\?]JcFp5o`0RCo)J@_JcDPGo`1'QJ,~> +PlLLYT)\?]JcFp5o`0RCo)J@_JcDPGo`1'QJ,~> +P5k7VVZ62eJcFj3o`0RCo)JC`JcDMFo`0sNJ,~> +P5k7VVZ62eJcFj3o`0RCo)JC`JcDMFo`0sNJ,~> +P5k7VVZ62eJcFj3o`0RCo)JC`JcDMFo`0sNJ,~> +O8nkQZ2a:nJcFm4oDjIBoDeF_JcDPGo`0gJJ,~> +O8nkQZ2a:nJcFm4oDjIBoDeF_JcDPGo`0gJJ,~> +O8nkQZ2a:nJcFm4oDjIBoDeF_JcDPGo`0gJJ,~> +N;rMM^&RI"JcFp5nGn.?p&FR_JcDYJnc4CDJ,~> +N;rMM^&RI"JcFp5nGn.?p&FR_JcDYJnc4CDJ,~> +N;rMM^&RI"JcFp5nGn.?p&FR_JcDYJnc4CDJ,~> +M?!,Hb5^]+JcG!7mf7q=p]'^_JcD_Lmf7t>J,~> +M?!,Hb5^]+JcG!7mf7q=p]'^_JcD_Lmf7t>J,~> +M?!,Hb5^]+JcG!7mf7q=p]'^_JcD_Lmf7t>J,~> +L&^Q@h>cO9JcG-;l2ZD8qZ#m^JcDkPlMuM9rr7K~> +L&^Q@h>cO9JcG-;l2ZD8qZ#m^JcDkPlMuM9rr7K~> +L&^Q@h>cO9JcG-;l2ZD8qZ#m^JcDkPlMuM9rr7K~> +Jc>`MJH16$JH16$LB)o*q#>j~> +Jc>`MJH16$JH16$LB)o*q#>j~> +Jc>`MJH16$JH16$LB)o*q#>j~> +JcGWIJH16$JH16$OoU(5o)F4~> +JcGWIJH16$JH16$OoU(5o)F4~> +JcGWIJH16$JH16$OoU(5o)F4~> +JcGECJH16$JH16$ScF?Am/MS~> +JcGECJH16$JH16$ScF?Am/MS~> +JcGECJH16$JH16$ScF?Am/MS~> +JcFm4r;_EKb5VGAJcFm4rr@WMRfEBfJcFI(J,~> +JcFm4r;_EKb5VGAJcFm4rr@WMRfEBfJcFI(J,~> +JcFm4r;_EKb5VGAJcFm4rr@WMRfEBfJcFI(J,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +JcC<$JcC<$JcC<$JcG]KJ,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/figures/comm.eps b/executable_names/doc/figures/comm.eps new file mode 100644 index 0000000000000000000000000000000000000000..ad30ee72455fa848efcd0ef3ba4c6b3d5fe1683c --- /dev/null +++ b/executable_names/doc/figures/comm.eps @@ -0,0 +1,2525 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /g/g0/jette/sigops/figure3.eps +%%CreationDate: Wed Feb 1 14:14:21 2006 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 720 455 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 440.640000 translate +705.600000 -440.640000 scale +% Image geometry +980 612 8 +% Transformation matrix +[ 980 0 0 612 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 980 string def +/gstr 980 string def +/bstr 980 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 120044 ASCII Bytes +colorimage +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)6`rrBY1rrD`lrrD`lrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)6`rrBY1rrD`lrrD`lrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)6`rrBY1rrD`lrrD`lrW%NLJcC<$e,Op~> +JcC<$JcFR+rW) +JcC<$JcFR+rW) +JcC<$JcFR+rW) +JcC<$JcFR+rW)9arW'S1rW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'S1rW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'S1rW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'h8!!)orrW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'h8!!)orrW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'h8!!)orrW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'h8rrDusrW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'h8rrDusrW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'h8rrDusrW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'k9rW)lrrW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'k9rW)lrrW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)9arW'k9rW)lrrW)ZlrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)TjqZ-WqrW)osrW)rtr;c`p!W`9#rW)rtrrE*!rW)lrrW)`nr;cfrqZ-WqrW)iq +r;ZitrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)TjqZ-WqrW)osrW)rtr;c`p!W`9#rW)rtrrE*!rW)lrrW)`nr;cfrqZ-WqrW)iq +r;ZitrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)TjqZ-WqrW)osrW)rtr;c`p!W`9#rW)rtrrE*!rW)lrrW)`nr;cfrqZ-WqrW)iq +r;ZitrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)WkrrE&urrE&urW)osrW)lrrW)uuo)JdjquHcsqZ-NnrrE*!rW)uuq>gNprW)lr +rrE&ur;cNjrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)WkrrE&urrE&urW)osrW)lrrW)uuo)JdjquHcsqZ-NnrrE*!rW)uuq>gNprW)lr +rrE&ur;cNjrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)WkrrE&urrE&urW)osrW)lrrW)uuo)JdjquHcsqZ-NnrrE*!rW)uuq>gNprW)lr +rrE&ur;cNjrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrW)os!!*#urW)lrrW)osrW)rtq#LHpr;cisr;cfrrrDusrrE#trW)rtrW)lr +rW)osrrDusrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrW)os!!*#urW)lrrW)osrW)rtq#LHpr;cisr;cfrrrDusrrE#trW)rtrW)lr +rW)osrrDusrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrW)os!!*#urW)lrrW)osrW)rtq#LHpr;cisr;cfrrrDusrrE#trW)rtrW)lr +rW)osrrDusrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrW)os!!*#urW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDusrW)rtrW)lr +rW)rtrW)lrrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrW)os!!*#urW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDusrW)rtrW)lr +rW)rtrW)lrrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrW)os!!*#urW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDusrW)rtrW)lr +rW)rtrW)lrrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrW)corW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDcmrW)lrrW)rtrW)lr +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrW)corW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDcmrW)lrrW)rtrW)lr +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrW)corW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDcmrW)lrrW)rtrW)lr +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Wkr;c`prW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDcmrW)lrrW)rtrrDrr +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Wkr;c`prW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDcmrW)lrrW)rtrrDrr +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Wkr;c`prW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDcmrW)lrrW)rtrrDrr +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)TjquH]qrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)ZlrW)lrrW)uurW)iq +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)TjquH]qrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)ZlrW)lrrW)uurW)iq +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)TjquH]qrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)ZlrW)lrrW)uurW)iq +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)QiquH`rrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)ZlrW)lrrW)uurW)iq +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)QiquH`rrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)ZlrW)lrrW)uurW)iq +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)QiquH`rrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)ZlrW)lrrW)uurW)iq +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Kgr;cltrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uur;cTlrW)lrrW)uur;ccq +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Kgr;cltrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uur;cTlrW)lrrW)uur;ccq +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Kgr;cltrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uur;cTlrW)lrrW)uur;ccq +rW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Zl!!)rsrW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtrW)iq!!*#urW)lr +rW)rtrW)lrrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Zl!!)rsrW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtrW)iq!!*#urW)lr +rW)rtrW)lrrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Zl!!)rsrW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtrW)iq!!*#urW)lr +rW)rtrW)lrrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrrE#trW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtr;cfrrrE&urW)lr +rW)rtr;cfrrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrrE#trW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtr;cfrrrE&urW)lr +rW)rtr;cfrrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrrE#trW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtr;cfrrrE&urW)lr +rW)rtr;cfrrW)WkrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrrE#trrE&urW)lrp&P*lrW)iqrW)osr;cfrrW)osq#LBnqZ-ZrrW)oso`4ad +rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrrE#trrE&urW)lrp&P*lrW)iqrW)osr;cfrrW)osq#LBnqZ-ZrrW)oso`4ad +rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)ZlrrE#trrE&urW)lrp&P*lrW)iqrW)osr;cfrrW)osq#LBnqZ-ZrrW)oso`4ad +rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Zlq>gNpqZ-Tpqu?`sr;ZitqZ-TpquHcsqZ-ZrquH]qqZ-Nnr;cltqZ-Wqp]1!e +rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Zlq>gNpqZ-Tpqu?`sr;ZitqZ-TpquHcsqZ-ZrquH]qqZ-Nnr;cltqZ-Wqp]1!e +rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)Zlq>gNpqZ-Tpqu?`sr;ZitqZ-TpquHcsqZ-ZrquH]qqZ-Nnr;cltqZ-Wqp]1!e +rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)NhrrDTh!!(OK!!)fo!!)TirrDQgrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)NhrrDTh!!(OK!!)fo!!)TirrDQgrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)NhrrDTh!!(OK!!)fo!!)TirrDQgrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)'[r;cZn!W`9#rW)ZlqZ-Tp!W`9#rVururW)rtr;c`p!!*#urW)*\rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)'[r;cZn!W`9#rW)ZlqZ-Tp!W`9#rVururW)rtr;c`p!!*#urW)*\rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)'[r;cZn!W`9#rW)ZlqZ-Tp!W`9#rVururW)rtr;c`p!!*#urW)*\rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)-]q#LEopAk!grrE&urr<'!oDnghrW)rtpAjCVrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)-]q#LEopAk!grrE&urr<'!oDnghrW)rtpAjCVrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)-]q#LEopAk!grrE&urr<'!oDnghrW)rtpAjCVrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)0^rrDusrW)rtq#L3irW)os!W`9#q#LHprW)osrW)osr;cisrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)0^rrDusrW)rtq#L3irW)os!W`9#q#LHprW)osrW)osr;cisrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)0^rrDusrW)rtq#L3irW)os!W`9#q#LHprW)osrW)osr;cisrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)3_rW)lrrW)osrW)TjrW)os!!*#urW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)3_rW)lrrW)osrW)TjrW)os!!*#urW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)3_rW)lrrW)osrW)TjrW)os!!*#urW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)TjrW)corW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)TjrW)corW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)TjrW)corW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)Qir;c`prW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)Qir;c`prW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)Qir;c`prW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)6`r;c`prW)rtrW)NhquH]qrW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)6`r;c`prW)rtrW)NhquH]qrW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)6`r;c`prW)rtrW)NhquH]qrW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)6`r;c`prW)rtrW)KgquH`rrW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)6`r;c`prW)rtrW)KgquH`rrW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)6`r;c`prW)rtrW)KgquH`rrW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)Eer;cltrW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)Eer;cltrW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)Eer;cltrW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)Tj!!)rsrW)uurW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)Tj!!)rsrW)uurW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)3_rW)iqrW)rtrW)Tj!!)rsrW)uurW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)0^rrDrrrrE#trW)TjrrE#trW)uurW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)0^rrDrrrrE#trW)TjrrE#trW)uurW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)0^rrDrrrrE#trW)TjrrE#trW)uurW)iqrW)osrW)osrW)osrW)0^rW%NLJcC<$ +e,Op~> +JcC<$JcFR+rW)0^rW)osrrDusrW)TjrrE#trrE&urW)iqp&P*lrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)0^rW)osrrDusrW)TjrrE#trrE&urW)iqp&P*lrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)0^rW)osrrDusrW)TjrrE#trrE&urW)iqp&P*lrW)osrW)0^rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)-]q>gKoqZ-gQqqZ-Nnqu?`sr;cltquHcsquH!]rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)-]q>gKoqZ-gQqqZ-Nnqu?`sr;cltquHcsquH!]rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)-]q>gKoqZ-gQqqZ-Nnqu?`sr;cltquHcsquH!]rW%NLJcC<$e,Op~> +JcC<$JcFR+rW)$ZrrD0\rrDQg!!(OKrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)$ZrrD0\rrDQg!!(OKrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)$ZrrD0\rrDQg!!(OKrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW%ZPrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)KgnGpW0pAjIXrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)KgnGpW0pAjIXrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)KgnGpW0pAjIXrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)NhnGpQ.nGr(YrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)NhnGpQ.nGr(YrW%NLJcC<$e,Op~> +JcC<$JcFR+rW)NhnGpQ.nGr(YrW%NLJcC<$e,Op~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcFR+JH5]MJcC<$JcF4!J,~> +JcC<$JcEgkp&Mr/pAfdEJcC<$]DmB~> +JcC<$JcEgkp&Mr/pAfdEJcC<$]DmB~> +JcC<$JcEgkp&Mr/pAfdEJcC<$]DmB~> +JcC<$JcEmmo`2c,pAfdEJcC<$]`3K~> +JcC<$JcEmmo`2c,pAfdEJcC<$]`3K~> +JcC<$JcEmmo`2c,pAfdEJcC<$]`3K~> +JcC<$JcEsoq>gQqr;aS3qu?`sqZ)3IJcC<$^Ai]~> +JcC<$JcEsoq>gQqr;aS3qu?`sqZ)3IJcC<$^Ai]~> +JcC<$JcEsoq>gQqr;aS3qu?`sqZ)3IJcC<$^Ai]~> +JcC<$JcF!pqZ-Tpr;aP2r;cltqZ)3IJcC<$^]/f~> +JcC<$JcF!pqZ-Tpr;aP2r;cltqZ)3IJcC<$^]/f~> +JcC<$JcF!pqZ-Tpr;aP2r;cltqZ)3IJcC<$^]/f~> +JcC<$JcF'rq>gHnrW'S1rW)osqZ)3IJcC<$_>f#~> +JcC<$JcF'rq>gHnrW'S1rW)osqZ)3IJcC<$_>f#~> +JcC<$JcF'rq>gHnrW'S1rW)osqZ)3IJcC<$_>f#~> +JcC<$JcF*sqZ-KmrW'S1rW)lrqZ)3IJcC<$_Z,,~> +JcC<$JcF*sqZ-KmrW'S1rW)lrqZ)3IJcC<$_Z,,~> +JcC<$JcF*sqZ-KmrW'S1rW)lrqZ)3IJcC<$_Z,,~> +JcC<$JcF0uqZ-EkrrBV0rrDoqqZ)3IJcC<$`;b>~> +JcC<$JcF0uqZ-EkrrBV0rrDoqqZ)3IJcC<$`;b>~> +JcC<$JcF0uqZ-EkrrBV0rrDoqqZ)3IJcC<$`;b>~> +JcC<$JcF7"q>g9i!!'P/rrDlpqZ)3IJcC<$`W(G~> +JcC<$JcF7"q>g9i!!'P/rrDlpqZ)3IJcC<$`W(G~> +JcC<$JcF7"q>g9i!!'P/rrDlpqZ)3IJcC<$`W(G~> +JcC<$JcF:#qZ- +JcC<$JcF:#qZ- +JcC<$JcF:#qZ- +JcC<$JcF@%qZ*Sp!!)`mqZ)3IJcC<$aT$b~> +JcC<$JcF@%qZ*Sp!!)`mqZ)3IJcC<$aT$b~> +JcC<$JcF@%qZ*Sp!!)`mqZ)3IJcC<$aT$b~> +JcC<$JcFF'q>cr`qZ)3IJcC<$b5Zt~> +JcC<$JcFF'q>cr`qZ)3IJcC<$b5Zt~> +JcC<$JcFF'q>cr`qZ)3IJcC<$b5Zt~> +JcC<$JcFI(qZ)r^qZ)3IJcC<$bQ!(~> +JcC<$JcFI(qZ)r^qZ)3IJcC<$bQ!(~> +JcC<$JcFI(qZ)r^qZ)3IJcC<$bQ!(~> +JcC<$JcFO*qZ)i[q>c*HJcC<$c2W:~> +JcC<$JcFO*qZ)i[q>c*HJcC<$c2W:~> +JcC<$JcFO*qZ)i[q>c*HJcC<$c2W:~> +JcC<$JcFU,q>cWWqZ)3IJcC<$cMrC~> +JcC<$JcFU,q>cWWqZ)3IJcC<$cMrC~> +JcC<$JcFU,q>cWWqZ)3IJcC<$cMrC~> +JcC<$JcFX-qZ)WUq>c*HJcC<$d/SU~> +JcC<$JcFX-qZ)WUq>c*HJcC<$d/SU~> +JcC<$JcFX-qZ)WUq>c*HJcC<$d/SU~> +JcC<$JcF^/qZ)KQqZ)3IJcC<$dJn^~> +JcC<$JcF^/qZ)KQqZ)3IJcC<$dJn^~> +JcC<$JcF^/qZ)KQqZ)3IJcC<$dJn^~> +JcC<$JcFd1q>cc*HJcC<$e,Op~> +JcC<$JcFd1q>cc*HJcC<$e,Op~> +JcC<$JcFd1q>cc*HJcC<$e,Op~> +JcC<$JcFg2qZ)9KqZ)3IJcC<$eGk%~> +JcC<$JcFg2qZ)9KqZ)3IJcC<$eGk%~> +JcC<$JcFg2qZ)9KqZ)3IJcC<$eGk%~> +JcC<$JcFm4qZ)3I!<;lqJcC<$JcF=$J,~> +JcC<$JcFm4qZ)3I!<;lqJcC<$JcF=$J,~> +JcC<$JcFm4qZ)3I!<;lqJcC<$JcF=$J,~> +JcC<$JcFs6q>c*HrVu`pJcC<$JcF@%J,~> +JcC<$JcFs6q>c*HrVu`pJcC<$JcF@%J,~> +JcC<$JcFs6q>c*HrVu`pJcC<$JcF@%J,~> +JcC<$JcG!7qZ)3IqZ$BlJcC<$JcFF'J,~> +JcC<$JcG!7qZ)3IqZ$BlJcC<$JcFF'J,~> +JcC<$JcG!7qZ)3IqZ$BlJcC<$JcFF'J,~> +JcC<$JcG'9qZ)3IpAb!iJcC<$JcFI(J,~> +JcC<$JcG'9qZ)3IpAb!iJcC<$JcFI(J,~> +JcC<$JcG'9qZ)3IpAb!iJcC<$JcFI(J,~> +JcC<$JcG-;q>c*Ho`+dgJcC<$JcFL)J,~> +JcC<$JcG-;q>c*Ho`+dgJcC<$JcFL)J,~> +JcC<$JcG-;q>c*Ho`+dgJcC<$JcFL)J,~> +JcC<$JcG0 +JcC<$JcG0 +JcC<$JcG0 +JcC<$JcG6>qZ)3ImJm%`JcC<$JcFU,J,~> +JcC<$JcG6>qZ)3ImJm%`JcC<$JcFU,J,~> +JcC<$JcG6>qZ)3ImJm%`JcC<$JcFU,J,~> +JcC<$JcG<@q>c*HlMp_]JcC<$JcF[.J,~> +JcC<$JcG<@q>c*HlMp_]JcC<$JcF[.J,~> +JcC<$JcG<@q>c*HlMp_]JcC<$JcF[.J,~> +JcC<$JcG?AqZ)3IkPtDZJcC<$JcF^/J,~> +JcC<$JcG?AqZ)3IkPtDZJcC<$JcF^/J,~> +JcC<$JcG?AqZ)3IkPtDZJcC<$JcF^/J,~> +JcC<$JcGECqZ)3Ij8\uVJcC<$JcFd1J,~> +JcC<$JcGECqZ)3Ij8\uVJcC<$JcFd1J,~> +JcC<$JcGECqZ)3Ij8\uVJcC<$JcFd1J,~> +JcC<$JcGKEq>c*HiW&cTJcC<$JcFg2J,~> +JcC<$JcGKEq>c*HiW&cTJcC<$JcFg2J,~> +JcC<$JcGKEq>c*HiW&cTJcC<$JcFg2J,~> +JcC<$JcGNFqZ)3Ih>d?PJcC<$JcFm4J,~> +JcC<$JcGNFqZ)3Ih>d?PJcC<$JcFm4J,~> +JcC<$JcGNFqZ)3Ih>d?PJcC<$JcFm4J,~> +JcC<$JcGTHqZ)3IgAh$MJcC<$JcFp5J,~> +JcC<$JcGTHqZ)3IgAh$MJcC<$JcFp5J,~> +JcC<$JcGTHqZ)3IgAh$MJcC<$JcFp5J,~> +JcC<$JcGZJq>c*HfDk^JJcC<$JcG!7J,~> +JcC<$JcGZJq>c*HfDk^JJcC<$JcG!7J,~> +JcC<$JcGZJq>c*HfDk^JJcC<$JcG!7J,~> +JcC<$JcG]KqZ)3IeGoCGJcC<$JcG$8J,~> +JcC<$JcG]KqZ)3IeGoCGJcC<$JcG$8J,~> +JcC<$JcG]KqZ)3IeGoCGJcC<$JcG$8J,~> +JcC<$JcGcMq>c*HdJs(DJcC<$JcG*:J,~> +JcC<$JcGcMq>c*HdJs(DJcC<$JcG*:J,~> +JcC<$JcGcMq>c*HdJs(DJcC<$JcG*:J,~> +JcC<$JcGQHJcF$qqZ)3IJcC<$mJh\~> +JcC<$JcGQHJcF$qqZ)3IJcC<$mJh\~> +JcC<$JcGQHJcF$qqZ)3IJcC<$mJh\~> +JcC<$K)b]JJcEmmqZ)3IJcC<$n,In~> +JcC<$K)b]JJcEmmqZ)3IJcC<$n,In~> +JcC<$K)b]JJcEmmqZ)3IJcC<$n,In~> +JcC<$K`ClKJcEgkqZ)3IJcC<$nGe"~> +JcC<$K`ClKJcEgkqZ)3IJcC<$nGe"~> +JcC<$K`ClKJcEgkqZ)3IJcC<$nGe"~> +JcC<$LB%)MJcE[gqZ)3IJcC<$o)F4~> +JcC<$LB%)MJcE[gqZ)3IJcC<$o)F4~> +JcC<$LB%)MJcE[gqZ)3IJcC<$o)F4~> +JcC<$L]@5OJcERdqZ)3IJcC<$oDa=~> +JcC<$L]@5OJcERdqZ)3IJcC<$oDa=~> +JcC<$L]@5OJcERdqZ)3IJcC<$oDa=~> +JcC<$M?!DPJcEIaqZ)3IJcC<$p&BO~> +JcC<$M?!DPJcEIaqZ)3IJcC<$p&BO~> +JcC<$M?!DPJcEIaqZ)3IJcC<$p&BO~> +JcC<$MuWVRJcE@^qZ)3IJcC<$pA]X~> +JcC<$MuWVRJcE@^qZ)3IJcC<$pA]X~> +JcC<$MuWVRJcE@^qZ)3IJcC<$pA]X~> +JcC<$N;rbTJcE4ZqZ)3IJcC<$q#>j~> +JcC<$N;rbTJcE4ZqZ)3IJcC<$q#>j~> +JcC<$N;rbTJcE4ZqZ)3IJcC<$q#>j~> +JcC<$NrSqUJcE.XqZ)3IJcC<$q>Ys~> +JcC<$NrSqUJcE.XqZ)3IJcC<$q>Ys~> +JcC<$NrSqUJcE.XqZ)3IJcC<$q>Ys~> +JcC<$OT5.WJcE"TqZ)3IJcC<$qu;0~> +JcC<$OT5.WJcE"TqZ)3IJcC<$qu;0~> +JcC<$OT5.WJcE"TqZ)3IJcC<$qu;0~> +JcC<$OoP:YJcDnQqZ)3IJcC<$r;V9~> +JcC<$OoP:YJcDnQqZ)3IJcC<$r;V9~> +JcC<$OoP:YJcDnQqZ)3IJcC<$r;V9~> +JcC<$PQ1IZJcDeNqZ)3IJcC<$rr7K~> +JcC<$PQ1IZJcDeNqZ)3IJcC<$rr7K~> +JcC<$PQ1IZJcDeNqZ)3IJcC<$rr7K~> +JcC<$Q2g[\JcD\KqZ)3IJcC<$s8RT~> +JcC<$Q2g[\JcD\KqZ)3IJcC<$s8RT~> +JcC<$Q2g[\JcD\KqZ)3IJcC<$s8RT~> +JcC<$QN-g^JcDPGqZ)3IJcC<$J,~> +JcC<$QN-g^JcDPGqZ)3IJcC<$J,~> +JcC<$QN-g^JcDPGqZ)3IJcC<$J,~> +JcC<$R/d!_JcDJEqZ)3IJcC?%J,~> +JcC<$R/d!_JcDJEqZ)3IJcC?%J,~> +JcC<$R/d!_JcDJEqZ)3IJcC?%J,~> +JcC<$RfE3aJcD>AqZ)3IJcCE'J,~> +JcC<$RfE3aJcD>AqZ)3IJcCE'J,~> +JcC<$RfE3aJcD>AqZ)3IJcCE'J,~> +JcC<$S,`?cJcD5>qZ)3IJcCH(J,~> +JcC<$S,`?cJcD5>qZ)3IJcCH(J,~> +JcC<$S,`?cJcD5>qZ)3IJcCH(J,~> +JcC<$ScANdJcD,;qZ)3IJcCN*J,~> +JcC<$ScANdJcD,;qZ)3IJcCN*J,~> +JcC<$ScANdJcD,;qZ)3IJcCN*J,~> +JcC<$TE"`fJcD#8qZ)3IJcCQ+J,~> +JcC<$TE"`fJcD#8qZ)3IJcCQ+J,~> +JcC<$TE"`fJcD#8qZ)3IJcCQ+J,~> +JcC<$T`=lhJcCl4qZ)3IJcCW-J,~> +JcC<$T`=lhJcCl4qZ)3IJcCW-J,~> +JcC<$T`=lhJcCl4qZ)3IJcCW-J,~> +JcC<$UAt&iJcCf2qZ)3IJcCZ.J,~> +JcC<$UAt&iJcCf2qZ)3IJcCZ.J,~> +JcC<$UAt&iJcCf2qZ)3IJcCZ.J,~> +JcC<$V#U8kJcCZ.qZ)3IJcC`0J,~> +JcC<$V#U8kJcCZ.qZ)3IJcC`0J,~> +JcC<$V#U8kJcCZ.qZ)3IJcC`0J,~> +JcC<$V>pDmJcCQ+qZ)3IJcCc1J,~> +JcC<$V>pDmJcCQ+qZ)3IJcCc1J,~> +JcC<$V>pDmJcCQ+qZ)3IJcCc1J,~> +JcC<$VuQSnJcCH(qZ)3IJcCi3J,~> +JcC<$VuQSnJcCH(qZ)3IJcCi3J,~> +JcC<$VuQSnJcCH(qZ)3IJcCi3J,~> +JcC<$WW2epJcC?%qZ)3IJcCl4J,~> +JcC<$WW2epJcC?%qZ)3IJcCl4J,~> +JcC<$WW2epJcC?%qZ)3IJcCl4J,~> +JcC<$WrMqrJcC<$rr;iqJcC<$PQ-.~> +JcC<$WrMqrJcC<$rr;iqJcC<$PQ-.~> +JcC<$WrMqrJcC<$rr;iqJcC<$PQ-.~> +JcC<$XT/+sJcC<$r;ZWoJcC<$PlH7~> +JcC<$XT/+sJcC<$r;ZWoJcC<$PlH7~> +JcC<$XT/+sJcC<$r;ZWoJcC<$PlH7~> +JcC<$Y5e=uJcC<$q#C3kJcC<$QN)I~> +JcC<$Y5e=uJcC<$q#C3kJcC<$QN)I~> +JcC<$Y5e=uJcC<$q#C3kJcC<$QN)I~> +JcC<$YQ+J"JcC<$p&FmhJcC<$QiDR~> +JcC<$YQ+J"JcC<$p&FmhJcC<$QiDR~> +JcC<$YQ+J"JcC<$p&FmhJcC<$QiDR~> +JcC<$Z2aY#JcC<$o)JReJcC<$RK%d~> +JcC<$Z2aY#JcC<$o)JReJcC<$RK%d~> +JcC<$Z2aY#JcC<$o)JReJcC<$RK%d~> +JcC<$ZN'e%JcC<$n,N7bJcC<$Rf@m~> +JcC<$ZN'e%JcC<$n,N7bJcC<$Rf@m~> +JcC<$ZN'e%JcC<$n,N7bJcC<$Rf@m~> +JcC<$[/^"'JcC<$li6h^JcC<$SH"*~> +JcC<$[/^"'JcC<$li6h^JcC<$SH"*~> +JcC<$[/^"'JcC<$li6h^JcC<$SH"*~> +JcC<$[f?1(JcC<$l2UV\JcC<$Sc=3~> +JcC<$[f?1(JcC<$l2UV\JcC<$Sc=3~> +JcC<$[f?1(JcC<$l2UV\JcC<$Sc=3~> +JcC<$\,Z=*JcC<$jo>2XJcC<$TDsE~> +JcC<$\,Z=*JcC<$jo>2XJcC<$TDsE~> +JcC<$\,Z=*JcC<$jo>2XJcC<$TDsE~> +JcC<$\c;O,JcC<$irAlUJcC<$T`9N~> +JcC<$\c;O,JcC<$irAlUJcC<$T`9N~> +JcC<$\c;O,JcC<$irAlUJcC<$T`9N~> +JcC<$]Dq^-JcC<$huEQRJcC<$UAo`~> +JcC<$]Dq^-JcC<$huEQRJcC<$UAo`~> +JcC<$]Dq^-JcC<$huEQRJcC<$UAo`~> +JcC<$]`7j/JcC<$h#I6OJcC<$U]5i~> +JcC<$]`7j/JcC<$h#I6OJcC<$U]5i~> +JcC<$]`7j/JcC<$h#I6OJcC<$U]5i~> +JcC<$^An'1JcC<$f`1gKJcC<$V>l&~> +JcC<$^An'1JcC<$f`1gKJcC<$V>l&~> +JcC<$^An'1JcC<$f`1gKJcC<$V>l&~> +JcC<$_#O62JcC<$f)PUIJcC<$VZ2/~> +JcC<$_#O62JcC<$f)PUIJcC<$VZ2/~> +JcC<$_#O62JcC<$f)PUIJcC<$VZ2/~> +JcC<$_>jB4JcC<$df91EJcC<$W;hA~> +JcC<$_>jB4JcC<$df91EJcC<$W;hA~> +JcC<$_>jB4JcC<$df91EJcC<$W;hA~> +JcC<$_uKT6JcC<$ci +JcC<$_uKT6JcC<$ci +JcC<$_uKT6JcC<$ci +JcC<$`W,c7JcC<$bl@P?JcC<$X8d\~> +JcC<$`W,c7JcC<$bl@P?JcC<$X8d\~> +JcC<$`W,c7JcC<$bl@P?JcC<$X8d\~> +JcC<$`rGo9JcC<$aoD5 +JcC<$`rGo9JcC<$aoD5 +JcC<$`rGo9JcC<$aoD5 +JcC<$aT),;JcC<$`W,f8JcC<$Y5a"~> +JcC<$aT),;JcC<$`W,f8JcC<$Y5a"~> +JcC<$aT),;JcC<$`W,f8JcC<$Y5a"~> +JcC<$b5_; +JcC<$b5_; +JcC<$b5_; +JcC<$bQ%G>JcC<$^]402JcC<$Z2]=~> +JcC<$bQ%G>JcC<$^]402JcC<$Z2]=~> +JcC<$bQ%G>JcC<$^]402JcC<$Z2]=~> +JcC<$c2[Y@JcC<$]`7j/JcC<$ZN#F~> +JcC<$c2[Y@JcC<$]`7j/JcC<$ZN#F~> +JcC<$c2[Y@JcC<$]`7j/JcC<$ZN#F~> +JcC<$ci +JcC<$ci +JcC<$ci +JcC<$d/WtCJcC<$[f?4)JcC<$[Jta~> +JcC<$d/WtCJcC<$[f?4)JcC<$[Jta~> +JcC<$d/WtCJcC<$[f?4)JcC<$[Jta~> +JcC<$df91EJcC<$ZN'e%JcC<$\,Us~> +JcC<$df91EJcC<$ZN'e%JcC<$\,Us~> +JcC<$df91EJcC<$ZN'e%JcC<$\,Us~> +JcC<$eGo@FJcC<$YlFS#JcC<$\Gq'~> +JcC<$eGo@FJcC<$YlFS#JcC<$\Gq'~> +JcC<$eGo@FJcC<$YlFS#JcC<$\Gq'~> +JcC<$ec5LHJcC<$XT/.tJcC<$])R9~> +JcC<$ec5LHJcC<$XT/.tJcC<$])R9~> +JcC<$ec5LHJcC<$XT/.tJcC<$])R9~> +JcC<$fDk^JJcC<$WW2hqJcC<$]DmB~> +JcC<$fDk^JJcC<$WW2hqJcC<$]DmB~> +JcC<$fDk^JJcC<$WW2hqJcC<$]DmB~> +JcC<$g&LmKJcC<$VZ6MnJcC<$^&NT~> +JcC<$g&LmKJcC<$VZ6MnJcC<$^&NT~> +JcC<$g&LmKJcC<$VZ6MnJcC<$^&NT~> +JcC<$gAh$MJcC<$U]:2kJcC<$^Ai]~> +JcC<$gAh$MJcC<$U]:2kJcC<$^Ai]~> +JcC<$gAh$MJcC<$U]:2kJcC<$^Ai]~> +JcC<$h#I6OJcC<$TE"cgJcC<$_#Jo~> +JcC<$h#I6OJcC<$TE"cgJcC<$_#Jo~> +JcC<$h#I6OJcC<$TE"cgJcC<$_#Jo~> +JcC<$hZ*EPJcC<$ScAQeJcC<$_>f#~> +JcC<$hZ*EPJcC<$ScAQeJcC<$_>f#~> +JcC<$hZ*EPJcC<$ScAQeJcC<$_>f#~> +JcC<$huEQRJcC<$RK*-aJcC<$_uG5~> +JcC<$huEQRJcC<$RK*-aJcC<$_uG5~> +JcC<$huEQRJcC<$RK*-aJcC<$_uG5~> +JcC<$iW&`SJcC<$QiHp_JcC<$`;b>~> +JcC<$iW&`SJcC<$QiHp_JcC<$`;b>~> +JcC<$iW&`SJcC<$QiHp_JcC<$`;b>~> +JcC<$j8\rUJcC<$PQ1L[JcC<$`rCP~> +JcC<$j8\rUJcC<$PQ1L[JcC<$`rCP~> +JcC<$j8\rUJcC<$PQ1L[JcC<$`rCP~> +JcC<$jT#)WJcC<$OT51XJcC<$a8^Y~> +JcC<$jT#)WJcC<$OT51XJcC<$a8^Y~> +JcC<$jT#)WJcC<$OT51XJcC<$a8^Y~> +JcC<$k5Y8XJcC<$NW8kUJcC<$ao?k~> +JcC<$k5Y8XJcC<$NW8kUJcC<$ao?k~> +JcC<$k5Y8XJcC<$NW8kUJcC<$ao?k~> +JcC<$kl:JZJcC<$MZ +JcC<$kl:JZJcC<$MZ +JcC<$kl:JZJcC<$MZ +JcC<$l2UV\JcC<$LB%,NJcC<$bl<1~> +JcC<$l2UV\JcC<$LB%,NJcC<$bl<1~> +JcC<$l2UV\JcC<$LB%,NJcC<$bl<1~> +JcC<$li6e]JcC<$K`CoLJcC<$c2W:~> +JcC<$li6e]JcC<$K`CoLJcC<$c2W:~> +JcC<$li6e]JcC<$K`CoLJcC<$c2W:~> +JcC<$mJm"_JcC<$Jc>`MqZ)3IJcF'rJ,~> +JcC<$mJm"_JcC<$Jc>`MqZ)3IJcF'rJ,~> +JcC<$mJm"_JcC<$Jc>`MqZ)3IJcF'rJ,~> +JcC<$mf3.aJcC<$JcG]KqZ)3IJcF*sJ,~> +JcC<$mf3.aJcC<$JcG]KqZ)3IJcF*sJ,~> +JcC<$mf3.aJcC<$JcG]KqZ)3IJcF*sJ,~> +JcC<$nGi=bJcC<$JcGTHqZ)3IJcF0uJ,~> +JcC<$nGi=bJcC<$JcGTHqZ)3IJcF0uJ,~> +JcC<$nGi=bJcC<$JcGTHqZ)3IJcF0uJ,~> +JcC<$o)JOdJcC<$JcGKEqZ)3IJcF4!J,~> +JcC<$o)JOdJcC<$JcGKEqZ)3IJcF4!J,~> +JcC<$o)JOdJcC<$JcGKEqZ)3IJcF4!J,~> +JcC<$oDe[fJcC<$JcG?AqZ)3IJcF:#J,~> +JcC<$oDe[fJcC<$JcG?AqZ)3IJcF:#J,~> +JcC<$oDe[fJcC<$JcG?AqZ)3IJcF:#J,~> +JcC<$p&FjgJcC<$JcG9?qZ)3IJcF=$J,~> +JcC<$p&FjgJcC<$JcG9?qZ)3IJcF=$J,~> +JcC<$p&FjgJcC<$JcG9?qZ)3IJcF=$J,~> +JcC?%!!)cnq>c*HJcC<$mJm%`JcC<$f`-I~> +JcC?%!!)cnq>c*HJcC<$mJm%`JcC<$f`-I~> +JcC?%!!)cnq>c*HJcC<$mJm%`JcC<$f`-I~> +JcC?%!!)foqZ)3IJcC<$lMp_]JcC<$g&HR~> +JcC?%!!)foqZ)3IJcC<$lMp_]JcC<$g&HR~> +JcC?%!!)foqZ)3IJcC<$lMp_]JcC<$g&HR~> +JcCB&rrDoqq>c*HJcC<$kPtDZJcC<$g])d~> +JcCB&rrDoqq>c*HJcC<$kPtDZJcC<$g])d~> +JcCB&rrDoqq>c*HJcC<$kPtDZJcC<$g])d~> +JcCE'rW)lrq>c*HJcC<$jT#)WJcC<$h#Dm~> +JcCE'rW)lrq>c*HJcC<$jT#)WJcC<$h#Dm~> +JcCE'rW)lrq>c*HJcC<$jT#)WJcC<$h#Dm~> +JcCE'rW)osqZ)3IJcC<$i;`ZSJcC<$hZ&*~> +JcCE'rW)osqZ)3IJcC<$i;`ZSJcC<$hZ&*~> +JcCE'rW)osqZ)3IJcC<$i;`ZSJcC<$hZ&*~> +JcCH(r;cltq>c*HJcC<$hZ*HQJcC<$huA3~> +JcCH(r;cltq>c*HJcC<$hZ*HQJcC<$huA3~> +JcCH(r;cltq>c*HJcC<$hZ*HQJcC<$huA3~> +JcCK)o`0RCJcC<$gAh$MJcC<$iW"E~> +JcCK)o`0RCJcC<$gAh$MJcC<$iW"E~> +JcCK)o`0RCJcC<$gAh$MJcC<$iW"E~> +JcCK)pAfdEJcC<$fDk^JJcC<$ir=N~> +JcCK)pAfdEJcC<$fDk^JJcC<$ir=N~> +JcCK)pAfdEJcC<$fDk^JJcC<$ir=N~> +JcCN*pAfdEJcC<$eGoCGJcC<$jSs`~> +JcCN*pAfdEJcC<$eGoCGJcC<$jSs`~> +JcCN*pAfdEJcC<$eGoCGJcC<$jSs`~> +JcCN*q#H!GJcC<$dJs(DJcC<$jo9i~> +JcCN*q#H!GJcC<$dJs(DJcC<$jo9i~> +JcCN*q#H!GJcC<$dJs(DJcC<$jo9i~> +JcCQ+pAfdEJcC<$d/WtCJcC<$kPp&~> +JcCQ+pAfdEJcC<$d/WtCJcC<$kPp&~> +JcCQ+pAfdEJcC<$d/WtCJcC<$kPp&~> +JcCT,oDjIBJcC<$dJs(DJcC<$kl6/~> +JcCT,oDjIBJcC<$dJs(DJcC<$kl6/~> +JcCT,oDjIBJcC<$dJs(DJcC<$kl6/~> +JcCT,nc47@JcC<$df9.DJcC<$lMlA~> +JcCT,nc47@JcC<$df9.DJcC<$lMlA~> +JcCT,nc47@JcC<$df9.DJcC<$lMlA~> +JcEIaRK.p=JcC<$oDe[fJcC<$li2J~> +JcEIaRK.p=JcC<$oDe[fJcC<$li2J~> +JcEIaRK.p=JcC<$oDe[fJcC<$li2J~> +JcEIaRK.p=JcC<$o)JOdJcC<$mJh\~> +JcEIaRK.p=JcC<$o)JOdJcC<$mJh\~> +JcEIaRK.p=JcC<$o)JOdJcC<$mJh\~> +JcEIaRK.p=JcC<$nGi@cJcC<$mf.e~> +JcEIaRK.p=JcC<$nGi@cJcC<$mf.e~> +JcEIaRK.p=JcC<$nGi@cJcC<$mf.e~> +JcEIarW&VkrW%NLJcC<$n,N4aJcC<$nGe"~> +JcEIarW&VkrW%NLJcC<$n,N4aJcC<$nGe"~> +JcEIarW&VkrW%NLJcC<$n,N4aJcC<$nGe"~> +JcEIarW&VkrW%NLJcC<$mJm%`JcC<$nc++~> +JcEIarW&VkrW%NLJcC<$mJm%`JcC<$nc++~> +JcEIarW&VkrW%NLJcC<$mJm%`JcC<$nc++~> +JcEIarW&VkrW%NLJcC<$m/Qn^JcC<$oDa=~> +JcEIarW&VkrW%NLJcC<$m/Qn^JcC<$oDa=~> +JcEIarW&VkrW%NLJcC<$m/Qn^JcC<$oDa=~> +JcEIarW&VkrW%NLJcC<$lMp_]JcC<$o`'F~> +JcEIarW&VkrW%NLJcC<$lMp_]JcC<$o`'F~> +JcEIarW&VkrW%NLJcC<$lMp_]JcC<$o`'F~> +JcEIarW&VkrW%NLJcC<$l2US[JcC<$pA]X~> +JcEIarW&VkrW%NLJcC<$l2US[JcC<$pA]X~> +JcEIarW&VkrW%NLJcC<$l2US[JcC<$pA]X~> +JcEIarW&VkrW%NLJcC<$kPtDZJcC<$p]#a~> +JcEIarW&VkrW%NLJcC<$kPtDZJcC<$p]#a~> +JcEIarW&VkrW%NLJcC<$kPtDZJcC<$p]#a~> +JcEIarW&VkrW%NLJcC<$k5Y;YJcC<$q#>j~> +JcEIarW&VkrW%NLJcC<$k5Y;YJcC<$q#>j~> +JcEIarW&VkrW%NLJcC<$k5Y;YJcC<$q#>j~> +JcEIarW&VkrW%NLJcC<$jT#)WJcC<$qYu'~> +JcEIarW&VkrW%NLJcC<$jT#)WJcC<$qYu'~> +JcEIarW&VkrW%NLJcC<$jT#)WJcC<$qYu'~> +JcEIarW&VkrW%NLJcC<$j8\uVJcC<$qu;0~> +JcEIarW&VkrW%NLJcC<$j8\uVJcC<$qu;0~> +JcEIarW&VkrW%NLJcC<$j8\uVJcC<$qu;0~> +JcEIarW&VkrW%NLJcC<$iW&cTp\t3nJcCQ+J,~> +JcEIarW&VkrW%NLJcC<$iW&cTp\t3nJcCQ+J,~> +JcEIarW&VkrW%NLJcC<$iW&cTp\t3nJcCQ+J,~> +JcEIarW&VkrW%NLJcC<$i;`ZSq#: +JcEIarW&VkrW%NLJcC<$i;`ZSq#: +JcEIarW&VkrW%NLJcC<$i;`ZSq#: +JcEIarW)6`rrC+>rrD`lrW%NLJcC<$hZ*HQqu?WqJcCT,J,~> +JcEIarW)6`rrC+>rrD`lrW%NLJcC<$hZ*HQqu?WqJcCT,J,~> +JcEIarW)6`rrC+>rrD`lrW%NLJcC<$hZ*HQqu?WqJcCT,J,~> +JcEIarW)r;cNjrW%NLJcC<$h>d?Pr;Z`rJcCT,J,~> +JcEIarW)r;cNjrW%NLJcC<$h>d?Pr;Z`rJcCT,J,~> +JcEIarW)r;cNjrW%NLJcC<$h>d?Pr;Z`rJcCT,J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$g].-Nrr;osJcCW-J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$g].-Nrr;osJcCW-J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$g].-Nrr;osJcCW-J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$gAh$Ms8W#tJcCW-J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$gAh$Ms8W#tJcCW-J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$gAh$Ms8W#tJcCW-J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$f`1XFJcCZ.J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$f`1XFJcCZ.J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$f`1XFJcCZ.J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$fDkRFJcCZ.J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$fDkRFJcCZ.J,~> +JcEIarW)9arW(%>rW)WkrW%NLJcC<$fDkRFJcCZ.J,~> +JcEIarW)TjqZ-WqrW)osrW)rtr;c`p!W`9#rW)rtrrE*!rW)lrrW)cor;ZitrW)WkrW%NLJcC<$ +ec5CEJcC]/J,~> +JcEIarW)TjqZ-WqrW)osrW)rtr;c`p!W`9#rW)rtrrE*!rW)lrrW)cor;ZitrW)WkrW%NLJcC<$ +ec5CEJcC]/J,~> +JcEIarW)TjqZ-WqrW)osrW)rtr;c`p!W`9#rW)rtrrE*!rW)lrrW)cor;ZitrW)WkrW%NLJcC<$ +ec5CEJcC]/J,~> +JcEIarW)WkrrE&urrE&urW)osrW)lrrW)uuo)JdjquHcsqZ-NnrrE&ur;cNjrW%NLJcC<$eGo:D +JcC`0J,~> +JcEIarW)WkrrE&urrE&urW)osrW)lrrW)uuo)JdjquHcsqZ-NnrrE&ur;cNjrW%NLJcC<$eGo:D +JcC`0J,~> +JcEIarW)WkrrE&urrE&urW)osrW)lrrW)uuo)JdjquHcsqZ-NnrrE&ur;cNjrW%NLJcC<$eGo:D +JcC`0J,~> +JcEIarW)ZlrW)os!!*#urW)lrrW)osrW)rtq#LHpr;cisr;cfrrrDusrrDusrW)WkrW%NLJcC<$ +f)PFDJcC`0J,~> +JcEIarW)ZlrW)os!!*#urW)lrrW)osrW)rtq#LHpr;cisr;cfrrrDusrrDusrW)WkrW%NLJcC<$ +f)PFDJcC`0J,~> +JcEIarW)ZlrW)os!!*#urW)lrrW)osrW)rtq#LHpr;cisr;cfrrrDusrrDusrW)WkrW%NLJcC<$ +f)PFDJcC`0J,~> +JcEIarW)ZlrW)os!!*#urW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrW)lrrW)WkrW%NLJcC<$ +f`1OCJcCc1J,~> +JcEIarW)ZlrW)os!!*#urW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrW)lrrW)WkrW%NLJcC<$ +f`1OCJcCc1J,~> +JcEIarW)ZlrW)os!!*#urW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrW)lrrW)WkrW%NLJcC<$ +f`1OCJcCc1J,~> +JcEIarW)ZlrW)corW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrW)lrrW)WkrW%NLJcC<$gAg[C +JcCc1J,~> +JcEIarW)ZlrW)corW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrW)lrrW)WkrW%NLJcC<$gAg[C +JcCc1J,~> +JcEIarW)ZlrW)corW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrW)lrrW)WkrW%NLJcC<$gAg[C +JcCc1J,~> +JcEIarW)Wkr;c`prW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDrrrW)WkrW%NLJcC<$r;W5d +JcEUeJ,~> +JcEIarW)Wkr;c`prW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDrrrW)WkrW%NLJcC<$r;W5d +JcEUeJ,~> +JcEIarW)Wkr;c`prW)lrrW)osrW)osrW)iqrW)osr;cfrrW)rtrrDrrrW)WkrW%NLJcC<$r;W5d +JcEUeJ,~> +JcEIarW)TjquH]qrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)iqrW)WkrW%NLJcC<$r;W5d +JcEUeJ,~> +JcEIarW)TjquH]qrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)iqrW)WkrW%NLJcC<$r;W5d +JcEUeJ,~> +JcEIarW)TjquH]qrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)iqrW)WkrW%NLJcC<$r;W5d +JcEUeJ,~> +JcEIarW)QiquH`rrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)iqrW)WkrW%NLJcC<$r;W5d +JcEUeJ,~> +JcEIarW)QiquH`rrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)iqrW)WkrW%NLJcC<$r;W5d +JcEUeJ,~> +JcEIarW)QiquH`rrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)iqrW)WkrW%NLJcC<$r;W5d +JcEUeJ,~> +JcEIarW)Kgr;cltrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uur;ccqrW)WkrW%NLJcC<$r;Z`r +U&Y)lJcEUeJ,~> +JcEIarW)Kgr;cltrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uur;ccqrW)WkrW%NLJcC<$r;Z`r +U&Y)lJcEUeJ,~> +JcEIarW)Kgr;cltrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uur;ccqrW)WkrW%NLJcC<$r;Z`r +U&Y)lJcEUeJ,~> +JcEIarW)Zl!!)rsrW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtrW)lrrW)WkrW%NLJcC<$ +r;Z`rU&Y)lJcEUeJ,~> +JcEIarW)Zl!!)rsrW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtrW)lrrW)WkrW%NLJcC<$ +r;Z`rU&Y)lJcEUeJ,~> +JcEIarW)Zl!!)rsrW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtrW)lrrW)WkrW%NLJcC<$ +r;Z`rU&Y)lJcEUeJ,~> +JcEIarW)ZlrrE#trW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtr;cfrrW)WkrW%NLJcC<$ +r;Z`rU&Y)lJcEUeJ,~> +JcEIarW)ZlrrE#trW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtr;cfrrW)WkrW%NLJcC<$ +r;Z`rU&Y)lJcEUeJ,~> +JcEIarW)ZlrrE#trW)uurW)lrrW)osrW)osrW)iqrW)lrrW)osrW)rtr;cfrrW)WkrW%NLJcC<$ +r;Z`rU&Y)lJcEUeJ,~> +JcEIarW)ZlrrE#trrE&urW)lrp&P*lrW)iqrW)osr;cfrrW)oso`4adrW%NLJcC<$r;Z`rU&Y)l +JcEUeJ,~> +JcEIarW)ZlrrE#trrE&urW)lrp&P*lrW)iqrW)osr;cfrrW)oso`4adrW%NLJcC<$r;Z`rU&Y)l +JcEUeJ,~> +JcEIarW)ZlrrE#trrE&urW)lrp&P*lrW)iqrW)osr;cfrrW)oso`4adrW%NLJcC<$r;Z`rU&Y)l +JcEUeJ,~> +JcEIarW)Zlq>gNpqZ-Tpqu?`sr;ZitqZ-TpquHcsqZ-ZrquH]qp]1!erW%NLJcC<$r;Z`rU&Y)l +JcEUeJ,~> +JcEIarW)Zlq>gNpqZ-Tpqu?`sr;ZitqZ-TpquHcsqZ-ZrquH]qp]1!erW%NLJcC<$r;Z`rU&Y)l +JcEUeJ,~> +JcEIarW)Zlq>gNpqZ-Tpqu?`sr;ZitqZ-TpquHcsqZ-ZrquH]qp]1!erW%NLJcC<$r;Z`rU&Y)l +JcEUeJ,~> +JcEIarW)NhrrDTh!!(RLrrDQgrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW)NhrrDTh!!(RLrrDQgrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW)NhrrDTh!!(RLrrDQgrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rU&Y)lJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rlMpkaaT)8?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rlMpkaaT)8?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rlMpkaaT)8?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rm/R"ab5_D?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rm/R"ab5_D?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rm/R"ab5_D?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW&VkrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW(sX!!)6_!!(aQrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW(sX!!)6_!!(aQrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW(sX!!)6_!!(aQrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW)$ZrW)0^rW(aRrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW)$ZrW)0^rW(aRrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW)$ZrW)0^rW(aRrW%NLJcC<$r;Z`rli6qaaoD>?p&G!kJcEUeJ,~> +JcEIarW)*\quGs\quGURrW%NLJcC<$r;Z`rp&FmhrVuisrVuisrr;osqu6]ts8W&urr;uus8W&u +r;Z`rqZ$Ko!<<#up&G!kJcEUeJ,~> +JcEIarW)*\quGs\quGURrW%NLJcC<$r;Z`rp&FmhrVuisrVuisrr;osqu6]ts8W&urr;uus8W&u +r;Z`rqZ$Ko!<<#up&G!kJcEUeJ,~> +JcEIarW)*\quGs\quGURrW%NLJcC<$r;Z`rp&FmhrVuisrVuisrr;osqu6]ts8W&urr;uus8W&u +r;Z`rqZ$Ko!<<#up&G!kJcEUeJ,~> +JcEIaRK.p=JcC<$r;Z`rpAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!k +JcEUeJ,~> +JcEIaRK.p=JcC<$r;Z`rpAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!k +JcEUeJ,~> +JcEIaRK.p=JcC<$r;Z`rpAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!k +JcEUeJ,~> +JcEIaRK.p=JcC<$r;Z`rp](3mrVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`r +p&G!kJcEUeJ,~> +JcEIaRK.p=JcC<$r;Z`rp](3mrVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`r +p&G!kJcEUeJ,~> +JcEIaRK.p=JcC<$r;Z`rp](3mrVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`r +p&G!kJcEUeJ,~> +JcEIaRK.p=JcC<$r;Z`rp](3mrVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`r +p&G!kJcEUeJ,~> +JcEIaRK.p=JcC<$r;Z`rp](3mrVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`r +p&G!kJcEUeJ,~> +JcEIaRK.p=JcC<$r;Z`rp](3mrVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`r +p&G!kJcEUeJ,~> +JcDbMo)RqQo`0RCJcC<$hZ*QTp](3mq#C +JcDbMo)RqQo`0RCJcC<$hZ*QTp](3mq#C +JcDbMo)RqQo`0RCJcC<$hZ*QTp](3mq#C +JcDbMo)RqQo)O@AJcC<$i;`cVpAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wq +p&G!kJcEUeJ,~> +JcDbMo)RqQo)O@AJcC<$i;`cVpAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wq +p&G!kJcEUeJ,~> +JcDbMo)RqQo)O@AJcC<$i;`cVpAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wq +p&G!kJcEUeJ,~> +JcDSHp]0IVp],mFJcC<$g].6Qp&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wq +p&G!kJcEUeJ,~> +JcDSHp]0IVp],mFJcC<$g].6Qp&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wq +p&G!kJcEUeJ,~> +JcDSHp]0IVp],mFJcC<$g].6Qp&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wq +p&G!kJcEUeJ,~> +JcDSHq#KOVq#H!GJcC<$gAh-Po`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wq +p&G!kJcEUeJ,~> +JcDSHq#KOVq#H!GJcC<$gAh-Po`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wq +p&G!kJcEUeJ,~> +JcDSHq#KOVq#H!GJcC<$gAh-Po`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wq +p&G!kJcEUeJ,~> +JcDVIr;Zitr;bpYq#H!GJcC<$g].6Qo)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;ut +r;Z`rp&G!kJcEUeJ,~> +JcDVIr;Zitr;bpYq#H!GJcC<$g].6Qo)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;ut +r;Z`rp&G!kJcEUeJ,~> +JcDVIr;Zitr;bpYq#H!GJcC<$g].6Qo)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;ut +r;Z`rp&G!kJcEUeJ,~> +JcDYJr;cltr;bpYrVurur;_EKJcC<$g].6Qp\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`r +rVuiss8W&ur;Z`rp&G!kJcEUeJ,~> +JcDYJr;cltr;bpYrVurur;_EKJcC<$g].6Qp\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`r +rVuiss8W&ur;Z`rp&G!kJcEUeJ,~> +JcDYJr;cltr;bpYrVurur;_EKJcC<$g].6Qp\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`r +rVuiss8W&ur;Z`rp&G!kJcEUeJ,~> +JcD\KquHcsr;bpYrW)uur;_EKJcC<$h#I?Rp](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`r +rVuiss8W#trVuisp&G!kJcEUeJ,~> +JcD\KquHcsr;bpYrW)uur;_EKJcC<$h#I?Rp](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`r +rVuiss8W#trVuisp&G!kJcEUeJ,~> +JcD\KquHcsr;bpYrW)uur;_EKJcC<$h#I?Rp](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`r +rVuiss8W#trVuisp&G!kJcEUeJ,~> +JcD_LquH]qrrD*ZrW)rtr;_EKJcC<$h>dHSp](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuis +rr;Wkp](3mJcEUeJ,~> +JcD_LquH]qrrD*ZrW)rtr;_EKJcC<$h>dHSp](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuis +rr;Wkp](3mJcEUeJ,~> +JcD_LquH]qrrD*ZrW)rtr;_EKJcC<$h>dHSp](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuis +rr;Wkp](3mJcEUeJ,~> +JcD_Lr;ccqrrD*ZrrDusr;_EKJcC<$hZ*QTp]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vus +rr;`np&G!kJcEUeJ,~> +JcD_Lr;ccqrrD*ZrrDusr;_EKJcC<$hZ*QTp]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vus +rr;`np&G!kJcEUeJ,~> +JcD_Lr;ccqrrD*ZrrDusr;_EKJcC<$hZ*QTp]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vus +rr;`np&G!kJcEUeJ,~> +JcDbMr;c`prrD'Y!!)rsquD +JcDbMr;c`prrD'Y!!)rsquD +JcDbMr;c`prrD'Y!!)rsquD +JcDeNr;cZn!!)$Y!!)orr;_EKJcC<$huEZUU&Y)lJcEUeJ,~> +JcDeNr;cZn!!)$Y!!)orr;_EKJcC<$huEZUU&Y)lJcEUeJ,~> +JcDeNr;cZn!!)$Y!!)orr;_EKJcC<$huEZUU&Y)lJcEUeJ,~> +JcDhOr;b4Er;_EKJcC<$i;`cVU&Y)lJcEUeJ,~> +JcDhOr;b4Er;_EKJcC<$i;`cVU&Y)lJcEUeJ,~> +JcDhOr;b4Er;_EKJcC<$i;`cVU&Y)lJcEUeJ,~> +JcDkPquG(Cr;_EKJcC<$iW&lWU&Y)lJcEUeJ,~> +JcDkPquG(Cr;_EKJcC<$iW&lWU&Y)lJcEUeJ,~> +JcDkPquG(Cr;_EKJcC<$iW&lWU&Y)lJcEUeJ,~> +JcDnQquG%BquD +JcDnQquG%BquD +JcDnQquG%BquD +JcDnQr;b(Ar;_EKJcC<$irAuXU&Y)lJcEUeJ,~> +JcDnQr;b(Ar;_EKJcC<$irAuXU&Y)lJcEUeJ,~> +JcDnQr;b(Ar;_EKJcC<$irAuXU&Y)lJcEUeJ,~> +JcDqRr;b"?r;_EKJcC<$j8])YU&Y)lJcEUeJ,~> +JcDqRr;b"?r;_EKJcC<$j8])YU&Y)lJcEUeJ,~> +JcDqRr;b"?r;_EKJcC<$j8])YU&Y)lJcEUeJ,~> +JcDtSr;aq=r;_EKJcC<$jT#2ZU&Y)lJcEUeJ,~> +JcDtSr;aq=r;_EKJcC<$jT#2ZU&Y)lJcEUeJ,~> +JcDtSr;aq=r;_EKJcC<$jT#2ZU&Y)lJcEUeJ,~> +JcE"Tr;an;[U&Y)lJcEUeJ,~> +JcE"Tr;an;[U&Y)lJcEUeJ,~> +JcE"Tr;an;[U&Y)lJcEUeJ,~> +JcE%UquFb:r;_EKJcC<$jo>;[U&Y)lJcEUeJ,~> +JcE%UquFb:r;_EKJcC<$jo>;[U&Y)lJcEUeJ,~> +JcE%UquFb:r;_EKJcC<$jo>;[U&Y)lJcEUeJ,~> +JcE(VquF\8r;_EKJcC<$k5YD\j8],Znc/Uhe,TCIJcEUeJ,~> +JcE(VquF\8r;_EKJcC<$k5YD\j8],Znc/Uhe,TCIJcEUeJ,~> +JcE(VquF\8r;_EKJcC<$k5YD\j8],Znc/Uhe,TCIJcEUeJ,~> +JcE(Vr;a_7r;_EKJcC<$kPtM]k5YA[nGi@cfDkgMJcEUeJ,~> +JcE(Vr;a_7r;_EKJcC<$kPtM]k5YA[nGi@cfDkgMJcEUeJ,~> +JcE(Vr;a_7r;_EKJcC<$kPtM]k5YA[nGi@cfDkgMJcEUeJ,~> +JcE+Wr;a\6quD +JcE+Wr;a\6quD +JcE+Wr;a\6quD +JcE.Xr;aV4quD +JcE.Xr;aV4quD +JcE.Xr;aV4quD +JcE1YquFJ2r;_EKJcC<$l2R4QJcEUeJ,~> +JcE1YquFJ2r;_EKJcC<$l2R4QJcEUeJ,~> +JcE1YquFJ2r;_EKJcC<$l2R4QJcEUeJ,~> +JcE4ZquFD0r;_EKJcC<$lMm=RJcEUeJ,~> +JcE4ZquFD0r;_EKJcC<$lMm=RJcEUeJ,~> +JcE4ZquFD0r;_EKJcC<$lMm=RJcEUeJ,~> +JcE4Zr;aG/r;_EKJcC<$f`1OCmJln\JcD5>J,~> +JcE4Zr;aG/r;_EKJcC<$f`1OCmJln\JcD5>J,~> +JcE4Zr;aG/r;_EKJcC<$f`1OCmJln\JcD5>J,~> +JcE7[r;aD.quD +JcE7[r;aD.quD +JcE7[r;aD.quD +JcE:\r;a>,r;_EKJcC<$eGo:Dm/Qh\JcD5>J,~> +JcE:\r;a>,r;_EKJcC<$eGo:Dm/Qh\JcD5>J,~> +JcE:\r;a>,r;_EKJcC<$eGo:Dm/Qh\JcD5>J,~> +JcE=]r;a8*r;_EKJcC<$f)PLFlMpVZJcD8?J,~> +JcE=]r;a8*r;_EKJcC<$f)PLFlMpVZJcD8?J,~> +JcE=]r;a8*r;_EKJcC<$f)PLFlMpVZJcD8?J,~> +JcE@^quF,(r;_EKJcC<$f`1jL!<;utlMpe_!<;rsJcD;@J,~> +JcE@^quF,(r;_EKJcC<$f`1jL!<;utlMpe_!<;rsJcD;@J,~> +JcE@^quF,(r;_EKJcC<$f`1jL!<;utlMpe_!<;rsJcD;@J,~> +JcEC_quF)'quDAJ,~> +JcEC_quF)'quDAJ,~> +JcEC_quF)'quDAJ,~> +JcEC_r;a,&r;_EKJcC<$gAh*OrVuisl2U__rr;lrJcDABJ,~> +JcEC_r;a,&r;_EKJcC<$gAh*OrVuisl2U__rr;lrJcDABJ,~> +JcEC_r;a,&r;_EKJcC<$gAh*OrVuisl2U__rr;lrJcDABJ,~> +JcEF`r;a&$r;_EKJcC<$h#I +JcEF`r;a&$r;_EKJcC<$h#I +JcEF`r;a&$r;_EKJcC<$h#I +JcEIar;`u"r;_EKJcC<$hZ*NSqu?Zrkl:Y_qu?QoJcDGDJ,~> +JcEIar;`u"r;_EKJcC<$hZ*NSqu?Zrkl:Y_qu?QoJcDGDJ,~> +JcEIar;`u"r;_EKJcC<$hZ*NSqu?Zrkl:Y_qu?QoJcDGDJ,~> +JcELbr;`r!quD +JcELbr;`r!quD +JcELbr;`r!quD +JcEOcquEetr;_EKJcC<$iW&iVq#: +JcEOcquEetr;_EKJcC<$iW&iVq#: +JcEOcquEetr;_EKJcC<$iW&iVq#: +JcERdquE_rr;_EKJcC<$j8]#We,T=GJcDPGJ,~> +JcERdquE_rr;_EKJcC<$j8]#We,T=GJcDPGJ,~> +JcERdquE_rr;_EKJcC<$j8]#We,T=GJcDPGJ,~> +JcERdr;`bqr;_EKJcC<$jo>5Yd/X%EJcDSHJ,~> +JcERdr;`bqr;_EKJcC<$jo>5Yd/X%EJcDSHJ,~> +JcERdr;`bqr;_EKJcC<$jo>5Yd/X%EJcDSHJ,~> +JcEUer;`\or;_EKJcC<$kPtG[cN!eBJcDYJJ,~> +JcEUer;`\or;_EKJcC<$kPtG[cN!eBJcDYJJ,~> +JcEUer;`\or;_EKJcC<$kPtG[cN!eBJcDYJJ,~> +JcEXfr;`YnquD +JcEXfr;`YnquD +JcEXfr;`YnquD +JcE[gquEMlr;_EKJcC<$lMpb^b5_A>JcD_LJ,~> +JcE[gquEMlr;_EKJcC<$lMpb^b5_A>JcD_LJ,~> +JcE[gquEMlr;_EKJcC<$lMpb^b5_A>JcD_LJ,~> +JcE^hquEGjr;_EKJcC<$m/Qt`aT)/ +JcE^hquEGjr;_EKJcC<$m/Qt`aT)/ +JcE^hquEGjr;_EKJcC<$m/Qt`aT)/ +JcE^hr;`Jir;_EKJcC<$mf31b`rGr:JcDeNJ,~> +JcE^hr;`Jir;_EKJcC<$mf31b`rGr:JcDeNJ,~> +JcE^hr;`Jir;_EKJcC<$mf31b`rGr:JcDeNJ,~> +JcEair;`GhquD +JcEair;`GhquD +JcEair;`GhquD +JcEdjr;`Afr;_EKJcC<$nc/Le_Z0N6JcDkPJ,~> +JcEdjr;`Afr;_EKJcC<$nc/Le_Z0N6JcDkPJ,~> +JcEdjr;`Afr;_EKJcC<$nc/Le_Z0N6JcDkPJ,~> +JcEgkr;`;dr;_EKJcC<$o)JXg_#O<4JcDnQJ,~> +JcEgkr;`;dr;_EKJcC<$o)JXg_#O<4JcDnQJ,~> +JcEgkr;`;dr;_EKJcC<$o)JXg_#O<4JcDnQJ,~> +JcEjlquE/br;_EKJcC<$o`+ji^An*2JcDqRJ,~> +JcEjlquE/br;_EKJcC<$o`+ji^An*2JcDqRJ,~> +JcEjlquE/br;_EKJcC<$o`+ji^An*2JcDqRJ,~> +JcEmmquE,aquD +JcEmmquE,aquD +JcEmmquE,aquD +JcEmmr;`/`r;_EKJcC<$p](0l])V[.JcE"TJ,~> +JcEmmr;`/`r;_EKJcC<$p](0l])V[.JcE"TJ,~> +JcEmmr;`/`r;_EKJcC<$p](0l])V[.JcE"TJ,~> +JcEpnr;`)^r;_EKJcC<$q>^Bn\GuI,JcE%UJ,~> +JcEpnr;`)^r;_EKJcC<$q>^Bn\GuI,JcE%UJ,~> +JcEpnr;`)^r;_EKJcC<$q>^Bn\GuI,JcE%UJ,~> +JcEsor;`#\r;_EKJcC<$qu?Tp[f?7*JcE(VJ,~> +JcEsor;`#\r;_EKJcC<$qu?Tp[f?7*JcE(VJ,~> +JcEsor;`#\r;_EKJcC<$qu?Tp[f?7*JcE(VJ,~> +JcF!pr;_u[quD +JcF!pr;_u[quD +JcF!pr;_u[quD +JcF$qquDiYquD +JcF$qquDiYquD +JcF$qquDiYquD +JcF'rquDcWr;_EKJcC<$!<;rsYlFV$JcE4ZJ,~> +JcF'rquDcWr;_EKJcC<$!<;rsYlFV$JcE4ZJ,~> +JcF'rquDcWr;_EKJcC<$!<;rsYlFV$JcE4ZJ,~> +JcF'rr;_fVr;_EKJcC?%quEo"quD +JcF'rr;_fVr;_EKJcC?%quEo"quD +JcF'rr;_fVr;_EKJcC?%quEo"quD +JcF*sr;_`Tr;_EKJcCE'quEhuquD +JcF*sr;_`Tr;_EKJcCE'quEhuquD +JcF*sr;_`Tr;_EKJcCE'quEhuquD +JcF-tr;_]SquD +JcF-tr;_]SquD +JcF-tr;_]SquD +JcF0uquDQQr;_EKJcCN*quE\qquD +JcF0uquDQQr;_EKJcCN*quE\qquD +JcF0uquDQQr;_EKJcCN*quE\qquD +JcF4!quDKOr;_EKJcCT,quEVoquD +JcF4!quDKOr;_EKJcCT,quEVoquD +JcF4!quDKOr;_EKJcCT,quEVoquD +JcF4!r;_NNr;_EKJcCZ.quEPmquD +JcF4!r;_NNr;_EKJcCZ.quEPmquD +JcF4!r;_NNr;_EKJcCZ.quEPmquD +JcF7"r;_KMquD +JcF7"r;_KMquD +JcF7"r;_KMquD +JcF:#r;_EKr;_EKJcC`0r;`MjquD +JcF:#r;_EKr;_EKJcC`0r;`MjquD +JcF:#r;_EKr;_EKJcC`0r;`MjquD +JcF=$r;_EKs8W#tJcC<$O8o.YT)\]gJcEOcJ,~> +JcF=$r;_EKs8W#tJcC<$O8o.YT)\]gJcEOcJ,~> +JcF=$r;_EKs8W#tJcC<$O8o.YT)\]gJcEOcJ,~> +JcF@%quD +JcF@%quD +JcF@%quD +JcFC&quD +JcFC&quD +JcFC&quD +JcFC&r;_EKqu?TpJcC<$PlL[^R/d'aJcEXfJ,~> +JcFC&r;_EKqu?TpJcC<$PlL[^R/d'aJcEXfJ,~> +JcFC&r;_EKqu?TpJcC<$PlL[^R/d'aJcEXfJ,~> +JcFF'r;_EKq>^BnJcC<$QN-j_QiHs`JcE[gJ,~> +JcFF'r;_EKq>^BnJcC<$QN-j_QiHs`JcE[gJ,~> +JcFF'r;_EKq>^BnJcC<$QN-j_QiHs`JcE[gJ,~> +JcFI(r;_EKp](0lJcC<$R/d'aPlL[^JcE^hJ,~> +JcFI(r;_EKp](0lJcC<$R/d'aPlL[^JcE^hJ,~> +JcFI(r;_EKp](0lJcC<$R/d'aPlL[^JcE^hJ,~> +JcFL)r;_EKp&FsjJcC<$RfE9cP5kF[JcEdjJ,~> +JcFL)r;_EKp&FsjJcC<$RfE9cP5kF[JcEdjJ,~> +JcFL)r;_EKp&FsjJcC<$RfE9cP5kF[JcEdjJ,~> +JcFO*quD +JcFO*quD +JcFO*quD +JcFR+quD +JcFR+quD +JcFR+quD +JcFR+r;_EKnc/OfJcC<$TE"fhN;reUJcEmmJ,~> +JcFR+r;_EKnc/OfJcC<$TE"fhN;reUJcEmmJ,~> +JcFR+r;_EKnc/OfJcC<$TE"fhN;reUJcEmmJ,~> +JcFU,r;_EKn,N=dJcC<$U&Y#jMZ +JcFU,r;_EKn,N=dJcC<$U&Y#jMZ +JcFU,r;_EKn,N=dJcC<$U&Y#jMZ +JcFX-r;_EKmf31bJcC<$U]:5lM#[AQJcEsoJ,~> +JcFX-r;_EKmf31bJcC<$U]:5lM#[AQJcEsoJ,~> +JcFX-r;_EKmf31bJcC<$U]:5lM#[AQJcEsoJ,~> +JcF[.quD +JcF[.quD +JcF[.quD +JcF^/quDpJoK`CrMJcF$qJ,~> +JcF^/quDpJoK`CrMJcF$qJ,~> +JcF^/quDpJoK`CrMJcF$qJ,~> +JcF^/r;_EKl2U\^JcC<$VuQ\qK)b`KJcF'rJ,~> +JcF^/r;_EKl2U\^JcC<$VuQ\qK)b`KJcF'rJ,~> +JcF^/r;_EKl2U\^JcC<$VuQ\qK)b`KJcF'rJ,~> +JcFa0r;_EKkl:P\JcC<$WW2nsJc>`MquD +JcFa0r;_EKkl:P\JcC<$WW2nsJc>`MquD +JcFa0r;_EKkl:P\JcC<$WW2nsJc>`MquD +JcFd1r;_EKk5YA[JcC<$WrN"tJcG`LquD +JcFd1r;_EKk5YA[JcC<$WrN"tJcG`LquD +JcFd1r;_EKk5YA[JcC<$WrN"tJcG`LquD +JcFg2r;_EKjT#/YJcC<$XT/5!JcGZJquD +JcFg2r;_EKjT#/YJcC<$XT/5!JcGZJquD +JcFg2r;_EKjT#/YJcC<$XT/5!JcGZJquD +JcFj3quD +JcFj3quD +JcFj3quD +JcFm4quD +JcFm4quD +JcFm4quD +JcFm4r;_EKi;``UJcC<$Z2a_%JcGHDr;_EKec1.~> +JcFm4r;_EKi;``UJcC<$Z2a_%JcGHDr;_EKec1.~> +JcFm4r;_EKi;``UJcC<$Z2a_%JcGHDr;_EKec1.~> +JcFp5r;_EKhZ*NSJcC<$ZiBq'JcGBBquD +JcFp5r;_EKhZ*NSJcC<$ZiBq'JcGBBquD +JcFp5r;_EKhZ*NSJcC<$ZiBq'JcGBBquD +JcFs6r;_EKh#I +JcFs6r;_EKh#I +JcFs6r;_EKh#I +JcG!7quDquD +JcG!7quDquD +JcG!7quDquD +JcG$8quD +JcG$8quD +JcG$8quD +JcG'9quD +JcG'9quD +JcG'9quD +JcG'9r;_EKf)P[KJcC<$]`7m0JcG$8quD +JcG'9r;_EKf)P[KJcC<$]`7m0JcG$8quD +JcG'9r;_EKf)P[KJcC<$]`7m0JcG$8quD +JcG*:r;_EKeGoIIJcC<$^&S$2JcFs6quD`!~> +JcG*:r;_EKeGoIIJcC<$^&S$2JcFs6quD`!~> +JcG*:r;_EKeGoIIJcC<$^&S$2JcFs6quD`!~> +JcG-;r;_EKe,T=GJcC<$^]464JcFm4quD +JcG-;r;_EKe,T=GJcC<$^]464JcFm4quD +JcG-;r;_EKe,T=GJcC<$^]464JcFm4quD +JcG0 +JcG0 +JcG0 +JcG3=quD +JcG3=quD +JcG3=quD +JcG3=r;_EKcN!hCJcC<$`;fc9JcF[.quD +JcG3=r;_EKcN!hCJcC<$`;fc9JcF[.quD +JcG3=r;_EKcN!hCJcC<$`;fc9JcF[.quD +JcG6>r;_EKc2[\AJcC<$`rGu;JcFU,quD +JcG6>r;_EKc2[\AJcC<$`rGu;JcFU,quD +JcG6>r;_EKc2[\AJcC<$`rGu;JcFU,quD +JcG9?r;_EKbQ%M@JcC<$a8c&;JcFR+quD +JcG9?r;_EKbQ%M@JcC<$a8c&;JcFR+quD +JcG9?r;_EKbQ%M@JcC<$a8c&;JcFR+quD +JcG<@r;_EKaoD;>JcC<$aoD8=JcFL)quD +JcG<@r;_EKaoD;>JcC<$aoD8=JcFL)quD +JcG<@r;_EKaoD;>JcC<$aoD8=JcFL)quD +JcG?AquD +JcG?AquD +JcG?AquD +JcGBBquD +JcGBBquD +JcGBBquD +JcGBBr;_EK`W,i9JcC<$ci +JcGBBr;_EK`W,i9JcC<$ci +JcGBBr;_EK`W,i9JcC<$ci +JcGECr;_EK_uKZ8JcC<$d/X"DJcF0uquD +JcGECr;_EK_uKZ8JcC<$d/X"DJcF0uquD +JcGECr;_EK_uKZ8JcC<$d/X"DJcF0uquD +JcGHDr;_EK_>jH6JcC<$df94FJcF*squD +JcGHDr;_EK_>jH6JcC<$df94FJcF*squD +JcGHDr;_EK_>jH6JcC<$df94FJcF*squD +JcGKEquD +JcGKEquD +JcGKEquD +JcGNFquD +JcGNFquD +JcGNFquD +JcGQGquD +JcGQGquD +JcGQGquD +JcGQGr;_EK]Dqg0JcC<$f`1mMJcEgkquD +JcGQGr;_EK]Dqg0JcC<$f`1mMJcEgkquD +JcGQGr;_EK]Dqg0JcC<$f`1mMJcEgkquD +JcGTHr;_EK\c;U.JcC<$gAh*OJcEaiquD +JcGTHr;_EK\c;U.JcC<$gAh*OJcEaiquD +JcGTHr;_EK\c;U.JcC<$gAh*OJcEaiquD +JcGWIr;_EK\GuI,JcC<$h#I +JcGWIr;_EK\GuI,JcC<$h#I +JcGWIr;_EK\GuI,JcC<$h#I +JcGZJquDdERJcEUequD +JcGZJquDdERJcEUequD +JcGZJquDdERJcEUequD +JcG]KquD +JcG]KquD +JcG]KquD +JcG]Kr;_EKZiBt(JcC<$iW&fUJcELbquD +JcG]Kr;_EKZiBt(JcC<$iW&fUJcELbquD +JcG]Kr;_EKZiBt(JcC<$iW&fUJcELbquD +JcG`Lr;_EKZN'h&JcC<$j8]#WJcEC_r;_EKo`'F~> +JcG`Lr;_EKZN'h&JcC<$j8]#WJcEC_r;_EKo`'F~> +JcG`Lr;_EKZN'h&JcC<$j8]#WJcEC_r;_EKo`'F~> +JcGcMr;_EKYlFY%JcC<$jT#,XJcE=]quD +JcGcMr;_EKYlFY%JcC<$jT#,XJcE=]quD +JcGcMr;_EKYlFY%JcC<$jT#,XJcE=]quD +Jc>`Mr;_EKY5eG#JcC<$k5Y>ZJcE7[quD +Jc>`Mr;_EKY5eG#JcC<$k5Y>ZJcE7[quD +Jc>`Mr;_EKY5eG#JcC<$k5Y>ZJcE7[quD +JcGWJJcDkPr;_EKJcFs6quD +JcGWJJcDkPr;_EKJcFs6quD +JcGWJJcDkPr;_EKJcFs6quD +K)b`KJcDeNr;_EKJcG$8quD +K)b`KJcDeNr;_EKJcG$8quD +K)b`KJcDeNr;_EKJcG$8quD +K)bcLJcDbMquD +K)bcLJcDbMquD +K)bcLJcDbMquD +KE(lMJcD\Kr;_EKJcG-;quD +KE(lMJcD\Kr;_EKJcG-;quD +KE(lMJcD\Kr;_EKJcG-;quD +K`CuNJcDVIr;_EKJcG0 +K`CuNJcDVIr;_EKJcG0 +K`CuNJcDVIr;_EKJcG0 +N;ikXqu?QoJcDSHr;c]o!!%TMJcGNFr;_EKXT/1uJcG]KJ,~> +N;ikXqu?QoJcDSHr;c]o!!%TMJcGNFr;_EKXT/1uJcG]KJ,~> +N;ikXqu?QoJcDSHr;c]o!!%TMJcGNFr;_EKXT/1uJcG]KJ,~> +N;ikXr;ZZpJcDPGquHZprr@WMJc>]MqZ$KoJcDbMquHQm!!%fSJ,~> +N;ikXr;ZZpJcDPGquHZprr@WMJc>]MqZ$KoJcDbMquHQm!!%fSJ,~> +N;ikXr;ZZpJcDPGquHZprr@WMJc>]MqZ$KoJcDbMquHQm!!%fSJ,~> +NW9"Yr;Z]qJcDJEr;ccqrr@WMJcG`Mr;Z]qJcD\KquHTn!!%fSJ,~> +NW9"Yr;Z]qJcDJEr;ccqrr@WMJcG`Mr;Z]qJcD\KquHTn!!%fSJ,~> +NW9"Yr;Z]qJcDJEr;ccqrr@WMJcG`Mr;Z]qJcD\KquHTn!!%fSJ,~> +NW8tXrr;osJcDDCr;cfrrr@WMJcG`MrVufrJcDVIquHZprr@iSJ,~> +NW8tXrr;osJcDDCr;cfrrr@WMJcG`MrVufrJcDVIquHZprr@iSJ,~> +NW8tXrr;osJcDDCr;cfrrr@WMJcG`MrVufrJcDVIquHZprr@iSJ,~> +NW8tXs8W#tJcD>Ar;cltrW%NLK)bfMrr;osJcDPGquH]qrW%cSJ,~> +NW8tXs8W#tJcD>Ar;cltrW%NLK)bfMrr;osJcDPGquH]qrW%cSJ,~> +NW8tXs8W#tJcD>Ar;cltrW%NLK)bfMrr;osJcDPGquH]qrW%cSJ,~> +NW8tX!<;utJcD;@qu?`sr;_EKKE(lM!<;rsJcDMFquH`rrW%cSJ,~> +NW8tX!<;utJcD;@qu?`sr;_EKKE(lM!<;rsJcDMFquH`rrW%cSJ,~> +NW8tX!<;utJcD;@qu?`sr;_EKKE(lM!<;rsJcDMFquH`rrW%cSJ,~> +NW8eSJcD8?r;Zitr;_EKKE(]HJcDGDquHcsr;_]SJ,~> +NW8eSJcD8?r;Zitr;_EKKE(]HJcDGDquHcsr;_]SJ,~> +NW8eSJcD8?r;Zitr;_EKKE(]HJcDGDquHcsr;_]SJ,~> +NrSnTJcD2=q#H!GKE(`IJcD>Ar;Zitr;_]SJ,~> +NrSnTJcD2=q#H!GKE(`IJcD>Ar;Zitr;_]SJ,~> +NrSnTJcD2=q#H!GKE(`IJcD>Ar;Zitr;_]SJ,~> +NrSqUJcD,;q>c*HK`CiJJcD8?q#H9OJ,~> +NrSqUJcD,;q>c*HK`CiJJcD8?q#H9OJ,~> +NrSqUJcD,;q>c*HK`CiJJcD8?q#H9OJ,~> +NrSeQJcDMFo)O@AK`CfIJcD8?q#H +NrSeQJcDMFo)O@AK`CfIJcD8?q#H +NrSeQJcDMFo)O@AK`CfIJcD8?q#H +NrS\NJcDSHo)O@AL&^`EJcDJEp]-3OJ,~> +NrS\NJcDSHo)O@AL&^`EJcDJEp]-3OJ,~> +NrS\NJcDSHo)O@AL&^`EJcDJEp]-3OJ,~> +O8nhPJcDDCp&K[DL&^cFJcDPGoDjgLJ,~> +O8nhPJcDDCp&K[DL&^cFJcDPGoDjgLJ,~> +O8nhPJcDDCp&K[DL&^cFJcDPGoDjgLJ,~> +O8nqSJcD5>p],mFLB$oHJcDPGnc4UJJ,~> +O8nqSJcD5>p],mFLB$oHJcDPGnc4UJJ,~> +O8nqSJcD5>p],mFLB$oHJcDPGnc4UJJ,~> +O8o"UJcD):q>c*HLB%#KJcDABo)OaLJ,~> +O8o"UJcD):q>c*HLB%#KJcDABo)OaLJ,~> +O8o"UJcD):q>c*HLB%#KJcDABo)OaLJ,~> +O8o(WJcCr6quD +O8o(WJcCr6quD +O8o(WJcCr6quD +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9lMpkaaT)8?p&G!kJcG-;rW)6`rrC.?rrD`lrW%NLmJm.clMpkaaT)8?p&G!kJcG-;rW)6` +rrC.?rrD`lrW'_5J,~> +_uK]9lMpkaaT)8?p&G!kJcG-;rW)6`rrC.?rrD`lrW%NLmJm.clMpkaaT)8?p&G!kJcG-;rW)6` +rrC.?rrD`lrW'_5J,~> +_uK]9lMpkaaT)8?p&G!kJcG-;rW)6`rrC.?rrD`lrW%NLmJm.clMpkaaT)8?p&G!kJcG-;rW)6` +rrC.?rrD`lrW'_5J,~> +_uK]9m/R"ab5_D?p&G!kJcG-;rW) +_uK]9m/R"ab5_D?p&G!kJcG-;rW) +_uK]9m/R"ab5_D?p&G!kJcG-;rW) +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9li6qaaoD>?p&G!kJcG-;rW)9arW((?rW)WkrW%NLmJm.cli6qaaoD>?p&G!kJcG-;rW)9a +rW((?rW)WkrW'_5J,~> +_uK]9p&FmhrVuisrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kJcG-;rW)Wk +qZ-TprW)osrW)rtr;c`p!W`9#rW)rtrrE*!rW)lrrW)fpr;ZitrW)WkrW%NLmJm.cp&FmhrVuis +rVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kJcG-;rW)WkqZ-TprW)osrW)rt +r;c`p!W`9#rW)rtrrE*!rW)lrrW)fpr;ZitrW)WkrW'_5J,~> +_uK]9p&FmhrVuisrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kJcG-;rW)Wk +qZ-TprW)osrW)rtr;c`p!W`9#rW)rtrrE*!rW)lrrW)fpr;ZitrW)WkrW%NLmJm.cp&FmhrVuis +rVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kJcG-;rW)WkqZ-TprW)osrW)rt +r;c`p!W`9#rW)rtrrE*!rW)lrrW)fpr;ZitrW)WkrW'_5J,~> +_uK]9p&FmhrVuisrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kJcG-;rW)Wk +qZ-TprW)osrW)rtr;c`p!W`9#rW)rtrrE*!rW)lrrW)fpr;ZitrW)WkrW%NLmJm.cp&FmhrVuis +rVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kJcG-;rW)WkqZ-TprW)osrW)rt +r;c`p!W`9#rW)rtrrE*!rW)lrrW)fpr;ZitrW)WkrW'_5J,~> +_uK]9pAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kJcG-;rW)ZlrrE&u +rrE#trW)osrW)lrrW)uuo)JdjquHcsqZ-QorrE&ur;cNjrW%NLmJm.cpAb-mrr;uurVuisrVuis +r;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kJcG-;rW)ZlrrE&urrE#trW)osrW)lrrW)uuo)Jdj +quHcsqZ-QorrE&ur;cNjrW'_5J,~> +_uK]9pAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kJcG-;rW)ZlrrE&u +rrE#trW)osrW)lrrW)uuo)JdjquHcsqZ-QorrE&ur;cNjrW%NLmJm.cpAb-mrr;uurVuisrVuis +r;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kJcG-;rW)ZlrrE&urrE#trW)osrW)lrrW)uuo)Jdj +quHcsqZ-QorrE&ur;cNjrW'_5J,~> +_uK]9pAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kJcG-;rW)ZlrrE&u +rrE#trW)osrW)lrrW)uuo)JdjquHcsqZ-QorrE&ur;cNjrW%NLmJm.cpAb-mrr;uurVuisrVuis +r;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kJcG-;rW)ZlrrE&urrE#trW)osrW)lrrW)uuo)Jdj +quHcsqZ-QorrE&ur;cNjrW'_5J,~> +_uK]9p](3mrVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`rp&G!kJcG-;rW)]m +rW)os!!)utrW)lrrW)osrW)rtq#LHpr;cisr;cfrrrE#trrDusrW)WkrW%NLmJm.cp](3mrVlit +rVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`rp&G!kJcG-;rW)]mrW)os!!)utrW)lr +rW)osrW)rtq#LHpr;cisr;cfrrrE#trrDusrW)WkrW'_5J,~> +_uK]9p](3mrVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`rp&G!kJcG-;rW)]m +rW)os!!)utrW)lrrW)osrW)rtq#LHpr;cisr;cfrrrE#trrDusrW)WkrW%NLmJm.cp](3mrVlit +rVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`rp&G!kJcG-;rW)]mrW)os!!)utrW)lr +rW)osrW)rtq#LHpr;cisr;cfrrrE#trrDusrW)WkrW'_5J,~> +_uK]9p](3mrVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`rp&G!kJcG-;rW)]m +rW)os!!)utrW)lrrW)osrW)rtq#LHpr;cisr;cfrrrE#trrDusrW)WkrW%NLmJm.cp](3mrVlit +rVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`rp&G!kJcG-;rW)]mrW)os!!)utrW)lr +rW)osrW)rtq#LHpr;cisr;cfrrrE#trrDusrW)WkrW'_5J,~> +_uK]9p](3mrVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kJcG-;rW)]m +rW)os!!)utrW)lrrW)osrW)osrW)iqrW)osr;cfrrW)uurW)lrrW)WkrW%NLmJm.cp](3mrVlit +rVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kJcG-;rW)]mrW)os!!)utrW)lr +rW)osrW)osrW)iqrW)osr;cfrrW)uurW)lrrW)WkrW'_5J,~> +_uK]9p](3mrVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kJcG-;rW)]m +rW)os!!)utrW)lrrW)osrW)osrW)iqrW)osr;cfrrW)uurW)lrrW)WkrW%NLmJm.cp](3mrVlit +rVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kJcG-;rW)]mrW)os!!)utrW)lr +rW)osrW)osrW)iqrW)osr;cfrrW)uurW)lrrW)WkrW'_5J,~> +_uK]9p](3mrVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kJcG-;rW)]m +rW)os!!)utrW)lrrW)osrW)osrW)iqrW)osr;cfrrW)uurW)lrrW)WkrW%NLmJm.cp](3mrVlit +rVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kJcG-;rW)]mrW)os!!)utrW)lr +rW)osrW)osrW)iqrW)osr;cfrrW)uurW)lrrW)WkrW'_5J,~> +_uK]9p](3mq#C +_uK]9p](3mq#C +_uK]9p](3mq#C +_uK]9pAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kJcG-;rW)Zlr;c]o +rW)lrrW)osrW)osrW)iqrW)osr;cfrrW)uurrDrrrW)WkrW%NLmJm.cpAb'kqZ$Npr;Z`rrVuis +rVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kJcG-;rW)Zlr;c]orW)lrrW)osrW)osrW)iqrW)os +r;cfrrW)uurrDrrrW)WkrW'_5J,~> +_uK]9pAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kJcG-;rW)Zlr;c]o +rW)lrrW)osrW)osrW)iqrW)osr;cfrrW)uurrDrrrW)WkrW%NLmJm.cpAb'kqZ$Npr;Z`rrVuis +rVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kJcG-;rW)Zlr;c]orW)lrrW)osrW)osrW)iqrW)os +r;cfrrW)uurrDrrrW)WkrW'_5J,~> +_uK]9pAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kJcG-;rW)Zlr;c]o +rW)lrrW)osrW)osrW)iqrW)osr;cfrrW)uurrDrrrW)WkrW%NLmJm.cpAb'kqZ$Npr;Z`rrVuis +rVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kJcG-;rW)Zlr;c]orW)lrrW)osrW)osrW)iqrW)os +r;cfrrW)uurrDrrrW)WkrW'_5J,~> +_uK]9p&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)WkquHZp +rW)lrrW)osrW)osrW)iqrW)lrrW)osrVururW)iqrW)WkrW%NLmJm.cp&Fpir;Z`rr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)WkquHZprW)lrrW)osrW)osrW)iqrW)lr +rW)osrVururW)iqrW)WkrW'_5J,~> +_uK]9p&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)WkquHZp +rW)lrrW)osrW)osrW)iqrW)lrrW)osrVururW)iqrW)WkrW%NLmJm.cp&Fpir;Z`rr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)WkquHZprW)lrrW)osrW)osrW)iqrW)lr +rW)osrVururW)iqrW)WkrW'_5J,~> +_uK]9p&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)WkquHZp +rW)lrrW)osrW)osrW)iqrW)lrrW)osrVururW)iqrW)WkrW%NLmJm.cp&Fpir;Z`rr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)WkquHZprW)lrrW)osrW)osrW)iqrW)lr +rW)osrVururW)iqrW)WkrW'_5J,~> +_uK]9o`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)TjquH]q +rW)lrrW)osrW)osrW)iqrW)lrrW)osrVururW)iqrW)WkrW%NLmJm.co`+ghrVuisr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)TjquH]qrW)lrrW)osrW)osrW)iqrW)lr +rW)osrVururW)iqrW)WkrW'_5J,~> +_uK]9o`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)TjquH]q +rW)lrrW)osrW)osrW)iqrW)lrrW)osrVururW)iqrW)WkrW%NLmJm.co`+ghrVuisr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)TjquH]qrW)lrrW)osrW)osrW)iqrW)lr +rW)osrVururW)iqrW)WkrW'_5J,~> +_uK]9o`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)TjquH]q +rW)lrrW)osrW)osrW)iqrW)lrrW)osrVururW)iqrW)WkrW%NLmJm.co`+ghrVuisr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kJcG-;rW)TjquH]qrW)lrrW)osrW)osrW)iqrW)lr +rW)osrVururW)iqrW)WkrW'_5J,~> +_uK]9o)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kJcG-;rW)Nhr;cis +rW)lrrW)osrW)osrW)iqrW)lrrW)osrVurur;ccqrW)WkrW%NLmJm.co)JXgrr;rtr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kJcG-;rW)Nhr;cisrW)lrrW)osrW)osrW)iqrW)lr +rW)osrVurur;ccqrW)WkrW'_5J,~> +_uK]9o)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kJcG-;rW)Nhr;cis +rW)lrrW)osrW)osrW)iqrW)lrrW)osrVurur;ccqrW)WkrW%NLmJm.co)JXgrr;rtr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kJcG-;rW)Nhr;cisrW)lrrW)osrW)osrW)iqrW)lr +rW)osrVurur;ccqrW)WkrW'_5J,~> +_uK]9o)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kJcG-;rW)Nhr;cis +rW)lrrW)osrW)osrW)iqrW)lrrW)osrVurur;ccqrW)WkrW%NLmJm.co)JXgrr;rtr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kJcG-;rW)Nhr;cisrW)lrrW)osrW)osrW)iqrW)lr +rW)osrVurur;ccqrW)WkrW'_5J,~> +_uK]9p\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kJcG-;rW)]m +!!)rsrW)rtrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)lrrW)WkrW%NLmJm.cp\t3nr;Z`r +rr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kJcG-;rW)]m!!)rsrW)rtrW)lr +rW)osrW)osrW)iqrW)lrrW)osrW)uurW)lrrW)WkrW'_5J,~> +_uK]9p\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kJcG-;rW)]m +!!)rsrW)rtrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)lrrW)WkrW%NLmJm.cp\t3nr;Z`r +rr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kJcG-;rW)]m!!)rsrW)rtrW)lr +rW)osrW)osrW)iqrW)lrrW)osrW)uurW)lrrW)WkrW'_5J,~> +_uK]9p\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kJcG-;rW)]m +!!)rsrW)rtrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uurW)lrrW)WkrW%NLmJm.cp\t3nr;Z`r +rr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kJcG-;rW)]m!!)rsrW)rtrW)lr +rW)osrW)osrW)iqrW)lrrW)osrW)uurW)lrrW)WkrW'_5J,~> +_uK]9p](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kJcG-;rW)]m +rrE#trW)rtrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uur;cfrrW)WkrW%NLmJm.cp](6nrVuis +rr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kJcG-;rW)]mrrE#trW)rtrW)lr +rW)osrW)osrW)iqrW)lrrW)osrW)uur;cfrrW)WkrW'_5J,~> +_uK]9p](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kJcG-;rW)]m +rrE#trW)rtrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uur;cfrrW)WkrW%NLmJm.cp](6nrVuis +rr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kJcG-;rW)]mrrE#trW)rtrW)lr +rW)osrW)osrW)iqrW)lrrW)osrW)uur;cfrrW)WkrW'_5J,~> +_uK]9p](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kJcG-;rW)]m +rrE#trW)rtrW)lrrW)osrW)osrW)iqrW)lrrW)osrW)uur;cfrrW)WkrW%NLmJm.cp](6nrVuis +rr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kJcG-;rW)]mrrE#trW)rtrW)lr +rW)osrW)osrW)iqrW)lrrW)osrW)uur;cfrrW)WkrW'_5J,~> +_uK]9p](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mJcG-;rW)]mrrE#trrE#t +rW)lrp&P*lrW)iqrW)osr;cfrrW)rto`4adrW%NLmJm.cp](6nrVultrVuisr;ZHjrr;rtqu?Wq +rVufrrVuisrr;Wkp](3mJcG-;rW)]mrrE#trrE#trW)lrp&P*lrW)iqrW)osr;cfrrW)rto`4ad +rW'_5J,~> +_uK]9p](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mJcG-;rW)]mrrE#trrE#t +rW)lrp&P*lrW)iqrW)osr;cfrrW)rto`4adrW%NLmJm.cp](6nrVultrVuisr;ZHjrr;rtqu?Wq +rVufrrVuisrr;Wkp](3mJcG-;rW)]mrrE#trrE#trW)lrp&P*lrW)iqrW)osr;cfrrW)rto`4ad +rW'_5J,~> +_uK]9p](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mJcG-;rW)]mrrE#trrE#t +rW)lrp&P*lrW)iqrW)osr;cfrrW)rto`4adrW%NLmJm.cp](6nrVultrVuisr;ZHjrr;rtqu?Wq +rVufrrVuisrr;Wkp](3mJcG-;rW)]mrrE#trrE#trW)lrp&P*lrW)iqrW)osr;cfrrW)rto`4ad +rW'_5J,~> +_uK]9p]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kJcG-;rW)]mq>gKoqZ-Tp +qu?`sr;ZitqZ-TpquHcsqZ-ZrquH`rp]1!erW%NLmJm.cp]('irVu`prVucq!<;ut!<;orrVucq +s8Vrrs8Vusrr;`np&G!kJcG-;rW)]mq>gKoqZ-Tpqu?`sr;ZitqZ-TpquHcsqZ-ZrquH`rp]1!e +rW'_5J,~> +_uK]9p]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kJcG-;rW)]mq>gKoqZ-Tp +qu?`sr;ZitqZ-TpquHcsqZ-ZrquH`rp]1!erW%NLmJm.cp]('irVu`prVucq!<;ut!<;orrVucq +s8Vrrs8Vusrr;`np&G!kJcG-;rW)]mq>gKoqZ-Tpqu?`sr;ZitqZ-TpquHcsqZ-ZrquH`rp]1!e +rW'_5J,~> +_uK]9p]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kJcG-;rW)]mq>gKoqZ-Tp +qu?`sr;ZitqZ-TpquHcsqZ-ZrquH`rp]1!erW%NLmJm.cp]('irVu`prVucq!<;ut!<;orrVucq +s8Vrrs8Vusrr;`np&G!kJcG-;rW)]mq>gKoqZ-Tpqu?`sr;ZitqZ-TpquHcsqZ-ZrquH`rp]1!e +rW'_5J,~> +_uK]9oDegjnG`Igf)PaMnGiIfJcG-;rW)QirrDQg!!(UMrrDQgrW%NLmJm.coDegjnG`Igf)PaM +nGiIfJcG-;rW)QirrDQg!!(UMrrDQgrW'_5J,~> +_uK]9oDegjnG`Igf)PaMnGiIfJcG-;rW)QirrDQg!!(UMrrDQgrW%NLmJm.coDegjnG`Igf)PaM +nGiIfJcG-;rW)QirrDQg!!(UMrrDQgrW'_5J,~> +_uK]9oDegjnG`Igf)PaMnGiIfJcG-;rW)QirrDQg!!(UMrrDQgrW%NLmJm.coDegjnG`Igf)PaM +nGiIfJcG-;rW)QirrDQg!!(UMrrDQgrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9U&Y)lJcG-;rW&YlrW%NLmJm.cU&Y)lJcG-;rW&YlrW'_5J,~> +_uK]9ir8uYl2Ub`g].6QJcG-;rW(sX!!(sW!!)'ZrW%NLmJm.cir8uYi;WcWj8])YJcG-;rW(sX +!!(sW!!)'ZrW'_5J,~> +_uK]9ir8uYl2Ub`g].6QJcG-;rW(sX!!(sW!!)'ZrW%NLmJm.cir8uYi;WcWj8])YJcG-;rW(sX +!!(sW!!)'ZrW'_5J,~> +_uK]9ir8uYl2Ub`g].6QJcG-;rW(sX!!(sW!!)'ZrW%NLmJm.cir8uYi;WcWj8])YJcG-;rW(sX +!!(sW!!)'ZrW'_5J,~> +_uK]9j8],Zl2U__h#I?RJcG-;rW)!YrrD$XrW)$ZrW%NLmJm.cj8],Zi;`fWjT#2ZJcG-;rW)!Y +rrD!WrrD-[rW'_5J,~> +_uK]9j8],Zl2U__h#I?RJcG-;rW)!YrrD$XrW)$ZrW%NLmJm.cj8],Zi;`fWjT#2ZJcG-;rW)!Y +rrD!WrrD-[rW'_5J,~> +_uK]9j8],Zl2U__h#I?RJcG-;rW)!YrrD$XrW)$ZrW%NLmJm.cj8],Zi;`fWjT#2ZJcG-;rW)!Y +rrD!WrrD-[rW'_5J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +_uH2+JcG-;RfJ$>mJiXUJcG-;RfL5'J,~> +VuQPmlMp\\JcDkPq#KFSq>c*H[/]t&irAfSJcE.Xq>fOTq#I5jJ,~> +VuQPmlMp\\JcDkPq#KFSq>c*H[/]t&irAfSJcE.Xq>fOTq#I5jJ,~> +VuQPmlMp\\JcDkPq#KFSq>c*H[/]t&irAfSJcE.Xq>fOTq#I5jJ,~> +W;lVmli6_[JcDqRp]0@Sq#H!G[K$%&irAcRJcE4Zq#KFSp]./jJ,~> +W;lVmli6_[JcDqRp]0@Sq#H!G[K$%&irAcRJcE4Zq#KFSp]./jJ,~> +W;lVmli6_[JcDqRp]0@Sq#H!G[K$%&irAcRJcE4Zq#KFSp]./jJ,~> +WW2\mli6\ZJcE"TpAj7Rp],mF[f?+&j8\iRJcE7[p]0@SpAh)jJ,~> +WW2\mli6\ZJcE"TpAj7Rp],mF[f?+&j8\iRJcE7[p]0@SpAh)jJ,~> +WW2\mli6\ZJcE"TpAj7Rp],mF[f?+&j8\iRJcE7[p]0@SpAh)jJ,~> +WrMbmli6YYJcE(Vp&O.QpAfdE\Gu:'j8\fQJcE=]pAj7Rp&M#jJ,~> +WrMbmli6YYJcE(Vp&O.QpAfdE\Gu:'j8\fQJcE=]pAj7Rp&M#jJ,~> +WrMbmli6YYJcE(Vp&O.QpAfdE\Gu:'j8\fQJcE=]pAj7Rp&M#jJ,~> +X8hhmli6VXJcE.Xo`4%Pp&K[D])VI(j8\cPJcEC_p&O.Qo`1rjJ,~> +X8hhmli6VXJcE.Xo`4%Pp&K[D])VI(j8\cPJcEC_p&O.Qo`1rjJ,~> +X8hhmli6VXJcE.Xo`4%Pp&K[D])VI(j8\cPJcEC_p&O.Qo`1rjJ,~> +XT/1u!<;lqli6e]!<;rsJcE4Zqu?`sq>fRUo`0RC]`7X)jT#&V!<;orJcEIao`4(Qq>^NqqZ*Vq +J,~> +XT/1u!<;lqli6e]!<;rsJcE4Zqu?`sq>fRUo`0RC]`7X)jT#&V!<;orJcEIao`4(Qq>^NqqZ*Vq +J,~> +XT/1u!<;lqli6e]!<;rsJcE4Zqu?`sq>fRUo`0RC]`7X)jT#&V!<;orJcEIao`4(Qq>^NqqZ*Vq +J,~> +XoJD$rVuWmm/Qn^r;ZcsJcE:\rrE#tp]0FUq#LHpr;_EK^An-3!<;ipjT##Ur;Q`sJcELbr;Zit +q#KLUq#L?m!!'"uJ,~> +XoJD$rVuWmm/Qn^r;ZcsJcE:\rrE#tp]0FUq#LHpr;_EK^An-3!<;ipjT##Ur;Q`sJcELbr;Zit +q#KLUq#L?m!!'"uJ,~> +XoJD$rVuWmm/Qn^r;ZcsJcE:\rrE#tp]0FUq#LHpr;_EK^An-3!<;ipjT##Ur;Q`sJcELbr;Zit +q#KLUq#L?m!!'"uJ,~> +VuQ_rs8W#tm/R%b!<;utJcDkPrW)uur;bsZr;ZitrW)lr!!%TM^]4<6rVuiss8W#tjo>8Z!<<#u +JcE=]rrE#trW)uur;bsZr;ZitrW&_nJ,~> +VuQ_rs8W#tm/R%b!<;utJcDkPrW)uur;bsZr;ZitrW)lr!!%TM^]4<6rVuiss8W#tjo>8Z!<<#u +JcE=]rrE#trW)uur;bsZr;ZitrW&_nJ,~> +VuQ_rs8W#tm/R%b!<;utJcDkPrW)uur;bsZr;ZitrW)lr!!%TM^]4<6rVuiss8W#tjo>8Z!<<#u +JcE=]rrE#trW)uur;bsZr;ZitrW&_nJ,~> +VuQ_rrr;rtm/R(crr;rtJcDkPrW)rtrW)'[rW)uurW%NLZiC")rr;rtjo>;[s8W&uJcE+WrW)rt +rW)'[rW)uurW&_nJ,~> +VuQ_rrr;rtm/R(crr;rtJcDkPrW)rtrW)'[rW)uurW%NLZiC")rr;rtjo>;[s8W&uJcE+WrW)rt +rW)'[rW)uurW&_nJ,~> +VuQ_rrr;rtm/R(crr;rtJcDkPrW)rtrW)'[rW)uurW%NLZiC")rr;rtjo>;[s8W&uJcE+WrW)rt +rW)'[rW)uurW&_nJ,~> +W;lerrVultmJm.crr;osJcDqRr;cfrrrD0\rrE&ur;_EK[K$1*rVultjo>>\rr;osJcE1Yr;cfr +rrD0\rrE&ur;`YnJ,~> +W;lerrVultmJm.crr;osJcDqRr;cfrrrD0\rrE&ur;_EK[K$1*rVultjo>>\rr;osJcE1Yr;cfr +rrD0\rrE&ur;`YnJ,~> +W;lerrVultmJm.crr;osJcDqRr;cfrrrD0\rrE&ur;_EK[K$1*rVultjo>>\rr;osJcE1Yr;cfr +rrD0\rrE&ur;`YnJ,~> +W;lhsqu6WrmJm1drVufrJcDqRrW)iq!!)0]rrE#tr;_EK[K$1*r;Q`sjo5;\r;Z`rJcE1Yr;ccq +!!)-\!!)rsrW&boJ,~> +W;lhsqu6WrmJm1drVufrJcDqRrW)iq!!)0]rrE#tr;_EK[K$1*r;Q`sjo5;\r;Z`rJcE1Yr;ccq +!!)-\!!)rsrW&boJ,~> +W;lhsqu6WrmJm1drVufrJcDqRrW)iq!!)0]rrE#tr;_EK[K$1*r;Q`sjo5;\r;Z`rJcE1Yr;ccq +!!)-\!!)rsrW&boJ,~> +WW2nsqu6WrmJd.dqu?WqJcDtSr;c`p!!)0]!!)orrW%NL[K$4+f`1mMJcE4ZrW(UNr;`\oJ,~> +WW2nsqu6WrmJd.dqu?WqJcDtSr;c`p!!)0]!!)orrW%NL[K$4+f`1mMJcE4ZrW(UNr;`\oJ,~> +WW2nsqu6WrmJd.dqu?WqJcDtSr;c`p!!)0]!!)orrW%NL[K$4+f`1mMJcE4ZrW(UNr;`\oJ,~> +WW2nshuEWTJcE"Tr;bLMrW%NL[K$4+f`1mMJcE4ZrW(UNr;`\oJ,~> +WW2nshuEWTJcE"Tr;bLMrW%NL[K$4+f`1mMJcE4ZrW(UNr;`\oJ,~> +WW2nshuEWTJcE"Tr;bLMrW%NL[K$4+f`1mMJcE4ZrW(UNr;`\oJ,~> +WW2qthZ*NSJcE"TrW(RMr;_EK\,ZC,fDkgMJcE7[r;bILrW&epJ,~> +WW2qthZ*NSJcE"TrW(RMr;_EK\,ZC,fDkgMJcE7[r;bILrW&epJ,~> +WW2qthZ*NSJcE"TrW(RMr;_EK\,ZC,fDkgMJcE7[r;bILrW&epJ,~> +WrN"th>dHSJcE%Ur;bFKrW%NL\,ZF-f)P[KJcE:\rW(OLr;`_pJ,~> +WrN"th>dHSJcE%Ur;bFKrW%NL\,ZF-f)P[KJcE:\rW(OLr;`_pJ,~> +WrN"th>dHSJcE%Ur;bFKrW%NL\,ZF-f)P[KJcE:\rW(OLr;`_pJ,~> +WrN"th>dERJcE(Vr;bFKrW%NL\,ZF-f)P[KJcE:\rW(OLr;`_pJ,~> +WrN"th>dERJcE(Vr;bFKrW%NL\,ZF-f)P[KJcE:\rW(OLr;`_pJ,~> +WrN"th>dERJcE(Vr;bFKrW%NL\,ZF-f)P[KJcE:\rW(OLr;`_pJ,~> +WrN%uh#I +WrN%uh#I +WrN%uh#I +X8i+ug].6QJcE+Wr;bCJr;_EK\c;U.ec5RJJcE@^r;bCJr;`bqJ,~> +X8i+ug].6QJcE+Wr;bCJr;_EK\c;U.ec5RJJcE@^r;bCJr;`bqJ,~> +X8i+ug].6QJcE+Wr;bCJr;_EK\c;U.ec5RJJcE@^r;bCJr;`bqJ,~> +X8i/!gAh*OJcE.XrW(FIrW%NL\c;X/e,TCIJcE@^rW(FIrW&krJ,~> +X8i/!gAh*OJcE.XrW(FIrW%NL\c;X/e,TCIJcE@^rW(FIrW&krJ,~> +X8i/!gAh*OJcE.XrW(FIrW%NL\c;X/e,TCIJcE@^rW(FIrW&krJ,~> +X8i/!g&M$OJcE.XrW(FIrW%NL\c;X/e,TCIJcE@^rW(FIrW&krJ,~> +X8i/!g&M$OJcE.XrW(FIrW%NL\c;X/e,TCIJcE@^rW(FIrW&krJ,~> +X8i/!g&M$OJcE.XrW(FIrW%NL\c;X/e,TCIJcE@^rW(FIrW&krJ,~> +XT/5!g&M$OJcE1Yr;b=Hr;_EK]Dqg0e,T@HJcEF`r;b=Hr;`erJ,~> +XT/5!g&M$OJcE1Yr;b=Hr;_EK]Dqg0e,T@HJcEF`r;b=Hr;`erJ,~> +XT/5!g&M$OJcE1Yr;b=Hr;_EK]Dqg0e,T@HJcEF`r;b=Hr;`erJ,~> +XT/8"f`1mMJcE4ZrW(@GrW%NL]Dqj1dJs1GJcEF`rW(@GrW&nsJ,~> +XT/8"f`1mMJcE4ZrW(@GrW%NL]Dqj1dJs1GJcEF`rW(@GrW&nsJ,~> +XT/8"f`1mMJcE4ZrW(@GrW%NL]Dqj1dJs1GJcEF`rW(@GrW&nsJ,~> +XT/8"fDkgMJcE4ZrW(@GrW%NL]Dqj1dJs1GJcEF`rW(@GrW&nsJ,~> +XT/8"fDkgMJcE4ZrW(@GrW%NL]Dqj1dJs1GJcEF`rW(@GrW&nsJ,~> +XT/8"fDkgMJcE4ZrW(@GrW%NL]Dqj1dJs1GJcEF`rW(@GrW&nsJ,~> +XoJ>"fDkdLJcE:\r;b7Fr;_EK^&S$2dJs.FJcELbr;b7Fr;`hsJ,~> +XoJ>"fDkdLJcE:\r;b7Fr;_EK^&S$2dJs.FJcELbr;b7Fr;`hsJ,~> +XoJ>"fDkdLJcE:\r;b7Fr;_EK^&S$2dJs.FJcELbr;b7Fr;`hsJ,~> +XoJA#f)P[KJcE:\rW(=Fr;_EK^&S$2d/X(FJcELbr;b4ErW&qtJ,~> +XoJA#f)P[KJcE:\rW(=Fr;_EK^&S$2d/X(FJcELbr;b4ErW&qtJ,~> +XoJA#f)P[KJcE:\rW(=Fr;_EK^&S$2d/X(FJcELbr;b4ErW&qtJ,~> +Y5eG#ec5UKJcE=]r;b1DrW%NL^&S'3ci +Y5eG#ec5UKJcE=]r;b1DrW%NL^&S'3ci +Y5eG#ec5UKJcE=]r;b1DrW%NL^&S'3ci +Y5eG#ec5RJJcE@^r;b1DrW%NL^&S'3ci +Y5eG#ec5RJJcE@^r;b1DrW%NL^&S'3ci +Y5eG#ec5RJJcE@^r;b1DrW%NL^&S'3ci +Y5eJ$eGoIIJcE@^rW(7Dr;_EK^]464cN!kDJcERdr;b.CrW&tuJ,~> +Y5eJ$eGoIIJcE@^rW(7Dr;_EK^]464cN!kDJcERdr;b.CrW&tuJ,~> +Y5eJ$eGoIIJcE@^rW(7Dr;_EK^]464cN!kDJcERdr;b.CrW&tuJ,~> +YQ+P$e,TCIJcEC_r;b+BrW%NL^]495c2[_BJcEUerW(4Cr;`nuJ,~> +YQ+P$e,TCIJcEC_r;b+BrW%NL^]495c2[_BJcEUerW(4Cr;`nuJ,~> +YQ+P$e,TCIJcEC_r;b+BrW%NL^]495c2[_BJcEUerW(4Cr;`nuJ,~> +YQ+P$e,T@HJcEF`r;b+BrW%NL^]495c2[_BJcEUerW(4Cr;`nuJ,~> +YQ+P$e,T@HJcEF`r;b+BrW%NL^]495c2[_BJcEUerW(4Cr;`nuJ,~> +YQ+P$e,T@HJcEF`r;b+BrW%NL^]495c2[_BJcEUerW(4Cr;`nuJ,~> +YQ+S%df97GJcEF`rW(1Br;_EK_>jH6bl@YBJcEXfr;b(ArW'#!J,~> +YQ+S%df97GJcEF`rW(1Br;_EK_>jH6bl@YBJcEXfr;b(ArW'#!J,~> +YQ+S%df97GJcEF`rW(1Br;_EK_>jH6bl@YBJcEXfr;b(ArW'#!J,~> +YlFY%dJs1GJcEIar;b(Ar;_EK_>jH6bl@VAJcE[gr;b(Ar;`r!J,~> +YlFY%dJs1GJcEIar;b(Ar;_EK_>jH6bl@VAJcE[gr;b(Ar;`r!J,~> +YlFY%dJs1GJcEIar;b(Ar;_EK_>jH6bl@VAJcE[gr;b(Ar;`r!J,~> +YlF\&d/X%EJcELbrW(+@rW%NL_>jK7b5_G@JcE[grW(+@rW'&"J,~> +YlF\&d/X%EJcELbrW(+@rW%NL_>jK7b5_G@JcE[grW(+@rW'&"J,~> +YlF\&d/X%EJcELbrW(+@rW%NL_>jK7b5_G@JcE[grW(+@rW'&"J,~> +YlF\&cijK7b5_G@JcE[grW(+@rW'&"J,~> +YlF\&cijK7b5_G@JcE[grW(+@rW'&"J,~> +YlF\&cijK7b5_G@JcE[grW(+@rW'&"J,~> +Z2ab&ci +Z2ab&ci +Z2ab&ci +Z2ae'cN!hCJcERdrW(%>rW%NL_uK]9aT)5>JcEairW(%>rW')#J,~> +Z2ae'cN!hCJcERdrW(%>rW%NL_uK]9aT)5>JcEairW(%>rW')#J,~> +Z2ae'cN!hCJcERdrW(%>rW%NL_uK]9aT)5>JcEairW(%>rW')#J,~> +Z2ae'c2[bCJcERdrW(%>rW%NL_uK]9aT)5>JcEairW(%>rW')#J,~> +Z2ae'c2[bCJcERdrW(%>rW%NL_uK]9aT)5>JcEairW(%>rW')#J,~> +Z2ae'c2[bCJcERdrW(%>rW%NL_uK]9aT)5>JcEairW(%>rW')#J,~> +ZN'k'c2[_BJcEXfr;aq=r;_EK`W,l:aT)2=JcEgkr;aq=r;a##J,~> +ZN'k'c2[_BJcEXfr;aq=r;_EK`W,l:aT)2=JcEgkr;aq=r;a##J,~> +ZN'k'c2[_BJcEXfr;aq=r;_EK`W,l:aT)2=JcEgkr;aq=r;a##J,~> +ZN'n(bl@VAJcEXfrW("=r;_EK`W,l:a8c,=JcEgkr;an +ZN'n(bl@VAJcEXfrW("=r;_EK`W,l:a8c,=JcEgkr;an +ZN'n(bl@VAJcEXfrW("=r;_EK`W,l:a8c,=JcEgkr;an +ZiBt(bQ%PAJcE[gr;ak;rW%NL`W,o;`rGu;JcEjlrW't +ZiBt(bQ%PAJcE[gr;ak;rW%NL`W,o;`rGu;JcEjlrW't +ZiBt(bQ%PAJcE[gr;ak;rW%NL`W,o;`rGu;JcEjlrW't +ZiBt(bQ%M@JcE^hr;ak;rW%NL`W,o;`rGu;JcEjlrW't +ZiBt(bQ%M@JcE^hr;ak;rW%NL`W,o;`rGu;JcEjlrW't +ZiBt(bQ%M@JcE^hr;ak;rW%NL`W,o;`rGu;JcEjlrW't +ZiC")b5_D?JcE^hrW'q;r;_EKa8c)<`W,o;JcEmmr;ah:rW'/%J,~> +ZiC")b5_D?JcE^hrW'q;r;_EKa8c)<`W,o;JcEmmr;ah:rW'/%J,~> +ZiC")b5_D?JcE^hrW'q;r;_EKa8c)<`W,o;JcEmmr;ah:rW'/%J,~> +[/^()aoD>?JcEair;ae9rW%NLa8c,=`;fc9JcEpnrW'n:r;a)%J,~> +[/^()aoD>?JcEair;ae9rW%NLa8c,=`;fc9JcEpnrW'n:r;a)%J,~> +[/^()aoD>?JcEair;ae9rW%NLa8c,=`;fc9JcEpnrW'n:r;a)%J,~> +[/^()aoD;>JcEdjr;ae9rW%NLa8c,=`;fc9JcEpnrW'n:r;a)%J,~> +[/^()aoD;>JcEdjr;ae9rW%NLa8c,=`;fc9JcEpnrW'n:r;a)%J,~> +[/^()aoD;>JcEdjr;ae9rW%NLa8c,=`;fc9JcEpnrW'n:r;a)%J,~> +[/^+*aT)2=JcEdjrW'k9r;_EKaoD;>_uK]9JcEsor;ab8rW'2&J,~> +[/^+*aT)2=JcEdjrW'k9r;_EKaoD;>_uK]9JcEsor;ab8rW'2&J,~> +[/^+*aT)2=JcEdjrW'k9r;_EKaoD;>_uK]9JcEsor;ab8rW'2&J,~> +[K$1*a8c,=JcEgkr;ab8r;_EKaoD;>_uKZ8JcF!pr;ab8r;a,&J,~> +[K$1*a8c,=JcEgkr;ab8r;_EKaoD;>_uKZ8JcF!pr;ab8r;a,&J,~> +[K$1*a8c,=JcEgkr;ab8r;_EKaoD;>_uKZ8JcF!pr;ab8r;a,&J,~> +[K$4+`rGu;JcEjlrW'e7rW%NLaoD>?_>jK7JcF!prW'e7rW'5'J,~> +[K$4+`rGu;JcEjlrW'e7rW%NLaoD>?_>jK7JcF!prW'e7rW'5'J,~> +[K$4+`rGu;JcEjlrW'e7rW%NLaoD>?_>jK7JcF!prW'e7rW'5'J,~> +[K$4+`W,o;JcEjlrW'e7rW%NLaoD>?_>jK7JcF!prW'e7rW'5'J,~> +[K$4+`W,o;JcEjlrW'e7rW%NLaoD>?_>jK7JcF!prW'e7rW'5'J,~> +[K$4+`W,o;JcEjlrW'e7rW%NLaoD>?_>jK7JcF!prW'e7rW'5'J,~> +[f?:+`W,o;JcEmmr;a\6r;_EKbQ%M@_>jH6JcF'rr;a\6r;a/'J,~> +[f?:+`W,o;JcEmmr;a\6r;_EKbQ%M@_>jH6JcF'rr;a\6r;a/'J,~> +[f?:+`W,o;JcEmmr;a\6r;_EKbQ%M@_>jH6JcF'rr;a\6r;a/'J,~> +[f?=,`;fc9JcEpnrW'_5rW%NLbQ%PA^]495JcF'rrW'_5rW'8(J,~> +[f?=,`;fc9JcEpnrW'_5rW%NLbQ%PA^]495JcF'rrW'_5rW'8(J,~> +[f?=,`;fc9JcEpnrW'_5rW%NLbQ%PA^]495JcF'rrW'_5rW'8(J,~> +[f?=,_uK]9JcEpnrW'_5rW%NLbQ%PA^]495JcF'rrW'_5rW'8(J,~> +[f?=,_uK]9JcEpnrW'_5rW%NLbQ%PA^]495JcF'rrW'_5rW'8(J,~> +[f?=,_uK]9JcEpnrW'_5rW%NLbQ%PA^]495JcF'rrW'_5rW'8(J,~> +\,ZC,_uKZ8JcF!pr;aV4r;_EKc2[_B^]464JcF-tr;aV4r;a2(J,~> +\,ZC,_uKZ8JcF!pr;aV4r;_EKc2[_B^]464JcF-tr;aV4r;a2(J,~> +\,ZC,_uKZ8JcF!pr;aV4r;_EKc2[_B^]464JcF-tr;aV4r;a2(J,~> +\,ZF-_Z0Q7JcF!prW'\4r;_EKc2[_B^An04JcF-tr;aS3rW';)J,~> +\,ZF-_Z0Q7JcF!prW'\4r;_EKc2[_B^An04JcF-tr;aS3rW';)J,~> +\,ZF-_Z0Q7JcF!prW'\4r;_EKc2[_B^An04JcF-tr;aS3rW';)J,~> +\GuL-_>jK7JcF$qr;aP2rW%NLc2[bC^&S$2JcF0urW'Y3r;a5)J,~> +\GuL-_>jK7JcF$qr;aP2rW%NLc2[bC^&S$2JcF0urW'Y3r;a5)J,~> +\GuL-_>jK7JcF$qr;aP2rW%NLc2[bC^&S$2JcF0urW'Y3r;a5)J,~> +\GuL-_>jH6JcF'rr;aP2rW%NLc2[bC^&S$2JcF0urW'Y3r;a5)J,~> +\GuL-_>jH6JcF'rr;aP2rW%NLc2[bC^&S$2JcF0urW'Y3r;a5)J,~> +\GuL-_>jH6JcF'rr;aP2rW%NLc2[bC^&S$2JcF0urW'Y3r;a5)J,~> +\GuO._#O?5JcF'rrW'V2r;_EKci*J,~> +\GuO._#O?5JcF'rrW'V2r;_EKci*J,~> +\GuO._#O?5JcF'rrW'V2r;_EKci*J,~> +\c;U.^]495JcF*sr;aJ0rW%NLci +\c;U.^]495JcF*sr;aJ0rW%NLci +\c;U.^]495JcF*sr;aJ0rW%NLci +\c;U.^]464JcF-tr;aJ0rW%NLci +\c;U.^]464JcF-tr;aJ0rW%NLci +\c;U.^]464JcF-tr;aJ0rW%NLci +\c;X/^An-3JcF-trW'P0r;_EKdJs.F])Va0JcF:#r;aG/rW'A+J,~> +\c;X/^An-3JcF-trW'P0r;_EKdJs.F])Va0JcF:#r;aG/rW'A+J,~> +\c;X/^An-3JcF-trW'P0r;_EKdJs.F])Va0JcF:#r;aG/rW'A+J,~> +])V^/^&S'3JcF0ur;aG/r;_EKdJs.F])V^/JcF=$r;aG/r;a;+J,~> +])V^/^&S'3JcF0ur;aG/r;_EKdJs.F])V^/JcF=$r;aG/r;a;+J,~> +])V^/^&S'3JcF0ur;aG/r;_EKdJs.F])V^/JcF=$r;aG/r;a;+J,~> +])Va0]`7p1JcF4!rW'J.rW%NLdJs1G\GuO.JcF=$rW'J.rW'D,J,~> +])Va0]`7p1JcF4!rW'J.rW%NLdJs1G\GuO.JcF=$rW'J.rW'D,J,~> +])Va0]`7p1JcF4!rW'J.rW%NLdJs1G\GuO.JcF=$rW'J.rW'D,J,~> +])Va0]Dqj1JcF4!rW'J.rW%NLdJs1G\GuO.JcF=$rW'J.rW'D,J,~> +])Va0]Dqj1JcF4!rW'J.rW%NLdJs1G\GuO.JcF=$rW'J.rW'D,J,~> +])Va0]Dqj1JcF4!rW'J.rW%NLdJs1G\GuO.JcF=$rW'J.rW'D,J,~> +]Dqg0]Dqj1JcF7"r;aA-r;_EKe,T@H\GuL-JcFC&r;aA-r;a>,J,~> +]Dqg0]Dqj1JcF7"r;aA-r;_EKe,T@H\GuL-JcFC&r;aA-r;a>,J,~> +]Dqg0]Dqj1JcF7"r;aA-r;_EKe,T@H\GuL-JcFC&r;aA-r;a>,J,~> +]Dqj1])V^/JcF:#rW'D,rW%NLe,TCI[f?=,JcFC&rW'D,rW'G-J,~> +]Dqj1])V^/JcF:#rW'D,rW%NLe,TCI[f?=,JcFC&rW'D,rW'G-J,~> +]Dqj1])V^/JcF:#rW'D,rW%NLe,TCI[f?=,JcFC&rW'D,rW'G-J,~> +]Dqj1\c;X/JcF:#rW'D,rW%NLe,TCI[f?=,JcFC&rW'D,rW'G-J,~> +]Dqj1\c;X/JcF:#rW'D,rW%NLe,TCI[f?=,JcFC&rW'D,rW'G-J,~> +]Dqj1\c;X/JcF:#rW'D,rW%NLe,TCI[f?=,JcFC&rW'D,rW'G-J,~> +]`7p1\c;U.JcF@%r;a;+r;_EKec5RJ[f?:+JcFI(r;a;+r;aA-J,~> +]`7p1\c;U.JcF@%r;a;+r;_EKec5RJ[f?:+JcFI(r;a;+r;aA-J,~> +]`7p1\c;U.JcF@%r;a;+r;_EKec5RJ[f?:+JcFI(r;a;+r;aA-J,~> +]`7s2\GuL-JcF@%rW'A+r;_EKec5RJ[K$4+JcFI(r;a8*rW'J.J,~> +]`7s2\GuL-JcF@%rW'A+r;_EKec5RJ[K$4+JcFI(r;a8*rW'J.J,~> +]`7s2\GuL-JcF@%rW'A+r;_EKec5RJ[K$4+JcFI(r;a8*rW'J.J,~> +^&S$2\,ZF-JcFC&r;a5)rW%NLec5UK[/^()JcFL)rW'>*r;aD.J,~> +^&S$2\,ZF-JcFC&r;a5)rW%NLec5UK[/^()JcFL)rW'>*r;aD.J,~> +^&S$2\,ZF-JcFC&r;a5)rW%NLec5UK[/^()JcFL)rW'>*r;aD.J,~> +^&S$2\,ZC,JcFF'r;a5)rW%NLec5UK[/^()JcFL)rW'>*r;aD.J,~> +^&S$2\,ZC,JcFF'r;a5)rW%NLec5UK[/^()JcFL)rW'>*r;aD.J,~> +^&S$2\,ZC,JcFF'r;a5)rW%NLec5UK[/^()JcFL)rW'>*r;aD.J,~> +^&S'3[f?:+JcFF'rW';)r;_EKfDkdLZiC")JcFO*r;a2(rW'M/J,~> +^&S'3[f?:+JcFF'rW';)r;_EKfDkdLZiC")JcFO*r;a2(rW'M/J,~> +^&S'3[f?:+JcFF'rW';)r;_EKfDkdLZiC")JcFO*r;a2(rW'M/J,~> +^An-3[K$4+JcFI(r;a/'rW%NLfDkgMZN'k'JcFR+rW'8(r;aG/J,~> +^An-3[K$4+JcFI(r;a/'rW%NLfDkgMZN'k'JcFR+rW'8(r;aG/J,~> +^An-3[K$4+JcFI(r;a/'rW%NLfDkgMZN'k'JcFR+rW'8(r;aG/J,~> +^An-3[K$1*JcFL)r;a/'rW%NLfDkgMZN'k'JcFR+rW'8(r;aG/J,~> +^An-3[K$1*JcFL)r;a/'rW%NLfDkgMZN'k'JcFR+rW'8(r;aG/J,~> +^An-3[K$1*JcFL)r;a/'rW%NLfDkgMZN'k'JcFR+rW'8(r;aG/J,~> +^An04[/^()JcFL)rW'5'r;_EKg&M!NZ2ae'JcFU,r;a,&rW'P0J,~> +^An04[/^()JcFL)rW'5'r;_EKg&M!NZ2ae'JcFU,r;a,&rW'P0J,~> +^An04[/^()JcFL)rW'5'r;_EKg&M!NZ2ae'JcFU,r;a,&rW'P0J,~> +^]464ZiC")JcFO*r;a,&r;_EKg&M!NZ2ab&JcFX-r;a,&r;aJ0J,~> +^]464ZiC")JcFO*r;a,&r;_EKg&M!NZ2ab&JcFX-r;a,&r;aJ0J,~> +^]464ZiC")JcFO*r;a,&r;_EKg&M!NZ2ab&JcFX-r;a,&r;aJ0J,~> +^]495ZN'k'JcFR+rW'/%rW%NLg&M$OYQ+S%JcFX-rW'/%rW'S1J,~> +^]495ZN'k'JcFR+rW'/%rW%NLg&M$OYQ+S%JcFX-rW'/%rW'S1J,~> +^]495ZN'k'JcFR+rW'/%rW%NLg&M$OYQ+S%JcFX-rW'/%rW'S1J,~> +^]495Z2ae'JcFR+rW'/%rW%NLg&M$OYQ+S%JcFX-rW'/%rW'S1J,~> +^]495Z2ae'JcFR+rW'/%rW%NLg&M$OYQ+S%JcFX-rW'/%rW'S1J,~> +^]495Z2ae'JcFR+rW'/%rW%NLg&M$OYQ+S%JcFX-rW'/%rW'S1J,~> +_#O?5Z2ae'JcFU,r;a&$r;_EKg].3PYQ+P$JcF^/r;a&$r;aM1J,~> +_#O?5Z2ae'JcFU,r;a&$r;_EKg].3PYQ+P$JcF^/r;a&$r;aM1J,~> +_#O?5Z2ae'JcFU,r;a&$r;_EKg].3PYQ+P$JcF^/r;a&$r;aM1J,~> +_#OB6YlFY%JcFX-rW')#rW%NLg].6QXoJA#JcF^/rW')#rW'V2J,~> +_#OB6YlFY%JcFX-rW')#rW%NLg].6QXoJA#JcF^/rW')#rW'V2J,~> +_#OB6YlFY%JcFX-rW')#rW%NLg].6QXoJA#JcF^/rW')#rW'V2J,~> +_#OB6YQ+S%JcFX-rW')#rW%NLg].6QXoJA#JcF^/rW')#rW'V2J,~> +_#OB6YQ+S%JcFX-rW')#rW%NLg].6QXoJA#JcF^/rW')#rW'V2J,~> +_#OB6YQ+S%JcFX-rW')#rW%NLg].6QXoJA#JcF^/rW')#rW'V2J,~> +_>jH6YQ+P$JcF^/r;`u"r;_EKh>dERXoJ>"JcFd1r;`u"r;aP2J,~> +_>jH6YQ+P$JcF^/r;`u"r;_EKh>dERXoJ>"JcFd1r;`u"r;aP2J,~> +_>jH6YQ+P$JcF^/r;`u"r;_EKh>dERXoJ>"JcFd1r;`u"r;aP2J,~> +_>jK7Y5eG#JcF^/rW'&"r;_EKh>dERXT/8"JcFd1r;`r!rW'Y3J,~> +_>jK7Y5eG#JcF^/rW'&"r;_EKh>dERXT/8"JcFd1r;`r!rW'Y3J,~> +_>jK7Y5eG#JcF^/rW'&"r;_EKh>dERXT/8"JcFd1r;`r!rW'Y3J,~> +_Z0Q7XoJA#JcFa0r;`nurW%NLh>dHSX8i+uJcFg2rW'#!r;aS3J,~> +_Z0Q7XoJA#JcFa0r;`nurW%NLh>dHSX8i+uJcFg2rW'#!r;aS3J,~> +_Z0Q7XoJA#JcFa0r;`nurW%NLh>dHSX8i+uJcFg2rW'#!r;aS3J,~> +_Z0Q7XoJ>"JcFd1r;`nurW%NLh>dHSX8i+uJcFg2rW'#!r;aS3J,~> +_Z0Q7XoJ>"JcFd1r;`nurW%NLh>dHSX8i+uJcFg2rW'#!r;aS3J,~> +_Z0Q7XoJ>"JcFd1r;`nurW%NLh>dHSX8i+uJcFg2rW'#!r;aS3J,~> +_Z0T8XT/5!JcFd1rW&tur;_EKhuEWTWrN%uJcFj3r;`ktrW'\4J,~> +_Z0T8XT/5!JcFd1rW&tur;_EKhuEWTWrN%uJcFj3r;`ktrW'\4J,~> +_Z0T8XT/5!JcFd1rW&tur;_EKhuEWTWrN%uJcFj3r;`ktrW'\4J,~> +_uKZ8X8i/!JcFg2r;`hsrW%NLhuEZUWW2nsJcFm4rW&qtr;aV4J,~> +_uKZ8X8i/!JcFg2r;`hsrW%NLhuEZUWW2nsJcFm4rW&qtr;aV4J,~> +_uKZ8X8i/!JcFg2r;`hsrW%NLhuEZUWW2nsJcFm4rW&qtr;aV4J,~> +_uKZ8X8i+uJcFj3r;`hsrW%NLhuEZUWW2nsJcFm4rW&qtr;aV4J,~> +_uKZ8X8i+uJcFj3r;`hsrW%NLhuEZUWW2nsJcFm4rW&qtr;aV4J,~> +_uKZ8X8i+uJcFj3r;`hsrW%NLhuEZUWW2nsJcFm4rW&qtr;aV4J,~> +_uK]9WrN"tJcFj3rW&nsrW%NLhuEZUW;lhsJcFm4rW&nsrW'_5J,~> +_uK]9WrN"tJcFj3rW&nsrW%NLhuEZUW;lhsJcFm4rW&nsrW'_5J,~> +_uK]9WrN"tJcFj3rW&nsrW%NLhuEZUW;lhsJcFm4rW&nsrW'_5J,~> +`;fc9WW2qtJcFm4r;`err;_EKiW&iVW;lerJcFs6r;`err;aY5J,~> +`;fc9WW2qtJcFm4r;`err;_EKiW&iVW;lerJcFs6r;`err;aY5J,~> +`;fc9WW2qtJcFm4r;`err;_EKiW&iVW;lerJcFs6r;`err;aY5J,~> +`;ff:W;lerJcFp5rW&hqrW%NLiW&lWVZ6VqJcFs6rW&hqrW'b6J,~> +`;ff:W;lerJcFp5rW&hqrW%NLiW&lWVZ6VqJcFs6rW&hqrW'b6J,~> +`;ff:W;lerJcFp5rW&hqrW%NLiW&lWVZ6VqJcFs6rW&hqrW'b6J,~> +`;ff:VuQ_rJcFp5rW&hqrW%NLiW&lWVZ6VqJcFs6rW&hqrW'b6J,~> +`;ff:VuQ_rJcFp5rW&hqrW%NLiW&lWVZ6VqJcFs6rW&hqrW'b6J,~> +`;ff:VuQ_rJcFp5rW&hqrW%NLiW&lWVZ6VqJcFs6rW&hqrW'b6J,~> +`W,l:VuQ_rJcFs6r;`_pr;_EKj8]&XVZ6SpJcG$8r;`_pr;a\6J,~> +`W,l:VuQ_rJcFs6r;`_pr;_EKj8]&XVZ6SpJcG$8r;`_pr;a\6J,~> +`W,l:VuQ_rJcFs6r;`_pr;_EKj8]&XVZ6SpJcG$8r;`_pr;a\6J,~> +`W,o;VZ6SpJcG!7rW&epr;_EKj8]&XV>pMpJcG$8r;`\orW'e7J,~> +`W,o;VZ6SpJcG!7rW&epr;_EKj8]&XV>pMpJcG$8r;`\orW'e7J,~> +`W,o;VZ6SpJcG!7rW&epr;_EKj8]&XV>pMpJcG$8r;`\orW'e7J,~> +`W,o;V>pMpJcG!7rW&borW%NLj8])YV#UDoJcG$8rW&borW'e7J,~> +`W,o;V>pMpJcG!7rW&borW%NLj8])YV#UDoJcG$8rW&borW'e7J,~> +`W,o;V>pMpJcG!7rW&borW%NLj8])YV#UDoJcG$8rW&borW'e7J,~> +`rGu;V>pJoJcG'9r;`YnrW%NLj8])YV#UAnJcG'9rW&bor;a_7J,~> +`rGu;V>pJoJcG'9r;`YnrW%NLj8])YV#UAnJcG'9rW&bor;a_7J,~> +`rGu;V>pJoJcG'9r;`YnrW%NLj8])YV#UAnJcG'9rW&bor;a_7J,~> +`rH# +`rH# +`rH# +bl7YCrVufrU]:;nr;ZcsJcGNF!!)utr;`SlrW)lr!!%TMnc/UhrVuisUAt/lr;Q`sJcGQGrrE#t +rW&\mr;ccq!!(.@J,~> +bl7YCrVufrU]:;nr;ZcsJcGNF!!)utr;`SlrW)lr!!%TMnc/UhrVuisUAt/lr;Q`sJcGQGrrE#t +rW&\mr;ccq!!(.@J,~> +bl7YCrVufrU]:;nr;ZcsJcGNF!!)utr;`SlrW)lr!!%TMnc/UhrVuisUAt/lr;Q`sJcGQGrrE#t +rW&\mr;ccq!!(.@J,~> +bl@\Crr;osU]:8mrr;rtJcGNFrrE&ur;`SlrW)osrr@WMnGiLgrr;rtUAt/lrVultJcGNFrrE&u +rW&\mr;cfrrrC1@J,~> +bl@\Crr;osU]:8mrr;rtJcGNFrrE&ur;`SlrW)osrr@WMnGiLgrr;rtUAt/lrVultJcGNFrrE&u +rW&\mr;cfrrrC1@J,~> +bl@\Crr;osU]:8mrr;rtJcGNFrrE&ur;`SlrW)osrr@WMnGiLgrr;rtUAt/lrVultJcGNFrrE&u +rW&\mr;cfrrrC1@J,~> +bl@YBs8W&uUAt/lrr;uuJcGKErW)uurW&Ylr;cltrW%NLnGiIf!<;utU&Y)lrr;rtJcGNFrVuru +r;`PkrW)rtrW((?J,~> +bl@YBs8W&uUAt/lrr;uuJcGKErW)uurW&Ylr;cltrW%NLnGiIf!<;utU&Y)lrr;rtJcGNFrVuru +r;`PkrW)rtrW((?J,~> +bl@YBs8W&uUAt/lrr;uuJcGKErW)uurW&Ylr;cltrW%NLnGiIf!<;utU&Y)lrr;rtJcGNFrVuru +r;`PkrW)rtrW((?J,~> +bl@J=U&Y)ls8W&uJcGKEq#I,gr;Zitr;_EKnGi:aU&Y&k!<;utJcGNFq#I,gr;Zitr;at>J,~> +bl@J=U&Y)ls8W&uJcGKEq#I,gr;Zitr;_EKnGi:aU&Y&k!<;utJcGNFq#I,gr;Zitr;at>J,~> +bl@J=U&Y)ls8W&uJcGKEq#I,gr;Zitr;_EKnGi:aU&Y&k!<;utJcGNFq#I,gr;Zitr;at>J,~> +bl@J=r;Q`sXoAA$r;ZQmJcGKEq#L?m!!',#rW)rtq#H!GnGi=brVuisXoJD$rVuZnJcGKEq>gKo +rW')#rrE#tq#JM9J,~> +bl@J=r;Q`sXoAA$r;ZQmJcGKEq#L?m!!',#rW)rtq#H!GnGi=brVuisXoJD$rVuZnJcGKEq>gKo +rW')#rrE#tq#JM9J,~> +bl@J=r;Q`sXoAA$r;ZQmJcGKEq#L?m!!',#rW)rtq#H!GnGi=brVuisXoJD$rVuZnJcGKEq>gKo +rW')#rrE#tq#JM9J,~> +bl@M>s8VusXT.nmJcGKEq>gQqquEetoDjIBnGi+\X8i(t!<;lqJcGKEoDkrlqu?`sq>eV:J,~> +bl@M>s8VusXT.nmJcGKEq>gQqquEetoDjIBnGi+\X8i(t!<;lqJcGKEoDkrlqu?`sq>eV:J,~> +bl@M>s8VusXT.nmJcGKEq>gQqquEetoDjIBnGi+\X8i(t!<;lqJcGKEoDkrlqu?`sq>eV:J,~> +bl@;8WrM_lJcGKEoDkljp&K[Dn,N%\WW2VkJcGKEo`1uko`3)5J,~> +bl@;8WrM_lJcGKEoDkljp&K[Dn,N%\WW2VkJcGKEo`1uko`3)5J,~> +bl@;8WrM_lJcGKEoDkljp&K[Dn,N%\WW2VkJcGKEo`1uko`3)5J,~> +bl@>9W;lPkJcGKEo`1rjp&K[Dmf3"]VuQGjJcGHDpAh,kp&N26J,~> +bl@>9W;lPkJcGKEo`1rjp&K[Dmf3"]VuQGjJcGHDpAh,kp&N26J,~> +bl@>9W;lPkJcGKEo`1rjp&K[Dmf3"]VuQGjJcGHDpAh,kp&N26J,~> +bQ%;:VZ6AjJcGHDpAh)jpAfdEmf3%^V>p8iJcGHDp]./jpAi;7J,~> +bQ%;:VZ6AjJcGHDpAh)jpAfdEmf3%^V>p8iJcGHDp]./jpAi;7J,~> +bQ%;:VZ6AjJcGHDpAh)jpAfdEmf3%^V>p8iJcGHDp]./jpAi;7J,~> +bQ%>;V#U2iJcGHDp].,ip],mFmf3(_U]:)hJcGHDq#I2ip]/D8J,~> +bQ%>;V#U2iJcGHDp].,ip],mFmf3(_U]:)hJcGHDq#I2ip]/D8J,~> +bQ%>;V#U2iJcGHDp].,ip],mFmf3(_U]:)hJcGHDq#I2ip]/D8J,~> +bQ%A +bQ%A +bQ%A +bQ%G>TE"cgJcGECqZ*8gq>c*Hmf3+`T`=lhJcGECq>d2gqZ+\:J,~> +bQ%G>TE"cgJcGECqZ*8gq>c*Hmf3+`T`=lhJcGECq>d2gqZ+\:J,~> +bQ%G>TE"cgJcGECqZ*8gq>c*Hmf3+`T`=lhJcGECq>d2gqZ+\:J,~> +bQ%J?ScATfJcGECquE;fquD +bQ%J?ScATfJcGECquE;fquD +bQ%J?ScATfJcGECquE;fquD +bQ%M@S,`EeJcGECr;`>er;_EKm/R"aSH&NfJcGBBr;`Afr;an +bQ%M@S,`EeJcGECr;`>er;_EKm/R"aSH&NfJcGBBr;`Afr;an +bQ%M@S,`EeJcGECr;`>er;_EKm/R"aSH&NfJcGBBr;`Afr;an +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtl2Ub`aT)8?p&G!kqu?WqlMpkaaT)8?p&G!kgAh-Pl2Ub`aT)8?p&G!kqu?WqlMpkaaT)8? +p&G!kdJs1GlMpkaaT)8?p&G!kqu?WqlMpkaa8c/>p&G!kgAh-PlMpkaaT)8?p&G!kqu?WqlMpka +a8c/>p&G!kqYu'~> +rr;rtl2Ub`aT)8?p&G!kqu?WqlMpkaaT)8?p&G!kgAh-Pl2Ub`aT)8?p&G!kqu?WqlMpkaaT)8? +p&G!kdJs1GlMpkaaT)8?p&G!kqu?WqlMpkaa8c/>p&G!kgAh-PlMpkaaT)8?p&G!kqu?WqlMpka +a8c/>p&G!kqYu'~> +rr;rtl2Ub`aT)8?p&G!kqu?WqlMpkaaT)8?p&G!kgAh-Pl2Ub`aT)8?p&G!kqu?WqlMpkaaT)8? +p&G!kdJs1GlMpkaaT)8?p&G!kqu?WqlMpkaa8c/>p&G!kgAh-PlMpkaaT)8?p&G!kqu?WqlMpka +a8c/>p&G!kqYu'~> +rr;rtli6n`b5_D?p&G!kqu?Wqm/R"ab5_D?p&G!kgAh-Pli6n`b5_D?p&G!kqu?Wqm/R"ab5_D? +p&G!kdJs1Gm/R"ab5_D?p&G!kqu?Wqm/R"aaoD;>p&G!kgAh-Pm/R"ab5_D?p&G!kqu?Wqm/R"a +aoD;>p&G!kqYu'~> +rr;rtli6n`b5_D?p&G!kqu?Wqm/R"ab5_D?p&G!kgAh-Pli6n`b5_D?p&G!kqu?Wqm/R"ab5_D? +p&G!kdJs1Gm/R"ab5_D?p&G!kqu?Wqm/R"aaoD;>p&G!kgAh-Pm/R"ab5_D?p&G!kqu?Wqm/R"a +aoD;>p&G!kqYu'~> +rr;rtli6n`b5_D?p&G!kqu?Wqm/R"ab5_D?p&G!kgAh-Pli6n`b5_D?p&G!kqu?Wqm/R"ab5_D? +p&G!kdJs1Gm/R"ab5_D?p&G!kqu?Wqm/R"aaoD;>p&G!kgAh-Pm/R"ab5_D?p&G!kqu?Wqm/R"a +aoD;>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rtlMph`aoD>?p&G!kqu?Wqli6qaaoD>?p&G!kgAh-PlMph`aoD>?p&G!kqu?Wqli6qaaoD>? +p&G!kdJs1Gli6qaaoD>?p&G!kqu?Wqli6qaaT)5>p&G!kgAh-Pli6qaaoD>?p&G!kqu?Wqli6qa +aT)5>p&G!kqYu'~> +rr;rto`+dgrVuisrr;rtrr;osqu6]ts8W&urr;uus8W&ur;Z`rq>^Bn!<<#up&G!kqu?Wqp&Fmh +rVuisrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kgAh-Po`+dgrVuisrr;rt +rr;osqu6]ts8W&urr;uus8W&ur;Z`rq>^Bn!<<#up&G!kqu?Wqp&FmhrVuisrVuisrr;osqu6]t +s8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kdJs1Gp&FmhrVuisrVuisrr;osqu6]ts8W&urr;uu +s8W&ur;Z`rqZ$Ko!<<#up&G!kqu?Wqo`+dgrr;rtrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`r +q>^Bn!<<#up&G!kgAh-Pp&FmhrVuisrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#u +p&G!kqu?Wqo`+dgrr;rtrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rq>^Bn!<<#up&G!kqYu'~> +rr;rto`+dgrVuisrr;rtrr;osqu6]ts8W&urr;uus8W&ur;Z`rq>^Bn!<<#up&G!kqu?Wqp&Fmh +rVuisrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kgAh-Po`+dgrVuisrr;rt +rr;osqu6]ts8W&urr;uus8W&ur;Z`rq>^Bn!<<#up&G!kqu?Wqp&FmhrVuisrVuisrr;osqu6]t +s8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kdJs1Gp&FmhrVuisrVuisrr;osqu6]ts8W&urr;uu +s8W&ur;Z`rqZ$Ko!<<#up&G!kqu?Wqo`+dgrr;rtrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`r +q>^Bn!<<#up&G!kgAh-Pp&FmhrVuisrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#u +p&G!kqu?Wqo`+dgrr;rtrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rq>^Bn!<<#up&G!kqYu'~> +rr;rto`+dgrVuisrr;rtrr;osqu6]ts8W&urr;uus8W&ur;Z`rq>^Bn!<<#up&G!kqu?Wqp&Fmh +rVuisrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kgAh-Po`+dgrVuisrr;rt +rr;osqu6]ts8W&urr;uus8W&ur;Z`rq>^Bn!<<#up&G!kqu?Wqp&FmhrVuisrVuisrr;osqu6]t +s8W&urr;uus8W&ur;Z`rqZ$Ko!<<#up&G!kdJs1Gp&FmhrVuisrVuisrr;osqu6]ts8W&urr;uu +s8W&ur;Z`rqZ$Ko!<<#up&G!kqu?Wqo`+dgrr;rtrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`r +q>^Bn!<<#up&G!kgAh-Pp&FmhrVuisrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rqZ$Ko!<<#u +p&G!kqu?Wqo`+dgrr;rtrVuisrr;osqu6]ts8W&urr;uus8W&ur;Z`rq>^Bn!<<#up&G!kqYu'~> +rr;rtp&G$lrr;uurVuisrr;rtr;Z`rs8VZj!<;rss8Vrrqu?Zrrr;osp&G!kqu?WqpAb-mrr;uu +rVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kgAh-Pp&G$lrr;uurVuisrr;rtr;Z`r +s8VZj!<;rss8Vrrqu?Zrrr;osp&G!kqu?WqpAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrr +r;Zcsrr;osp&G!kdJs1GpAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!k +qu?Wqp&G$lrr;uurr;rtrVuisr;Z`rs8VZj!<;rss8Vrrqu?Zrrr;osp&G!kgAh-PpAb-mrr;uu +rVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kqu?Wqp&G$lrr;uurr;rtrVuisr;Z`r +s8VZj!<;rss8Vrrqu?Zrrr;osp&G!kqYu'~> +rr;rtp&G$lrr;uurVuisrr;rtr;Z`rs8VZj!<;rss8Vrrqu?Zrrr;osp&G!kqu?WqpAb-mrr;uu +rVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kgAh-Pp&G$lrr;uurVuisrr;rtr;Z`r +s8VZj!<;rss8Vrrqu?Zrrr;osp&G!kqu?WqpAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrr +r;Zcsrr;osp&G!kdJs1GpAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!k +qu?Wqp&G$lrr;uurr;rtrVuisr;Z`rs8VZj!<;rss8Vrrqu?Zrrr;osp&G!kgAh-PpAb-mrr;uu +rVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kqu?Wqp&G$lrr;uurr;rtrVuisr;Z`r +s8VZj!<;rss8Vrrqu?Zrrr;osp&G!kqYu'~> +rr;rtp&G$lrr;uurVuisrr;rtr;Z`rs8VZj!<;rss8Vrrqu?Zrrr;osp&G!kqu?WqpAb-mrr;uu +rVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kgAh-Pp&G$lrr;uurVuisrr;rtr;Z`r +s8VZj!<;rss8Vrrqu?Zrrr;osp&G!kqu?WqpAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrr +r;Zcsrr;osp&G!kdJs1GpAb-mrr;uurVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!k +qu?Wqp&G$lrr;uurr;rtrVuisr;Z`rs8VZj!<;rss8Vrrqu?Zrrr;osp&G!kgAh-PpAb-mrr;uu +rVuisrVuisr;Z`rs8VZj!<;rss8Vrrr;Zcsrr;osp&G!kqu?Wqp&G$lrr;uurr;rtrVuisr;Z`r +s8VZj!<;rss8Vrrqu?Zrrr;osp&G!kqYu'~> +rr;rtpAb*lrVlitrVuisrVuisrVuisrr;cos8W#trr;osrVultr;Zcsr;Z`rp&G!kqu?Wqp](3m +rVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`rp&G!kgAh-PpAb*lrVlitrVuis +rVuisrVuisrr;cos8W#trr;osrVultr;Zcsr;Z`rp&G!kqu?Wqp](3mrVlitrVuisr;Z`rrVuis +rr;cos8W#trr;osrVultrVultr;Z`rp&G!kdJs1Gp](3mrVlitrVuisr;Z`rrVuisrr;cos8W#t +rr;osrVultrVultr;Z`rp&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrr;cos8W#trr;osrVult +r;Zcsr;Z`rp&G!kgAh-Pp](3mrVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`r +p&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrr;cos8W#trr;osrVultr;Zcsr;Z`rp&G!kqYu'~> +rr;rtpAb*lrVlitrVuisrVuisrVuisrr;cos8W#trr;osrVultr;Zcsr;Z`rp&G!kqu?Wqp](3m +rVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`rp&G!kgAh-PpAb*lrVlitrVuis +rVuisrVuisrr;cos8W#trr;osrVultr;Zcsr;Z`rp&G!kqu?Wqp](3mrVlitrVuisr;Z`rrVuis +rr;cos8W#trr;osrVultrVultr;Z`rp&G!kdJs1Gp](3mrVlitrVuisr;Z`rrVuisrr;cos8W#t +rr;osrVultrVultr;Z`rp&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrr;cos8W#trr;osrVult +r;Zcsr;Z`rp&G!kgAh-Pp](3mrVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`r +p&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrr;cos8W#trr;osrVultr;Zcsr;Z`rp&G!kqYu'~> +rr;rtpAb*lrVlitrVuisrVuisrVuisrr;cos8W#trr;osrVultr;Zcsr;Z`rp&G!kqu?Wqp](3m +rVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`rp&G!kgAh-PpAb*lrVlitrVuis +rVuisrVuisrr;cos8W#trr;osrVultr;Zcsr;Z`rp&G!kqu?Wqp](3mrVlitrVuisr;Z`rrVuis +rr;cos8W#trr;osrVultrVultr;Z`rp&G!kdJs1Gp](3mrVlitrVuisr;Z`rrVuisrr;cos8W#t +rr;osrVultrVultr;Z`rp&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrr;cos8W#trr;osrVult +r;Zcsr;Z`rp&G!kgAh-Pp](3mrVlitrVuisr;Z`rrVuisrr;cos8W#trr;osrVultrVultr;Z`r +p&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrr;cos8W#trr;osrVultr;Zcsr;Z`rp&G!kqYu'~> +rr;rtpAb*lrVlitrVuisrVuisrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kqu?Wqp](3m +rVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kgAh-PpAb*lrVlitrVuis +rVuisrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kqu?Wqp](3mrVlitrVuisr;Z`rrVuis +rVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kdJs1Gp](3mrVlitrVuisr;Z`rrVuisrVuisqu?Wq +rVufrrVuiss8W&ur;Z`rp&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrVuisqu?WqrVufrrVuis +rr;rtr;Z`rp&G!kgAh-Pp](3mrVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`r +p&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kqYu'~> +rr;rtpAb*lrVlitrVuisrVuisrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kqu?Wqp](3m +rVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kgAh-PpAb*lrVlitrVuis +rVuisrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kqu?Wqp](3mrVlitrVuisr;Z`rrVuis +rVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kdJs1Gp](3mrVlitrVuisr;Z`rrVuisrVuisqu?Wq +rVufrrVuiss8W&ur;Z`rp&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrVuisqu?WqrVufrrVuis +rr;rtr;Z`rp&G!kgAh-Pp](3mrVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`r +p&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kqYu'~> +rr;rtpAb*lrVlitrVuisrVuisrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kqu?Wqp](3m +rVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kgAh-PpAb*lrVlitrVuis +rVuisrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kqu?Wqp](3mrVlitrVuisr;Z`rrVuis +rVuisqu?WqrVufrrVuiss8W&ur;Z`rp&G!kdJs1Gp](3mrVlitrVuisr;Z`rrVuisrVuisqu?Wq +rVufrrVuiss8W&ur;Z`rp&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrVuisqu?WqrVufrrVuis +rr;rtr;Z`rp&G!kgAh-Pp](3mrVlitrVuisr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W&ur;Z`r +p&G!kqu?WqpAb*lrVlitrr;rtr;Z`rrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kqYu'~> +rr;rtpAb*lq#C^Eor;Z`rrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kgAh-Pp](3mq#C^Eor;Z`rrVuisrVuis +qu?WqrVufrrVuisrr;rtr;Z`rp&G!kqYu'~> +rr;rtpAb*lq#C^Eor;Z`rrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kgAh-Pp](3mq#C^Eor;Z`rrVuisrVuis +qu?WqrVufrrVuisrr;rtr;Z`rp&G!kqYu'~> +rr;rtpAb*lq#C^Eor;Z`rrVuisrVuisqu?WqrVufrrVuisrr;rtr;Z`rp&G!kgAh-Pp](3mq#C^Eor;Z`rrVuisrVuis +qu?WqrVufrrVuisrr;rtr;Z`rp&G!kqYu'~> +rr;rtp&FsjqZ$NprVuisrVuisrVuisqu?WqrVufrrVuisrr;uuqu?Wqp&G!kqu?WqpAb'kqZ$Np +r;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kgAh-Pp&FsjqZ$NprVuisrVuisrVuis +qu?WqrVufrrVuisrr;uuqu?Wqp&G!kqu?WqpAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuis +s8W*!qu?Wqp&G!kdJs1GpAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!k +qu?Wqp&Fsjqu?Wqr;Z`rrVuisrVuisqu?WqrVufrrVuisrr;uuqu?Wqp&G!kgAh-PpAb'kqZ$Np +r;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kqu?Wqp&Fsjqu?Wqr;Z`rrVuisrVuis +qu?WqrVufrrVuisrr;uuqu?Wqp&G!kqYu'~> +rr;rtp&FsjqZ$NprVuisrVuisrVuisqu?WqrVufrrVuisrr;uuqu?Wqp&G!kqu?WqpAb'kqZ$Np +r;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kgAh-Pp&FsjqZ$NprVuisrVuisrVuis +qu?WqrVufrrVuisrr;uuqu?Wqp&G!kqu?WqpAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuis +s8W*!qu?Wqp&G!kdJs1GpAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!k +qu?Wqp&Fsjqu?Wqr;Z`rrVuisrVuisqu?WqrVufrrVuisrr;uuqu?Wqp&G!kgAh-PpAb'kqZ$Np +r;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kqu?Wqp&Fsjqu?Wqr;Z`rrVuisrVuis +qu?WqrVufrrVuisrr;uuqu?Wqp&G!kqYu'~> +rr;rtp&FsjqZ$NprVuisrVuisrVuisqu?WqrVufrrVuisrr;uuqu?Wqp&G!kqu?WqpAb'kqZ$Np +r;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kgAh-Pp&FsjqZ$NprVuisrVuisrVuis +qu?WqrVufrrVuisrr;uuqu?Wqp&G!kqu?WqpAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuis +s8W*!qu?Wqp&G!kdJs1GpAb'kqZ$Npr;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!k +qu?Wqp&Fsjqu?Wqr;Z`rrVuisrVuisqu?WqrVufrrVuisrr;uuqu?Wqp&G!kgAh-PpAb'kqZ$Np +r;Z`rrVuisrVuisqu?WqrVufrrVuiss8W*!qu?Wqp&G!kqu?Wqp&Fsjqu?Wqr;Z`rrVuisrVuis +qu?WqrVufrrVuisrr;uuqu?Wqp&G!kqYu'~> +rr;rto`+ghr;Z`rrVuisrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqp&Fpir;Z`r +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kgAh-Po`+ghr;Z`rrVuisrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqp&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +!<<#uqu?Wqp&G!kdJs1Gp&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!k +qu?Wqo`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kgAh-Pp&Fpir;Z`r +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kqu?Wqo`+ghrVuisr;Z`rrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqYu'~> +rr;rto`+ghr;Z`rrVuisrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqp&Fpir;Z`r +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kgAh-Po`+ghr;Z`rrVuisrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqp&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +!<<#uqu?Wqp&G!kdJs1Gp&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!k +qu?Wqo`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kgAh-Pp&Fpir;Z`r +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kqu?Wqo`+ghrVuisr;Z`rrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqYu'~> +rr;rto`+ghr;Z`rrVuisrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqp&Fpir;Z`r +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kgAh-Po`+ghr;Z`rrVuisrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqp&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +!<<#uqu?Wqp&G!kdJs1Gp&Fpir;Z`rr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!k +qu?Wqo`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kgAh-Pp&Fpir;Z`r +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kqu?Wqo`+ghrVuisr;Z`rrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqYu'~> +rr;rtoDe^grVuisrVuisrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqo`+ghrVuis +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kgAh-PoDe^grVuisrVuisrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqo`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +!<<#uqu?Wqp&G!kdJs1Go`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!k +qu?WqoDe^grr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kgAh-Po`+ghrVuis +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kqu?WqoDe^grr;rtr;Z`rrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqYu'~> +rr;rtoDe^grVuisrVuisrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqo`+ghrVuis +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kgAh-PoDe^grVuisrVuisrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqo`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +!<<#uqu?Wqp&G!kdJs1Go`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!k +qu?WqoDe^grr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kgAh-Po`+ghrVuis +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kqu?WqoDe^grr;rtr;Z`rrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqYu'~> +rr;rtoDe^grVuisrVuisrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqo`+ghrVuis +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kgAh-PoDe^grVuisrVuisrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqu?Wqo`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +!<<#uqu?Wqp&G!kdJs1Go`+ghrVuisr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!k +qu?WqoDe^grr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kgAh-Po`+ghrVuis +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<<#uqu?Wqp&G!kqu?WqoDe^grr;rtr;Z`rrVuisrVuis +qu?Wqr;Z`rrVuiss8W&uqu?Wqp&G!kqYu'~> +rr;rtnc/Ofrr;rtrVuisrVuisrVuisqu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kqu?Wqo)JXgrr;rt +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kgAh-Pnc/Ofrr;rtrVuisrVuisrVuis +qu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kqu?Wqo)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +!<;utr;Z`rp&G!kdJs1Go)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!k +qu?Wqnc/Ofs8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kgAh-Po)JXgrr;rt +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kqu?Wqnc/Ofs8W&ur;Z`rrVuisrVuis +qu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kqYu'~> +rr;rtnc/Ofrr;rtrVuisrVuisrVuisqu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kqu?Wqo)JXgrr;rt +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kgAh-Pnc/Ofrr;rtrVuisrVuisrVuis +qu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kqu?Wqo)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +!<;utr;Z`rp&G!kdJs1Go)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!k +qu?Wqnc/Ofs8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kgAh-Po)JXgrr;rt +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kqu?Wqnc/Ofs8W&ur;Z`rrVuisrVuis +qu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kqYu'~> +rr;rtnc/Ofrr;rtrVuisrVuisrVuisqu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kqu?Wqo)JXgrr;rt +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kgAh-Pnc/Ofrr;rtrVuisrVuisrVuis +qu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kqu?Wqo)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +!<;utr;Z`rp&G!kdJs1Go)JXgrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!k +qu?Wqnc/Ofs8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kgAh-Po)JXgrr;rt +r;Z`rrVuisrVuisqu?Wqr;Z`rrVuis!<;utr;Z`rp&G!kqu?Wqnc/Ofs8W&ur;Z`rrVuisrVuis +qu?Wqr;Z`rrVuiss8W#tr;Z`rp&G!kqYu'~> +rr;rtpAY*mr;Z`rrr;rtrVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;rtr;Z`rp&G!kqu?Wqp\t3n +r;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kgAh-PpAY*mr;Z`rrr;rt +rVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;rtr;Z`rp&G!kqu?Wqp\t3nr;Z`rrr;rtr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kdJs1Gp\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wq +r;Z`rrVuiss8W&ur;Z`rp&G!kqu?WqpAY*mr;Z`rs8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +rr;rtr;Z`rp&G!kgAh-Pp\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`r +p&G!kqu?WqpAY*mr;Z`rs8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuisrr;rtr;Z`rp&G!kqYu'~> +rr;rtpAY*mr;Z`rrr;rtrVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;rtr;Z`rp&G!kqu?Wqp\t3n +r;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kgAh-PpAY*mr;Z`rrr;rt +rVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;rtr;Z`rp&G!kqu?Wqp\t3nr;Z`rrr;rtr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kdJs1Gp\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wq +r;Z`rrVuiss8W&ur;Z`rp&G!kqu?WqpAY*mr;Z`rs8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +rr;rtr;Z`rp&G!kgAh-Pp\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`r +p&G!kqu?WqpAY*mr;Z`rs8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuisrr;rtr;Z`rp&G!kqYu'~> +rr;rtpAY*mr;Z`rrr;rtrVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;rtr;Z`rp&G!kqu?Wqp\t3n +r;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kgAh-PpAY*mr;Z`rrr;rt +rVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;rtr;Z`rp&G!kqu?Wqp\t3nr;Z`rrr;rtr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuiss8W&ur;Z`rp&G!kdJs1Gp\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wq +r;Z`rrVuiss8W&ur;Z`rp&G!kqu?WqpAY*mr;Z`rs8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +rr;rtr;Z`rp&G!kgAh-Pp\t3nr;Z`rrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W&ur;Z`r +p&G!kqu?WqpAY*mr;Z`rs8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuisrr;rtr;Z`rp&G!kqYu'~> +rr;rtpAb-mrVuisrr;rtrVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;osrVuisp&G!kqu?Wqp](6n +rVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kgAh-PpAb-mrVuisrr;rt +rVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;osrVuisp&G!kqu?Wqp](6nrVuisrr;rtr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kdJs1Gp](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wq +r;Z`rrVuiss8W#trVuisp&G!kqu?WqpAb-mrVuiss8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +rr;osrVuisp&G!kgAh-Pp](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuis +p&G!kqu?WqpAb-mrVuiss8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuisrr;osrVuisp&G!kqYu'~> +rr;rtpAb-mrVuisrr;rtrVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;osrVuisp&G!kqu?Wqp](6n +rVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kgAh-PpAb-mrVuisrr;rt +rVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;osrVuisp&G!kqu?Wqp](6nrVuisrr;rtr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kdJs1Gp](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wq +r;Z`rrVuiss8W#trVuisp&G!kqu?WqpAb-mrVuiss8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +rr;osrVuisp&G!kgAh-Pp](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuis +p&G!kqu?WqpAb-mrVuiss8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuisrr;osrVuisp&G!kqYu'~> +rr;rtpAb-mrVuisrr;rtrVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;osrVuisp&G!kqu?Wqp](6n +rVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kgAh-PpAb-mrVuisrr;rt +rVuisrVuisrVuisqu?Wqr;Z`rrVuisrr;osrVuisp&G!kqu?Wqp](6nrVuisrr;rtr;Z`rrVuis +rVuisqu?Wqr;Z`rrVuiss8W#trVuisp&G!kdJs1Gp](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wq +r;Z`rrVuiss8W#trVuisp&G!kqu?WqpAb-mrVuiss8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuis +rr;osrVuisp&G!kgAh-Pp](6nrVuisrr;rtr;Z`rrVuisrVuisqu?Wqr;Z`rrVuiss8W#trVuis +p&G!kqu?WqpAb-mrVuiss8W&ur;Z`rrVuisrVuisqu?Wqr;Z`rrVuisrr;osrVuisp&G!kqYu'~> +rr;rtpAb-mrVultrVuisrVuQkrr;rtqu?WqrVufrrVuisrVuNjp](3mqu?Wqp](6nrVultrVuis +r;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mgAh-PpAb-mrVultrVuisrVuQkrr;rtqu?WqrVufr +rVuisrVuNjp](3mqu?Wqp](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mdJs1G +p](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mqu?WqpAb-mrVultrr;rtr;ZHj +rr;rtqu?WqrVufrrVuisrVuNjp](3mgAh-Pp](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuis +rr;Wkp](3mqu?WqpAb-mrVultrr;rtr;ZHjrr;rtqu?WqrVufrrVuisrVuNjp](3mqYu'~> +rr;rtpAb-mrVultrVuisrVuQkrr;rtqu?WqrVufrrVuisrVuNjp](3mqu?Wqp](6nrVultrVuis +r;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mgAh-PpAb-mrVultrVuisrVuQkrr;rtqu?WqrVufr +rVuisrVuNjp](3mqu?Wqp](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mdJs1G +p](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mqu?WqpAb-mrVultrr;rtr;ZHj +rr;rtqu?WqrVufrrVuisrVuNjp](3mgAh-Pp](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuis +rr;Wkp](3mqu?WqpAb-mrVultrr;rtr;ZHjrr;rtqu?WqrVufrrVuisrVuNjp](3mqYu'~> +rr;rtpAb-mrVultrVuisrVuQkrr;rtqu?WqrVufrrVuisrVuNjp](3mqu?Wqp](6nrVultrVuis +r;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mgAh-PpAb-mrVultrVuisrVuQkrr;rtqu?WqrVufr +rVuisrVuNjp](3mqu?Wqp](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mdJs1G +p](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuisrr;Wkp](3mqu?WqpAb-mrVultrr;rtr;ZHj +rr;rtqu?WqrVufrrVuisrVuNjp](3mgAh-Pp](6nrVultrVuisr;ZHjrr;rtqu?WqrVufrrVuis +rr;Wkp](3mqu?WqpAb-mrVultrr;rtr;ZHjrr;rtqu?WqrVufrrVuisrVuNjp](3mqYu'~> +rr;rtpAashrVu`prr;lr!<;ut!<;orrVucqs8Vrrs8VusrVuWmp&G!kqu?Wqp]('irVu`prVucq +!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kgAh-PpAashrVu`prr;lr!<;ut!<;orrVucqs8Vrr +s8VusrVuWmp&G!kqu?Wqp]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kdJs1G +p]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kqu?WqpAashrr;iqrVucq!<;ut +!<;orrVucqs8Vrrs8VusrVuWmp&G!kgAh-Pp]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vus +rr;`np&G!kqu?WqpAashrr;iqrVucq!<;ut!<;orrVucqs8Vrrs8VusrVuWmp&G!kqYu'~> +rr;rtpAashrVu`prr;lr!<;ut!<;orrVucqs8Vrrs8VusrVuWmp&G!kqu?Wqp]('irVu`prVucq +!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kgAh-PpAashrVu`prr;lr!<;ut!<;orrVucqs8Vrr +s8VusrVuWmp&G!kqu?Wqp]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kdJs1G +p]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kqu?WqpAashrr;iqrVucq!<;ut +!<;orrVucqs8Vrrs8VusrVuWmp&G!kgAh-Pp]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vus +rr;`np&G!kqu?WqpAashrr;iqrVucq!<;ut!<;orrVucqs8Vrrs8VusrVuWmp&G!kqYu'~> +rr;rtpAashrVu`prr;lr!<;ut!<;orrVucqs8Vrrs8VusrVuWmp&G!kqu?Wqp]('irVu`prVucq +!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kgAh-PpAashrVu`prr;lr!<;ut!<;orrVucqs8Vrr +s8VusrVuWmp&G!kqu?Wqp]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kdJs1G +p]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vusrr;`np&G!kqu?WqpAashrr;iqrVucq!<;ut +!<;orrVucqs8Vrrs8VusrVuWmp&G!kgAh-Pp]('irVu`prVucq!<;ut!<;orrVucqs8Vrrs8Vus +rr;`np&G!kqu?WqpAashrr;iqrVucq!<;ut!<;orrVucqs8Vrrs8VusrVuWmp&G!kqYu'~> +rr;rto)J^inc&Rhec5XLnGiIfqu?WqoDegjnG`Igf)PaMnGiIfgAh-Po)J^inc&Rhec5XLnGiIf +qu?WqoDegjnG`Igf)PaMnGiIfdJs1GoDegjnG`Igf)PaMnGiIfqu?Wqo)J^inc&Rhec5XLnGiIf +gAh-PoDegjnG`Igf)PaMnGiIfqu?Wqo)J^inc&Rhec5XLnGiIfqYu'~> +rr;rto)J^inc&Rhec5XLnGiIfqu?WqoDegjnG`Igf)PaMnGiIfgAh-Po)J^inc&Rhec5XLnGiIf +qu?WqoDegjnG`Igf)PaMnGiIfdJs1GoDegjnG`Igf)PaMnGiIfqu?Wqo)J^inc&Rhec5XLnGiIf +gAh-PoDegjnG`Igf)PaMnGiIfqu?Wqo)J^inc&Rhec5XLnGiIfqYu'~> +rr;rto)J^inc&Rhec5XLnGiIfqu?WqoDegjnG`Igf)PaMnGiIfgAh-Po)J^inc&Rhec5XLnGiIf +qu?WqoDegjnG`Igf)PaMnGiIfdJs1GoDegjnG`Igf)PaMnGiIfqu?Wqo)J^inc&Rhec5XLnGiIf +gAh-PoDegjnG`Igf)PaMnGiIfqu?Wqo)J^inc&Rhec5XLnGiIfqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr;rtT`=ukqu?WqU&Y)lgAh-PT`=ukqu?WqU&Y)ldJs1GU&Y)lqu?WqT`=ukgAh-PU&Y)lqu?Wq +T`=ukqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +rr8Dequ<,cgAdTAqu<,cdJo[9qu<)bgAdWBqu<)bqYu'~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$JcDkPJ,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/figures/connections.dia b/executable_names/doc/figures/connections.dia new file mode 100644 index 0000000000000000000000000000000000000000..572db84b1cae9a8488e2417d497ab5614dc5f165 --- /dev/null +++ b/executable_names/doc/figures/connections.dia @@ -0,0 +1,2 @@ + +#A4##srun##slurmctld##slurmd##slurmd##slurmd####ephemeral port####``known'' port##1.##2.##3.##4.# diff --git a/executable_names/doc/figures/connections.eps b/executable_names/doc/figures/connections.eps new file mode 100644 index 0000000000000000000000000000000000000000..6703af0774eca99c47d0297b3087e20dfb4f24ee --- /dev/null +++ b/executable_names/doc/figures/connections.eps @@ -0,0 +1,619 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ../figures/connections.dia +%%Creator: Dia v0.88.1 +%%CreationDate: Thu Apr 3 14:26:17 2003 +%%For: grondo +%%Magnification: 1.0000 +%%Orientation: Portrait +%%BoundingBox: 0 0 594 437 +%%Pages: 1 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/Times-Roman-latin1 + /Times-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Italic-latin1 + /Times-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Bold-latin1 + /Times-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-BoldItalic-latin1 + /Times-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Book-latin1 + /AvantGarde-Book findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-BookOblique-latin1 + /AvantGarde-BookOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Demi-latin1 + /AvantGarde-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-DemiOblique-latin1 + /AvantGarde-DemiOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Light-latin1 + /Bookman-Light findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-LightItalic-latin1 + /Bookman-LightItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Demi-latin1 + /Bookman-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-DemiItalic-latin1 + /Bookman-DemiItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-latin1 + /Courier findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Oblique-latin1 + /Courier-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Bold-latin1 + /Courier-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-BoldOblique-latin1 + /Courier-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-latin1 + /Helvetica findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Oblique-latin1 + /Helvetica-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Bold-latin1 + /Helvetica-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-BoldOblique-latin1 + /Helvetica-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-latin1 + /Helvetica-Narrow findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Oblique-latin1 + /Helvetica-Narrow-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Bold-latin1 + /Helvetica-Narrow-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-BoldOblique-latin1 + /Helvetica-Narrow-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Roman-latin1 + /NewCenturySchoolbook-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Italic-latin1 + /NewCenturySchoolbook-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Bold-latin1 + /NewCenturySchoolbook-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-BoldItalic-latin1 + /NewCenturySchoolbook-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Roman-latin1 + /Palatino-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Italic-latin1 + /Palatino-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Bold-latin1 + /Palatino-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-BoldItalic-latin1 + /Palatino-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Symbol-latin1 + /Symbol findfont +definefont pop +/ZapfChancery-MediumItalic-latin1 + /ZapfChancery-MediumItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/ZapfDingbats-latin1 + /ZapfDingbats findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +28.346000 -28.346000 scale +-0.267000 -16.350000 translate +%%EndProlog + + +1.000000 1.000000 1.000000 srgb +n 0.817000 4.500000 m 0.817000 6.500000 l 3.433000 6.500000 l 3.433000 4.500000 l f +n 0.817000 5.000000 m 0.817000 5.000000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 3.433000 5.000000 m 3.433000 5.000000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 0.317000 5.000000 m 0.317000 6.000000 l 3.933000 6.000000 l 3.933000 5.000000 l f +n 0.817000 6.000000 m 0.817000 6.000000 0.500000 0.500000 90.000000 180.000000 ellipse f +n 3.433000 6.000000 m 3.433000 6.000000 0.500000 0.500000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.817000 4.500000 m 3.433000 4.500000 l s +n 0.817000 6.500000 m 3.433000 6.500000 l s +n 0.817000 5.000000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 3.433000 5.000000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 0.317000 5.000000 m 0.317000 6.000000 l s +n 3.933000 5.000000 m 3.933000 6.000000 l s +n 0.817000 6.000000 0.500000 0.500000 90.000000 180.000000 ellipse s +n 3.433000 6.000000 0.500000 0.500000 0.000000 90.000000 ellipse s +/Courier-Bold-latin1 ff 0.800000 scf sf +(srun) dup sw 2 div 2.125000 ex sub 5.805217 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n 3.500000 4.750000 m 3.500000 5.250000 l 4.000000 5.250000 l 4.000000 4.750000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 4.750000 m 3.500000 5.250000 l 4.000000 5.250000 l 4.000000 4.750000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 5.750000 m 3.500000 6.250000 l 4.000000 6.250000 l 4.000000 5.750000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 5.750000 m 3.500000 6.250000 l 4.000000 6.250000 l 4.000000 5.750000 l cp s +1.000000 1.000000 1.000000 srgb +n 1.750000 6.500000 0.250000 0.250000 0 360 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0.000000 0.000000 0.000000 srgb +n 1.750000 6.500000 0.250000 0.250000 0 360 ellipse cp s +1.000000 1.000000 1.000000 srgb +n 8.513600 1.000000 m 8.513600 3.000000 l 14.649600 3.000000 l 14.649600 1.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.513600 1.000000 m 8.513600 3.000000 l 14.649600 3.000000 l 14.649600 1.000000 l cp s +/Courier-Bold-latin1 ff 0.800000 scf sf +(slurmctld) dup sw 2 div 11.581600 ex sub 2.305217 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 3.750000 4.750000 m 4.000000 3.250000 4.500000 1.500000 8.500000 1.500000 c s +0 slj +1.000000 1.000000 1.000000 srgb +n 8.100000 1.700000 m 8.500000 1.500000 l 8.100000 1.300000 l f +0.100000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.100000 1.700000 m 8.500000 1.500000 l 8.100000 1.300000 l cp s +1.000000 1.000000 1.000000 srgb +n 16.542400 8.500000 m 16.542400 10.500000 l 21.166400 10.500000 l 21.166400 8.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 16.542400 8.500000 m 16.542400 10.500000 l 21.166400 10.500000 l 21.166400 8.500000 l cp s +/Courier-Bold-latin1 ff 0.800000 scf sf +(slurmd) dup sw 2 div 18.854400 ex sub 9.805217 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n 11.542400 8.500000 m 11.542400 10.500000 l 16.166400 10.500000 l 16.166400 8.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 11.542400 8.500000 m 11.542400 10.500000 l 16.166400 10.500000 l 16.166400 8.500000 l cp s +/Courier-Bold-latin1 ff 0.800000 scf sf +(slurmd) dup sw 2 div 13.854400 ex sub 9.805217 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n 6.542400 8.500000 m 6.542400 10.500000 l 11.166400 10.500000 l 11.166400 8.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.542400 8.500000 m 6.542400 10.500000 l 11.166400 10.500000 l 11.166400 8.500000 l cp s +/Courier-Bold-latin1 ff 0.800000 scf sf +(slurmd) dup sw 2 div 8.854400 ex sub 9.805217 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n 7.000000 10.250000 m 7.000000 10.750000 l 7.500000 10.750000 l 7.500000 10.250000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.000000 10.250000 m 7.000000 10.750000 l 7.500000 10.750000 l 7.500000 10.250000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 4.000000 6.000000 m 5.079000 6.000000 7.250000 6.750000 7.250000 8.250000 c s +0 slj +1.000000 1.000000 1.000000 srgb +n 7.050000 7.850000 m 7.250000 8.250000 l 7.450000 7.850000 l f +0.100000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.050000 7.850000 m 7.250000 8.250000 l 7.450000 7.850000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 4.000000 6.000000 m 5.250000 6.000000 12.000000 5.760000 12.250000 8.260000 c s +0 slj +1.000000 1.000000 1.000000 srgb +n 12.011191 7.881886 m 12.250000 8.260000 l 12.409206 7.842084 l f +0.100000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 12.011191 7.881886 m 12.250000 8.260000 l 12.409206 7.842084 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 4.000000 6.000000 m 4.500000 5.750000 17.250000 5.250000 17.250000 8.250000 c s +0 slj +1.000000 1.000000 1.000000 srgb +n 17.050000 7.850000 m 17.250000 8.250000 l 17.450000 7.850000 l f +0.100000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 17.050000 7.850000 m 17.250000 8.250000 l 17.450000 7.850000 l cp s +1.000000 1.000000 1.000000 srgb +n 7.250000 8.500000 0.250000 0.250000 0 360 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0.000000 0.000000 0.000000 srgb +n 7.250000 8.500000 0.250000 0.250000 0 360 ellipse cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 7.250000 10.750000 m 3.500000 13.000000 1.823220 9.323220 1.750000 6.750000 c s +0 slj +n 2.014120 7.242687 m 1.750000 6.750000 l 1.514323 7.256908 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 12.250000 10.760000 m 5.500000 15.510000 2.000000 13.000000 1.750000 6.750000 c s +0 slj +n 2.019784 7.239608 m 1.750000 6.750000 l 1.520184 7.259592 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 17.000000 10.750000 m 8.426800 16.323200 2.000000 16.750000 1.750000 6.750000 c s +0 slj +n 2.012418 7.243596 m 1.750000 6.750000 l 1.512574 7.256092 l f +1.000000 1.000000 1.000000 srgb +n 12.000000 10.250000 m 12.000000 10.760000 l 12.500000 10.760000 l 12.500000 10.250000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 12.000000 10.250000 m 12.000000 10.760000 l 12.500000 10.760000 l 12.500000 10.250000 l cp s +1.000000 1.000000 1.000000 srgb +n 12.250000 8.510000 0.250000 0.250000 0 360 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0.000000 0.000000 0.000000 srgb +n 12.250000 8.510000 0.250000 0.250000 0 360 ellipse cp s +1.000000 1.000000 1.000000 srgb +n 17.000000 10.250000 m 17.000000 10.750000 l 17.500000 10.750000 l 17.500000 10.250000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 17.000000 10.250000 m 17.000000 10.750000 l 17.500000 10.750000 l 17.500000 10.250000 l cp s +1.000000 1.000000 1.000000 srgb +n 17.250000 8.500000 0.250000 0.250000 0 360 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0.000000 0.000000 0.000000 srgb +n 17.250000 8.500000 0.250000 0.250000 0 360 ellipse cp s +1.000000 1.000000 1.000000 srgb +n 8.500000 2.250000 m 8.500000 2.750000 l 9.000000 2.750000 l 9.000000 2.250000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.500000 2.250000 m 8.500000 2.750000 l 9.000000 2.750000 l 9.000000 2.250000 l cp s +1.000000 1.000000 1.000000 srgb +n 8.750000 1.500000 0.250000 0.250000 0 360 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0.000000 0.000000 0.000000 srgb +n 8.750000 1.500000 0.250000 0.250000 0 360 ellipse cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 8.500000 2.500000 m 7.000000 2.500000 4.750000 3.000000 4.000000 4.750000 c s +0 slj +1.000000 1.000000 1.000000 srgb +n 3.973739 4.303558 m 4.000000 4.750000 l 4.341397 4.461126 l f +0.100000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.973739 4.303558 m 4.000000 4.750000 l 4.341397 4.461126 l cp s +1.000000 1.000000 1.000000 srgb +n 4.250000 15.750000 m 4.250000 16.300000 l 4.750000 16.300000 l 4.750000 15.750000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 4.250000 15.750000 m 4.250000 16.300000 l 4.750000 16.300000 l 4.750000 15.750000 l cp s +/Courier-latin1 ff 0.800000 scf sf +() dup sw 2 div 5.000000 ex sub 16.000000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.700000 scf sf +(ephemeral port) 5.000000 16.250000 m gs 1 -1 sc sh gr +/Courier-latin1 ff 0.800000 scf sf +() dup sw 2 div 5.250000 ex sub 16.250000 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n 11.750000 16.000000 0.250000 0.250000 0 360 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0.000000 0.000000 0.000000 srgb +n 11.750000 16.000000 0.250000 0.250000 0 360 ellipse cp s +/Helvetica-latin1 ff 0.700000 scf sf +(``known'' port) 12.250000 16.250000 m gs 1 -1 sc sh gr +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(1.) dup sw 2 div 5.000000 ex sub 2.000000 m gs 1 -1 sc sh gr +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(2.) dup sw 2 div 6.000000 ex sub 2.750000 m gs 1 -1 sc sh gr +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(3.) dup sw 2 div 13.250000 ex sub 6.000000 m gs 1 -1 sc sh gr +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(4.) dup sw 2 div 4.750000 ex sub 11.000000 m gs 1 -1 sc sh gr +showpage diff --git a/executable_names/doc/figures/entities.dia b/executable_names/doc/figures/entities.dia new file mode 100644 index 0000000000000000000000000000000000000000..691382f90313aa7b1389a6dc01cc19bca8295dda --- /dev/null +++ b/executable_names/doc/figures/entities.dia @@ -0,0 +1,1454 @@ + + + + + + + + + + #A4# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Partition 1# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Partition 2# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Job# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Job# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Job +Step# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #node# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Job +Step# + + + + + + + + + + + + + + + + + + + + + diff --git a/executable_names/doc/figures/entities.eps b/executable_names/doc/figures/entities.eps new file mode 100644 index 0000000000000000000000000000000000000000..c0731e6f874b2bf7bb5f5b582ed1cef87ec345cd --- /dev/null +++ b/executable_names/doc/figures/entities.eps @@ -0,0 +1,634 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: figures/entities.dia +%%Creator: Dia v0.88.1 +%%CreationDate: Wed Mar 26 17:17:24 2003 +%%For: ayoo +%%Magnification: 1.0000 +%%Orientation: Portrait +%%BoundingBox: 0 0 413 307 +%%Pages: 1 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/Times-Roman-latin1 + /Times-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Italic-latin1 + /Times-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Bold-latin1 + /Times-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-BoldItalic-latin1 + /Times-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Book-latin1 + /AvantGarde-Book findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-BookOblique-latin1 + /AvantGarde-BookOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Demi-latin1 + /AvantGarde-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-DemiOblique-latin1 + /AvantGarde-DemiOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Light-latin1 + /Bookman-Light findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-LightItalic-latin1 + /Bookman-LightItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Demi-latin1 + /Bookman-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-DemiItalic-latin1 + /Bookman-DemiItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-latin1 + /Courier findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Oblique-latin1 + /Courier-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Bold-latin1 + /Courier-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-BoldOblique-latin1 + /Courier-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-latin1 + /Helvetica findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Oblique-latin1 + /Helvetica-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Bold-latin1 + /Helvetica-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-BoldOblique-latin1 + /Helvetica-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-latin1 + /Helvetica-Narrow findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Oblique-latin1 + /Helvetica-Narrow-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Bold-latin1 + /Helvetica-Narrow-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-BoldOblique-latin1 + /Helvetica-Narrow-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Roman-latin1 + /NewCenturySchoolbook-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Italic-latin1 + /NewCenturySchoolbook-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Bold-latin1 + /NewCenturySchoolbook-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-BoldItalic-latin1 + /NewCenturySchoolbook-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Roman-latin1 + /Palatino-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Italic-latin1 + /Palatino-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Bold-latin1 + /Palatino-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-BoldItalic-latin1 + /Palatino-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Symbol-latin1 + /Symbol findfont +definefont pop +/ZapfChancery-MediumItalic-latin1 + /ZapfChancery-MediumItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/ZapfDingbats-latin1 + /ZapfDingbats findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +28.346000 -28.346000 scale +-0.725000 -12.025000 translate +%%EndProlog + + +0.694118 0.694118 0.776471 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 9.750000 12.000000 l 9.750000 1.250000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.750000 1.250000 m 0.750000 12.000000 l 9.750000 12.000000 l 9.750000 1.250000 l cp s +0.600000 0.709804 0.596078 srgb +n 9.750000 1.250000 m 9.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.750000 1.250000 m 9.750000 12.000000 l 15.250000 12.000000 l 15.250000 1.250000 l cp s +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.407843 0.486275 0.407843 srgb +n 10.000000 10.375000 m 10.000000 9.875000 10.000000 2.250000 10.000000 1.750000 c 10.000000 1.250000 14.500000 1.250000 14.500000 1.750000 c 14.500000 2.250000 14.500000 9.875000 14.500000 10.375000 c 14.500000 10.875000 10.000000 10.875000 10.000000 10.375000 c f +0.411765 0.486275 0.411765 srgb +n 10.000000 10.375000 m 10.000000 9.875000 10.000000 2.250000 10.000000 1.750000 c 10.000000 1.250000 14.500000 1.250000 14.500000 1.750000 c 14.500000 2.250000 14.500000 9.875000 14.500000 10.375000 c 14.500000 10.875000 10.000000 10.875000 10.000000 10.375000 c s +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.419608 0.419608 0.607843 srgb +n 1.500000 6.750000 m 2.000000 6.750000 5.500000 6.625000 5.750000 7.000000 c 6.000000 7.375000 5.750000 8.375000 6.000000 8.500000 c 6.250000 8.625000 9.500000 8.750000 9.500000 8.250000 c 9.500000 7.750000 9.500000 1.750000 9.250000 1.750000 c 9.000000 1.750000 2.000000 1.750000 1.500000 1.750000 c 1.000000 1.750000 1.000000 6.750000 1.500000 6.750000 c f +0.423529 0.423529 0.607843 srgb +n 1.500000 6.750000 m 2.000000 6.750000 5.500000 6.625000 5.750000 7.000000 c 6.000000 7.375000 5.750000 8.375000 6.000000 8.500000 c 6.250000 8.625000 9.500000 8.750000 9.500000 8.250000 c 9.500000 7.750000 9.500000 1.750000 9.250000 1.750000 c 9.000000 1.750000 2.000000 1.750000 1.500000 1.750000 c 1.000000 1.750000 1.000000 6.750000 1.500000 6.750000 c s +/Helvetica-Narrow-Bold-latin1 ff 0.700000 scf sf +0.000000 0.000000 0.000000 srgb +(Partition 1) dup sw 2 div 5.250000 ex sub 11.750000 m gs 1 -1 sc sh gr +/Helvetica-Narrow-Bold-latin1 ff 0.700000 scf sf +(Partition 2) dup sw 2 div 12.500000 ex sub 11.750000 m gs 1 -1 sc sh gr +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(Job) dup sw 2 div 2.250000 ex sub 6.250000 m gs 1 -1 sc sh gr +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(Job) dup sw 2 div 13.500000 ex sub 9.875000 m gs 1 -1 sc sh gr +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.886275 0.886275 0.917647 srgb +n 2.000000 2.250000 m 2.750000 2.250000 8.750000 2.250000 9.000000 2.250000 c 9.250000 2.250000 9.250000 8.250000 9.000000 8.375000 c 8.750000 8.500000 6.500000 8.500000 6.250000 8.375000 c 6.000000 8.250000 6.250000 6.916670 6.000000 6.625000 c 5.750000 6.333330 3.500000 6.625000 3.250000 6.375000 c 3.000000 6.125000 3.000000 4.750000 3.000000 4.500000 c 3.000000 4.250000 2.750000 4.250000 2.000000 4.250000 c 1.250000 4.250000 1.250000 2.250000 2.000000 2.250000 c f +0.890196 0.886275 0.913725 srgb +n 2.000000 2.250000 m 2.750000 2.250000 8.750000 2.250000 9.000000 2.250000 c 9.250000 2.250000 9.250000 8.250000 9.000000 8.375000 c 8.750000 8.500000 6.500000 8.500000 6.250000 8.375000 c 6.000000 8.250000 6.250000 6.916670 6.000000 6.625000 c 5.750000 6.333330 3.500000 6.625000 3.250000 6.375000 c 3.000000 6.125000 3.000000 4.750000 3.000000 4.500000 c 3.000000 4.250000 2.750000 4.250000 2.000000 4.250000 c 1.250000 4.250000 1.250000 2.250000 2.000000 2.250000 c s +1.000000 1.000000 1.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 3.000000 m 3.500000 4.175000 l 5.625000 4.175000 l 5.625000 3.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 4.562500 ex sub 3.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 3.975000 m 3.375000 4.275000 l 5.750000 4.275000 l 5.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 3.000000 m 6.500000 4.175000 l 8.625000 4.175000 l 8.625000 3.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 7.562500 ex sub 3.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 3.975000 m 6.375000 4.275000 l 8.750000 4.275000 l 8.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 7.000000 m 3.500000 8.175000 l 5.625000 8.175000 l 5.625000 7.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 4.562500 ex sub 7.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 7.975000 m 3.375000 8.275000 l 5.750000 8.275000 l 5.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 7.000000 m 6.500000 8.175000 l 8.625000 8.175000 l 8.625000 7.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 7.562500 ex sub 7.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 7.975000 m 6.375000 8.275000 l 8.750000 8.275000 l 8.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 9.000000 m 3.500000 10.175000 l 5.625000 10.175000 l 5.625000 9.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 4.562500 ex sub 9.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 9.975000 m 3.375000 10.275000 l 5.750000 10.275000 l 5.750000 9.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 9.000000 m 6.500000 10.175000 l 8.625000 10.175000 l 8.625000 9.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 7.562500 ex sub 9.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 9.975000 m 6.375000 10.275000 l 8.750000 10.275000 l 8.750000 9.975000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +0.000000 0.000000 0.000000 srgb +(Job) dup sw 2 div 2.500000 ex sub 3.250000 m gs 1 -1 sc sh gr +(Step) dup sw 2 div 2.500000 ex sub 3.850000 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.500000 5.000000 m 3.500000 6.175000 l 5.625000 6.175000 l 5.625000 5.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 4.562500 ex sub 5.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 3.375000 5.975000 m 3.375000 6.275000 l 5.750000 6.275000 l 5.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 5.000000 m 6.500000 6.175000 l 8.625000 6.175000 l 8.625000 5.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 7.562500 ex sub 5.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 6.375000 5.975000 m 6.375000 6.275000 l 8.750000 6.275000 l 8.750000 5.975000 l cp s +0.010000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.764706 0.949020 0.764706 srgb +n 10.250000 2.250000 m 10.250000 1.500000 14.200000 1.525000 14.250000 2.125000 c 14.300000 2.725000 14.250000 5.875000 14.250000 6.375000 c 14.250000 6.875000 10.250000 6.875000 10.250000 6.375000 c 10.250000 5.875000 10.250000 3.000000 10.250000 2.250000 c f +0.768627 0.949020 0.768627 srgb +n 10.250000 2.250000 m 10.250000 1.500000 14.200000 1.525000 14.250000 2.125000 c 14.300000 2.725000 14.250000 5.875000 14.250000 6.375000 c 14.250000 6.875000 10.250000 6.875000 10.250000 6.375000 c 10.250000 5.875000 10.250000 3.000000 10.250000 2.250000 c s +1.000000 1.000000 1.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 3.000000 m 10.500000 4.175000 l 12.625000 4.175000 l 12.625000 3.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 11.562500 ex sub 3.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 3.975000 m 10.375000 4.275000 l 12.750000 4.275000 l 12.750000 3.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 5.000000 m 10.500000 6.175000 l 12.625000 6.175000 l 12.625000 5.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 11.562500 ex sub 5.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 5.975000 m 10.375000 6.275000 l 12.750000 6.275000 l 12.750000 5.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 7.000000 m 10.500000 8.175000 l 12.625000 8.175000 l 12.625000 7.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 11.562500 ex sub 7.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 7.975000 m 10.375000 8.275000 l 12.750000 8.275000 l 12.750000 7.975000 l cp s +1.000000 1.000000 1.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.500000 9.000000 m 10.500000 10.175000 l 12.625000 10.175000 l 12.625000 9.000000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +(node) dup sw 2 div 11.562500 ex sub 9.750000 m gs 1 -1 sc sh gr +0.800000 0.800000 0.800000 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l f +0.050000 slw +[] 0 sd +[] 0 sd +0 slj +0.003922 0.003922 0.003922 srgb +n 10.375000 9.975000 m 10.375000 10.275000 l 12.750000 10.275000 l 12.750000 9.975000 l cp s +/Helvetica-Narrow-Bold-latin1 ff 0.600000 scf sf +0.000000 0.000000 0.000000 srgb +(Job) dup sw 2 div 13.500000 ex sub 4.250000 m gs 1 -1 sc sh gr +(Step) dup sw 2 div 13.500000 ex sub 4.850000 m gs 1 -1 sc sh gr +showpage diff --git a/executable_names/doc/figures/entities2.eps b/executable_names/doc/figures/entities2.eps new file mode 100644 index 0000000000000000000000000000000000000000..ff6c3da83f22a60bcda39c41583d4f9e72501523 --- /dev/null +++ b/executable_names/doc/figures/entities2.eps @@ -0,0 +1,2516 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /g/g0/jette/sigops/figure1.eps +%%CreationDate: Wed Feb 1 14:10:07 2006 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 559 444 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 429.120000 translate +544.320000 -429.120000 scale +% Image geometry +756 596 8 +% Transformation matrix +[ 756 0 0 596 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 756 string def +/gstr 756 string def +/bstr 756 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 127970 ASCII Bytes +colorimage +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7_uK`:jo>;[JcGTHrW'h8rrD3]rW'>*rW'e7rW'k9rrD0\rW&_nrW)ZlJ,~> +q>^Eo_>jK7_uK`:jo>;[JcGTHrW'h8rrD3]rW'>*rW'e7rW'k9rrD0\rW&_nrW)ZlJ,~> +q>^Eo_>jK7_uK`:jo>;[JcGTHrW'h8rrD3]rW'>*rW'e7rW'k9rrD0\rW&_nrW)ZlJ,~> +q>^Eo_>jK7pAb!iq#C-ikl:M[k5YD\JcGTHrW)ZlqZ-Ekq#KUXqZ,gZrW'>*rW'e7rW)ZlqZ-Ek +q#KXYqZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7pAb!iq#C-ikl:M[k5YD\JcGTHrW)ZlqZ-Ekq#KUXqZ,gZrW'>*rW'e7rW)ZlqZ-Ek +q#KXYqZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7pAb!iq#C-ikl:M[k5YD\JcGTHrW)ZlqZ-Ekq#KUXqZ,gZrW'>*rW'e7rW)ZlqZ-Ek +q#KXYqZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mjo>2Xk5YD\JcGTHrW)TjquHKkrW)$ZqZ,gZrW'>*rW'e7rW)TjquHKk +rW)'[qZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mjo>2Xk5YD\JcGTHrW)TjquHKkrW)$ZqZ,gZrW'>*rW'e7rW)TjquHKk +rW)'[qZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mjo>2Xk5YD\JcGTHrW)TjquHKkrW)$ZqZ,gZrW'>*rW'e7rW)TjquHKk +rW)'[qZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mj8])Yjo>;[JcGTHrW)TjquHKkrW(sXrW)*\rW'>*rW'e7rW)TjquHKk +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mj8])Yjo>;[JcGTHrW)TjquHKkrW(sXrW)*\rW'>*rW'e7rW)TjquHKk +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mj8])Yjo>;[JcGTHrW)TjquHKkrW(sXrW)*\rW'>*rW'e7rW)TjquHKk +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+dgq#C;[JcGTHrW)TjqZ-EkrW(sXrW)*\rW'>*rW'e7rW)TjqZ-Ek +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+dgq#C;[JcGTHrW)TjqZ-EkrW(sXrW)*\rW'>*rW'e7rW)TjqZ-Ek +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+dgq#C;[JcGTHrW)TjqZ-EkrW(sXrW)*\rW'>*rW'e7rW)TjqZ-Ek +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+afq>^Eoj8])Yjo>;[JcGTHrW)Tjq>g?krW(sXrW)*\rW'>*rW'e7rW)Tjq>g?k +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+afq>^Eoj8])Yjo>;[JcGTHrW)Tjq>g?krW(sXrW)*\rW'>*rW'e7rW)Tjq>g?k +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+afq>^Eoj8])Yjo>;[JcGTHrW)Tjq>g?krW(sXrW)*\rW'>*rW'e7rW)Tjq>g?k +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+^eq>^Hpj8])Yjo>;[JcGTHrW)Tjq#L6jrrD'YrW)*\rW'>*rW'e7rW)Tjq#L6j +rrD*ZrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+^eq>^Hpj8])Yjo>;[JcGTHrW)Tjq#L6jrrD'YrW)*\rW'>*rW'e7rW)Tjq#L6j +rrD*ZrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+^eq>^Hpj8])Yjo>;[JcGTHrW)Tjq#L6jrrD'YrW)*\rW'>*rW'e7rW)Tjq#L6j +rrD*ZrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C*rW'e7rW)TjrVuruquHTnrrDfnrrD]krW)uurW)`nrW)KgrW&_n +rW)ZlJ,~> +q>^Eo_>jK7o`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C*rW'e7rW)TjrVuruquHTnrrDfnrrD]krW)uurW)`nrW)KgrW&_n +rW)ZlJ,~> +q>^Eo_>jK7o`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C*rW'e7rW)TjrVuruquHTnrrDfnrrD]krW)uurW)`nrW)KgrW&_n +rW)ZlJ,~> +q>^Eo_>jK7o`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDediJcGTHrW)TjrW)uur;c]orrDoqq#L3i +pAk*jq>g-erW'>*rW'e7rW)TjrW)uur;c]orrDoqq#L6jpAk'iq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDediJcGTHrW)TjrW)uur;c]orrDoqq#L3i +pAk*jq>g-erW'>*rW'e7rW)TjrW)uur;c]orrDoqq#L6jpAk'iq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDediJcGTHrW)TjrW)uur;c]orrDoqq#L3i +pAk*jq>g-erW'>*rW'e7rW)TjrW)uur;c]orrDoqq#L6jpAk'iq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mjJcGTHrW)TjrW)uu +quHWorrDrrrW)osrW)fprW)osr;ccqrrE&ur;cKirW'>*rW'e7rW)TjrW)uuquHWorrDrrrW)os +rW)iqrW)osr;c`prrE&ur;cKirW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mjJcGTHrW)TjrW)uu +quHWorrDrrrW)osrW)fprW)osr;ccqrrE&ur;cKirW'>*rW'e7rW)TjrW)uuquHWorrDrrrW)os +rW)iqrW)osr;c`prrE&ur;cKirW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mjJcGTHrW)TjrW)uu +quHWorrDrrrW)osrW)fprW)osr;ccqrrE&ur;cKirW'>*rW'e7rW)TjrW)uuquHWorrDrrrW)os +rW)iqrW)osr;c`prrE&ur;cKirW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)rt +quHZprrDusrW)iqrW)lrrW)iqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)rtquHZprrDusrW)iq +rW)osrW)iqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)rt +quHZprrDusrW)iqrW)lrrW)iqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)rtquHZprrDusrW)iq +rW)osrW)iqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)rt +quHZprrDusrW)iqrW)lrrW)iqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)rtquHZprrDusrW)iq +rW)osrW)iqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)os +quH]qrrDusrW)iqr;cfrrrDoqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)osquH]qrrDusrW)iq +r;cisrrDoqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)os +quH]qrrDusrW)iqr;cfrrrDoqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)osquH]qrrDusrW)iq +r;cisrrDoqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)os +quH]qrrDusrW)iqr;cfrrrDoqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)osquH]qrrDusrW)iq +r;cisrrDoqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*lJcGTHrW)TjrW)lrquH`r +rrE#trW)corW)rtrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)lrquH`rrrE#trW)corW)uurW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*lJcGTHrW)TjrW)lrquH`r +rrE#trW)corW)rtrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)lrquH`rrrE#trW)corW)uurW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*lJcGTHrW)TjrW)lrquH`r +rrE#trW)corW)rtrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)lrquH`rrrE#trW)corW)uurW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*lJcGTHrW)TjrW)iqr;cis +rrE#trW)cor;cltrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)iqr;cisrrE#trW)cor;ZitrW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*lJcGTHrW)TjrW)iqr;cis +rrE#trW)cor;cltrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)iqr;cisrrE#trW)cor;ZitrW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*lJcGTHrW)TjrW)iqr;cis +rrE#trW)cor;cltrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)iqr;cisrrE#trW)cor;ZitrW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)iqquHcs +rrE#trW)cor;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)iqquHcsrrE#trW)cor;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)iqquHcs +rrE#trW)cor;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)iqquHcsrrE#trW)cor;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)iqquHcs +rrE#trW)cor;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)iqquHcsrrE#trW)cor;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)fpqu?fu +!!*#ur;cZnr;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)fpqu?fu!!*#ur;cZnr;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)fpqu?fu +!!*#ur;cZnr;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)fpqu?fu!!*#ur;cZnr;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)fpqu?fu +!!*#ur;cZnr;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)fpqu?fu!!*#ur;cZnr;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%bJcGTHrW)TjrW)coq>gNpr;cZnr;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)coq>gNpr;cZnq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%bJcGTHrW)TjrW)coq>gNpr;cZnr;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)coq>gNpr;cZnq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%bJcGTHrW)TjrW)coq>gNpr;cZnr;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)coq>gNpr;cZnq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%bJcGTHrW)TjrW)`nqZ-Tpr;c]or;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)`nqZ-Tpr;c]oq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%bJcGTHrW)TjrW)`nqZ-Tpr;c]or;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)`nqZ-Tpr;c]oq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%bJcGTHrW)TjrW)`nqZ-Tpr;c]or;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)`nqZ-Tpr;c]oq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:*rW'e7rW)TjrW)]mquH]qr;c]or;Zitr;c`prW)os +rW)`n!!)`mrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:*rW'e7rW)TjrW)]mquH]qr;c]or;Zitr;c`prW)os +rW)`n!!)`mrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:*rW'e7rW)TjrW)]mquH]qr;c]or;Zitr;c`prW)os +rW)`n!!)`mrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kJcGTHrW)TjrW)]mquHZp +rW)fprW)rtr;c`prW)rtr;c]o!!)]lrW'>*rW'e7rW)TjrW)]mquHZprW)fprW)uur;c`prW)os +r;c]o!!)]lrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kJcGTHrW)TjrW)]mquHZp +rW)fprW)rtr;c`prW)rtr;c]o!!)]lrW'>*rW'e7rW)TjrW)]mquHZprW)fprW)uur;c`prW)os +r;c]o!!)]lrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kJcGTHrW)TjrW)]mquHZp +rW)fprW)rtr;c`prW)rtr;c]o!!)]lrW'>*rW'e7rW)TjrW)]mquHZprW)fprW)uur;c`prW)os +r;c]o!!)]lrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kJcGTHrW)TjrW)Zlr;ccq +r;c`prrDusr;ccqrW)osquH`rrW)WkrW'>*rW'e7rW)TjrW)Zlr;ccqr;c`prrE#tr;ccqrW)lr +quH`rrW)WkrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kJcGTHrW)TjrW)Zlr;ccq +r;c`prrDusr;ccqrW)osquH`rrW)WkrW'>*rW'e7rW)TjrW)Zlr;ccqr;c`prrE#tr;ccqrW)lr +quH`rrW)WkrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kJcGTHrW)TjrW)Zlr;ccq +r;c`prrDusr;ccqrW)osquH`rrW)WkrW'>*rW'e7rW)TjrW)Zlr;ccqr;c`prrE#tr;ccqrW)lr +quH`rrW)WkrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mjJcGTHrW)TjrW)WkrW)iqr;cfrrW)iq +oDnpkpAjjcrW'>*rW'e7rW)TjrW)WkrW)iqr;cfrrW)lroDnmjpAjjcrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mjJcGTHrW)TjrW)WkrW)iqr;cfrrW)iq +oDnpkpAjjcrW'>*rW'e7rW)TjrW)WkrW)iqr;cfrrW)lroDnmjpAjjcrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mjJcGTHrW)TjrW)WkrW)iqr;cfrrW)iq +oDnpkpAjjcrW'>*rW'e7rW)TjrW)WkrW)iqr;cfrrW)lroDnmjpAjjcrW&_nrW)ZlJ,~> +q>^Eo_>jK7p]($hpAb-mqZ$?kq>^g-erW'>*rW'e7rW)]mq#L-grrDoqq#L6jqZ$WrrW)fpq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7p]($hpAb-mqZ$?kq>^g-erW'>*rW'e7rW)]mq#L-grrDoqq#L6jqZ$WrrW)fpq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7p]($hpAb-mqZ$?kq>^g-erW'>*rW'e7rW)]mq#L-grrDoqq#L6jqZ$WrrW)fpq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7j8T)Zq#C9mp&G$loDeahnc/RgJcGTHrW)!Y!!)for;cKirrD]kr;cBfrW'>*rW'e7 +rW)!Y!!)for;cNjrrDZjr;cBfrW&_nrW)ZlJ,~> +q>^Eo_>jK7j8T)Zq#C9mp&G$loDeahnc/RgJcGTHrW)!Y!!)for;cKirrD]kr;cBfrW'>*rW'e7 +rW)!Y!!)for;cNjrrDZjr;cBfrW&_nrW)ZlJ,~> +q>^Eo_>jK7j8T)Zq#C9mp&G$loDeahnc/RgJcGTHrW)!Y!!)for;cKirrD]kr;cBfrW'>*rW'e7 +rW)!Y!!)for;cNjrrDZjr;cBfrW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7_uK`:jo>;[JcGTHrW'h8rrD3]rW'>*rW'e7rW'k9rrD0\rW&_nrW)ZlJ,~> +q>^Eo_>jK7_uK`:jo>;[JcGTHrW'h8rrD3]rW'>*rW'e7rW'k9rrD0\rW&_nrW)ZlJ,~> +q>^Eo_>jK7_uK`:jo>;[JcGTHrW'h8rrD3]rW'>*rW'e7rW'k9rrD0\rW&_nrW)ZlJ,~> +q>^Eo_>jK7pAb!iq#C-ikl:M[k5YD\JcGTHrW)ZlqZ-Ekq#KUXqZ,gZrW'>*rW'e7rW)ZlqZ-Ek +q#KXYqZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7pAb!iq#C-ikl:M[k5YD\JcGTHrW)ZlqZ-Ekq#KUXqZ,gZrW'>*rW'e7rW)ZlqZ-Ek +q#KXYqZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7pAb!iq#C-ikl:M[k5YD\JcGTHrW)ZlqZ-Ekq#KUXqZ,gZrW'>*rW'e7rW)ZlqZ-Ek +q#KXYqZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mjo>2Xk5YD\JcGTHrW)TjquHKkrW)$ZqZ,gZrW'>*rW'e7rW)TjquHKk +rW)'[qZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mjo>2Xk5YD\JcGTHrW)TjquHKkrW)$ZqZ,gZrW'>*rW'e7rW)TjquHKk +rW)'[qZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mjo>2Xk5YD\JcGTHrW)TjquHKkrW)$ZqZ,gZrW'>*rW'e7rW)TjquHKk +rW)'[qZ,dYrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mj8])Yjo>;[JcGTHrW)TjquHKkrW(sXrW)*\rW'>*rW'e7rW)TjquHKk +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mj8])Yjo>;[JcGTHrW)TjquHKkrW(sXrW)*\rW'>*rW'e7rW)TjquHKk +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+ghp](3mj8])Yjo>;[JcGTHrW)TjquHKkrW(sXrW)*\rW'>*rW'e7rW)TjquHKk +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+dgq#C;[JcGTHrW)TjqZ-EkrW(sXrW)*\rW'>*rW'e7rW)TjqZ-Ek +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+dgq#C;[JcGTHrW)TjqZ-EkrW(sXrW)*\rW'>*rW'e7rW)TjqZ-Ek +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+dgq#C;[JcGTHrW)TjqZ-EkrW(sXrW)*\rW'>*rW'e7rW)TjqZ-Ek +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+afq>^Eoj8])Yjo>;[JcGTHrW)Tjq>g?krW(sXrW)*\rW'>*rW'e7rW)Tjq>g?k +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+afq>^Eoj8])Yjo>;[JcGTHrW)Tjq>g?krW(sXrW)*\rW'>*rW'e7rW)Tjq>g?k +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+afq>^Eoj8])Yjo>;[JcGTHrW)Tjq>g?krW(sXrW)*\rW'>*rW'e7rW)Tjq>g?k +rW)!YrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+^eq>^Hpj8])Yjo>;[JcGTHrW)Tjq#L6jrrD'YrW)*\rW'>*rW'e7rW)Tjq#L6j +rrD*ZrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+^eq>^Hpj8])Yjo>;[JcGTHrW)Tjq#L6jrrD'YrW)*\rW'>*rW'e7rW)Tjq#L6j +rrD*ZrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+^eq>^Hpj8])Yjo>;[JcGTHrW)Tjq#L6jrrD'YrW)*\rW'>*rW'e7rW)Tjq#L6j +rrD*ZrW)'[rW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C*rW'e7rW)TjrVuruquHTnrrDfnrrD]krW)uurW)`nrW)KgrW&_n +rW)ZlJ,~> +q>^Eo_>jK7o`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C*rW'e7rW)TjrVuruquHTnrrDfnrrD]krW)uurW)`nrW)KgrW&_n +rW)ZlJ,~> +q>^Eo_>jK7o`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C*rW'e7rW)TjrVuruquHTnrrDfnrrD]krW)uurW)`nrW)KgrW&_n +rW)ZlJ,~> +q>^Eo_>jK7o`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDediJcGTHrW)TjrW)uur;c]orrDoqq#L3i +pAk*jq>g-erW'>*rW'e7rW)TjrW)uur;c]orrDoqq#L6jpAk'iq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDediJcGTHrW)TjrW)uur;c]orrDoqq#L3i +pAk*jq>g-erW'>*rW'e7rW)TjrW)uur;c]orrDoqq#L6jpAk'iq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDediJcGTHrW)TjrW)uur;c]orrDoqq#L3i +pAk*jq>g-erW'>*rW'e7rW)TjrW)uur;c]orrDoqq#L6jpAk'iq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mjJcGTHrW)TjrW)uu +quHWorrDrrrW)osrW)fprW)osr;ccqrrE&ur;cKirW'>*rW'e7rW)TjrW)uuquHWorrDrrrW)os +rW)iqrW)osr;c`prrE&ur;cKirW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mjJcGTHrW)TjrW)uu +quHWorrDrrrW)osrW)fprW)osr;ccqrrE&ur;cKirW'>*rW'e7rW)TjrW)uuquHWorrDrrrW)os +rW)iqrW)osr;c`prrE&ur;cKirW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mjJcGTHrW)TjrW)uu +quHWorrDrrrW)osrW)fprW)osr;ccqrrE&ur;cKirW'>*rW'e7rW)TjrW)uuquHWorrDrrrW)os +rW)iqrW)osr;c`prrE&ur;cKirW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)rt +quHZprrDusrW)iqrW)lrrW)iqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)rtquHZprrDusrW)iq +rW)osrW)iqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)rt +quHZprrDusrW)iqrW)lrrW)iqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)rtquHZprrDusrW)iq +rW)osrW)iqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)rt +quHZprrDusrW)iqrW)lrrW)iqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)rtquHZprrDusrW)iq +rW)osrW)iqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)os +quH]qrrDusrW)iqr;cfrrrDoqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)osquH]qrrDusrW)iq +r;cisrrDoqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)os +quH]qrrDusrW)iqr;cfrrrDoqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)osquH]qrrDusrW)iq +r;cisrrDoqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!kJcGTHrW)TjrW)os +quH]qrrDusrW)iqr;cfrrrDoqrW)osrrDusr;cNjrW'>*rW'e7rW)TjrW)osquH]qrrDusrW)iq +r;cisrrDoqrW)lrrrDusr;cNjrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*lJcGTHrW)TjrW)lrquH`r +rrE#trW)corW)rtrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)lrquH`rrrE#trW)corW)uurW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*lJcGTHrW)TjrW)lrquH`r +rrE#trW)corW)rtrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)lrquH`rrrE#trW)corW)uurW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*lJcGTHrW)TjrW)lrquH`r +rrE#trW)corW)rtrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)lrquH`rrrE#trW)corW)uurW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*lJcGTHrW)TjrW)iqr;cis +rrE#trW)cor;cltrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)iqr;cisrrE#trW)cor;ZitrW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*lJcGTHrW)TjrW)iqr;cis +rrE#trW)cor;cltrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)iqr;cisrrE#trW)cor;ZitrW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*lJcGTHrW)TjrW)iqr;cis +rrE#trW)cor;cltrW)fprW)rtoDnUbrW'>*rW'e7rW)TjrW)iqr;cisrrE#trW)cor;ZitrW)fp +rW)osoDnUbrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)iqquHcs +rrE#trW)cor;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)iqquHcsrrE#trW)cor;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)iqquHcs +rrE#trW)cor;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)iqquHcsrrE#trW)cor;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)iqquHcs +rrE#trW)cor;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)iqquHcsrrE#trW)cor;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)fpqu?fu +!!*#ur;cZnr;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)fpqu?fu!!*#ur;cZnr;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)fpqu?fu +!!*#ur;cZnr;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)fpqu?fu!!*#ur;cZnr;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%bJcGTHrW)TjrW)fpqu?fu +!!*#ur;cZnr;cltrW)fprW)uur;c3arW'>*rW'e7rW)TjrW)fpqu?fu!!*#ur;cZnr;ZitrW)fp +rW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%bJcGTHrW)TjrW)coq>gNpr;cZnr;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)coq>gNpr;cZnq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%bJcGTHrW)TjrW)coq>gNpr;cZnr;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)coq>gNpr;cZnq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%bJcGTHrW)TjrW)coq>gNpr;cZnr;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)coq>gNpr;cZnq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%bJcGTHrW)TjrW)`nqZ-Tpr;c]or;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)`nqZ-Tpr;c]oq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%bJcGTHrW)TjrW)`nqZ-Tpr;c]or;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)`nqZ-Tpr;c]oq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%bJcGTHrW)TjrW)`nqZ-Tpr;c]or;Zit +r;c]orW)uur;c3arW'>*rW'e7rW)TjrW)`nqZ-Tpr;c]oq#L9krW)rtr;c3arW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:*rW'e7rW)TjrW)]mquH]qr;c]or;Zitr;c`prW)os +rW)`n!!)`mrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:*rW'e7rW)TjrW)]mquH]qr;c]or;Zitr;c`prW)os +rW)`n!!)`mrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:*rW'e7rW)TjrW)]mquH]qr;c]or;Zitr;c`prW)os +rW)`n!!)`mrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kJcGTHrW)TjrW)]mquHZp +rW)fprW)rtr;c`prW)rtr;c]o!!)]lrW'>*rW'e7rW)TjrW)]mquHZprW)fprW)uur;c`prW)os +r;c]o!!)]lrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kJcGTHrW)TjrW)]mquHZp +rW)fprW)rtr;c`prW)rtr;c]o!!)]lrW'>*rW'e7rW)TjrW)]mquHZprW)fprW)uur;c`prW)os +r;c]o!!)]lrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kJcGTHrW)TjrW)]mquHZp +rW)fprW)rtr;c`prW)rtr;c]o!!)]lrW'>*rW'e7rW)TjrW)]mquHZprW)fprW)uur;c`prW)os +r;c]o!!)]lrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kJcGTHrW)TjrW)Zlr;ccq +r;c`prrDusr;ccqrW)osquH`rrW)WkrW'>*rW'e7rW)TjrW)Zlr;ccqr;c`prrE#tr;ccqrW)lr +quH`rrW)WkrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kJcGTHrW)TjrW)Zlr;ccq +r;c`prrDusr;ccqrW)osquH`rrW)WkrW'>*rW'e7rW)TjrW)Zlr;ccqr;c`prrE#tr;ccqrW)lr +quH`rrW)WkrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kJcGTHrW)TjrW)Zlr;ccq +r;c`prrDusr;ccqrW)osquH`rrW)WkrW'>*rW'e7rW)TjrW)Zlr;ccqr;c`prrE#tr;ccqrW)lr +quH`rrW)WkrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mjJcGTHrW)TjrW)WkrW)iqr;cfrrW)iq +oDnpkpAjjcrW'>*rW'e7rW)TjrW)WkrW)iqr;cfrrW)lroDnmjpAjjcrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mjJcGTHrW)TjrW)WkrW)iqr;cfrrW)iq +oDnpkpAjjcrW'>*rW'e7rW)TjrW)WkrW)iqr;cfrrW)lroDnmjpAjjcrW&_nrW)ZlJ,~> +q>^Eo_>jK7o`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mjJcGTHrW)TjrW)WkrW)iqr;cfrrW)iq +oDnpkpAjjcrW'>*rW'e7rW)TjrW)WkrW)iqr;cfrrW)lroDnmjpAjjcrW&_nrW)ZlJ,~> +q>^Eo_>jK7p]($hpAb-mqZ$?kq>^g-erW'>*rW'e7rW)]mq#L-grrDoqq#L6jqZ$WrrW)fpq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7p]($hpAb-mqZ$?kq>^g-erW'>*rW'e7rW)]mq#L-grrDoqq#L6jqZ$WrrW)fpq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7p]($hpAb-mqZ$?kq>^g-erW'>*rW'e7rW)]mq#L-grrDoqq#L6jqZ$WrrW)fpq>g-erW&_nrW)ZlJ,~> +q>^Eo_>jK7j8T)Zq#C9mp&G$loDeahnc/RgJcGTHrW)!Y!!)for;cKirrD]kr;cBfrW'>*rW'e7 +rW)!Y!!)for;cNjrrDZjr;cBfrW&_nrW)ZlJ,~> +q>^Eo_>jK7j8T)Zq#C9mp&G$loDeahnc/RgJcGTHrW)!Y!!)for;cKirrD]kr;cBfrW'>*rW'e7 +rW)!Y!!)for;cNjrrDZjr;cBfrW&_nrW)ZlJ,~> +q>^Eo_>jK7j8T)Zq#C9mp&G$loDeahnc/RgJcGTHrW)!Y!!)for;cKirrD]kr;cBfrW'>*rW'e7 +rW)!Y!!)for;cNjrrDZjr;cBfrW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>jK7V>pMpJcGTHrW&eprW'>*rW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^Eo_>g,-JcGTHT)c7urW'e7T)bYdrW)ZlJ,~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@T)d.9rW)iqrW)TjrW'e7T)bYdrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@T)d.9rW)iqrW)TjrW'e7T)bYdrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@T)d.9rW)iqrW)TjrW'e7T)bYdrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@T)d.9rW)iqrW)TjrW'e7T)bYdrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@T)d.9rW)iqrW)TjrW'e7T)bYdrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@T)d.9rW)iqrW)TjrW'e7T)bYdrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@T)d.9rW)iqrW)TjrW'e7T)bYdrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@T)d.9rW)iqrW)TjrW'e7T)bYdrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@T)d.9rW)iqrW)TjrW'e7T)bYdrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW(+@rW&eprW(4CrW)iqrW)TjrW'e7rW&eprW&_nrW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@_Z0W9k5YD\c2[bCqu?Wqo`+mj_>jK7_uK`: +jo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@_Z0W9k5YD\c2[bCqu?Wqo`+mj_>jK7_uK`: +jo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@_Z0W9k5YD\c2[bCqu?Wqo`+mj_>jK7_uK`: +jo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@pAb!iq#C-ikPtDZkPtM]c2[bCqu?Wqo`+mj +_>jK7pAb!iq#C-ikl:M[k5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@pAb!iq#C-ikPtDZkPtM]c2[bCqu?Wqo`+mj +_>jK7pAb!iq#C-ikl:M[k5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@pAb!iq#C-ikPtDZkPtM]c2[bCqu?Wqo`+mj +_>jK7pAb!iq#C-ikl:M[k5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+ghp](3mjT#)WkPtM]c2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mjo>2Xk5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+ghp](3mjT#)WkPtM]c2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mjo>2Xk5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+ghp](3mjT#)WkPtM]c2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mjo>2Xk5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+ghp](3mirAuXk5YD\c2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+ghp](3mirAuXk5YD\c2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+ghp](3mirAuXk5YD\c2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+dgq#CjK7o`+dgq#C;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+dgq#CjK7o`+dgq#C;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+dgq#CjK7o`+dgq#C;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+afq>^EoirAuXk5YD\c2[bCqu?Wqo`+mj +_>jK7o`+afq>^Eoj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+afq>^EoirAuXk5YD\c2[bCqu?Wqo`+mj +_>jK7o`+afq>^Eoj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+afq>^EoirAuXk5YD\c2[bCqu?Wqo`+mj +_>jK7o`+afq>^Eoj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+^eq>^HpirAuXk5YD\c2[bCqu?Wqo`+mj +_>jK7o`+^eq>^Hpj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+^eq>^HpirAuXk5YD\c2[bCqu?Wqo`+mj +_>jK7o`+^eq>^Hpj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+^eq>^HpirAuXk5YD\c2[bCqu?Wqo`+mj +_>jK7o`+^eq>^Hpj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+mj!<;rsqZ$Qqp](6noDedis8W&uq>^Eo +nc/Rgc2[bCqu?Wqo`+mj_>jK7o`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+mj!<;rsqZ$Qqp](6noDedis8W&uq>^Eo +nc/Rgc2[bCqu?Wqo`+mj_>jK7o`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@o`+mj!<;rsqZ$Qqp](6noDedis8W&uq>^Eo +nc/Rgc2[bCqu?Wqo`+mj_>jK7o`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C +q>^Eoqu?Wqr;Z`rdf9:H_uK`:jo>;[`W,o;oDedib5_G@o`+mjs8W#tqZ$QqqZ$?kq#C'gqu?Km +oDedic2[bCqu?Wqo`+mj_>jK7o`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDediU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:H_uK`:jo>;[`W,o;oDedib5_G@o`+mjs8W#tqZ$QqqZ$?kq#C'gqu?Km +oDedic2[bCqu?Wqo`+mj_>jK7o`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDediU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:H_uK`:jo>;[`W,o;oDedib5_G@o`+mjs8W#tqZ$QqqZ$?kq#C'gqu?Km +oDedic2[bCqu?Wqo`+mj_>jK7o`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDediU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HpAb!iq#C-ikl:M[k5YD\`W,o;oDedib5_G@o`+mjs8Vusqu?Zrqu?Wq +rVuisqZ$NprVufrr;Zcsrr;oso`+mjc2[bCqu?Wqo`+mj_>jK7o`+mjs8Vusqu?Zrqu?WqrVuis +qu?WqrVufrqu?Zrrr;oso`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HpAb!iq#C-ikl:M[k5YD\`W,o;oDedib5_G@o`+mjs8Vusqu?Zrqu?Wq +rVuisqZ$NprVufrr;Zcsrr;oso`+mjc2[bCqu?Wqo`+mj_>jK7o`+mjs8Vusqu?Zrqu?WqrVuis +qu?WqrVufrqu?Zrrr;oso`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HpAb!iq#C-ikl:M[k5YD\`W,o;oDedib5_G@o`+mjs8Vusqu?Zrqu?Wq +rVuisqZ$NprVufrr;Zcsrr;oso`+mjc2[bCqu?Wqo`+mj_>jK7o`+mjs8Vusqu?Zrqu?WqrVuis +qu?WqrVufrqu?Zrrr;oso`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mjo>2Xk5YD\`W,o;oDedib5_G@o`+mjrr;lrr;Zcsr;Z`r +qu?Wqr;Z`rqu?WqrVultr;Z]qp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mjrr;lrr;Zcsr;Z`rqu?Wq +rVuisqu?Wqr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mjo>2Xk5YD\`W,o;oDedib5_G@o`+mjrr;lrr;Zcsr;Z`r +qu?Wqr;Z`rqu?WqrVultr;Z]qp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mjrr;lrr;Zcsr;Z`rqu?Wq +rVuisqu?Wqr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mjo>2Xk5YD\`W,o;oDedib5_G@o`+mjrr;lrr;Zcsr;Z`r +qu?Wqr;Z`rqu?WqrVultr;Z]qp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mjrr;lrr;Zcsr;Z`rqu?Wq +rVuisqu?Wqr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mj8])Yjo>;[`W,o;oDedib5_G@o`+mjrVucqrVultr;Z`r +qu?TprVultqZ$NprVultr;Z]qp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mjrVucqrVultr;Z`rqu?Tp +rr;uuqZ$Npr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mj8])Yjo>;[`W,o;oDedib5_G@o`+mjrVucqrVultr;Z`r +qu?TprVultqZ$NprVultr;Z]qp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mjrVucqrVultr;Z`rqu?Tp +rr;uuqZ$Npr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mj8])Yjo>;[`W,o;oDedib5_G@o`+mjrVucqrVultr;Z`r +qu?TprVultqZ$NprVultr;Z]qp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mjrVucqrVultr;Z`rqu?Tp +rr;uuqZ$Npr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+dgq#C;[`W,o;oDedib5_G@o`+mjr;ZZprr;uurVuis +q>^Eorr;rtqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+mjr;ZZprr;uurVuisq>^Eos8W&u +qZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+dgq#C;[`W,o;oDedib5_G@o`+mjr;ZZprr;uurVuis +q>^Eorr;rtqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+mjr;ZZprr;uurVuisq>^Eos8W&u +qZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+dgq#C;[`W,o;oDedib5_G@o`+mjr;ZZprr;uurVuis +q>^Eorr;rtqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+mjr;ZZprr;uurVuisq>^Eos8W&u +qZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+afq>^Eoj8])Yjo>;[`W,o;oDedib5_G@o`+mjqu?Tprr;uurVuis +q>^Bns8W&uqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+mjqu?Tprr;uurVuisq>^Bn!<<#u +qZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+afq>^Eoj8])Yjo>;[`W,o;oDedib5_G@o`+mjqu?Tprr;uurVuis +q>^Bns8W&uqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+mjqu?Tprr;uurVuisq>^Bn!<<#u +qZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+afq>^Eoj8])Yjo>;[`W,o;oDedib5_G@o`+mjqu?Tprr;uurVuis +q>^Bns8W&uqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+mjqu?Tprr;uurVuisq>^Bn!<<#u +qZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+^eq>^Hpj8])Yjo>;[`W,o;oDedib5_G@o`+mjqu?Qos8W*!rVuis +q>^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjqu?Qos8W*!rVuisq>^Bn!<<#u +qZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+^eq>^Hpj8])Yjo>;[`W,o;oDedib5_G@o`+mjqu?Qos8W*!rVuis +q>^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjqu?Qos8W*!rVuisq>^Bn!<<#u +qZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+^eq>^Hpj8])Yjo>;[`W,o;oDedib5_G@o`+mjqu?Qos8W*!rVuis +q>^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjqu?Qos8W*!rVuisq>^Bn!<<#u +qZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjqZ$Hn +!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjqZ$Hn +!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjqZ$Hn +!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDedi`W,o;oDedib5_G@o`+mj +q>^9krr;osq>^Bn!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjq>^9krr;osq>^6j +qZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDedi`W,o;oDedib5_G@o`+mj +q>^9krr;osq>^Bn!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjq>^9krr;osq>^6j +qZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDedi`W,o;oDedib5_G@o`+mj +q>^9krr;osq>^Bn!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjq>^9krr;osq>^6j +qZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mj`W,o; +oDedib5_G@o`+mjq#C3krVufrqZ$Ko!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mj +q#C3krVufrqZ$?kqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mj`W,o; +oDedib5_G@o`+mjq#C3krVufrqZ$Ko!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mj +q#C3krVufrqZ$?kqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mj`W,o; +oDedib5_G@o`+mjq#C3krVufrqZ$Ko!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mj +q#C3krVufrqZ$?kqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjp](-krVufrqZ$Kos8W#tqu?Wqrr;rtq#:jK7 +o`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#: +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjp](-krVufrqZ$Kos8W#tqu?Wqrr;rtq#:jK7 +o`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#: +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjp](-krVufrqZ$Kos8W#tqu?Wqrr;rtq#:jK7 +o`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#: +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjp](-kr;Z`rqZ$Nprr;osqu?Wqrr;osqYpNqp&G!kc2[bCqu?Wqo`+mj_>jK7 +o`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjp](-kr;Z`rqZ$Nprr;osqu?Wqrr;osqYpNqp&G!kc2[bCqu?Wqo`+mj_>jK7 +o`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjp](-kr;Z`rqZ$Nprr;osqu?Wqrr;osqYpNqp&G!kc2[bCqu?Wqo`+mj_>jK7 +o`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjpAb'kr;Z]qqu?Zrr;Z]qr;Z`rrVucqrr;rtp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mj +pAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjpAb'kr;Z]qqu?Zrr;Z]qr;Z`rrVucqrr;rtp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mj +pAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjpAb'kr;Z]qqu?Zrr;Z]qr;Z`rrVucqrr;rtp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mj +pAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjp&G!kqu?TprVuisqu?9gs8Vfno`+mjc2[bCqu?Wqo`+mj_>jK7o`+mjp&G!kqu?Tp +rVuisr;ZBhrr;]mo`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjp&G!kqu?TprVuisqu?9gs8Vfno`+mjc2[bCqu?Wqo`+mj_>jK7o`+mjp&G!kqu?Tp +rVuisr;ZBhrr;]mo`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjp&G!kqu?TprVuisqu?9gs8Vfno`+mjc2[bCqu?Wqo`+mj_>jK7o`+mjp&G!kqu?Tp +rVuisr;ZBhrr;]mo`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@p]($hpAb-mqZ$?kq#C3k!<<#uqu?KmoDedic2[bCqu?Wqo`+mj_>jK7p]($hpAb-mqZ$?k +q>^ +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@p]($hpAb-mqZ$?kq#C3k!<<#uqu?KmoDedic2[bCqu?Wqo`+mj_>jK7p]($hpAb-mqZ$?k +q>^ +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@p]($hpAb-mqZ$?kq#C3k!<<#uqu?KmoDedic2[bCqu?Wqo`+mj_>jK7p]($hpAb-mqZ$?k +q>^ +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@j8T)Zq#C9mo`+pko`+jinc/Rgc2[bCqu?Wqo`+mj_>jK7j8T)Zq#C9mp&G$loDeahnc/Rg +U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@j8T)Zq#C9mo`+pko`+jinc/Rgc2[bCqu?Wqo`+mj_>jK7j8T)Zq#C9mp&G$loDeahnc/Rg +U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@j8T)Zq#C9mo`+pko`+jinc/Rgc2[bCqu?Wqo`+mj_>jK7j8T)Zq#C9mp&G$loDeahnc/Rg +U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%b`W,o;oDedib5_G@V>pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%b`W,o;oDedib5_G@V>pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%b`W,o;oDedib5_G@V>pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%b`W,o;oDedib5_G@V>pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%b`W,o;oDedib5_G@V>pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%b`W,o;oDedib5_G@V>pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!k`W,o;oDedi +b5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!k`W,o;oDedi +b5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!k`W,o;oDedi +b5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!k`W,o;oDedi +b5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!k`W,o;oDedi +b5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!k`W,o;oDedi +b5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mj`W,o;oDedib5_G@V>pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mj`W,o;oDedib5_G@V>pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mj`W,o;oDedib5_G@V>pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hp]($hpAb-mqZ$?kq>^pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hp]($hpAb-mqZ$?kq>^pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hp]($hpAb-mqZ$?kq>^pMp +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hj8T)Zq#C9mp&G$loDeahnc/Rg`W,o;oDedib5_G@V>pMpc2[bCqu?Wq +o`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hj8T)Zq#C9mp&G$loDeahnc/Rg`W,o;oDedib5_G@V>pMpc2[bCqu?Wq +o`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hj8T)Zq#C9mp&G$loDeahnc/Rg`W,o;oDedib5_G@V>pMpc2[bCqu?Wq +o`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDediJcE+WrW)iqrW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:H_uK`:jo>;[`W,o;oDedib5_G@_Z0W9k5YD\c2[bCqu?Wqo`+mj_>jK7 +V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:H_uK`:jo>;[`W,o;oDedib5_G@_Z0W9k5YD\c2[bCqu?Wqo`+mj_>jK7 +V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:H_uK`:jo>;[`W,o;oDedib5_G@_Z0W9k5YD\c2[bCqu?Wqo`+mj_>jK7 +V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HpAb!iq#C-ikl:M[k5YD\`W,o;oDedib5_G@pAb!iq#C-ikPtDZkPtM] +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HpAb!iq#C-ikl:M[k5YD\`W,o;oDedib5_G@pAb!iq#C-ikPtDZkPtM] +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HpAb!iq#C-ikl:M[k5YD\`W,o;oDedib5_G@pAb!iq#C-ikPtDZkPtM] +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mjo>2Xk5YD\`W,o;oDedib5_G@o`+ghp](3mjT#)WkPtM] +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mjo>2Xk5YD\`W,o;oDedib5_G@o`+ghp](3mjT#)WkPtM] +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mjo>2Xk5YD\`W,o;oDedib5_G@o`+ghp](3mjT#)WkPtM] +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mj8])Yjo>;[`W,o;oDedib5_G@o`+ghp](3mirAuXk5YD\ +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mj8])Yjo>;[`W,o;oDedib5_G@o`+ghp](3mirAuXk5YD\ +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+ghp](3mj8])Yjo>;[`W,o;oDedib5_G@o`+ghp](3mirAuXk5YD\ +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+dgq#C;[`W,o;oDedib5_G@o`+dgq#CjK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+dgq#C;[`W,o;oDedib5_G@o`+dgq#CjK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+dgq#C;[`W,o;oDedib5_G@o`+dgq#CjK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+afq>^Eoj8])Yjo>;[`W,o;oDedib5_G@o`+afq>^EoirAuXk5YD\ +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+afq>^Eoj8])Yjo>;[`W,o;oDedib5_G@o`+afq>^EoirAuXk5YD\ +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+afq>^Eoj8])Yjo>;[`W,o;oDedib5_G@o`+afq>^EoirAuXk5YD\ +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+^eq>^Hpj8])Yjo>;[`W,o;oDedib5_G@o`+^eq>^HpirAuXk5YD\ +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+^eq>^Hpj8])Yjo>;[`W,o;oDedib5_G@o`+^eq>^HpirAuXk5YD\ +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+^eq>^Hpj8])Yjo>;[`W,o;oDedib5_G@o`+^eq>^HpirAuXk5YD\ +c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C^Eonc/Rgc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C^Eonc/Rgc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mj!<;rsqZ$Qqp](6no`+mjs8W&uq#C^Eonc/Rgc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDedi`W,o;oDedib5_G@o`+mj +s8W#tqZ$QqqZ$?kq#C'gqu?KmoDedic2[bCqu?Wqo`+mj_>jK7_uK`:jo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDedi`W,o;oDedib5_G@o`+mj +s8W#tqZ$QqqZ$?kq#C'gqu?KmoDedic2[bCqu?Wqo`+mj_>jK7_uK`:jo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8W#tqZ$QqqZ$?kq>^0hqZ$BloDedi`W,o;oDedib5_G@o`+mj +s8W#tqZ$QqqZ$?kq#C'gqu?KmoDedic2[bCqu?Wqo`+mj_>jK7_uK`:jo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mj`W,o; +oDedib5_G@o`+mjs8Vusqu?Zrqu?WqrVuisqZ$NprVufrr;Zcsrr;oso`+mjc2[bCqu?Wqo`+mj +_>jK7pAb!iq#C-ikl:M[k5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mj`W,o; +oDedib5_G@o`+mjs8Vusqu?Zrqu?WqrVuisqZ$NprVufrr;Zcsrr;oso`+mjc2[bCqu?Wqo`+mj +_>jK7pAb!iq#C-ikl:M[k5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjs8Vusqu?Zrqu?WqrVuisqu?WqrVufrqu?Zrrr;oso`+mj`W,o; +oDedib5_G@o`+mjs8Vusqu?Zrqu?WqrVuisqZ$NprVufrr;Zcsrr;oso`+mjc2[bCqu?Wqo`+mj +_>jK7pAb!iq#C-ikl:M[k5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjrr;lrr;Zcsr;Z`rqu?Wqr;Z`rqu?WqrVultr;Z]qp&G!kc2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mjo>2Xk5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjrr;lrr;Zcsr;Z`rqu?Wqr;Z`rqu?WqrVultr;Z]qp&G!kc2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mjo>2Xk5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjrr;lrr;Zcsr;Z`rqu?Wqr;Z`rqu?WqrVultr;Z]qp&G!kc2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mjo>2Xk5YD\U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjrVucqrVultr;Z`rqu?TprVultqZ$NprVultr;Z]qp&G!kc2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjrVucqrVultr;Z`rqu?TprVultqZ$NprVultr;Z]qp&G!kc2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjrVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!k`W,o; +oDedib5_G@o`+mjrVucqrVultr;Z`rqu?TprVultqZ$NprVultr;Z]qp&G!kc2[bCqu?Wqo`+mj +_>jK7o`+ghp](3mj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjr;ZZprr;uurVuisq>^Eorr;rtqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+dg +q#C;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjr;ZZprr;uurVuisq>^Eorr;rtqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+dg +q#C;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjr;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjr;ZZprr;uurVuisq>^Eorr;rtqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+dg +q#C;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjqu?Tprr;uurVuisq>^Bns8W&uqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+af +q>^Eoj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjqu?Tprr;uurVuisq>^Bns8W&uqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+af +q>^Eoj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Tprr;uurVuisq>^Bn!<<#uqZ$NprVuKipAb*l`W,o;oDedi +b5_G@o`+mjqu?Tprr;uurVuisq>^Bns8W&uqZ$Nprr;TjpAb*lc2[bCqu?Wqo`+mj_>jK7o`+af +q>^Eoj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@o`+mjqu?Qos8W*!rVuisq>^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+^e +q>^Hpj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@o`+mjqu?Qos8W*!rVuisq>^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+^e +q>^Hpj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqu?Qos8W*!rVuisq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@o`+mjqu?Qos8W*!rVuisq>^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+^e +q>^Hpj8])Yjo>;[U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@o`+mjqZ$Hn!ri6#rr;osq>^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mj +!<;rsqZ$Qqp](6no`+mjs8W&uq#C +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@o`+mjqZ$Hn!ri6#rr;osq>^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mj +!<;rsqZ$Qqp](6no`+mjs8W&uq#C +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%b`W,o;oDedi +b5_G@o`+mjqZ$Hn!ri6#rr;osq>^Bns8W&uqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mj +!<;rsqZ$Qqp](6no`+mjs8W&uq#C +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%b`W,o;oDedib5_G@o`+mj +q>^9krr;osq>^Bn!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjs8W#tqZ$QqqZ$?k +q>^0hqZ$BloDediU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%b`W,o;oDedib5_G@o`+mj +q>^9krr;osq>^Bn!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjs8W#tqZ$QqqZ$?k +q>^0hqZ$BloDediU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq>^9krr;osq>^6jqZ$Nprr;osm/R%b`W,o;oDedib5_G@o`+mj +q>^9krr;osq>^Bn!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjs8W#tqZ$QqqZ$?k +q>^0hqZ$BloDediU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%b`W,o;oDedib5_G@o`+mj +q#C3krVufrqZ$Ko!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjs8Vusqu?Zrqu?Wq +rVuisqu?WqrVufrqu?Zrrr;oso`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%b`W,o;oDedib5_G@o`+mj +q#C3krVufrqZ$Ko!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjs8Vusqu?Zrqu?Wq +rVuisqu?WqrVufrqu?Zrrr;oso`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjq#C3krVufrqZ$?kqZ$Nprr;osm/R%b`W,o;oDedib5_G@o`+mj +q#C3krVufrqZ$Ko!<;utqZ$Nps8W#tm/R%bc2[bCqu?Wqo`+mj_>jK7o`+mjs8Vusqu?Zrqu?Wq +rVuisqu?WqrVufrqu?Zrrr;oso`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:jK7o`+mj +rr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:jK7o`+mj +rr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-krVufrqZ$Ko!<;utqu?WqrVuisq#:jK7o`+mj +rr;lrr;Zcsr;Z`rqu?WqrVuisqu?Wqr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!k`W,o;oDedi +b5_G@o`+mjp](-kr;Z`rqZ$Nprr;osqu?Wqrr;osqYpNqp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mj +rVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!k`W,o;oDedi +b5_G@o`+mjp](-kr;Z`rqZ$Nprr;osqu?Wqrr;osqYpNqp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mj +rVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp](-kr;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!k`W,o;oDedi +b5_G@o`+mjp](-kr;Z`rqZ$Nprr;osqu?Wqrr;osqYpNqp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mj +rVucqrVultr;Z`rqu?Tprr;uuqZ$Npr;Zcsr;Z]qp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!k`W,o;oDedi +b5_G@o`+mjpAb'kr;Z]qqu?Zrr;Z]qr;Z`rrVucqrr;rtp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mj +r;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!k`W,o;oDedi +b5_G@o`+mjpAb'kr;Z]qqu?Zrr;Z]qr;Z`rrVucqrr;rtp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mj +r;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjpAb'kr;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!k`W,o;oDedi +b5_G@o`+mjpAb'kr;Z]qqu?Zrr;Z]qr;Z`rrVucqrr;rtp&G!kc2[bCqu?Wqo`+mj_>jK7o`+mj +r;ZZprr;uurVuisq>^Eos8W&uqZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mj`W,o;oDedib5_G@o`+mj +p&G!kqu?TprVuisqu?9gs8Vfno`+mjc2[bCqu?Wqo`+mj_>jK7o`+mjqu?Tprr;uurVuisq>^Bn +!<<#uqZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mj`W,o;oDedib5_G@o`+mj +p&G!kqu?TprVuisqu?9gs8Vfno`+mjc2[bCqu?Wqo`+mj_>jK7o`+mjqu?Tprr;uurVuisq>^Bn +!<<#uqZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Ho`+mjp&G!kqu?TprVuisr;ZBhrr;]mo`+mj`W,o;oDedib5_G@o`+mj +p&G!kqu?TprVuisqu?9gs8Vfno`+mjc2[bCqu?Wqo`+mj_>jK7o`+mjqu?Tprr;uurVuisq>^Bn +!<<#uqZ$NprVuKipAb*lU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hp]($hpAb-mqZ$?kq>^jK7o`+mjqu?Qos8W*!rVuisq>^Bn +!<<#uqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hp]($hpAb-mqZ$?kq>^jK7o`+mjqu?Qos8W*!rVuisq>^Bn +!<<#uqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hp]($hpAb-mqZ$?kq>^jK7o`+mjqu?Qos8W*!rVuisq>^Bn +!<<#uqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hj8T)Zq#C9mp&G$loDeahnc/Rg`W,o;oDedib5_G@j8T)Zq#C9mo`+pk +o`+jinc/Rgc2[bCqu?Wqo`+mj_>jK7o`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%b +U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hj8T)Zq#C9mp&G$loDeahnc/Rg`W,o;oDedib5_G@j8T)Zq#C9mo`+pk +o`+jinc/Rgc2[bCqu?Wqo`+mj_>jK7o`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%b +U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:Hj8T)Zq#C9mp&G$loDeahnc/Rg`W,o;oDedib5_G@j8T)Zq#C9mo`+pk +o`+jinc/Rgc2[bCqu?Wqo`+mj_>jK7o`+mjqZ$Hn!ri6#rr;osq>^Bn!<<#uqZ$Nprr;osm/R%b +U]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjq>^9k +rr;osq>^6jqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjq>^9k +rr;osq>^6jqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjq>^9k +rr;osq>^6jqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjq#C3k +rVufrqZ$?kqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjq#C3k +rVufrqZ$?kqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjq#C3k +rVufrqZ$?kqZ$Nprr;osm/R%bU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjp](-k +rVufrqZ$Ko!<;utqu?WqrVuisq#: +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjp](-k +rVufrqZ$Ko!<;utqu?WqrVuisq#: +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjp](-k +rVufrqZ$Ko!<;utqu?WqrVuisq#: +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjp](-k +r;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjp](-k +r;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjp](-k +r;Z`rqZ$Nps8W#tqu?WqrVufrqYpNqp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjpAb'k +r;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjpAb'k +r;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjpAb'k +r;Z]qqu?ZrrVufrr;Z`rr;ZZprr;rtp&G!kU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjp&G!k +qu?TprVuisr;ZBhrr;]mo`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjp&G!k +qu?TprVuisr;ZBhrr;]mo`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7o`+mjp&G!k +qu?TprVuisr;ZBhrr;]mo`+mjU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7p]($hpAb-m +qZ$?kq>^ +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7p]($hpAb-m +qZ$?kq>^ +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7p]($hpAb-m +qZ$?kq>^ +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7j8T)Zq#C9m +p&G$loDeahnc/RgU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7j8T)Zq#C9m +p&G$loDeahnc/RgU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7j8T)Zq#C9m +p&G$loDeahnc/RgU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf9:HV>pMp`W,o;oDedib5_G@V>pMpc2[bCqu?Wqo`+mj_>jK7V>pMpU]:;n +pA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rdf5p>`W,o;oDedib5\(6c2[bCqu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>jK7V>pMpU]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`r\GuL-rVlitLB%5QoDediYlFY%rVlitNrT(Yqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`r\GuL-rVlitLB%5QoDediYlFY%rVlitNrT(Yqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`r\GuL-rVlitLB%5QoDediYlFY%rVlitNrT(Yqu?Wqo`+mj_>g,-U]:;npA]X~> +q>^Eoqu?Wqr;Z`r])VI(LB%5QoDediZN'UuNrT(Yqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r])VI(LB%5QoDediZN'UuNrT(Yqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r])VI(LB%5QoDediZN'UuNrT(Yqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dqg0rVufrLB%5QoDediZiBt(rVufrNrT(Yqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dqg0rVufrLB%5QoDediZiBt(rVufrNrT(Yqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dqg0rVufrLB%5QoDediZiBt(rVufrNrT(Yqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dqj1qu?TpL]@>RoDediZiC")qu?TpO8o1Zqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dqj1qu?TpL]@>RoDediZiC")qu?TpO8o1Zqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dqj1qu?TpL]@>RoDediZiC")qu?TpO8o1Zqu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7p1qZ$Npqu6WrNrT(YoDedi[/^()qZ$NpqYpNqQiI$bqu?Wqo`+mjJcC<$ +rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7p1qZ$Npqu6WrNrT(YoDedi[/^()qZ$NpqYpNqQiI$bqu?Wqo`+mjJcC<$ +rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7p1qZ$Npqu6WrNrT(YoDedi[/^()qZ$NpqYpNqQiI$bqu?Wqo`+mjJcC<$ +rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7p1q>^Hpr;Z`rO8o1ZoDedi[/^()q>^Hpqu?WqR/d-cqu?Wqo`+mjJcC<$ +rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7p1q>^Hpr;Z`rO8o1ZoDedi[/^()q>^Hpqu?WqR/d-cqu?Wqo`+mjJcC<$ +rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7p1q>^Hpr;Z`rO8o1ZoDedi[/^()q>^Hpqu?WqR/d-cqu?Wqo`+mjJcC<$ +rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7p1q>^Hpr;Z`rO8o1ZoDedi[/^()q>^Hpqu?WqR/d-cqu?Wqo`+mjJcC<$ +rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7p1q>^Hpr;Z`rO8o1ZoDedi[/^()q>^Hpqu?WqR/d-cqu?Wqo`+mjJcC<$ +rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7p1q>^Hpr;Z`rO8o1ZoDedi[/^()q>^Hpqu?WqR/d-cqu?Wqo`+mjJcC<$ +rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7m0q>UEprVufrp](3moDegjXT/8"oDedi[/^%(q>UEpr;Z]qq#C +q>^Eoqu?Wqr;Z`r]`7m0q>UEprVufrp](3moDegjXT/8"oDedi[/^%(q>UEpr;Z]qq#C +q>^Eoqu?Wqr;Z`r]`7m0q>UEprVufrp](3moDegjXT/8"oDedi[/^%(q>UEpr;Z]qq#C +q>^Eoqu?Wqr;Z`r]Dqd/p](!gr;ZTnr;Z`rs8VrrY5eJ$oDediZiBq'pAamfrVu]oqu?Wqs8Vrr +\,ZF-qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dqd/p](!gr;ZTnr;Z`rs8VrrY5eJ$oDediZiBq'pAamfrVu]oqu?Wqs8Vrr +\,ZF-qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dqd/p](!gr;ZTnr;Z`rs8VrrY5eJ$oDediZiBq'pAamfrVu]oqu?Wqs8Vrr +\,ZF-qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dq^-q#C0jr;Zcsrr;oss8VZjYQ+S%oDediZiBk%p]('irVultrr;osrr;Qi +\GuO.qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dq^-q#C0jr;Zcsrr;oss8VZjYQ+S%oDediZiBk%p]('irVultrr;osrr;Qi +\GuO.qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]Dq^-q#C0jr;Zcsrr;oss8VZjYQ+S%oDediZiBk%p]('irVultrr;osrr;Qi +\GuO.qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r])VU,q#C9mqu?Zrr;Z]qrr;osr;Z]qYlF\&oDediZN'b$p](0lr;Zcsr;Z]q +rVufrr;Z]q\c;X/qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r])VU,q#C9mqu?Zrr;Z]qrr;osr;Z]qYlF\&oDediZN'b$p](0lr;Zcsr;Z]q +rVufrr;Z]q\c;X/qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r])VU,q#C9mqu?Zrr;Z]qrr;osr;Z]qYlF\&oDediZN'b$p](0lr;Zcsr;Z]q +rVufrr;Z]q\c;X/qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r\GuC*qZ$Koqu?Zrr;Z]qrr;osqu?WqYlF\&oDediYlFP"q>^Bnr;Zcsr;Z]q +rVufrqu?Wq\c;X/qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r\GuC*qZ$Koqu?Zrr;Z]qrr;osqu?WqYlF\&oDediYlFP"q>^Bnr;Zcsr;Z]q +rVufrqu?Wq\c;X/qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r\GuC*qZ$Koqu?Zrr;Z]qrr;osqu?WqYlF\&oDediYlFP"q>^Bnr;Zcsr;Z]q +rVufrqu?Wq\c;X/qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r\,Z:)qu?Tpr;ZBhs8W#tqu?TpZ2ae'oDediYQ+G!qZ$KorVuKirr;osqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r\,Z:)qu?Tpr;ZBhs8W#tqu?TpZ2ae'oDediYQ+G!qZ$KorVuKirr;osqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r\,Z:)qu?Tpr;ZBhs8W#tqu?TpZ2ae'oDediYQ+G!qZ$KorVuKirr;osqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r[K$+(r;Z]qr;ZBhs8W#tqu?TpZ2ae'oDediXoJ7uqu?TprVuKirr;osqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r[K$+(r;Z]qr;ZBhs8W#tqu?TpZ2ae'oDediXoJ7uqu?TprVuKirr;osqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r[K$+(r;Z]qr;ZBhs8W#tqu?TpZ2ae'oDediXoJ7uqu?TprVuKirr;osqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r[/^"'rVufrrVufrp&Fsjqu?TpZ2ae'oDediXT/.tr;Z]qrr;oso`+jiqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r[/^"'rVufrrVufrp&Fsjqu?TpZ2ae'oDediXT/.tr;Z]qrr;oso`+jiqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r[/^"'rVufrrVufrp&Fsjqu?TpZ2ae'oDediXT/.tr;Z]qrr;oso`+jiqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rZiBq'rVufrrVufrp&Fsjqu?TpZ2ae'oDediX8i(tr;Z]qrr;oso`+jiqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rZiBq'rVufrrVufrp&Fsjqu?TpZ2ae'oDediX8i(tr;Z]qrr;oso`+jiqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rZiBq'rVufrrVufrp&Fsjqu?TpZ2ae'oDediX8i(tr;Z]qrr;oso`+jiqu?Tp +])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r^&J'4p](-krr;osrVufrp&Fsjqu?TpZ2ae'oDedi[Jp4,p](-krVufrrr;os +o`+jiqu?Tp])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r^&J'4p](-krr;osrVufrp&Fsjqu?TpZ2ae'oDedi[Jp4,p](-krVufrrr;os +o`+jiqu?Tp])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r^&J'4p](-krr;osrVufrp&Fsjqu?TpZ2ae'oDedi[Jp4,p](-krVufrrr;os +o`+jiqu?Tp])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r^&S*4q#C6lrr;osrVufrp&Fsjqu?TpZ2ae'oDedi[K$7,q#C6lrVufrrr;os +o`+jiqu?Tp])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r^&S*4q#C6lrr;osrVufrp&Fsjqu?TpZ2ae'oDedi[K$7,q#C6lrVufrrr;os +o`+jiqu?Tp])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r^&S*4q#C6lrr;osrVufrp&Fsjqu?TpZ2ae'oDedi[K$7,q#C6lrVufrrr;os +o`+jiqu?Tp])Va0qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r^&S*4p](0lrr;osr;Z`rq#:Bqs8W#tqu?WqYlF\&oDedi[K$7,p](0lrVufr +rVuisq#: +q>^Eoqu?Wqr;Z`r^&S*4p](0lrr;osr;Z`rq#:Bqs8W#tqu?WqYlF\&oDedi[K$7,p](0lrVufr +rVuisq#: +q>^Eoqu?Wqr;Z`r^&S*4p](0lrr;osr;Z`rq#:Bqs8W#tqu?WqYlF\&oDedi[K$7,p](0lrVufr +rVuisq#: +q>^Eoqu?Wqr;Z`r^&S'3q#C +q>^Eoqu?Wqr;Z`r^&S'3q#C +q>^Eoqu?Wqr;Z`r^&S'3q#C +q>^Eoqu?Wqr;Z`r]`7s2qZ$KorVufrs8N'!rr;lrrr;rtrr;osr;Z`rYQ+S%oDedi[/^+*qZ$Ko +r;Z]qs8N-#s8Vusrr;rtrVufrr;Z`r\GuO.qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7s2qZ$KorVufrs8N'!rr;lrrr;rtrr;osr;Z`rYQ+S%oDedi[/^+*qZ$Ko +r;Z]qs8N-#s8Vusrr;rtrVufrr;Z`r\GuO.qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7s2qZ$KorVufrs8N'!rr;lrrr;rtrr;osr;Z`rYQ+S%oDedi[/^+*qZ$Ko +r;Z]qs8N-#s8Vusrr;rtrVufrr;Z`r\GuO.qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7m0rVufrqu?Nnrr;]mrVucqrr;rtY5eJ$oDedi[/^%(rVufrqZ$Ems8Vfn +r;ZZprr;rt\,ZF-qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7m0rVufrqu?Nnrr;]mrVucqrr;rtY5eJ$oDedi[/^%(rVufrqZ$Ems8Vfn +r;ZZprr;rt\,ZF-qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7m0rVufrqu?Nnrr;]mrVucqrr;rtY5eJ$oDedi[/^%(rVufrqZ$Ems8Vfn +r;ZZprr;rt\,ZF-qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7X)qZ$Hnqu?Kmr;ZKkXoJA#oDedi[/]e!q>^?mr;ZTnqu?Bj[f?=,qu?Wq +o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7X)qZ$Hnqu?Kmr;ZKkXoJA#oDedi[/]e!q>^?mr;ZTnqu?Bj[f?=,qu?Wq +o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`7X)qZ$Hnqu?Kmr;ZKkXoJA#oDedi[/]e!q>^?mr;ZTnqu?Bj[f?=,qu?Wq +o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`.s3rVufrp&>!lq#C9mqZ$Kos8W*!X8i/!oDedi[/U++rVufro`"mkq>^Bn +q>^Bns8W*![/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`.s3rVufrp&>!lq#C9mqZ$Kos8W*!X8i/!oDedi[/U++rVufro`"mkq>^Bn +q>^Bns8W*![/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`r]`.s3rVufrp&>!lq#C9mqZ$Kos8W*!X8i/!oDedi[/U++rVufro`"mkq>^Bn +q>^Bns8W*![/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rP5kI\VuQ_roDediM?!MSYlF\&qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rPlLOZWW2qtoDediMuWSQZN'n(qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rPlLOZWW2qtoDediMuWSQZN'n(qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rPlLOZWW2qtoDediMuWSQZN'n(qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rPlLOZWW2qtoDediMuWSQZN'n(qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rPlLOZWW2qtoDediMuWSQZN'n(qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rPlLOZWW2qtoDediMuWSQZN'n(qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;Z`rJcE+WrW)QirW%NL[/^+*qu?Wqo`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?Wqr;V +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqN;ikXJcC<$\GuO.o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqN;ikXJcC<$\GuO.o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqN;ikXJcC<$\GuO.o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqX8hqpn,N7bJcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqX8hqpn,N7bJcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqX8hqpn,N7bJcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqWW2krmJm%`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqWW2krmJm%`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqWW2krmJm%`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqWW2krli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqWW2krli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqWW2krli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerli6n`JcC<$\c;X/o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerp](6np](0lrr;uuJcC<$^An04o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerp](6np](0lrr;uuJcC<$^An04o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerp](6np](0lrr;uuJcC<$^An04o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerqZ$?kqZ$Ko!<;orJcC<$_#OB6o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerqZ$?kqZ$Ko!<;orJcC<$_#OB6o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerqZ$?kqZ$Ko!<;orJcC<$_#OB6o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerqu?WqrVuisqu?jK7o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerqu?WqrVuisqu?jK7o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerqu?WqrVuisqu?jK7o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerr;Z`rqu?Wqr;ZZprr;lrJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerr;Z`rqu?Wqr;ZZprr;lrJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerr;Z`rqu?Wqr;ZZprr;lrJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerr;Z`rqu?TprVuisqu?TpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerr;Z`rqu?TprVuisqu?TpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerr;Z`rqu?TprVuisqu?TpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVuisq>^EorVuisqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVuisq>^EorVuisqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVuisq>^EorVuisqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVuisq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVuisq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVuisq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVuisq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVuisq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVuisq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrr;osq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrr;osq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrr;osq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrr;osq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrr;osq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrr;osq>^Bnrr;rtqZ$KoJcC<$_uK]9o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVufrqZ$Korr;rtqZ$NpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVufrqZ$Korr;rtqZ$NpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVufrqZ$Korr;rtqZ$NpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVufrqZ$Korr;rtqZ$NpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVufrqZ$Korr;rtqZ$NpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqW;lerrVufrqZ$Korr;rtqZ$NpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqXoJD$rr;rtqu?WqqZ$NprVuisqZ$NpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqXoJD$rr;rtqu?WqqZ$NprVuisqZ$NpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqXoJD$rr;rtqu?WqqZ$NprVuisqZ$NpJcC<$_Z0T8o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqY5eG#s8W&uqu?Tpqu?Zrr;Z`rqu?WqJcC<$_>jK7o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqY5eG#s8W&uqu?Tpqu?Zrr;Z`rqu?WqJcC<$_>jK7o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqY5eG#s8W&uqu?Tpqu?Zrr;Z`rqu?WqJcC<$_>jK7o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqY5eG#!<<#uq>^BnrVuisr;Z]qrVuisJcC<$_#OB6o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqY5eG#!<<#uq>^BnrVuisr;Z]qrVuisJcC<$_#OB6o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqY5eG#!<<#uq>^BnrVuisr;Z]qrVuisJcC<$_#OB6o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqXoJ7up]($hq>^3iJcC<$^]495o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqXoJ7up]($hq>^3iJcC<$^]495o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqXoJ7up]($hq>^3iJcC<$^]495o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqXT/8"oDeaho`+mjJcC<$]`7s2o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqXT/8"oDeaho`+mjJcC<$]`7s2o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqXT/8"oDeaho`+mjJcC<$]`7s2o`+mjJcC<$rW)ZlJ,~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu?WqJcC<$JcEUerW)TjrW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^Eoqu;3IJH16$]E%U(rW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcDbMrrDQgrr@WMQ2gg`QN-sbnc/Uhc2[_B\GuO.pA]X~> +q>^EoJcDbMrrDQgrr@WMQ2gg`QN-sbnc/Uhc2[_B\GuO.pA]X~> +q>^EoJcDbMrrDQgrr@WMQ2gg`QN-sbnc/Uhc2[_B\GuO.pA]X~> +q>^EoJcF^/oDmMCrW)KgrW(4Crr@WMbl@YBcN!M:f)P^Lo)J[hd/WnA])Va0pA]X~> +q>^EoJcF^/oDmMCrW)KgrW(4Crr@WMbl@YBcN!M:f)P^Lo)J[hd/WnA])Va0pA]X~> +q>^EoJcF^/oDmMCrW)KgrW(4Crr@WMbl@YBcN!M:f)P^Lo)J[hd/WnA])Va0pA]X~> +q>^EoJcFX-oDmVFr;cEgr;b1Dr;_EKbl@YBbl@;8g&M!NoDeahdJrq@]Dqj1pA]X~> +q>^EoJcFX-oDmVFr;cEgr;b1Dr;_EKbl@YBbl@;8g&M!NoDeahdJrq@]Dqj1pA]X~> +q>^EoJcFX-oDmVFr;cEgr;b1Dr;_EKbl@YBbl@;8g&M!NoDeahdJrq@]Dqj1pA]X~> +q>^EoJcFX-r;c`pr;bROrrDQgrrCFGqZ)3Ibl@YBbl@VAqu?Tpg&M'Pnc/UhdJs1Grr;lr]Dqj1 +pA]X~> +q>^EoJcFX-r;c`pr;bROrrDQgrrCFGqZ)3Ibl@YBbl@VAqu?Tpg&M'Pnc/UhdJs1Grr;lr]Dqj1 +pA]X~> +q>^EoJcFX-r;c`pr;bROrrDQgrrCFGqZ)3Ibl@YBbl@VAqu?Tpg&M'Pnc/UhdJs1Grr;lr]Dqj1 +pA]X~> +q>^EoJcFX-r;c]or;bmX!!)Ng!!'q:rW%NLbl@YBbl@VAqZ$Koir8uYnG`IgaT)8?qu?Tp]`7s2 +pA]X~> +q>^EoJcFX-r;c]or;bmX!!)Ng!!'q:rW%NLbl@YBbl@VAqZ$Koir8uYnG`IgaT)8?qu?Tp]`7s2 +pA]X~> +q>^EoJcFX-r;c]or;bmX!!)Ng!!'q:rW%NLbl@YBbl@VAqZ$Koir8uYnG`IgaT)8?qu?Tp]`7s2 +pA]X~> +q>^EoJcFX-r;c]or;bpYrW)NhrW'n:rW%NLbl@YBbl@VAqZ$Koj8])Yo)J[hb5_JAq>^Eo]`7s2 +pA]X~> +q>^EoJcFX-r;c]or;bpYrW)NhrW'n:rW%NLbl@YBbl@VAqZ$Koj8])Yo)J[hb5_JAq>^Eo]`7s2 +pA]X~> +q>^EoJcFX-r;c]or;bpYrW)NhrW'n:rW%NLbl@YBbl@VAqZ$Koj8])Yo)J[hb5_JAq>^Eo]`7s2 +pA]X~> +q>^EoJcFX-r;c]or;bpYrW)NhrW'n:rW%NLbl@YBbl@VAqZ$Koj8])Yo)J[hb5VGAq#C9m^&S'3 +pA]X~> +q>^EoJcFX-r;c]or;bpYrW)NhrW'n:rW%NLbl@YBbl@VAqZ$Koj8])Yo)J[hb5VGAq#C9m^&S'3 +pA]X~> +q>^EoJcFX-r;c]or;bpYrW)NhrW'n:rW%NLbl@YBbl@VAqZ$Koj8])Yo)J[hb5VGAq#C9m^&S'3 +pA]X~> +q>^EoJcFX-r;c]or;ccqr;cQk!!*#u!!*#ur;cHhr;c6brrD`l!!*#urrDEcrW%NLbl@YBbl@VA +qZ$Koqu?TppAY*mrr2rurr;osoDeahmf3:eo`"mkrr;uukl:V^]`7s2pA]X~> +q>^EoJcFX-r;c]or;ccqr;cQk!!*#u!!*#ur;cHhr;c6brrD`l!!*#urrDEcrW%NLbl@YBbl@VA +qZ$Koqu?TppAY*mrr2rurr;osoDeahmf3:eo`"mkrr;uukl:V^]`7s2pA]X~> +q>^EoJcFX-r;c]or;ccqr;cQk!!*#u!!*#ur;cHhr;c6brrD`l!!*#urrDEcrW%NLbl@YBbl@VA +qZ$Koqu?TppAY*mrr2rurr;osoDeahmf3:eo`"mkrr;uukl:V^]`7s2pA]X~> +q>^EoJcFX-r;c]or;cisq#L +q>^EoJcFX-r;c]or;cisq#L +q>^EoJcFX-r;c]or;cisq#L +q>^EoJcFX-r;c]or;cltrW)osrW)rtmK!:eqZ-Wqq>gNpqZ-QorW)osrW)rto)S7ZrW%NLbl@YB +bl@VAqZ$Korr;rtrVuisrr;Bds8Vrrrr;fps8Vrrr;Z`rrVuisrVuHhli6qa]`7s2pA]X~> +q>^EoJcFX-r;c]or;cltrW)osrW)rtmK!:eqZ-Wqq>gNpqZ-QorW)osrW)rto)S7ZrW%NLbl@YB +bl@VAqZ$Korr;rtrVuisrr;Bds8Vrrrr;fps8Vrrr;Z`rrVuisrVuHhli6qa]`7s2pA]X~> +q>^EoJcFX-r;c]or;cltrW)osrW)rtmK!:eqZ-Wqq>gNpqZ-QorW)osrW)rto)S7ZrW%NLbl@YB +bl@VAqZ$Korr;rtrVuisrr;Bds8Vrrrr;fps8Vrrr;Z`rrVuisrVuHhli6qa]`7s2pA]X~> +q>^EoJcFX-r;c`pr;cisrW)osrW)lrqu?`srW)uur;c`pr;cfrr;c]or;cfrrW)iqrW)osquH]q +rW)EerW%NLbl@YBbl@VAqu?TprVuisrVuisr;ZZp!<<#us8W#tqu?TprVufrqu?TprVuisqu?Wq +r;ZZprVuisli6tb]Dqj1pA]X~> +q>^EoJcFX-r;c`pr;cisrW)osrW)lrqu?`srW)uur;c`pr;cfrr;c]or;cfrrW)iqrW)osquH]q +rW)EerW%NLbl@YBbl@VAqu?TprVuisrVuisr;ZZp!<<#us8W#tqu?TprVufrqu?TprVuisqu?Wq +r;ZZprVuisli6tb]Dqj1pA]X~> +q>^EoJcFX-r;c`pr;cisrW)osrW)lrqu?`srW)uur;c`pr;cfrr;c]or;cfrrW)iqrW)osquH]q +rW)EerW%NLbl@YBbl@VAqu?TprVuisrVuisr;ZZp!<<#us8W#tqu?TprVufrqu?TprVuisqu?Wq +r;ZZprVuisli6tb]Dqj1pA]X~> +q>^EoJcFX-r;cfrquH]qrW)osrW)lrr;c]or;c`pr;cfrr;c]or;cfrrW)iqr;cisr;ccqrW)Ee +rW%NLbl@YBbl@VArVucqr;Z`rrVuisr;Z]qqZ$Koqu?TprVufrqu?TprVuisqu?TprVufrr;Z`r +m/R%b]Dqj1pA]X~> +q>^EoJcFX-r;cfrquH]qrW)osrW)lrr;c]or;c`pr;cfrr;c]or;cfrrW)iqr;cisr;ccqrW)Ee +rW%NLbl@YBbl@VArVucqr;Z`rrVuisr;Z]qqZ$Koqu?TprVufrqu?TprVuisqu?TprVufrr;Z`r +m/R%b]Dqj1pA]X~> +q>^EoJcFX-r;cfrquH]qrW)osrW)lrr;c]or;c`pr;cfrr;c]or;cfrrW)iqr;cisr;ccqrW)Ee +rW%NLbl@YBbl@VArVucqr;Z`rrVuisr;Z]qqZ$Koqu?TprVufrqu?TprVuisqu?TprVufrr;Z`r +m/R%b]Dqj1pA]X~> +q>^EoJcFX-o`4pirrDusr;cfrr;c]or;c`pr;cfrr;c]or;cisrW)corW)rtr;ccqrW)EerW%NL +bl@YBbl@>9qu?Zrr;Z]qrVufrqZ$Koqu?TprVufrqu?Tprr;rtq>^EorVufrr;Z`rm/R(c])Va0 +pA]X~> +q>^EoJcFX-o`4pirrDusr;cfrr;c]or;c`pr;cfrr;c]or;cisrW)corW)rtr;ccqrW)EerW%NL +bl@YBbl@>9qu?Zrr;Z]qrVufrqZ$Koqu?TprVufrqu?Tprr;rtq>^EorVufrr;Z`rm/R(c])Va0 +pA]X~> +q>^EoJcFX-o`4pirrDusr;cfrr;c]or;c`pr;cfrr;c]or;cisrW)corW)rtr;ccqrW)EerW%NL +bl@YBbl@>9qu?Zrr;Z]qrVufrqZ$Koqu?TprVufrqu?Tprr;rtq>^EorVufrr;Z`rm/R(c])Va0 +pA]X~> +q>^EoJcFX-p]0pcquH]qr;c]or;c`pr;cfrr;c]or;cisrW)cor;cltr;ccqr;c?erW%NLbl@YB +bl@G^Bnrr;osr;Z]qmf3:e\c;X/pA]X~> +q>^EoJcFX-p]0pcquH]qr;c]or;c`pr;cfrr;c]or;cisrW)cor;cltr;ccqr;c?erW%NLbl@YB +bl@G^Bnrr;osr;Z]qmf3:e\c;X/pA]X~> +q>^EoJcFX-p]0pcquH]qr;c]or;c`pr;cfrr;c]or;cisrW)cor;cltr;ccqr;c?erW%NLbl@YB +bl@G^Bnrr;osr;Z]qmf3:e\c;X/pA]X~> +q>^EoJcFX-r;c?eq>gKor;c]or;c`pr;cfrr;c]or;cisrW)cor;cltr;ccqr;c?erW%NLbl@YB +bl@VAn,N4arVufrqZ$Koqu?TprVufrqu?Tprr;rtq>^Bnrr;osr;Z]qn,NCf\GuO.pA]X~> +q>^EoJcFX-r;c?eq>gKor;c]or;c`pr;cfrr;c]or;cisrW)cor;cltr;ccqr;c?erW%NLbl@YB +bl@VAn,N4arVufrqZ$Koqu?TprVufrqu?Tprr;rtq>^Bnrr;osr;Z]qn,NCf\GuO.pA]X~> +q>^EoJcFX-r;c?eq>gKor;c]or;c`pr;cfrr;c]or;cisrW)cor;cltr;ccqr;c?erW%NLbl@YB +bl@VAn,N4arVufrqZ$Koqu?TprVufrqu?Tprr;rtq>^Bnrr;osr;Z]qn,NCf\GuO.pA]X~> +q>^EoJcFX-r;cEgrW)uur;cfrr;c]or;c`pr;cfrr;c]or;cltr;cZnr;cltr;ccqr;c?erW%NL +bl@YBbl@VAnc/Rgs8W#trVufrqZ$Koqu?TprVufrqu?Tps8W#tq>^Bnrr;osr;Z]qnGiLg\,ZF- +pA]X~> +q>^EoJcFX-r;cEgrW)uur;cfrr;c]or;c`pr;cfrr;c]or;cltr;cZnr;cltr;ccqr;c?erW%NL +bl@YBbl@VAnc/Rgs8W#trVufrqZ$Koqu?TprVufrqu?Tps8W#tq>^Bnrr;osr;Z]qnGiLg\,ZF- +pA]X~> +q>^EoJcFX-r;cEgrW)uur;cfrr;c]or;c`pr;cfrr;c]or;cltr;cZnr;cltr;ccqr;c?erW%NL +bl@YBbl@VAnc/Rgs8W#trVufrqZ$Koqu?TprVufrqu?Tps8W#tq>^Bnrr;osr;Z]qnGiLg\,ZF- +pA]X~> +q>^EoJcFX-r;cKirW)osr;cfrr;c]or;c`pr;cfrr;c]or;cltr;cZnr;cltr;ccqr;c?erW%NL +bl@YBbl@VAoDedirVufrrVufrqZ$Koqu?TprVufrqu?Tps8W#tq>^Bnrr;osr;Z]qnc/Uh[f?=, +pA]X~> +q>^EoJcFX-r;cKirW)osr;cfrr;c]or;c`pr;cfrr;c]or;cltr;cZnr;cltr;ccqr;c?erW%NL +bl@YBbl@VAoDedirVufrrVufrqZ$Koqu?TprVufrqu?Tps8W#tq>^Bnrr;osr;Z]qnc/Uh[f?=, +pA]X~> +q>^EoJcFX-r;cKirW)osr;cfrr;c]or;c`pr;cfrr;c]or;cltr;cZnr;cltr;ccqr;c?erW%NL +bl@YBbl@VAoDedirVufrrVufrqZ$Koqu?TprVufrqu?Tps8W#tq>^Bnrr;osr;Z]qnc/Uh[f?=, +pA]X~> +q>^EoJcFX-r;cKirW)osr;cfrr;c]or;c`pr;cfrr;c]or;cisr;c]or;cltr;ccqr;c?erW%NL +bl@YBbl@VAoDedirVufrrVufrqZ$Koqu?TprVufrqu?Tprr;osqZ$Korr;osr;Z]qnc&Rh[K$4+ +pA]X~> +q>^EoJcFX-r;cKirW)osr;cfrr;c]or;c`pr;cfrr;c]or;cisr;c]or;cltr;ccqr;c?erW%NL +bl@YBbl@VAoDedirVufrrVufrqZ$Koqu?TprVufrqu?Tprr;osqZ$Korr;osr;Z]qnc&Rh[K$4+ +pA]X~> +q>^EoJcFX-r;cKirW)osr;cfrr;c]or;c`pr;cfrr;c]or;cisr;c]or;cltr;ccqr;c?erW%NL +bl@YBbl@VAoDedirVufrrVufrqZ$Koqu?TprVufrqu?Tprr;osqZ$Korr;osr;Z]qnc&Rh[K$4+ +pA]X~> +q>^EoJcFX-r;cNjr;cfrr;cfrr;c]or;c`pr;cfrr;c]or;cisr;c]or;cltr;ccqr;c?erW%NL +bl@YBbl@VAo`+jirVufrrVufrqZ$Koqu?TprVufrqu?Tprr;osqZ$Korr;osr;Z]qo)A[iq#: +q>^EoJcFX-r;cNjr;cfrr;cfrr;c]or;c`pr;cfrr;c]or;cisr;c]or;cltr;ccqr;c?erW%NL +bl@YBbl@VAo`+jirVufrrVufrqZ$Koqu?TprVufrqu?Tprr;osqZ$Korr;osr;Z]qo)A[iq#: +q>^EoJcFX-r;cNjr;cfrr;cfrr;c]or;c`pr;cfrr;c]or;cisr;c]or;cltr;ccqr;c?erW%NL +bl@YBbl@VAo`+jirVufrrVufrqZ$Koqu?TprVufrqu?Tprr;osqZ$Korr;osr;Z]qo)A[iq#: +q>^EoJcFX-r;cNjr;cfrr;cfrr;c]or;c`pr;cfrr;c]or;cfrrW)fprW)rtr;ccqr;c?erW%NL +bl@YBbl@VAo`+jirVufrrVufrqZ$Koqu?TprVufrqu?TprVuisqZ$NprVufrr;Z]qoDegjq>^Hp +^An04pA]X~> +q>^EoJcFX-r;cNjr;cfrr;cfrr;c]or;c`pr;cfrr;c]or;cfrrW)fprW)rtr;ccqr;c?erW%NL +bl@YBbl@VAo`+jirVufrrVufrqZ$Koqu?TprVufrqu?TprVuisqZ$NprVufrr;Z]qoDegjq>^Hp +^An04pA]X~> +q>^EoJcFX-r;cNjr;cfrr;cfrr;c]or;c`pr;cfrr;c]or;cfrrW)fprW)rtr;ccqr;c?erW%NL +bl@YBbl@VAo`+jirVufrrVufrqZ$Koqu?TprVufrqu?TprVuisqZ$NprVufrr;Z]qoDegjq>^Hp +^An04pA]X~> +q>^EoJcFX-r;cNjr;cfrr;cfrr;c]or;clt!!*#ur;cfrr;clt!!)utr;cfrr;c`prrE#tr;ccq +r;c?erW%NLbl@YBbl@VAo`+jirVufrrVufrqZ$Kos8N'!rr;osrVufrs8N'!rr;osrVufrqu?Zr +r;Z]qr;Z]qo`+Ra^&S'3pA]X~> +q>^EoJcFX-r;cNjr;cfrr;cfrr;c]or;clt!!*#ur;cfrr;clt!!)utr;cfrr;c`prrE#tr;ccq +r;c?erW%NLbl@YBbl@VAo`+jirVufrrVufrqZ$Kos8N'!rr;osrVufrs8N'!rr;osrVufrqu?Zr +r;Z]qr;Z]qo`+Ra^&S'3pA]X~> +q>^EoJcFX-r;cNjr;cfrr;cfrr;c]or;clt!!*#ur;cfrr;clt!!)utr;cfrr;c`prrE#tr;ccq +r;c?erW%NLbl@YBbl@VAo`+jirVufrrVufrqZ$Kos8N'!rr;osrVufrs8N'!rr;osrVufrqu?Zr +r;Z]qr;Z]qo`+Ra^&S'3pA]X~> +q>^EoJcFX-r;cKioDnpkr;cZnqZ-Wqr;ccqqZ-Tpr;ccqr;cfrrW)osr;ccqr;c?erW%NLbl@YB +bl@VAoDeF_s8W#tq>^ +q>^EoJcFX-r;cKioDnpkr;cZnqZ-Wqr;ccqqZ-Tpr;ccqr;cfrrW)osr;ccqr;c?erW%NLbl@YB +bl@VAoDeF_s8W#tq>^ +q>^EoJcFX-r;cKioDnpkr;cZnqZ-Wqr;ccqqZ-Tpr;ccqr;cfrrW)osr;ccqr;c?erW%NLbl@YB +bl@VAoDeF_s8W#tq>^ +q>^EoJcF^/p]1'gqZ-Zrr;Zitq#LgKoquH`rq>gHnq#L?mqZ-WqqZ-9gp],mFcipAb!is8W#t!<;ipqu?Qos8VoqrVucqs8Voqr;ZQmqu?Nnrr;iqp]'jc]`7s2pA]X~> +q>^EoJcF^/p]1'gqZ-Zrr;Zitq#LgKoquH`rq>gHnq#L?mqZ-WqqZ-9gp],mFcipAb!is8W#t!<;ipqu?Qos8VoqrVucqs8Voqr;ZQmqu?Nnrr;iqp]'jc]`7s2pA]X~> +q>^EoJcF^/p]1'gqZ-Zrr;Zitq#LgKoquH`rq>gHnq#L?mqZ-WqqZ-9gp],mFcipAb!is8W#t!<;ipqu?Qos8VoqrVucqs8Voqr;ZQmqu?Nnrr;iqp]'jc]`7s2pA]X~> +q>^EoJcEso!!)or!!)He!!)Ng!!)Her;_EKU]:;n\GlO/qu6Wrmf*7enG`Ign,N=dNrT(YpA]X~> +q>^EoJcEso!!)or!!)He!!)Ng!!)Her;_EKU]:;n\GlO/qu6Wrmf*7enG`Ign,N=dNrT(YpA]X~> +q>^EoJcEso!!)or!!)He!!)Ng!!)Her;_EKU]:;n\GlO/qu6Wrmf*7enG`Ign,N=dNrT(YpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>^EoJcC<$JcD_LrW%NLJcG]LpA]X~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +q>Z!GJH16$JH16$TE+]cJ,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +JcC<$JcC<$JcC`0J,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/figures/interactive-job-init.dia b/executable_names/doc/figures/interactive-job-init.dia new file mode 100644 index 0000000000000000000000000000000000000000..dca7c9858265dbec8166e3d8adf33aaf1b9f51ee --- /dev/null +++ b/executable_names/doc/figures/interactive-job-init.dia @@ -0,0 +1,3 @@ + +#A4##User##slurmctld##slurmd##register job step##register job step reply##run job step req##run job step reply##job_mgr##session_mgr##connect(stdout/err)##task exit msg##release allocation##run epilog req##run epilog reply##srun##status req (periodic)##status reply##exit +status####cmd##srun cmd##prolog##epilog# diff --git a/executable_names/doc/figures/interactive-job-init.eps b/executable_names/doc/figures/interactive-job-init.eps new file mode 100644 index 0000000000000000000000000000000000000000..c97b7bc304b59ffb83cddfcb8e79b93efb82ac30 --- /dev/null +++ b/executable_names/doc/figures/interactive-job-init.eps @@ -0,0 +1,880 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ../figures/interactive-job-init.dia +%%Creator: Dia v0.88.1 +%%CreationDate: Thu Apr 3 14:26:18 2003 +%%For: grondo +%%Magnification: 1.0000 +%%Orientation: Portrait +%%BoundingBox: 0 0 751 430 +%%Pages: 1 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/Times-Roman-latin1 + /Times-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Italic-latin1 + /Times-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Bold-latin1 + /Times-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-BoldItalic-latin1 + /Times-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Book-latin1 + /AvantGarde-Book findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-BookOblique-latin1 + /AvantGarde-BookOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Demi-latin1 + /AvantGarde-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-DemiOblique-latin1 + /AvantGarde-DemiOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Light-latin1 + /Bookman-Light findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-LightItalic-latin1 + /Bookman-LightItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Demi-latin1 + /Bookman-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-DemiItalic-latin1 + /Bookman-DemiItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-latin1 + /Courier findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Oblique-latin1 + /Courier-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Bold-latin1 + /Courier-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-BoldOblique-latin1 + /Courier-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-latin1 + /Helvetica findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Oblique-latin1 + /Helvetica-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Bold-latin1 + /Helvetica-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-BoldOblique-latin1 + /Helvetica-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-latin1 + /Helvetica-Narrow findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Oblique-latin1 + /Helvetica-Narrow-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Bold-latin1 + /Helvetica-Narrow-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-BoldOblique-latin1 + /Helvetica-Narrow-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Roman-latin1 + /NewCenturySchoolbook-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Italic-latin1 + /NewCenturySchoolbook-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Bold-latin1 + /NewCenturySchoolbook-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-BoldItalic-latin1 + /NewCenturySchoolbook-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Roman-latin1 + /Palatino-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Italic-latin1 + /Palatino-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Bold-latin1 + /Palatino-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-BoldItalic-latin1 + /Palatino-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Symbol-latin1 + /Symbol findfont +definefont pop +/ZapfChancery-MediumItalic-latin1 + /ZapfChancery-MediumItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/ZapfDingbats-latin1 + /ZapfDingbats findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +28.346000 -28.346000 scale +-0.979962 -16.050000 translate +%%EndProlog + + +0.100000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 24.000000 6.500000 m 24.000000 10.500000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.003922 0.003922 0.003922 srgb +n 2.000000 2.500000 m 1.412500 1.750000 l 1.125000 1.987500 l 1.887500 2.962500 l 1.475000 4.425000 l 1.937500 4.425000 l 2.187500 3.475000 l 2.425000 4.425000 l 2.850000 4.425000 l 2.525000 3.175000 l 3.162500 3.550000 l 3.337500 3.225000 l 2.462500 2.675000 l 2.425000 2.487500 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 2.225000 2.234686 0.338980 0.338980 121.081372 58.918628 ellipse s +/Helvetica-latin1 ff 0.650000 scf sf +0.000000 0.000000 0.000000 srgb +(User) dup sw 2 div 2.000000 ex sub 1.500000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.701961 0.701961 0.701961 srgb +n 15.000000 2.500000 m 15.000000 16.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.694118 0.694118 0.694118 srgb +n 22.000000 2.500000 m 22.000000 16.000000 l s +/Courier-Bold-latin1 ff 0.600000 scf sf +0.000000 0.000000 0.000000 srgb +(slurmctld) dup sw 2 div 15.000000 ex sub 2.000000 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.600000 scf sf +(slurmd) dup sw 2 div 22.000000 ex sub 2.000000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 7.250000 3.000010 m 14.750000 3.000010 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 14.350000 3.200010 m 14.750000 3.000010 l 14.350000 2.800010 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.350000 3.200010 m 14.750000 3.000010 l 14.350000 2.800010 l cp s +0.537255 0.537255 0.733333 srgb +n 14.750000 3.000010 m 14.750000 4.000010 l 15.250000 4.000010 l 15.250000 3.000010 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.750000 3.000010 m 14.750000 4.000010 l 15.250000 4.000010 l 15.250000 3.000010 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 14.750000 4.000010 m 7.250000 4.000010 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 7.650000 3.800010 m 7.250000 4.000010 l 7.650000 4.200010 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.650000 3.800010 m 7.250000 4.000010 l 7.650000 4.200010 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(register job step) dup sw 2 div 11.000000 ex sub 2.875000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.600000 scf sf +(register job step reply) dup sw 2 div 11.000000 ex sub 3.875000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 7.250000 5.000010 m 21.750000 5.000010 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 21.350000 5.200010 m 21.750000 5.000010 l 21.350000 4.800010 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 21.350000 5.200010 m 21.750000 5.000010 l 21.350000 4.800010 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run job step req) dup sw 2 div 14.500000 ex sub 4.875000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 21.750000 6.000010 m 7.250000 6.000010 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 7.650000 5.800010 m 7.250000 6.000010 l 7.650000 6.200010 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.650000 5.800010 m 7.250000 6.000010 l 7.650000 6.200010 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run job step reply) dup sw 2 div 14.500000 ex sub 5.875000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 21.750000 5.000010 m 21.750000 6.500010 l 22.250003 6.500010 l 22.250003 5.000010 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 21.750000 5.000010 m 21.750000 6.500010 l 22.250003 6.500010 l 22.250003 5.000010 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +(job_mgr) 22.800000 5.900010 m gs 1 -1 sc sh gr +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 22.000000 6.500010 m 22.750000 6.500010 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 22.450000 6.650010 m 22.750000 6.500010 l 22.450000 6.350010 l s +/Courier-Bold-latin1 ff 0.500000 scf sf +(session_mgr) 23.500000 6.375000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 23.750000 7.500010 m 7.250000 7.500010 l s +0.080000 slw +[] 0 sd +0 slj +0 slc +n 23.750000 7.500010 m 23.750000 7.572510 23.677500 7.645010 23.605000 7.645010 c 23.532500 7.645010 23.460000 7.572510 23.460000 7.500010 c 23.460000 7.427510 23.532500 7.355010 23.605000 7.355010 c 23.677500 7.355010 23.750000 7.427510 23.750000 7.500010 c f +n 23.625000 7.250010 m 23.625000 7.750010 l s +0 slj +n 7.750000 7.250010 m 7.250000 7.500010 l 7.750000 7.750010 l f +/Helvetica-latin1 ff 0.600000 scf sf +(connect\(stdout/err\)) dup sw 2 div 15.500000 ex sub 7.375000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 23.750000 11.000000 m 7.250000 11.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 7.650000 10.800000 m 7.250000 11.000000 l 7.650000 11.200000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.650000 10.800000 m 7.250000 11.000000 l 7.650000 11.200000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(task exit msg) dup sw 2 div 15.500000 ex sub 10.875000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 7.000000 13.000000 m 14.750000 13.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 14.350000 13.200000 m 14.750000 13.000000 l 14.350000 12.800000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.350000 13.200000 m 14.750000 13.000000 l 14.350000 12.800000 l cp s +0.100000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 23.050000 6.000000 m 23.000000 11.500000 l s +/Helvetica-latin1 ff 0.600000 scf sf +(release allocation) dup sw 2 div 11.000000 ex sub 12.875000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 14.750000 13.000000 m 14.750000 15.500000 l 15.250000 15.500000 l 15.250000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.750000 13.000000 m 14.750000 15.500000 l 15.250000 15.500000 l 15.250000 13.000000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 15.250000 13.500000 m 21.750000 13.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 21.350000 13.700000 m 21.750000 13.500000 l 21.350000 13.300000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 21.350000 13.700000 m 21.750000 13.500000 l 21.350000 13.300000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run epilog req) dup sw 2 div 18.500000 ex sub 13.375000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 21.750000 15.000000 m 15.250000 15.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 15.650000 14.800000 m 15.250000 15.000000 l 15.650000 15.200000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 15.650000 14.800000 m 15.250000 15.000000 l 15.650000 15.200000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run epilog reply) dup sw 2 div 18.500000 ex sub 14.875000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 22.750000 6.500010 m 22.750000 7.000010 l 23.250000 7.000010 l 23.250000 6.500010 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 22.750000 6.500010 m 22.750000 7.000010 l 23.250000 7.000010 l 23.250000 6.500010 l cp s +0.537255 0.537255 0.749020 srgb +n 23.750000 7.000010 m 23.750000 8.000010 l 24.250000 8.000010 l 24.250000 7.000010 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 23.750000 7.000010 m 23.750000 8.000010 l 24.250000 8.000010 l 24.250000 7.000010 l cp s +0.537255 0.537255 0.749020 srgb +n 22.750000 11.500000 m 22.750000 12.500000 l 23.250000 12.500000 l 23.250000 11.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 22.750000 11.500000 m 22.750000 12.500000 l 23.250000 12.500000 l 23.250000 11.500000 l cp s +0.537255 0.537255 0.749020 srgb +n 21.750000 13.500000 m 21.750000 15.000000 l 22.250000 15.000000 l 22.250000 13.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 21.750000 13.500000 m 21.750000 15.000000 l 22.250000 15.000000 l 22.250000 13.500000 l cp s +/Courier-Bold-latin1 ff 0.600000 scf sf +(srun) dup sw 2 div 7.000000 ex sub 2.000000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 6.750000 3.000010 m 6.750000 13.500010 l 7.250000 13.500010 l 7.250000 3.000010 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.750000 3.000010 m 6.750000 13.500010 l 7.250000 13.500010 l 7.250000 3.000010 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 3.500000 3.000000 m 6.750000 3.000010 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 6.149999 3.200008 m 6.750000 3.000010 l 6.150001 2.800008 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.750000 13.500000 m 3.500000 13.500000 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 4.100000 13.300000 m 3.500000 13.500000 l 4.100000 13.700000 l s +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 15.000000 8.500000 m 7.250000 8.500010 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 7.650000 8.300009 m 7.250000 8.500010 l 7.650000 8.700009 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.650000 8.300009 m 7.250000 8.500010 l 7.650000 8.700009 l cp s +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 7.250000 9.050010 m 14.800000 9.050000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 14.400000 9.250001 m 14.800000 9.050000 l 14.400000 8.850001 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 14.400000 9.250001 m 14.800000 9.050000 l 14.400000 8.850001 l cp s +/Helvetica-latin1 ff 0.500000 scf sf +(status req \(periodic\)) dup sw 2 div 11.250000 ex sub 8.375000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.500000 scf sf +(status reply) dup sw 2 div 11.250000 ex sub 9.375000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.650000 scf sf +(exit ) dup sw 2 div 2.500000 ex sub 13.500000 m gs 1 -1 sc sh gr +(status) dup sw 2 div 2.500000 ex sub 14.150000 m gs 1 -1 sc sh gr +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 1.500000 m 5.000000 16.000000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 1.500000 m 4.500000 2.000000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 2.184500 m 4.500000 2.684500 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 2.869000 m 4.500000 3.369000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 3.553600 m 4.500000 4.053600 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 4.238100 m 4.500000 4.738100 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 4.922600 m 4.500000 5.422600 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 5.607100 m 4.500000 6.107100 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 6.291700 m 4.500000 6.791700 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 6.976200 m 4.500000 7.476200 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 7.660700 m 4.500000 8.160700 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 8.345200 m 4.500000 8.845200 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 9.029700 m 4.500000 9.529700 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 9.714300 m 4.500000 10.214300 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 10.398800 m 4.500000 10.898800 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 11.083300 m 4.500000 11.583300 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 11.767800 m 4.500000 12.267800 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 12.452300 m 4.500000 12.952300 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 13.136900 m 4.500000 13.636900 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 13.821400 m 4.500000 14.321400 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 14.505900 m 4.500000 15.005900 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 15.190400 m 4.500000 15.690400 l s +0.537255 0.537255 0.749020 srgb +n 24.750000 8.000010 m 24.750000 10.500010 l 25.250000 10.500010 l 25.250000 8.000010 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 24.750000 8.000010 m 24.750000 10.500010 l 25.250000 10.500010 l 25.250000 8.000010 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +() 25.250000 7.000010 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.500000 scf sf +(cmd) 24.750000 7.625000 m gs 1 -1 sc sh gr +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 23.000000 7.000010 m 23.750000 7.000010 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 23.450000 7.150010 m 23.750000 7.000010 l 23.450000 6.850010 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 24.000000 11.500000 m 23.250000 11.500000 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 23.550000 11.350000 m 23.250000 11.500000 l 23.550000 11.650000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 22.750000 12.500000 m 22.250000 12.500000 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 22.550000 12.350000 m 22.250000 12.500000 l 22.550000 12.650000 l s +0.537255 0.537255 0.749020 srgb +n 21.750000 12.500000 m 21.750000 13.000000 l 22.250000 13.000000 l 22.250000 12.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 21.750000 12.500000 m 21.750000 13.000000 l 22.250000 13.000000 l 22.250000 12.500000 l cp s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 24.250000 8.000010 m 24.750000 8.000010 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 24.450000 8.150010 m 24.750000 8.000010 l 24.450000 7.850010 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 24.750000 10.500000 m 24.250000 10.500000 l s +0.050000 slw +[] 0 sd +0 slj +0 slc +n 24.550000 10.350000 m 24.250000 10.500000 l 24.550000 10.650000 l s +/Helvetica-Bold-latin1 ff 0.500000 scf sf +(srun cmd) dup sw 2 div 5.000000 ex sub 2.875000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 23.750000 10.500000 m 23.750000 11.500000 l 24.250000 11.500000 l 24.250000 10.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 23.750000 10.500000 m 23.750000 11.500000 l 24.250000 11.500000 l 24.250000 10.500000 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +(prolog) 23.250000 5.125000 m gs 1 -1 sc sh gr +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 22.250000 5.000010 m 23.200000 5.050000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 22.790043 5.228704 m 23.200000 5.050000 l 22.811062 4.829257 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 22.790043 5.228704 m 23.200000 5.050000 l 22.811062 4.829257 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +(epilog) 23.355000 13.778300 m gs 1 -1 sc sh gr +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 22.400000 13.650000 m 23.245000 13.645000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 22.846190 13.847363 m 23.245000 13.645000 l 22.843824 13.447370 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 22.846190 13.847363 m 23.245000 13.645000 l 22.843824 13.447370 l cp s +showpage diff --git a/executable_names/doc/figures/launch.eps b/executable_names/doc/figures/launch.eps new file mode 100644 index 0000000000000000000000000000000000000000..06e54469e64ba81a3fc8426b9589f3db69929457 --- /dev/null +++ b/executable_names/doc/figures/launch.eps @@ -0,0 +1,1040 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner +%%Title: /g/g0/jette/sigops/figure4.eps +%%CreationDate: Wed Feb 1 14:17:36 2006 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 393 239 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228 14.173228 translate +% Translate to begin of first scanline +0.000000 224.640000 translate +378.720000 -224.640000 scale +% Image geometry +526 312 8 +% Transformation matrix +[ 526 0 0 312 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 526 string def +/gstr 526 string def +/bstr 526 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 39065 ASCII Bytes +colorimage +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcDeN!!)-\rr@WMJcFs6J,~> +JcDeN!!)-\rr@WMJcFs6J,~> +JcDeN!!)-\rr@WMJcFs6J,~> +JcDkPrW)?cp],mFJcFp5J,~> +JcDkPrW)?cp],mFJcFp5J,~> +JcDkPrW)?cp],mFJcFp5J,~> +JcDqRquH-ap],mFJcFp5J,~> +JcDqRquH-ap],mFJcFp5J,~> +JcDqRquH-ap],mFJcFp5J,~> +JcDtSqZ-'ap],mFJcFm4J,~> +JcDtSqZ-'ap],mFJcFm4J,~> +JcDtSqZ-'ap],mFJcFm4J,~> +JcE"T!!*#urW)Bdrr@WMJcFX-J,~> +JcE"T!!*#urW)Bdrr@WMJcFX-J,~> +JcE"T!!*#urW)Bdrr@WMJcFX-J,~> +JcDkPrW)Eerr@WMJcFU,J,~> +JcDkPrW)Eerr@WMJcFU,J,~> +JcDkPrW)Eerr@WMJcFU,J,~> +JcDkPrW)Eer;_EKJcF[.J,~> +JcDkPrW)Eer;_EKJcF[.J,~> +JcDkPrW)Eer;_EKJcF[.J,~> +JcDkPrW)Hfq#H!GJcFd1J,~> +JcDkPrW)Hfq#H!GJcFd1J,~> +JcDkPrW)Hfq#H!GJcFd1J,~> +JcDkPrW)Hfp],mFJcFg2J,~> +JcDkPrW)Hfp],mFJcFg2J,~> +JcDkPrW)Hfp],mFJcFg2J,~> +JcDkPrW)HfpAfdEJcFj3J,~> +JcDkPrW)HfpAfdEJcFj3J,~> +JcDkPrW)HfpAfdEJcFj3J,~> +JcDkPrW)9aqZ)3IJcFm4J,~> +JcDkPrW)9aqZ)3IJcFm4J,~> +JcDkPrW)9aqZ)3IJcFm4J,~> +JcDkPrW)3_quDEMJH4s8qu;0~> +JcDkPrW)3_quDEMJH4s8qu;0~> +JcDkPrW)3_quDEMJH4s8qu;0~> +JcDkPrW)0^r;_NNJH4s8qu;0~> +JcDkPrW)0^r;_NNJH4s8qu;0~> +JcDkPrW)0^r;_NNJH4s8qu;0~> +JcDkPrW)-]r;_QOJH4s8qu;0~> +JcDkPrW)-]r;_QOJH4s8qu;0~> +JcDkPrW)-]r;_QOJH4s8qu;0~> +JcDkPrW)-]r;_QOrW%NLnGiIfqu;0~> +JcDkPrW)-]r;_QOrW%NLnGiIfqu;0~> +JcDkPrW)-]r;_QOrW%NLnGiIfqu;0~> +JcDkPrW)-]r;_QOrW%NLnGiIfqu;0~> +JcDkPrW)-]r;_QOrW%NLnGiIfqu;0~> +JcDkPrW)-]r;_QOrW%NLnGiIfqu;0~> +JcDkPrW)*\rW%ZPrW%NLnGiIfqu;0~> +JcDkPrW)*\rW%ZPrW%NLnGiIfqu;0~> +JcDkPrW)*\rW%ZPrW%NLnGiIfqu;0~> +JcDkPrW)-]rW&#Z!!)cnrW%NLnGiIfqu;0~> +JcDkPrW)-]rW&#Z!!)cnrW%NLnGiIfqu;0~> +JcDkPrW)-]rW&#Z!!)cnrW%NLnGiIfqu;0~> +JcDkPrW)-]rW&#ZrW)corW%NLnGiIfqu;0~> +JcDkPrW)-]rW&#ZrW)corW%NLnGiIfqu;0~> +JcDkPrW)-]rW&#ZrW)corW%NLnGiIfqu;0~> +JcDkPrW)]mrrDZjrrA)ZqZ-QorW%NLnGiIfqu;0~> +JcDkPrW)]mrrDZjrrA)ZqZ-QorW%NLnGiIfqu;0~> +JcDkPrW)]mrrDZjrrA)ZqZ-QorW%NLnGiIfqu;0~> +JcDkPrW)`nr;cisr;ccqrrA&Yq#LEorW%NLnGiIfqu;0~> +JcDkPrW)`nr;cisr;ccqrrA&Yq#LEorW%NLnGiIfqu;0~> +JcDkPrW)`nr;cisr;ccqrrA&Yq#LEorW%NLnGiIfqu;0~> +JcDkPrW)`nquHcsquH`rrrA#Xo)O@AnGiIfqu;0~> +JcDkPrW)`nquHcsquH`rrrA#Xo)O@AnGiIfqu;0~> +JcDkPrW)`nquHcsquH`rrrA#Xo)O@AnGiIfqu;0~> +JcDtSp]13kquHcsp]-6Po)O@AnGiIfqu;0~> +JcDtSp]13kquHcsp]-6Po)O@AnGiIfqu;0~> +JcDtSp]13kquHcsp]-6Po)O@AnGiIfqu;0~> +JcDDCr;cfrr;_rZlMuM9nGiIfqu;0~> +JcDDCr;cfrr;_rZlMuM9nGiIfqu;0~> +JcDDCr;cfrr;_rZlMuM9nGiIfqu;0~> +JcD>ArrA5^i;eH/nGiIfqu;0~> +JcD>ArrA5^i;eH/nGiIfqu;0~> +JcD>ArrA5^i;eH/nGiIfqu;0~> +JcDABrrAShjoGG]o)O@AnGiIfqu;0~> +JcDABrrAShjoGG]o)O@AnGiIfqu;0~> +JcDABrrAShjoGG]o)O@AnGiIfqu;0~> +JcDDCrrAnqk5b/Sp]1?orW)-]rrB/#rrDWirrD]krW)iqJ,~> +JcDDCrrAnqk5b/Sp]1?orW)-]rrB/#rrDWirrD]krW)iqJ,~> +JcDDCrrAnqk5b/Sp]1?orW)-]rrB/#rrDWirrD]krW)iqJ,~> +JcDDC!!'2%k5acHq>gNprW)6`quEr#quHEiquHBhrW)iqJ,~> +JcDDC!!'2%k5acHq>gNprW)6`quEr#quHEiquHBhrW)iqJ,~> +JcDDC!!'2%k5acHq>gNprW)6`quEr#quHEiquHBhrW)iqJ,~> +k5VRaJcE^hjoF<=quHZprW)9aqZ*l#qZ- +k5VRaJcE^hjoF<=quHZprW)9aqZ*l#qZ- +k5VRaJcE^hjoF<=quHZprW)9aqZ*l#qZ- +k5VRaJcF'rk5a$3r;c`prW)0^rW'>*!!)orrW)QirW)TjrW)iqJ,~> +k5VRaJcF'rk5a$3r;c`prW)0^rW'>*!!)orrW)QirW)TjrW)iqJ,~> +k5VRaJcF'rk5a$3r;c`prW)0^rW'>*!!)orrW)QirW)TjrW)iqJ,~> +k5VRaJcFF'k5`[)rrDlprW)0^rW'A+rrDrrrW)QirW)TjrW)iqJ,~> +k5VRaJcFF'k5`[)rrDlprW)0^rW'A+rrDrrrW)QirW)TjrW)iqJ,~> +k5VRaJcFF'k5`[)rrDlprW)0^rW'A+rrDrrrW)QirW)TjrW)iqJ,~> +k5YD\[/^+*JcFg2joDjirW)0^rW'D,rW)iqrW)QirW)TjrW)iqJ,~> +k5YD\[/^+*JcFg2joDjirW)0^rW'D,rW)iqrW)QirW)TjrW)iqJ,~> +k5YD\[/^+*JcFg2joDjirW)0^rW'D,rW)iqrW)QirW)TjrW)iqJ,~> +k5YD\[/^+*JcG0 +k5YD\[/^+*JcG0 +k5YD\[/^+*JcG0 +k5YD\[/^+*JcGNFk5_4UrW)QirW)corW)0^"9AK%!!)`mrrDoq!!)ZkrW)fpr;c`prW)`nrW)uu +rW)TjrW)iqJ,~> +k5YD\[/^+*JcGNFk5_4UrW)QirW)corW)0^"9AK%!!)`mrrDoq!!)ZkrW)fpr;c`prW)`nrW)uu +rW)TjrW)iqJ,~> +k5YD\[/^+*JcGNFk5_4UrW)QirW)corW)0^"9AK%!!)`mrrDoq!!)ZkrW)fpr;c`prW)`nrW)uu +rW)TjrW)iqJ,~> +k5YD\[/^+*KE('6QiI$bp&Fgfr;Z`rrr;iqrr;lrr;Z]q!<;uts8W#t!<;orrr;iqq>^6jrr;`n +rr;rtqZ$9io`+mjqu;0~> +k5YD\[/^+*KE('6QiI$bp&Fgfr;Z`rrr;iqrr;lrr;Z]q!<;uts8W#t!<;orrr;iqq>^6jrr;`n +rr;rtqZ$9io`+mjqu;0~> +k5YD\[/^+*KE('6QiI$bp&Fgfr;Z`rrr;iqrr;lrr;Z]q!<;uts8W#t!<;orrr;iqq>^6jrr;`n +rr;rtqZ$9io`+mjqu;0~> +k5YD\[/^+*NW8/AN;rkWpAb-mrVuisr;Z`rr;Z]qr;Z`rrr;0^!<;ipqu?Wqrr;osrr;fprVuis +qu?WqrVufro`+mjqu;0~> +k5YD\[/^+*NW8/AN;rkWpAb-mrVuisr;Z`rr;Z]qr;Z`rrr;0^!<;ipqu?Wqrr;osrr;fprVuis +qu?WqrVufro`+mjqu;0~> +k5YD\[/^+*NW8/AN;rkWpAb-mrVuisr;Z`rr;Z]qr;Z`rrr;0^!<;ipqu?Wqrr;osrr;fprVuis +qu?WqrVufro`+mjqu;0~> +k5YD\[/^+*QiH4KK)bfMpAb-mr;Zcsr;Z`rr;Z]qr;Z`rr;ZZp!<<#us8VusrVucqrVufrrVuis +r;Z]qrr;osqu?Wqr;Z`rqu?Wqo`+mjqu;0~> +k5YD\[/^+*QiH4KK)bfMpAb-mr;Zcsr;Z`rr;Z]qr;Z`rr;ZZp!<<#us8VusrVucqrVufrrVuis +r;Z]qrr;osqu?Wqr;Z`rqu?Wqo`+mjqu;0~> +k5YD\[/^+*QiH4KK)bfMpAb-mr;Zcsr;Z`rr;Z]qr;Z`rr;ZZp!<<#us8VusrVucqrVufrrVuis +r;Z]qrr;osqu?Wqr;Z`rqu?Wqo`+mjqu;0~> +k5YD\[/^+*UAs?UJcGNFrW)]mrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfrrrDrr +r;cisr;c`prW)lrrW)iqrW)TjrW)iqJ,~> +k5YD\[/^+*UAs?UJcGNFrW)]mrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfrrrDrr +r;cisr;c`prW)lrrW)iqrW)TjrW)iqJ,~> +k5YD\[/^+*UAs?UJcGNFrW)]mrW)lrrrDusrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cfrrrDrr +r;cisr;c`prW)lrrW)iqrW)TjrW)iqJ,~> +k5YD\[/^+*XT.G`JcG3=quHKkr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fprrE#t +r;c`prW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*XT.G`JcG3=quHKkr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fprrE#t +r;c`prW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*XT.G`JcG3=quHKkr;cQkrW)lrr;ccqrW)lrr;cZnrW)lrr;ccqr;cisrW)fprrE#t +r;c`prW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*[f>LjJcG3=nc8C`quHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)Tjr;c`p +rW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*[f>LjJcG3=nc8C`quHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)Tjr;c`p +rW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*[f>LjJcG3=nc8C`quHNlrW)lrr;ccqrW)lrr;cZnrW)lrr;c`prW)rtrW)Tjr;c`p +rW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*_>iWtJcG6>k5b2TqZ-KmrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)Tjr;c`p +rW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*_>iWtJcG6>k5b2TqZ-KmrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)Tjr;c`p +rW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*_>iWtJcG6>k5b2TqZ-KmrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rtrW)Tjr;c`p +rW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*bQ$`*JcG3=k5bAYrW)TjqZ-NnrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cKi +r;c`prW)rtr;c]orW)TjrW)iqJ,~> +k5YD\[/^+*bQ$`*JcG3=k5bAYrW)TjqZ-NnrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cKi +r;c`prW)rtr;c]orW)TjrW)iqJ,~> +k5YD\[/^+*bQ$`*JcG3=k5bAYrW)TjqZ-NnrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cKi +r;c`prW)rtr;c]orW)TjrW)iqJ,~> +k5YD\[/^+*ec4e4JcG3=k5b#OrW)QiqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cKi +r;c`prW)rtr;c]orW)TjrW)iqJ,~> +k5YD\[/^+*ec4e4JcG3=k5b#OrW)QiqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cKi +r;c`prW)rtr;c]orW)TjrW)iqJ,~> +k5YD\[/^+*ec4e4JcG3=k5b#OrW)QiqZ-QorW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)uur;cKi +r;c`prW)rtr;c]orW)TjrW)iqJ,~> +k5YD\[/^+*i;_p>JcG6>joFQDrW)Zl!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +rW)Tjr;c`prW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*i;_p>JcG6>joFQDrW)Zl!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +rW)Tjr;c`prW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*i;_p>JcG6>joFQDrW)Zl!!)utquH]qrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +rW)Tjr;c`prW)osrW)fprW)TjrW)iqJ,~> +k5YD\[/^+*lMp#IJcG3=k5a9:rW)Zl!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +r;c]orrE&ur;c`prW)osr;c`prW)TjrW)iqJ,~> +k5YD\[/^+*lMp#IJcG3=k5a9:rW)Zl!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +r;c]orrE&ur;c`prW)osr;c`prW)TjrW)iqJ,~> +k5YD\[/^+*lMp#IJcG3=k5a9:rW)Zl!!)rsr;cfrrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +r;c]orrE&ur;c`prW)osr;c`prW)TjrW)iqJ,~> +k5YD\[/^+*o`+(SJcG3=k5`p0rW)Zl!!)orrW)osrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +quHWo!!)utr;c`prW)osr;c`prW)TjrW)iqJ,~> +k5YD\[/^+*o`+(SJcG3=k5`p0rW)Zl!!)orrW)osrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +quHWo!!)utr;c`prW)osr;c`prW)TjrW)iqJ,~> +k5YD\[/^+*o`+(SJcG3=k5`p0rW)Zl!!)orrW)osrW)lrr;ccqrW)lrr;cZnrW)iqrW)iqrW)rt +quHWo!!)utr;c`prW)osr;c`prW)TjrW)iqJ,~> +k5YD\[/^+*rr;-]JcG6>joEI%rW)Zl!!)orrW)osrW)lrr;cfrr;ccqr;cZnrW)lrr;ccqr;cfr +p&P'kr;clt!!*#urW)lrr;ccqr;cNjrW)iqJ,~> +k5YD\[/^+*rr;-]JcG6>joEI%rW)Zl!!)orrW)osrW)lrr;cfrr;ccqr;cZnrW)lrr;ccqr;cfr +p&P'kr;clt!!*#urW)lrr;ccqr;cNjrW)iqJ,~> +k5YD\[/^+*rr;-]JcG6>joEI%rW)Zl!!)orrW)osrW)lrr;cfrr;ccqr;cZnrW)lrr;ccqr;cfr +p&P'kr;clt!!*#urW)lrr;ccqr;cNjrW)iqJ,~> +k5YD\[/^+*rr;NhJcG3=k5`0prW)ZlrrDusrrDusr;ccqq>^NqquH`rr;c]or;ccqr;ccqr;ccq +p]16lq>gNpr;ccqoDnUbrW)iqJ,~> +k5YD\[/^+*rr;NhJcG3=k5`0prW)ZlrrDusrrDusr;ccqq>^NqquH`rr;c]or;ccqr;ccqr;ccq +p]16lq>gNpr;ccqoDnUbrW)iqJ,~> +k5YD\[/^+*rr;NhJcG3=k5`0prW)ZlrrDusrrDusr;ccqq>^NqquH`rr;c]or;ccqr;ccqr;ccq +p]16lq>gNpr;ccqoDnUbrW)iqJ,~> +k5YD\[/^+*rr;lrJcG3=k5_gfrW)Zlq#LBnq>gHnquHcsrW)rtq#LBnq>gQqq>gQqq>gKoq>gBl +quHcsq>gHnqZ$Wrr;cNjrW)iqJ,~> +k5YD\[/^+*rr;lrJcG3=k5_gfrW)Zlq#LBnq>gHnquHcsrW)rtq#LBnq>gQqq>gQqq>gKoq>gBl +quHcsq>gHnqZ$Wrr;cNjrW)iqJ,~> +k5YD\[/^+*rr;lrJcG3=k5_gfrW)Zlq#LBnq>gHnquHcsrW)rtq#LBnq>gQqq>gQqq>gKoq>gBl +quHcsq>gHnqZ$Wrr;cNjrW)iqJ,~> +k5YD\[/^+*JcG<@joD@[rW)Zl!W`9#rW)BdrW)rt!!(FHrW)]mrrDNfrrE&u!!)TirW)iqJ,~> +k5YD\[/^+*JcG<@joD@[rW)Zl!W`9#rW)BdrW)rt!!(FHrW)]mrrDNfrrE&u!!)TirW)iqJ,~> +k5YD\[/^+*JcG<@joD@[rW)Zl!W`9#rW)BdrW)rt!!(FHrW)]mrrDNfrrE&u!!)TirW)iqJ,~> +k5YD\o)J[hp\t?rs8N'!li-qbrr;uunc/RgJcGZJk5_(QrW%NLnGiIfqu;0~> +k5YD\o)J[hp\t?rs8N'!li-qbrr;uunc/RgJcGZJk5_(QrW%NLnGiIfqu;0~> +k5YD\o)J[hp\t?rs8N'!li-qbrr;uunc/RgJcGZJk5_(QrW%NLnGiIfqu;0~> +k5YD\o`+^erVufr!<;cnrr;lrrVufr!<;oroDediLB$E:PQ1U^JcG6>rW)iqJ,~> +k5YD\o`+^erVufr!<;cnrr;lrrVufr!<;oroDediLB$E:PQ1U^JcG6>rW)iqJ,~> +k5YD\o`+^erVufr!<;cnrr;lrrVufr!<;oroDediLB$E:PQ1U^JcG6>rW)iqJ,~> +k5YD\p&G$lrVuiss8V`l!<;utr;Z`rs8VZjo`+mjOoOPDM?!PTJcG6>rW)iqJ,~> +k5YD\p&G$lrVuiss8V`l!<;utr;Z`rs8VZjo`+mjOoOPDM?!PTJcG6>rW)iqJ,~> +k5YD\p&G$lrVuiss8V`l!<;utr;Z`rs8VZjo`+mjOoOPDM?!PTJcG6>rW)iqJ,~> +k5YD\p&G$lr;ZcsrVucq!<<#us8W#tr;Z`rrVucqrVuiso`+mjS,_XOJcG`LrW%NLnGiIfqu;0~> +k5YD\p&G$lr;ZcsrVucq!<<#us8W#tr;Z`rrVucqrVuiso`+mjS,_XOJcG`LrW%NLnGiIfqu;0~> +k5YD\p&G$lr;ZcsrVucq!<<#us8W#tr;Z`rrVucqrVuiso`+mjS,_XOJcG`LrW%NLnGiIfqu;0~> +k5YD\pAb*lr;ZcsrVufrqZ$Kor;Z`rrVufrr;Z`ro`+mjV>o]YJcGBBrW%NLnGiIfqu;0~> +k5YD\pAb*lr;ZcsrVufrqZ$Kor;Z`rrVufrr;Z`ro`+mjV>o]YJcGBBrW%NLnGiIfqu;0~> +k5YD\pAb*lr;ZcsrVufrqZ$Kor;Z`rrVufrr;Z`ro`+mjV>o]YJcGBBrW%NLnGiIfqu;0~> +k5YD\pAb'kp](0lqZ$Kor;Z`rr;Z`rr;Z]qp&G!kYlEhcJcG$8rW%NLnGiIfqu;0~> +k5YD\pAb'kp](0lqZ$Kor;Z`rr;Z`rr;Z]qp&G!kYlEhcJcG$8rW%NLnGiIfqu;0~> +k5YD\pAb'kp](0lqZ$Kor;Z`rr;Z`rr;Z]qp&G!kYlEhcJcG$8rW%NLnGiIfqu;0~> +k5YD\p&Fpiq>^BnqZ$Kor;Z`rr;Z`rr;Z]qp&G!knc&RhbQ$`*JcFX-rW%NLnGiIfqu;0~> +k5YD\p&Fpiq>^BnqZ$Kor;Z`rr;Z`rr;Z]qp&G!knc&RhbQ$`*JcFX-rW%NLnGiIfqu;0~> +k5YD\p&Fpiq>^BnqZ$Kor;Z`rr;Z`rr;Z]qp&G!knc&RhbQ$`*JcFX-rW%NLnGiIfqu;0~> +k5YD\o`+dgqu?TpqZ$Kor;Z`rr;Z`rr;Z]qp&G!koDediec4e4JcF:#rW%NLnGiIfqu;0~> +k5YD\o`+dgqu?TpqZ$Kor;Z`rr;Z`rr;Z]qp&G!koDediec4e4JcF:#rW%NLnGiIfqu;0~> +k5YD\o`+dgqu?TpqZ$Kor;Z`rr;Z`rr;Z]qp&G!koDediec4e4JcF:#rW%NLnGiIfqu;0~> +k5YD\oDe[fr;Z]qqZ$Kor;Z`rr;Z`rr;Z]qp&G!ko`+jii;_p>JcEpnrW%NLnGiIfqu;0~> +k5YD\oDe[fr;Z]qqZ$Kor;Z`rr;Z`rr;Z]qp&G!ko`+jii;_p>JcEpnrW%NLnGiIfqu;0~> +k5YD\oDe[fr;Z]qqZ$Kor;Z`rr;Z`rr;Z]qp&G!ko`+jii;_p>JcEpnrW%NLnGiIfqu;0~> +k5YD\o)JRerVufrqZ$Kor;Z`rr;Z`rr;Z]qp&G!kpAb!ilMp#IJcEOcrW%NLnGiIfqu;0~> +k5YD\o)JRerVufrqZ$Kor;Z`rr;Z`rr;Z]qp&G!kpAb!ilMp#IJcEOcrW%NLnGiIfqu;0~> +k5YD\o)JRerVufrqZ$Kor;Z`rr;Z`rr;Z]qp&G!kpAb!ilMp#IJcEOcrW%NLnGiIfqu;0~> +k5YD\p&>!lrVucqrr;osqZ$Kor;Z`rr;Z`rr;Z]qp&G!kq#C-io`+(SZ2ab&kPtJ\W;lhsJcG6> +rW)iqJ,~> +k5YD\p&>!lrVucqrr;osqZ$Kor;Z`rr;Z`rr;Z]qp&G!kq#C-io`+(SZ2ab&kPtJ\W;lhsJcG6> +rW)iqJ,~> +k5YD\p&>!lrVucqrr;osqZ$Kor;Z`rr;Z`rr;Z]qp&G!kq#C-io`+(SZ2ab&kPtJ\W;lhsJcG6> +rW)iqJ,~> +k5YD\p&>!lr;Z]qrr;osqZ$Kor;Z`rr;Z`rr;Z]qp&G!kq>^3is8V3]WW2bom/Qt`VZ6VqJcG6> +rW)iqJ,~> +k5YD\p&>!lr;Z]qrr;osqZ$Kor;Z`rr;Z`rr;Z]qp&G!kq>^3is8V3]WW2bom/Qt`VZ6VqJcG6> +rW)iqJ,~> +k5YD\p&>!lr;Z]qrr;osqZ$Kor;Z`rr;Z`rr;Z]qp&G!kq>^3is8V3]WW2bom/Qt`VZ6VqJcG6> +rW)iqJ,~> +k5YD\p&>!lqu?Wqrr;osqZ$Kor;Z`rr;Z`rr;Z]qp&G!kqu>^WTE"Wcmf34cV#UDoJcG6>rW)iq +J,~> +k5YD\p&>!lqu?Wqrr;osqZ$Kor;Z`rr;Z`rr;Z]qp&G!kqu>^WTE"Wcmf34cV#UDoJcG6>rW)iq +J,~> +k5YD\p&>!lqu?Wqrr;osqZ$Kor;Z`rr;Z`rr;Z]qp&G!kqu>^WTE"Wcmf34cV#UDoJcG6>rW)iq +J,~> +k5YD\p&>!lqu?Wqrr;osqZ$KorVufrrVufrr;Z]qp&G!krVu3aQN-parr;iqnGiIfUAt2mJcG6> +rW)iqJ,~> +k5YD\p&>!lqu?Wqrr;osqZ$KorVufrrVufrr;Z]qp&G!krVu3aQN-parr;iqnGiIfUAt2mJcG6> +rW)iqJ,~> +k5YD\p&>!lqu?Wqrr;osqZ$KorVufrrVufrr;Z]qp&G!krVu3aQN-parr;iqnGiIfUAt2mJcG6> +rW)iqJ,~> +k5YD\p&G$lr;ZcsrVufrq>^9k!<;rss8W#tr;Z]qp&G!krr;NhO8o4[qu?Tpnc/RgU&TZDl2^_] +J,~> +k5YD\p&G$lr;ZcsrVufrq>^9k!<;rss8W#tr;Z]qp&G!krr;NhO8o4[qu?Tpnc/RgU&TZDl2^_] +J,~> +k5YD\p&G$lr;ZcsrVufrq>^9k!<;rss8W#tr;Z]qp&G!krr;NhO8o4[qu?Tpnc/RgU&TZDl2^_] +J,~> +k5YD\p&Fgfrr;coqZ$Hns8W&urr;fps8VrrpAb*lr;ZBhOT5=\qZ$Koo)JXgU&TZDl2^_]J,~> +k5YD\p&Fgfrr;coqZ$Hns8W&urr;fps8VrrpAb*lr;ZBhOT5=\qZ$Koo)JXgU&TZDl2^_]J,~> +k5YD\p&Fgfrr;coqZ$Hns8W&urr;fps8VrrpAb*lr;ZBhOT5=\qZ$Koo)JXgU&TZDl2^_]J,~> +k5YD\p&>'ns8W&um/R%brr2ruirAuXq>^0hOT,:\q#C +k5YD\p&>'ns8W&um/R%brr2ruirAuXq>^0hOT,:\q#C +k5YD\p&>'ns8W&um/R%brr2ruirAuXq>^0hOT,:\q#C +k5YD\[/^+*p]($hOT,:\q#C +k5YD\[/^+*p]($hOT,:\q#C +k5YD\[/^+*p]($hOT,:\q#C +k5YD\[/^+*o`+ghLB%5Qo`+jis8W&uJcGZJrW)$ZqZ*r%J,~> +k5YD\[/^+*o`+ghLB%5Qo`+jis8W&uJcGZJrW)$ZqZ*r%J,~> +k5YD\[/^+*o`+ghLB%5Qo`+jis8W&uJcGZJrW)$ZqZ*r%J,~> +k5YD\[/^+*o)J[hLB%5Qp&F[bJcG`LrW)*\q#I`#J,~> +k5YD\[/^+*o)J[hLB%5Qp&F[bJcG`LrW)*\q#I`#J,~> +k5YD\[/^+*o)J[hLB%5Qp&F[bJcG`LrW)*\q#I`#J,~> +k5YD\[/^+*JcGECrW)TjoDjIB!<<#uk5Y2VZN#F~> +k5YD\[/^+*JcGECrW)TjoDjIB!<<#uk5Y2VZN#F~> +k5YD\[/^+*JcGECrW)TjoDjIB!<<#uk5Y2VZN#F~> +k5YD\[/^+*JcGECrW)Tjr;c`pr;_EKrW)0^p&MDuJ,~> +k5YD\[/^+*JcGECrW)Tjr;c`pr;_EKrW)0^p&MDuJ,~> +k5YD\[/^+*JcGECrW)Tjr;c`pr;_EKrW)0^p&MDuJ,~> +k5YD\[/^+*JcGHDrW)Qir;c`pr;_HLrW)0^o`2;tJ,~> +k5YD\[/^+*JcGHDrW)Qir;c`pr;_HLrW)0^o`2;tJ,~> +k5YD\[/^+*JcGHDrW)Qir;c`pr;_HLrW)0^o`2;tJ,~> +k5YD\[/^+*JcGHDrrDWir;c]or;_KMrW)3_oDl2sJ,~> +k5YD\[/^+*JcGHDrrDWir;c]or;_KMrW)3_oDl2sJ,~> +k5YD\[/^+*JcGHDrrDWir;c]or;_KMrW)3_oDl2sJ,~> +k5YD\[/^+*JcGKErrDThr;c]or;_NNrW)*\p&MDuJ,~> +k5YD\[/^+*JcGKErrDThr;c]or;_NNrW)*\p&MDuJ,~> +k5YD\[/^+*JcGKErrDThr;c]or;_NNrW)*\p&MDuJ,~> +k5YD\[/^+*JcGNFrrDQgr;c]or;_QOrW)!Yp].W"J,~> +k5YD\[/^+*JcGNFrrDQgr;c]or;_QOrW)!Yp].W"J,~> +k5YD\[/^+*JcGNFrrDQgr;c]or;_QOrW)!Yp].W"J,~> +k5YD\[/^+*JcGQGrrDNfr;c]or;_QOrW)!Yp].W"J,~> +k5YD\[/^+*JcGQGrrDNfr;c]or;_QOrW)!Yp].W"J,~> +k5YD\[/^+*JcGQGrrDNfr;c]or;_QOrW)!Yp].W"J,~> +k5YD\[/^+*JcGQG!!)Her;c]or;_TPrW(sXrVuruquF&&J,~> +k5YD\[/^+*JcGQG!!)Her;c]or;_TPrW(sXrVuruquF&&J,~> +k5YD\[/^+*JcGQG!!)Her;c]or;_TPrW(sXrVuruquF&&J,~> +k5YD\[/^+*JcGTH!!)fo!!)`mrW)fprW%ZPrW)!YrW)rtr;a/'J,~> +k5YD\[/^+*JcGTH!!)fo!!)`mrW)fprW%ZPrW)!YrW)rtr;a/'J,~> +k5YD\[/^+*JcGTH!!)fo!!)`mrW)fprW%ZPrW)!YrW)rtr;a/'J,~> +k5YD\[/^+*JcGWI!!)forrE#trrDusr;c`prW%]QrW)!Yr;ccqrrBA)J,~> +k5YD\[/^+*JcGWI!!)forrE#trrDusr;c`prW%]QrW)!Yr;ccqrrBA)J,~> +k5YD\[/^+*JcGWI!!)forrE#trrDusr;c`prW%]QrW)!Yr;ccqrrBA)J,~> +k5VRaJcGZJo`4sjr;ccqrW)iqrr@cQrW)!YrW&tuJ,~> +k5VRaJcGZJo`4sjr;ccqrW)iqrr@cQrW)!YrW&tuJ,~> +k5VRaJcGZJo`4sjr;ccqrW)iqrr@cQrW)!YrW&tuJ,~> +k5VRaJcG]KoDnjiquHZprW)osrr@cQrW)!YrW&qtJ,~> +k5VRaJcG]KoDnjiquHZprW)osrr@cQrW)!YrW&qtJ,~> +k5VRaJcG]KoDnjiquHZprW)osrr@cQrW)!YrW&qtJ,~> +k5VRaJcG`Lo)SahquHWoq>c6LrW(sXrW&qtJ,~> +k5VRaJcG`Lo)SahquHWoq>c6LrW(sXrW&qtJ,~> +k5VRaJcG`Lo)SahquHWoq>c6LrW(sXrW&qtJ,~> +aoD&7irArWJcFd1r;cZnrW%TNrW)!YrW&nsJ,~> +aoD&7irArWJcFd1r;cZnrW%TNrW)!YrW&nsJ,~> +aoD&7irArWJcFd1r;cZnrW%TNrW)!YrW&nsJ,~> +aT(l4jT#/YJcFa0rr@WMq>^EoirAuXW;hA~> +aT(l4jT#/YJcFa0rr@WMq>^EoirAuXW;hA~> +aT(l4jT#/YJcFa0rr@WMq>^EoirAuXW;hA~> +aT(l4j8]#WJcFj3rr@WMq#C +aT(l4j8]#WJcFj3rr@WMq#C +aT(l4j8]#WJcFj3rr@WMq#C +aT(o5iW&fUJcFp5rr@WMq#C +aT(o5iW&fUJcFp5rr@WMq#C +aT(o5iW&fUJcFp5rr@WMq#C +a8bl6hZ*NSJcFs6!!%TMp](3mj8])YVZ2/~> +a8bl6hZ*NSJcFs6!!%TMp](3mj8])YVZ2/~> +a8bl6hZ*NSJcFs6!!%TMp](3mj8])YVZ2/~> +a8bo7h#Il&~> +a8bo7h#Il&~> +a8bo7h#Il&~> +`rGf6h#I9PJcC<$irAuXirAuXV>l&~> +`rGf6h#I9PJcC<$irAuXirAuXV>l&~> +`rGf6h#I9PJcC<$irAuXirAuXV>l&~> +`rGc5h#I9PJcC<$j8])Yj8])YV#Pr~> +`rGc5h#I9PJcC<$j8])Yj8])YV#Pr~> +`rGc5h#I9PJcC<$j8])Yj8])YV#Pr~> +`W,i9!<;utg].3PJcC<$jo>;[irAuXV#Pr~> +`W,i9!<;utg].3PJcC<$jo>;[irAuXV#Pr~> +`W,i9!<;utg].3PJcC<$jo>;[irAuXV#Pr~> +`W,l:rr;osg].3PJcC<$k5YD\j8])YU]5i~> +`W,l:rr;osg].3PJcC<$k5YD\j8])YU]5i~> +`W,l:rr;osg].3PJcC<$k5YD\j8])YU]5i~> +`W,o;r;Z]qg].0OJcC<$l2U__j8]&XU]5i~> +`W,o;r;Z]qg].0OJcC<$l2U__j8]&XU]5i~> +`W,o;r;Z]qg].0OJcC<$l2U__j8]&XU]5i~> +`;]f;qZ$Hng].3PJcC<$lMph`j8])YUAo`~> +`;]f;qZ$Hng].3PJcC<$lMph`j8])YUAo`~> +`;]f;qZ$Hng].3PJcC<$lMph`j8])YUAo`~> +])V^/g].3PJcC<$m/R%bj8])YU&TW~> +])V^/g].3PJcC<$m/R%bj8])YU&TW~> +])V^/g].3PJcC<$m/R%bj8])YU&TW~> +\c;U.g].3PJcC<$mf37dirAuXU&TW~> +\c;U.g].3PJcC<$mf37dirAuXU&TW~> +\c;U.g].3PJcC<$mf37dirAuXU&TW~> +\GuL-g].0OJcC<$nGiIfj8])YT`9N~> +\GuL-g].0OJcC<$nGiIfj8])YT`9N~> +\GuL-g].0OJcC<$nGiIfj8])YT`9N~> +\,Z@+g].3PJcC<$o)J[hirAuXT`9N~> +\,Z@+g].3PJcC<$o)J[hirAuXT`9N~> +\,Z@+g].3PJcC<$o)J[hirAuXT`9N~> +[K$1*g].3PJcC<$oDedij8])YTDsE~> +[K$1*g].3PJcC<$oDedij8])YTDsE~> +[K$1*g].3PJcC<$oDedij8])YTDsE~> +[/^()g].3PJcC<$p&G!kj8]&XTDsE~> +[/^()g].3PJcC<$p&G!kj8]&XTDsE~> +[/^()g].3PJcC<$p&G!kj8]&XTDsE~> +ZiBt(g].0OJcC<$p](3mj8])YT)X<~> +ZiBt(g].0OJcC<$p](3mj8])YT)X<~> +ZiBt(g].0OJcC<$p](3mj8])YT)X<~> +ZN'k'gAh*OJcC<$q>^Eoj8])YSc=3~> +ZN'k'gAh*OJcC<$q>^Eoj8])YSc=3~> +ZN'k'gAh*OJcC<$q>^Eoj8])YSc=3~> +Z2a_%g].3PJcC<$qu?WqirAuXSc=3~> +Z2a_%g].3PJcC<$qu?WqirAuXSc=3~> +Z2a_%g].3PJcC<$qu?WqirAuXSc=3~> +YQ+P$g].3PJcC<$r;Z`rj8])YSH"*~> +YQ+P$g].3PJcC<$r;Z`rj8])YSH"*~> +YQ+P$g].3PJcC<$r;Z`rj8])YSH"*~> +Y5eG#g].0OJcC<$s8W&uirAuXSH"*~> +Y5eG#g].0OJcC<$s8W&uirAuXSH"*~> +Y5eG#g].0OJcC<$s8W&uirAuXSH"*~> +XoJ>"gAh*OJcC<$!<<#uj8])YS,\!~> +XoJ>"gAh*OJcC<$!<<#uj8])YS,\!~> +XoJ>"gAh*OJcC<$!<<#uj8])YS,\!~> +XT/5!gAh*OJcC?%rW)!Yr;`>eJ,~> +XT/5!gAh*OJcC?%rW)!Yr;`>eJ,~> +XT/5!gAh*OJcC?%rW)!Yr;`>eJ,~> +X8i(tg].0OJcCE'rW)!YrW&DeJ,~> +X8i(tg].0OJcCE'rW)!YrW&DeJ,~> +X8i(tg].0OJcCE'rW)!YrW&DeJ,~> +WW2nsg].0OJcCK)rW)!YrW&AdJ,~> +WW2nsg].0OJcCK)rW)!YrW&AdJ,~> +WW2nsg].0OJcCK)rW)!YrW&AdJ,~> +W;lergAh*OJcCQ+rW(sXrW&AdJ,~> +W;lergAh*OJcCQ+rW(sXrW&AdJ,~> +W;lergAh*OJcCQ+rW(sXrW&AdJ,~> +VuQ\qgAh*OJcCT,rW)!YrW&>cJ,~> +VuQ\qgAh*OJcCT,rW)!YrW&>cJ,~> +VuQ\qgAh*OJcCT,rW)!YrW&>cJ,~> +VZ6SpgAh'NJcC]/rW(sXrW&>cJ,~> +VZ6SpgAh'NJcC]/rW(sXrW&>cJ,~> +VZ6SpgAh'NJcC]/rW(sXrW&>cJ,~> +V>pGng].0OJcC`0rW)!YrW&;bJ,~> +V>pGng].0OJcC`0rW)!YrW&;bJ,~> +V>pGng].0OJcC`0rW)!YrW&;bJ,~> +U]:8mgAh*OJcCf2rW)!Yr;`2aJ,~> +U]:8mgAh*OJcCf2rW)!Yr;`2aJ,~> +U]:8mgAh*OJcCf2rW)!Yr;`2aJ,~> +UAt/lgAh*OJcCi3rW)!YrW&8aJ,~> +UAt/lgAh*OJcCi3rW)!YrW&8aJ,~> +UAt/lgAh*OJcCi3rW)!YrW&8aJ,~> +U&Y&kgAh'NJcCr6rW)!YrW&5`J,~> +U&Y&kgAh'NJcCr6rW)!YrW&5`J,~> +U&Y&kgAh'NJcCr6rW)!YrW&5`J,~> +T`=oigAh*OJcD#8rW(sXrW&5`J,~> +T`=oigAh*OJcD#8rW(sXrW&5`J,~> +T`=oigAh*OJcD#8rW(sXrW&5`J,~> +TE"fhgAh*OJcD&9rW)!YrW&2_J,~> +TE"fhgAh*OJcD&9rW)!YrW&2_J,~> +TE"fhgAh*OJcD&9rW)!YrW&2_J,~> +ScAWggAh*OJcD,;rW(sXrW&2_J,~> +ScAWggAh*OJcD,;rW(sXrW&2_J,~> +ScAWggAh*OJcD,;rW(sXrW&2_J,~> +SH&NfgAh'NJcD2=rW)!YrW&/^J,~> +SH&NfgAh'NJcD2=rW)!YrW&/^J,~> +SH&NfgAh'NJcD2=rW)!YrW&/^J,~> +S,`Eeg&M!NJcD8?rW)!Yr;`&]J,~> +S,`Eeg&M!NJcD8?rW)!Yr;`&]J,~> +S,`Eeg&M!NJcD8?rW)!Yr;`&]J,~> +RfE9cgAh*OJcD;@rW)!YrW&,]J,~> +RfE9cgAh*OJcD;@rW)!YrW&,]J,~> +RfE9cgAh*OJcD;@rW)!YrW&,]J,~> +R/d*bgAh*OJcDABrW)!YrW&)\J,~> +R/d*bgAh*OJcDABrW)!YrW&)\J,~> +R/d*bgAh*OJcDABrW)!YrW&)\J,~> +QiI!agAh'NJcDJErW(sXrW&)\J,~> +QiI!agAh'NJcDJErW(sXrW&)\J,~> +QiI!agAh'NJcDJErW(sXrW&)\J,~> +QN-m`g&M!NdJs.FJcF@%rW)!YrW&&[J,~> +QN-m`g&M!NdJs.FJcF@%rW)!YrW&&[J,~> +QN-m`g&M!NdJs.FJcF@%rW)!YrW&&[J,~> +Q2gd_g&M!NeGo=EJcFI(rW(sXrW&&[J,~> +Q2gd_g&M!NeGo=EJcFI(rW(sXrW&&[J,~> +Q2gd_g&M!NeGo=EJcFI(rW(sXrW&&[J,~> +PlLX]gAh'NfDkRFJcFL)rW)!YrW&#ZJ,~> +PlLX]gAh'NfDkRFJcFL)rW)!YrW&#ZJ,~> +PlLX]gAh'NfDkRFJcFL)rW)!YrW&#ZJ,~> +P5kI\gAh'Ng&M'Pr;Z]qJcFO*rW)!Yr;_oYJ,~> +P5kI\gAh'Ng&M'Pr;Z]qJcFO*rW)!Yr;_oYJ,~> +P5kI\gAh'Ng&M'Pr;Z]qJcFO*rW)!Yr;_oYJ,~> +OoP@[g&M!NgA_-QqZ$KoJcFR+rW)!YrW%uYJ,~> +OoP@[g&M!NgA_-QqZ$KoJcFR+rW)!YrW%uYJ,~> +OoP@[g&M!NgA_-QqZ$KoJcFR+rW)!YrW%uYJ,~> +OT57Zg&M!Nh#IBSqZ$KoJcFU,rW)!YrW%rXJ,~> +OT57Zg&M!Nh#IBSqZ$KoJcFU,rW)!YrW%rXJ,~> +OT57Zg&M!Nh#IBSqZ$KoJcFU,rW)!YrW%rXJ,~> +O8o.Yg&LsMec5UKJcFU,rW(sXrW%rXJ,~> +O8o.Yg&LsMec5UKJcFU,rW(sXrW%rXJ,~> +O8o.Yg&LsMec5UKJcFU,rW(sXrW%rXJ,~> +NrT"WgAh'Nf)P^LJcFU,rW)!YrW%oWJ,~> +NrT"WgAh'Nf)P^LJcFU,rW)!YrW%oWJ,~> +NrT"WgAh'Nf)P^LJcFU,rW)!YrW%oWJ,~> +N;rhVg&M!NfDkjNJcFU,rW(sXrW%oWJ,~> +N;rhVg&M!NfDkjNJcFU,rW(sXrW%oWJ,~> +N;rhVg&M!NfDkjNJcFU,rW(sXrW%oWJ,~> +MuW_Ug&M!Ng&M'PL&^cFk5YD\j8])YMuS;~> +MuW_Ug&M!Ng&M'PL&^cFk5YD\j8])YMuS;~> +MuW_Ug&M!Ng&M'PL&^cFk5YD\j8])YMuS;~> +MZdBQLB$lGkPtM]j8]&XMuS;~> +MZdBQLB$lGkPtM]j8]&XMuS;~> +MZdBQLB$lGkPtM]j8]&XMuS;~> +M?!MSf`1mMi;`TQM#[&HkPtM]j8])YMZ82~> +M?!MSf`1mMi;`TQM#[&HkPtM]j8])YMZ82~> +M?!MSf`1mMi;`TQM#[&HkPtM]j8])YMZ82~> +M#[AQg&M!NhZ*HQM?!SUq#C?okPtM]j8])YM>r)~> +M#[AQg&M!NhZ*HQM?!SUq#C?okPtM]j8])YM>r)~> +M#[AQg&M!NhZ*HQM?!SUq#C?okPtM]j8])YM>r)~> +LB%2Pg&M!Nh>dERMZ<\Vq#Cr)~> +LB%2Pg&M!Nh>dERMZ<\Vq#Cr)~> +LB%2Pg&M!Nh>dERMZ<\Vq#Cr)~> +L&_)Og&LsMhZ*NSJc>`MrW)0^rW)!YrW%cSJ,~> +L&_)Og&LsMhZ*NSJc>`MrW)0^rW)!YrW%cSJ,~> +L&_)Og&LsMhZ*NSJc>`MrW)0^rW)!YrW%cSJ,~> +K`CuNf`1mMhuEWTJc>fO!!)6_rW(sXrW%cSJ,~> +K`CuNf`1mMhuEWTJc>fO!!)6_rW(sXrW%cSJ,~> +K`CuNf`1mMhuEWTJc>fO!!)6_rW(sXrW%cSJ,~> +KE(iLg&M!NhuEZUJcG]Lkl:V^j8])YqZ$KoP5g%~> +KE(iLg&M!NhuEZUJcG]Lkl:V^j8])YqZ$KoP5g%~> +KE(iLg&M!NhuEZUJcG]Lkl:V^j8])YqZ$KoP5g%~> +K)b`Kg&M!Ni;`fWJc>`MrW)3_rW)!Yr;ccqq#HZZJ,~> +K)b`Kg&M!Ni;`fWJc>`MrW)3_rW)!Yr;ccqq#HZZJ,~> +K)b`Kg&M!Ni;`fWJc>`MrW)3_rW)!Yr;ccqq#HZZJ,~> +Jc>`Mr;bONquGdWrW%NL!ri6#kl:V^j8])Yr;Z`rrVuisQ2c@~> +Jc>`Mr;bONquGdWrW%NL!ri6#kl:V^j8])Yr;Z`rrVuisQ2c@~> +Jc>`Mr;bONquGdWrW%NL!ri6#kl:V^j8])Yr;Z`rrVuisQ2c@~> +JcGcMr;bLMr;bpYrr@WM!<<#ul2U__j8])Yr;Z`rqu?WqQN)I~> +JcGcMr;bLMr;bpYrr@WM!<<#ul2U__j8])Yr;Z`rqu?WqQN)I~> +JcGcMr;bLMr;bpYrr@WM!<<#ul2U__j8])Yr;Z`rqu?WqQN)I~> +JcG`Lr;bLMr;c9crrDoqrr@WM!<<#ulMph`irAuXr;Z`rqu?WqQN)I~> +JcG`Lr;bLMr;c9crrDoqrr@WM!<<#ulMph`irAuXr;Z`rqu?WqQN)I~> +JcG`Lr;bLMr;c9crrDoqrr@WM!<<#ulMph`irAuXr;Z`rqu?WqQN)I~> +JcG]KquGFMr;c?equH`rrW%NLs8W*!l2U__j8])Yqu?Wqqu?WqQN)I~> +JcG]KquGFMr;c?equH`rrW%NLs8W*!l2U__j8])Yqu?Wqqu?WqQN)I~> +JcG]KquGFMr;c?equH`rrW%NLs8W*!l2U__j8])Yqu?Wqqu?WqQN)I~> +JcGWIr;bONquH9eq#H!Grr;rtlMph`irAuXqu?Wqqu?WqQN)I~> +JcGWIr;bONquH9eq#H!Grr;rtlMph`irAuXqu?Wqqu?WqQN)I~> +JcGWIr;bONquH9eq#H!Grr;rtlMph`irAuXqu?Wqqu?WqQN)I~> +JcGTHr;bLMr;c?erW%NLqu?WqlMph`j8])YqZ$Kor;Z`rQN)I~> +JcGTHr;bLMr;c?erW%NLqu?WqlMph`j8])YqZ$Kor;Z`rQN)I~> +JcGTHr;bLMr;c?erW%NLqu?WqlMph`j8])YqZ$Kor;Z`rQN)I~> +JcGQGr;bLMr;_EKkl:Y_lMph`j8]&XqZ$Hnrr;rtQ2c@~> +JcGQGr;bLMr;_EKkl:Y_lMph`j8]&XqZ$Hnrr;rtQ2c@~> +JcGQGr;bLMr;_EKkl:Y_lMph`j8]&XqZ$Hnrr;rtQ2c@~> +JcGNFr;bLMquD +JcGNFr;bLMquD +JcGNFr;bLMquD +JcGKEquGFMquD +JcGKEquGFMquD +JcGKEquGFMquD +JcGECr;bLMr;_EKmJm1dli6qairAuXp&FmhPQ-.~> +JcGECr;bLMr;_EKmJm1dli6qairAuXp&FmhPQ-.~> +JcGECr;bLMr;_EKmJm1dli6qairAuXp&FmhPQ-.~> +JcGBBr;bLMr;_EKn,N@eli6qaj8])Yo`+afPlH7~> +JcGBBr;bLMr;_EKn,N@eli6qaj8])Yo`+afPlH7~> +JcGBBr;bLMr;_EKn,N@eli6qaj8])Yo`+afPlH7~> +JcG?Ar;bLMquD +JcG?Ar;bLMquD +JcG?Ar;bLMquD +JcG<@r;bLMquD +JcG<@r;bLMquD +JcG<@r;bLMquD +JcG9?quGCLr;_EKoDegjm/R%bj8]&XpAb*lr;ZZpQiDR~> +JcG9?quGCLr;_EKoDegjm/R%bj8]&XpAb*lr;ZZpQiDR~> +JcG9?quGCLr;_EKoDegjm/R%bj8]&XpAb*lr;ZZpQiDR~> +JcG3=r;bLMr;_EKh>dHSj8])Yp&G!kqu?TpQiDR~> +JcG3=r;bLMr;_EKh>dHSj8])Yp&G!kqu?TpQiDR~> +JcG3=r;bLMr;_EKh>dHSj8])Yp&G!kqu?TpQiDR~> +NW/tYj8]&Xf`1jLJcF[.rW)!YrW)Wkr;c]orW&;bJ,~> +NW/tYj8]&Xf`1jLJcF[.rW)!YrW)Wkr;c]orW&;bJ,~> +NW/tYj8]&Xf`1jLJcF[.rW)!YrW)Wkr;c]orW&;bJ,~> +NrT(Yj8]&XfDkdLJcFa0rW(sXrW)Wkr;c]orW&;bJ,~> +NrT(Yj8]&XfDkdLJcFa0rW(sXrW)Wkr;c]orW&;bJ,~> +NrT(Yj8]&XfDkdLJcFa0rW(sXrW)Wkr;c]orW&;bJ,~> +O8o.YirArWfDkdLJcFd1rW)!YrW)QirW)fprW&;bJ,~> +O8o.YirArWfDkdLJcFd1rW)!YrW)QirW)fprW&;bJ,~> +O8o.YirArWfDkdLJcFd1rW)!YrW)QirW)fprW&;bJ,~> +OT54YiW&fUf`1mMJcFj3rW(sXrW)QirW)fprrAAbJ,~> +OT54YiW&fUf`1mMJcFj3rW(sXrW)QirW)fprrAAbJ,~> +OT54YiW&fUf`1mMJcFj3rW(sXrW)QirW)fprrAAbJ,~> +OT54YhuEWTf`1jLJcFp5rW)!YrW)KgrW)lrrrA>aJ,~> +OT54YhuEWTf`1jLJcFp5rW)!YrW)KgrW)lrrrA>aJ,~> +OT54YhuEWTf`1jLJcFp5rW)!YrW)KgrW)lrrrA>aJ,~> +OoP:YhZ*NSfDkdLJcG!7rW)!Yr;c?eq#HZZJ,~> +OoP:YhZ*NSfDkdLJcG!7rW)!Yr;c?eq#HZZJ,~> +OoP:YhZ*NSfDkdLJcG!7rW)!Yr;c?eq#HZZJ,~> +P5kO^!<;uth>dERfDkdLJcG$8rW)!YrW)?cr;`#\J,~> +P5kO^!<;uth>dERfDkdLJcG$8rW)!YrW)?cr;`#\J,~> +P5kO^!<;uth>dERfDkdLJcG$8rW)!YrW)?cr;`#\J,~> +P5kO^!<;uth#I9Pf`1mMJcG*:rW)!YrW%NLq>Ys~> +P5kO^!<;uth#I9Pf`1mMJcG*:rW)!YrW%NLq>Ys~> +P5kO^!<;uth#I9Pf`1mMJcG*:rW)!YrW%NLq>Ys~> +PQ1X_s8W#tg].0Of`1jLJcG3=rW(sXrW%NLq>Ys~> +PQ1X_s8W#tg].0Of`1jLJcG3=rW(sXrW%NLq>Ys~> +PQ1X_s8W#tg].0Of`1jLJcG3=rW(sXrW%NLq>Ys~> +PlLa`rr;osg&M!NfDkdLJcG6>rW)!YrW%NLq#>j~> +PlLa`rr;osg&M!NfDkdLJcG6>rW)!YrW%NLq#>j~> +PlLa`rr;osg&M!NfDkdLJcG6>rW)!YrW%NLq#>j~> +Q2gjarVufrf`1mMfDkdLJcG<@rW(sXrW%NLq#>j~> +Q2gjarVufrf`1mMfDkdLJcG<@rW(sXrW%NLq#>j~> +Q2gjarVufrf`1mMfDkdLJcG<@rW(sXrW%NLq#>j~> +Q2gjarVufrfDkdLfDkdLJcG?ArW)!YrW%NLp]#a~> +Q2gjarVufrfDkdLfDkdLJcG?ArW)!YrW%NLp]#a~> +Q2gjarVufrfDkdLfDkdLJcG?ArW)!YrW%NLp]#a~> +QN-sbr;Z]qf)PXJf`1jLJcGHDrW)!Yr;_EKp]#a~> +QN-sbr;Z]qf)PXJf`1jLJcGHDrW)!Yr;_EKp]#a~> +QN-sbr;Z]qf)PXJf`1jLJcGHDrW)!Yr;_EKp]#a~> +QiI'cqu?TpeGoIIfDkdLJcGKErW)!YrW%NLpA]X~> +QiI'cqu?TpeGoIIfDkdLJcGKErW)!YrW%NLpA]X~> +QiI'cqu?TpeGoIIfDkdLJcGKErW)!YrW%NLpA]X~> +QiI'cqu?Tpe,T@HfDkdLJcGQGrW)!YrW%NLp&BO~> +QiI'cqu?Tpe,T@HfDkdLJcGQGrW)!YrW%NLp&BO~> +QiI'cqu?Tpe,T@HfDkdLJcGQGrW)!YrW%NLp&BO~> +R/c[Vec5RJfDkaKJcGZJrW(sXrW%NLp&BO~> +R/c[Vec5RJfDkaKJcGZJrW(sXrW%NLp&BO~> +R/c[Vec5RJfDkaKJcGZJrW(sXrW%NLp&BO~> +R/c[VeGoIIfDkaKJcG]KrW)!YrW%NLo`'F~> +R/c[VeGoIIfDkaKJcG]KrW)!YrW%NLo`'F~> +R/c[VeGoIIfDkaKJcG]KrW)!YrW%NLo`'F~> +R/c[Ve,T=GfDkdLJcGcMrW(sXrW%NLo`'F~> +R/c[Ve,T=GfDkdLJcGcMrW(sXrW%NLo`'F~> +R/c[Ve,T=GfDkdLJcGcMrW(sXrW%NLo`'F~> +O8o.YcN!hCfDkdLJc>`MrW)!YrW%NLoDa=~> +O8o.YcN!hCfDkdLJc>`MrW)!YrW%NLoDa=~> +O8o.YcN!hCfDkdLJc>`MrW)!YrW%NLoDa=~> +O8o.Yc2[_BfDkaKKE(oNj8]&XJcG?AJ,~> +O8o.Yc2[_BfDkaKKE(oNj8]&XJcG?AJ,~> +O8o.Yc2[_BfDkaKKE(oNj8]&XJcG?AJ,~> +O8o.Ybl@VAf)P[KK`D#Oj8])YJcG<@J,~> +O8o.Ybl@VAf)P[KK`D#Oj8])YJcG<@J,~> +O8o.Ybl@VAf)P[KK`D#Oj8])YJcG<@J,~> +O8o.YbQ%M@f)P[KLB%5Qj8])YJcG9?J,~> +O8o.YbQ%M@f)P[KLB%5Qj8])YJcG9?J,~> +O8o.YbQ%M@f)P[KLB%5Qj8])YJcG9?J,~> +O8o.Yb5_A>fDkdLM#[GSirAuXJcG9?J,~> +O8o.Yb5_A>fDkdLM#[GSirAuXJcG9?J,~> +O8o.Yb5_A>fDkdLM#[GSirAuXJcG9?J,~> +JcF0ur;bILquDWSrW)!YrW%NLnGe"~> +JcF0ur;bILquDWSrW)!YrW%NLnGe"~> +JcF0ur;bILquDWSrW)!YrW%NLnGe"~> +JcF-tr;bFKr;_fVrW(sXrW%NLnGe"~> +JcF-tr;bFKr;_fVrW(sXrW%NLnGe"~> +JcF-tr;bFKr;_fVrW(sXrW%NLnGe"~> +JcF*sr;bFKr;_iWrW)!YrW%NLn,In~> +JcF*sr;bFKr;_iWrW)!YrW%NLn,In~> +JcF*sr;bFKr;_iWrW)!YrW%NLn,In~> +JcF'rr;bFKr;_oYrW)!Yr;_EKn,In~> +JcF'rr;bFKr;_oYrW)!Yr;_EKn,In~> +JcF'rr;bFKr;_oYrW)!Yr;_EKn,In~> +JcF$qquG@KquDlZrW)!YrW%NLmf.e~> +JcF$qquG@KquDlZrW)!YrW%NLmf.e~> +JcF$qquG@KquDlZrW)!YrW%NLmf.e~> +JcEsor;bFKr;`&]rW)!YrW%NLmJh\~> +JcEsor;bFKr;`&]rW)!YrW%NLmJh\~> +JcEsor;bFKr;`&]rW)!YrW%NLmJh\~> +JcEpnr;bFKr;`,_rW(sXrW%NLmJh\~> +JcEpnr;bFKr;`,_rW(sXrW%NLmJh\~> +JcEpnr;bFKr;`,_rW(sXrW%NLmJh\~> +JcEmmr;bFKr;`/`rW)!YrW%NLm/MS~> +JcEmmr;bFKr;`/`rW)!YrW%NLm/MS~> +JcEmmr;bFKr;`/`rW)!YrW%NLm/MS~> +JcEjlquG@KquE/brW(sXrW%NLm/MS~> +JcEjlquG@KquE/brW(sXrW%NLm/MS~> +JcEjlquG@KquE/brW(sXrW%NLm/MS~> +JcEdjr;bFKr;`;drW)!YrW%NLli2J~> +JcEdjr;bFKr;`;drW)!YrW%NLli2J~> +JcEdjr;bFKr;`;drW)!YrW%NLli2J~> +JcEair;bFKr;`AfrW)!Yr;_EKli2J~> +JcEair;bFKr;`AfrW)!Yr;_EKli2J~> +JcEair;bFKr;`AfrW)!Yr;_EKli2J~> +JcE^hr;bFKquE>grW)!YrW%NLlMlA~> +JcE^hr;bFKquE>grW)!YrW%NLlMlA~> +JcE^hr;bFKquE>grW)!YrW%NLlMlA~> +JcE[gr;bFKquEDirW)!YrW%NLl2Q8~> +JcE[gr;bFKquEDirW)!YrW%NLl2Q8~> +JcE[gr;bFKquEDirW)!YrW%NLl2Q8~> +JcEXfquG=Jr;`SlrW(sXrW%NLl2Q8~> +JcEXfquG=Jr;`SlrW(sXrW%NLl2Q8~> +JcEXfquG=Jr;`SlrW(sXrW%NLl2Q8~> +JcERdr;bFKr;`VmrW)!YrW%NLkl6/~> +JcERdr;bFKr;`VmrW)!YrW%NLkl6/~> +JcERdr;bFKr;`VmrW)!YrW%NLkl6/~> +JcEOcr;bFKquEVorW(sXrW%NLkl6/~> +JcEOcr;bFKquEVorW(sXrW%NLkl6/~> +JcEOcr;bFKquEVorW(sXrW%NLkl6/~> +JcELbr;bFKquEYprW)!YrW%NLkPp&~> +JcELbr;bFKquEYprW)!YrW%NLkPp&~> +JcELbr;bFKquEYprW)!YrW%NLkPp&~> +JcEIar;bCJr;`hsrW)!Yr;_EKkPp&~> +JcEIar;bCJr;`hsrW)!Yr;_EKkPp&~> +JcEIar;bCJr;`hsrW)!Yr;_EKkPp&~> +JcEF`quG=Jr;`ktrW)!YrW%NLk5Tr~> +JcEF`quG=Jr;`ktrW)!YrW%NLk5Tr~> +JcEF`quG=Jr;`ktrW)!YrW%NLk5Tr~> +JcE@^r;bFKquEl!rW)!YrW%NLjo9i~> +JcE@^r;bFKquEl!rW)!YrW%NLjo9i~> +JcE@^r;bFKquEl!rW)!YrW%NLjo9i~> +JcE=]r;bCJr;a&$rW(sXrW%NLjo9i~> +JcE=]r;bCJr;a&$rW(sXrW%NLjo9i~> +JcE=]r;bCJr;a&$rW(sXrW%NLjo9i~> +JcE:\r;bCJr;a)%rW)!YrW%NLjSs`~> +JcE:\r;bCJr;a)%rW)!YrW%NLjSs`~> +JcE:\r;bCJr;a)%rW)!YrW%NLjSs`~> +JcE7[r;bCJr;a/'rW(sXrW%NLjSs`~> +JcE7[r;bCJr;a/'rW(sXrW%NLjSs`~> +JcE7[r;bCJr;a/'rW(sXrW%NLjSs`~> +JcE4ZquG=JquF,(rW)!YrW%NLj8XW~> +JcE4ZquG=JquF,(rW)!YrW%NLj8XW~> +JcE4ZquG=JquF,(rW)!YrW%NLj8XW~> +JcE.Xr;bCJr;a;+rW)!Yr;_EKj8XW~> +JcE.Xr;bCJr;a;+rW)!Yr;_EKj8XW~> +JcE.Xr;bCJr;a;+rW)!Yr;_EKj8XW~> +JcE+Wr;bCJr;a>,rW)!YrW%NLir=N~> +JcE+Wr;bCJr;a>,rW)!YrW%NLir=N~> +JcE+Wr;bCJr;a>,rW)!YrW%NLir=N~> +JcE(Vr;bCJr;aD.rW)!YrW%NLiW"E~> +JcE(Vr;bCJr;aD.rW)!YrW%NLiW"E~> +JcE(Vr;bCJr;aD.rW)!YrW%NLiW"E~> +JcE%UquG=JquFD0rW(sXrW%NLiW"E~> +JcE%UquG=JquFD0rW(sXrW%NLiW"E~> +JcE%UquG=JquFD0rW(sXrW%NLiW"E~> +JcE"TquG:Ir;aP2rW)!YrW%NLi;\<~> +JcE"TquG:Ir;aP2rW)!YrW%NLi;\<~> +JcE"TquG:Ir;aP2rW)!YrW%NLi;\<~> +JcDqRr;bCJr;aV4rW(sXrW%NLi;\<~> +JcDqRr;bCJr;aV4rW(sXrW%NLi;\<~> +JcDqRr;bCJr;aV4rW(sXrW%NLi;\<~> +JcDnQr;bCJr;aY5rW)!YrW%NLhuA3~> +JcDnQr;bCJr;aY5rW)!YrW%NLhuA3~> +JcDnQr;bCJr;aY5rW)!YrW%NLhuA3~> +JcDkPr;bCJquFY7rW)!Yr;_EKhuA3~> +JcDkPr;bCJquFY7rW)!Yr;_EKhuA3~> +JcDkPr;bCJquFY7rW)!Yr;_EKhuA3~> +JcDhOquG:Ir;ae9rW)!YrW%NLhZ&*~> +JcDhOquG:Ir;ae9rW)!YrW%NLhZ&*~> +JcDhOquG:Ir;ae9rW)!YrW%NLhZ&*~> +JcDbMr;bCJr;ak;rW)!YrW%NLh>`!~> +JcDbMr;bCJr;ak;rW)!YrW%NLh>`!~> +JcDbMr;bCJr;ak;rW)!YrW%NLh>`!~> +JcD_Lr;bCJquFk=rW(sXrW%NLh>`!~> +JcD_Lr;bCJquFk=rW(sXrW%NLh>`!~> +JcD_Lr;bCJquFk=rW(sXrW%NLh>`!~> +JcD\Kr;bCJquFn>rW)!YrW%NLh#Dm~> +JcD\Kr;bCJquFn>rW)!YrW%NLh#Dm~> +JcD\Kr;bCJquFn>rW)!YrW%NLh#Dm~> +JcDYJr;b@Ir;b(ArW(sXrW%NLh#Dm~> +JcDYJr;b@Ir;b(ArW(sXrW%NLh#Dm~> +JcDYJr;b@Ir;b(ArW(sXrW%NLh#Dm~> +JcDVIquG:Ir;b+BrW)!YrW%NLg])d~> +JcDVIquG:Ir;b+BrW)!YrW%NLg])d~> +JcDVIquG:Ir;b+BrW)!YrW%NLg])d~> +JcDPGr;bCJquG+DrW)!Yr;_EKg])d~> +JcDPGr;bCJquG+DrW)!Yr;_EKg])d~> +JcDPGr;bCJquG+DrW)!Yr;_EKg])d~> +JcDMFr;bCJquG.ErW)!YrW%NLgAc[~> +JcDMFr;bCJquG.ErW)!YrW%NLgAc[~> +JcDMFr;bCJquG.ErW)!YrW%NLgAc[~> +JcDJEr;b@Ir;b=HrW)!YrW%NLg&HR~> +JcDJEr;b@Ir;b=HrW)!YrW%NLg&HR~> +JcDJEr;b@Ir;b=HrW)!YrW%NLg&HR~> +JcDGDr;b@Ir;bCJrW(sXrW%NLg&HR~> +JcDGDr;b@Ir;bCJrW(sXrW%NLg&HR~> +JcDGDr;b@Ir;bCJrW(sXrW%NLg&HR~> +JcDDCquG:IquG@KrW)!YrW%NLf`-I~> +JcDDCquG:IquG@KrW)!YrW%NLf`-I~> +JcDDCquG:IquG@KrW)!YrW%NLf`-I~> +JcD>Ar;b@Ir;baT!!)rsrW(sXrW%NLf`-I~> +JcD>Ar;b@Ir;baT!!)rsrW(sXrW%NLf`-I~> +JcD>Ar;b@Ir;baT!!)rsrW(sXrW%NLf`-I~> +JcD;@r;b@Ir;bdUrW)rtrW)!YrW%NLfDg@~> +JcD;@r;b@Ir;bdUrW)rtrW)!YrW%NLfDg@~> +JcD;@r;b@Ir;bdUrW)rtrW)!YrW%NLfDg@~> +JcD8?r;b@Ir;cZn!!) +JcD8?r;b@Ir;cZn!!) +JcD8?r;b@Ir;cZn!!) +JcD5>r;b@IquHZprW)9aq#KITrW%NLf)L7~> +JcD5>r;b@IquHZprW)9aq#KITrW%NLf)L7~> +JcD5>r;b@IquHZprW)9aq#KITrW%NLf)L7~> +JcD2=quG7Hr;cisr;c0`q#KLUrW%NLec1.~> +JcD2=quG7Hr;cisr;c0`q#KLUrW%NLec1.~> +JcD2=quG7Hr;cisr;c0`q#KLUrW%NLec1.~> +JcD,;r;b@Ir;ZitqZ-!_pAj@UrW%NLec1.~> +JcD,;r;b@Ir;ZitqZ-!_pAj@UrW%NLec1.~> +JcD,;r;b@Ir;ZitqZ-!_pAj@UrW%NLec1.~> +JcD):r;b@IpAjR[o`47VrW%NLeGk%~> +JcD):r;b@IpAjR[o`47VrW%NLeGk%~> +JcD):r;b@IpAjR[o`47VrW%NLeGk%~> +JcD&9r;b@Ip]0[\o`47VrW%NLeGk%~> +JcD&9r;b@Ip]0[\o`47VrW%NLeGk%~> +JcD&9r;b@Ip]0[\o`47VrW%NLeGk%~> +JcD#8quG:Ip]0^]p&O@WrW%NLe,Op~> +JcD#8quG:Ip]0^]p&O@WrW%NLe,Op~> +JcD#8quG:Ip]0^]p&O@WrW%NLe,Op~> +JcCu7quG@KpAjU\p]0OXr;_EKe,Op~> +JcCu7quG@KpAjU\p]0OXr;_EKe,Op~> +JcCu7quG@KpAjU\p]0OXr;_EKe,Op~> +JcCo5r;bONo`4I\p]0LWrW%NLdf4g~> +JcCo5r;bONo`4I\p]0LWrW%NLdf4g~> +JcCo5r;bONo`4I\p]0LWrW%NLdf4g~> +JcCl4r;bROo`4I\q>f[XrW%NLdJn^~> +JcCl4r;bROo`4I\q>f[XrW%NLdJn^~> +JcCl4r;bROo`4I\q>f[XrW%NLdJn^~> +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>ArW)NhrrCLIrW)KgrrD'YrrD0\rW%NLmf.e~> +JcD>ArW)NhrrCLIrW)KgrrD'YrrD0\rW%NLmf.e~> +JcD>ArW)NhrrCLIrW)KgrrD'YrrD0\rW%NLmf.e~> +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW(OLrrB_3rrD*ZrW%NLmf.e~> +JcD>ArW(OLrrB_3rrD*ZrW%NLmf.e~> +JcD>ArW(OLrrB_3rrD*ZrW%NLmf.e~> +JcD>ArW(XOquFM3quGdWrW%NLmf.e~> +JcD>ArW(XOquFM3quGdWrW%NLmf.e~> +JcD>ArW(XOquFM3quGdWrW%NLmf.e~> +JcD>ArW([PqZ+D2quGdWrW%NLmf.e~> +JcD>ArW([PqZ+D2quGdWrW%NLmf.e~> +JcD>ArW([PqZ+D2quGdWrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(RMrW'Y3rW)!YrW%NLmf.e~> +JcD>ArW(sXrW)corW)0^"9AK%!!)`mrrDoq!!)]lrW)uurW)!YrW%NLmf.e~> +JcD>ArW(sXrW)corW)0^"9AK%!!)`mrrDoq!!)]lrW)uurW)!YrW%NLmf.e~> +JcD>ArW(sXrW)corW)0^"9AK%!!)`mrrDoq!!)]lrW)uurW)!YrW%NLmf.e~> +JcD>ArW)$Zq#L?mrW)osqZ-WqquH]qr;Zitr;cltr;ZitqZ-WqqZ-HlpAj7RrW%NLmf.e~> +JcD>ArW)$Zq#L?mrW)osqZ-WqquH]qr;Zitr;cltr;ZitqZ-WqqZ-HlpAj7RrW%NLmf.e~> +JcD>ArW)$Zq#L?mrW)osqZ-WqquH]qr;Zitr;cltr;ZitqZ-WqqZ-HlpAj7RrW%NLmf.e~> +JcD>ArW)'[rrE#trW)lrrW)iqr;ccqrW)uukPtV_q#L +JcD>ArW)'[rrE#trW)lrrW)iqr;ccqrW)uukPtV_q#L +JcD>ArW)'[rrE#trW)lrrW)iqr;ccqrW)uukPtV_q#L +JcD>ArW)'[rrDusrrDusrW)iqr;ccqrW)osqu?`srW)uuquH]qquH]qr;cfrrW)iqrW)!YrW%NL +mf.e~> +JcD>ArW)'[rrDusrrDusrW)iqr;ccqrW)osqu?`srW)uuquH]qquH]qr;cfrrW)iqrW)!YrW%NL +mf.e~> +JcD>ArW)'[rrDusrrDusrW)iqr;ccqrW)osqu?`srW)uuquH]qquH]qr;cfrrW)iqrW)!YrW%NL +mf.e~> +JcD>ArW)*\rW)lrrrDusrW)iqr;ccqrW)osr;cZnrW)lrr;ccqr;cfrrW)iqrW)!YrW%NLmf.e~> +JcD>ArW)*\rW)lrrrDusrW)iqr;ccqrW)osr;cZnrW)lrr;ccqr;cfrrW)iqrW)!YrW%NLmf.e~> +JcD>ArW)*\rW)lrrrDusrW)iqr;ccqrW)osr;cZnrW)lrr;ccqr;cfrrW)iqrW)!YrW%NLmf.e~> +JcD>ArW)*\r;cQkrW)iqr;ccqrW)osr;cZnrW)lrr;ccqr;cisrW)fprW)!YrW%NLmf.e~> +JcD>ArW)*\r;cQkrW)iqr;ccqrW)osr;cZnrW)lrr;ccqr;cisrW)fprW)!YrW%NLmf.e~> +JcD>ArW)*\r;cQkrW)iqr;ccqrW)osr;cZnrW)lrr;ccqr;cisrW)fprW)!YrW%NLmf.e~> +JcD>ArW)'[quHNlrW)iqr;ccqrW)osr;cZnrW)lrr;c`prW)rtrW)fprW)!YrW%NLmf.e~> +JcD>ArW)'[quHNlrW)iqr;ccqrW)osr;cZnrW)lrr;c`prW)rtrW)fprW)!YrW%NLmf.e~> +JcD>ArW)'[quHNlrW)iqr;ccqrW)osr;cZnrW)lrr;c`prW)rtrW)fprW)!YrW%NLmf.e~> +JcD>ArW)$ZqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)!YrW%NLmf.e~> +JcD>ArW)$ZqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)!YrW%NLmf.e~> +JcD>ArW)$ZqZ-KmrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)!YrW%NLmf.e~> +JcD>ArW)!YqZ-NnrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)!YrW%NLmf.e~> +JcD>ArW)!YqZ-NnrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)!YrW%NLmf.e~> +JcD>ArW)!YqZ-NnrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)!YrW%NLmf.e~> +JcD>ArW(sXqZ-QorW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)!YrW%NLmf.e~> +JcD>ArW(sXqZ-QorW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)!YrW%NLmf.e~> +JcD>ArW(sXqZ-QorW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)uur;c]orW)!YrW%NLmf.e~> +JcD>ArW)'[!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)!YrW%NLmf.e~> +JcD>ArW)'[!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)!YrW%NLmf.e~> +JcD>ArW)'[!!)utquH]qrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtrW)fprW)!YrW%NLmf.e~> +JcD>ArW)'[!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)!YrW%NLmf.e~> +JcD>ArW)'[!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)!YrW%NLmf.e~> +JcD>ArW)'[!!)rsr;cfrrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)!YrW%NLmf.e~> +JcD>ArW)'[!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)!YrW%NLmf.e~> +JcD>ArW)'[!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)!YrW%NLmf.e~> +JcD>ArW)'[!!)orrW)osrW)iqr;ccqrW)osr;cZnrW)iqrW)iqrW)rtr;c`prW)!YrW%NLmf.e~> +JcD>ArW)'[!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;bpYrW%NLmf.e~> +JcD>ArW)'[!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;bpYrW%NLmf.e~> +JcD>ArW)'[!!)orrW)osrW)iqr;cfrr;cfrr;cZnrW)lrr;ccqr;cfrr;ccqr;bpYrW%NLmf.e~> +JcD>ArW)'[rrDusrrDusr;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDn"QrW%NLmf.e~> +JcD>ArW)'[rrDusrrDusr;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDn"QrW%NLmf.e~> +JcD>ArW)'[rrDusrrDusr;c`pq>^NqquHcsr;c]or;ccqr;ccqr;ccqoDn"QrW%NLmf.e~> +JcD>ArW)'[q#LBnq>gEmquHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;bpYrW%NLmf.e~> +JcD>ArW)'[q#LBnq>gEmquHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;bpYrW%NLmf.e~> +JcD>ArW)'[q#LBnq>gEmquHcsrW)uuq#LBnq>gQqq>gQqq>gKoqZ$Wrr;bpYrW%NLmf.e~> +JcD>ArW)'[!W`9#rW)?crW)rt!!(IIrrE&u!!)!XrW%NLmf.e~> +JcD>ArW)'[!W`9#rW)?crW)rt!!(IIrrE&u!!)!XrW%NLmf.e~> +JcD>ArW)'[!W`9#rW)?crW)rt!!(IIrrE&u!!)!XrW%NLmf.e~> +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>ArW%NLn,N@eJcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcD>AJH4p7JcG0 +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +JcC<$JcC<$oDa=~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/executable_names/doc/figures/ll.dat b/executable_names/doc/figures/ll.dat new file mode 100644 index 0000000000000000000000000000000000000000..ae5b96dd4b8aa667d4f9505430346c3c668d0ccc --- /dev/null +++ b/executable_names/doc/figures/ll.dat @@ -0,0 +1,6 @@ +# LoadLeveler, times for /bin/hostname 2 tasks per node +1 8.57 +2 8.79 +3 9.07 +4 9.1 +5 9.77 diff --git a/executable_names/doc/figures/queued-job-init.dia b/executable_names/doc/figures/queued-job-init.dia new file mode 100644 index 0000000000000000000000000000000000000000..e3f830c62d719225aad8db1db45e883cf0791512 --- /dev/null +++ b/executable_names/doc/figures/queued-job-init.dia @@ -0,0 +1,4 @@ + +#A4##srun##slurmctld##slurmd##slurmd##batch req##batch reply##run req##job_mgr##session_mgr##srun##run reply##job step req##job step reply##cmd##release step reply##release step##task exit msg##run epilog req##run epilog reply##script##User##submit +exit status##job +queued##srun batch##prolog##epilog# diff --git a/executable_names/doc/figures/queued-job-init.eps b/executable_names/doc/figures/queued-job-init.eps new file mode 100644 index 0000000000000000000000000000000000000000..2e4a4d8b7d6e0ceab6e78f10a9a7cd43fc294979 --- /dev/null +++ b/executable_names/doc/figures/queued-job-init.eps @@ -0,0 +1,1027 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ../figures/queued-job-init.dia +%%Creator: Dia v0.88.1 +%%CreationDate: Thu Apr 3 14:26:19 2003 +%%For: grondo +%%Magnification: 1.0000 +%%Orientation: Portrait +%%BoundingBox: 0 0 729 483 +%%Pages: 1 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/Times-Roman-latin1 + /Times-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Italic-latin1 + /Times-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Bold-latin1 + /Times-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-BoldItalic-latin1 + /Times-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Book-latin1 + /AvantGarde-Book findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-BookOblique-latin1 + /AvantGarde-BookOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Demi-latin1 + /AvantGarde-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-DemiOblique-latin1 + /AvantGarde-DemiOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Light-latin1 + /Bookman-Light findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-LightItalic-latin1 + /Bookman-LightItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Demi-latin1 + /Bookman-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-DemiItalic-latin1 + /Bookman-DemiItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-latin1 + /Courier findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Oblique-latin1 + /Courier-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Bold-latin1 + /Courier-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-BoldOblique-latin1 + /Courier-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-latin1 + /Helvetica findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Oblique-latin1 + /Helvetica-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Bold-latin1 + /Helvetica-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-BoldOblique-latin1 + /Helvetica-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-latin1 + /Helvetica-Narrow findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Oblique-latin1 + /Helvetica-Narrow-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Bold-latin1 + /Helvetica-Narrow-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-BoldOblique-latin1 + /Helvetica-Narrow-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Roman-latin1 + /NewCenturySchoolbook-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Italic-latin1 + /NewCenturySchoolbook-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Bold-latin1 + /NewCenturySchoolbook-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-BoldItalic-latin1 + /NewCenturySchoolbook-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Roman-latin1 + /Palatino-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Italic-latin1 + /Palatino-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Bold-latin1 + /Palatino-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-BoldItalic-latin1 + /Palatino-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Symbol-latin1 + /Symbol findfont +definefont pop +/ZapfChancery-MediumItalic-latin1 + /ZapfChancery-MediumItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/ZapfDingbats-latin1 + /ZapfDingbats findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +28.346000 -28.346000 scale +-0.526200 -17.040323 translate +%%EndProlog + + +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.701961 0.701961 0.701961 srgb +n 10.500000 4.750000 m 10.500000 16.500000 l s +0.100000 slw +[0.200000] 0 sd +[0.100000] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 17.250000 6.125000 m 17.250000 14.000000 l s +0.100000 slw +[0.100000] 0 sd +[0.100000] 0 sd +0 slc +n 18.750000 8.125000 m 18.750000 12.500000 l s +0.100000 slw +[0.100000] 0 sd +[0.100000] 0 sd +0 slc +n 18.000000 7.125000 m 18.000000 13.000000 l s +0.847059 0.847059 0.847059 srgb +n 20.000000 9.375000 m 20.000000 12.000000 l 23.750000 12.000000 l 23.750000 9.375000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +n 20.000000 9.375000 m 20.000000 12.000000 l 23.750000 12.000000 l 23.750000 9.375000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.003922 0.003922 0.003922 srgb +n 2.000000 1.750000 m 1.412500 1.000000 l 1.125000 1.237500 l 1.887500 2.212500 l 1.475000 3.675000 l 1.937500 3.675000 l 2.187500 2.725000 l 2.425000 3.675000 l 2.850000 3.675000 l 2.525000 2.425000 l 3.162500 2.800000 l 3.337500 2.475000 l 2.462500 1.925000 l 2.425000 1.737500 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 2.225000 1.484686 0.338980 0.338980 121.081372 58.918628 ellipse s +/Courier-Bold-latin1 ff 0.600000 scf sf +0.000000 0.000000 0.000000 srgb +(srun) dup sw 2 div 6.500000 ex sub 1.000000 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.600000 scf sf +(slurmctld) dup sw 2 div 10.500000 ex sub 1.000000 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.600000 scf sf +(slurmd) dup sw 2 div 16.500000 ex sub 1.000000 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.600000 scf sf +(slurmd) dup sw 2 div 22.500000 ex sub 1.000000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 6.250000 2.000000 m 6.250000 4.500000 l 6.750000 4.500000 l 6.750000 2.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.250000 2.000000 m 6.250000 4.500000 l 6.750000 4.500000 l 6.750000 2.000000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.250000 4.500000 m 3.500000 4.500000 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 4.100000 4.300000 m 3.500000 4.500000 l 4.100000 4.700000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 3.000000 2.000000 m 6.250000 2.000000 l s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 5.650000 2.200000 m 6.250000 2.000000 l 5.650000 1.800000 l s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 6.750000 2.000000 m 10.250000 2.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 9.850000 2.200000 m 10.250000 2.000000 l 9.850000 1.800000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.850000 2.200000 m 10.250000 2.000000 l 9.850000 1.800000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 10.250000 3.000000 m 6.750000 3.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 7.150000 2.800000 m 6.750000 3.000000 l 7.150000 3.200000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.150000 2.800000 m 6.750000 3.000000 l 7.150000 3.200000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(batch req) dup sw 2 div 8.500000 ex sub 1.875000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.600000 scf sf +(batch reply) dup sw 2 div 8.500000 ex sub 2.875000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.701961 0.701961 0.701961 srgb +n 10.500000 1.500000 m 10.500000 3.875000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 16.500000 1.500000 m 16.500000 16.500000 l s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 10.750000 5.500000 m 16.250000 5.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 15.850000 5.700000 m 16.250000 5.500000 l 15.850000 5.300000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 15.850000 5.700000 m 16.250000 5.500000 l 15.850000 5.300000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run req) dup sw 2 div 13.500000 ex sub 5.375000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 16.250000 5.500000 m 16.250000 6.500000 l 16.750000 6.500000 l 16.750000 5.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 16.250000 5.500000 m 16.250000 6.500000 l 16.750000 6.500000 l 16.750000 5.500000 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +(job_mgr) 17.250000 6.000000 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.500000 scf sf +(session_mgr) 18.000000 7.000000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 17.000000 6.500000 m 17.000000 7.500000 l 17.500000 7.500000 l 17.500000 6.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 17.000000 6.500000 m 17.000000 7.500000 l 17.500000 7.500000 l 17.500000 6.500000 l cp s +0.537255 0.537255 0.749020 srgb +n 17.750000 7.500000 m 17.750000 8.500000 l 18.250000 8.500000 l 18.250000 7.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 17.750000 7.500000 m 17.750000 8.500000 l 18.250000 8.500000 l 18.250000 7.500000 l cp s +0.537255 0.537255 0.749020 srgb +n 17.000000 14.000000 m 17.000000 14.500000 l 17.500000 14.500000 l 17.500000 14.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 17.000000 14.000000 m 17.000000 14.500000 l 17.500000 14.500000 l 17.500000 14.000000 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +(srun) 19.750000 8.500000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 19.500000 9.000000 m 19.500000 12.500000 l 20.000000 12.500000 l 20.000000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.500000 9.000000 m 19.500000 12.500000 l 20.000000 12.500000 l 20.000000 9.000000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.701961 0.701961 0.701961 srgb +n 22.500000 1.500000 m 22.500000 16.500000 l s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 16.250000 6.500000 m 10.750000 6.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 11.150000 6.300000 m 10.750000 6.500000 l 11.150000 6.700000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 11.150000 6.300000 m 10.750000 6.500000 l 11.150000 6.700000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run reply) dup sw 2 div 13.500000 ex sub 6.375000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 20.000000 9.625000 m 22.250000 9.625000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 21.850000 9.825000 m 22.250000 9.625000 l 21.850000 9.425000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 21.850000 9.825000 m 22.250000 9.625000 l 21.850000 9.425000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 22.250000 10.000000 m 20.000000 10.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 20.400000 9.800000 m 20.000000 10.000000 l 20.400000 10.200000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 20.400000 9.800000 m 20.000000 10.000000 l 20.400000 10.200000 l cp s +0.537255 0.537255 0.749020 srgb +n 22.250000 9.625000 m 22.250000 9.999998 l 22.750000 9.999998 l 22.750000 9.625000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 22.250000 9.625000 m 22.250000 9.999998 l 22.750000 9.999998 l 22.750000 9.625000 l cp s +0.537255 0.537255 0.749020 srgb +n 23.250000 10.500000 m 23.250000 11.500000 l 23.750000 11.500000 l 23.750000 10.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 23.250000 10.500000 m 23.250000 11.500000 l 23.750000 11.500000 l 23.750000 10.500000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 23.250000 10.750000 m 20.000000 10.750000 l s +0.080000 slw +[] 0 sd +0 slj +0 slc +n 23.250000 10.750000 m 23.250000 10.810000 23.190000 10.870000 23.130000 10.870000 c 23.070000 10.870000 23.010000 10.810000 23.010000 10.750000 c 23.010000 10.690000 23.070000 10.630000 23.130000 10.630000 c 23.190000 10.630000 23.250000 10.690000 23.250000 10.750000 c f +n 23.150000 10.550000 m 23.150000 10.950000 l s +0 slj +n 20.400000 10.550000 m 20.000000 10.750000 l 20.400000 10.950000 l f +0.537255 0.537255 0.749020 srgb +n 17.750000 13.000000 m 17.750000 14.000000 l 18.250000 14.000000 l 18.250000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 17.750000 13.000000 m 17.750000 14.000000 l 18.250000 14.000000 l 18.250000 13.000000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.500000 9.000000 m 10.750000 9.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 11.150000 8.800000 m 10.750000 9.000000 l 11.150000 9.200000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 11.150000 8.800000 m 10.750000 9.000000 l 11.150000 9.200000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 10.750000 9.500000 m 19.500000 9.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 19.100000 9.700000 m 19.500000 9.500000 l 19.100000 9.300000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.100000 9.700000 m 19.500000 9.500000 l 19.100000 9.300000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(job step req) dup sw 2 div 14.000000 ex sub 8.875000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.600000 scf sf +(job step reply) dup sw 2 div 14.000000 ex sub 10.000000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 23.250000 11.500000 m 20.000000 11.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 20.400000 11.300000 m 20.000000 11.500000 l 20.400000 11.700000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 20.400000 11.300000 m 20.000000 11.500000 l 20.400000 11.700000 l cp s +0.537255 0.537255 0.749020 srgb +n 10.250000 9.000000 m 10.250000 9.500000 l 10.750000 9.500000 l 10.750000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.250000 9.000000 m 10.250000 9.500000 l 10.750000 9.500000 l 10.750000 9.000000 l cp s +0.537255 0.537255 0.749020 srgb +n 22.750000 10.000000 m 22.750000 10.500000 l 23.250000 10.500000 l 23.250000 10.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 22.750000 10.000000 m 22.750000 10.500000 l 23.250000 10.500000 l 23.250000 10.000000 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +(cmd) 24.000000 11.000000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 22.750000 11.500000 m 22.750000 11.999998 l 23.250000 11.999998 l 23.250000 11.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 22.750000 11.500000 m 22.750000 11.999998 l 23.250000 11.999998 l 23.250000 11.500000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.500000 12.000000 m 10.800000 12.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 11.200000 11.800000 m 10.800000 12.000000 l 11.200000 12.200000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 11.200000 11.800000 m 10.800000 12.000000 l 11.200000 12.200000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 10.800000 12.375000 m 19.500000 12.375000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 19.100000 12.575000 m 19.500000 12.375000 l 19.100000 12.175000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.100000 12.575000 m 19.500000 12.375000 l 19.100000 12.175000 l cp s +0.537255 0.537255 0.749020 srgb +n 10.250000 12.000000 m 10.250000 12.375002 l 10.800000 12.375002 l 10.800000 12.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.250000 12.000000 m 10.250000 12.375002 l 10.800000 12.375002 l 10.800000 12.000000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(release step reply) dup sw 2 div 14.000000 ex sub 12.875000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.600000 scf sf +(release step) dup sw 2 div 14.000000 ex sub 11.875000 m gs 1 -1 sc sh gr +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 17.750000 13.500000 m 10.750000 13.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 11.150000 13.300000 m 10.750000 13.500000 l 11.150000 13.700000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 11.150000 13.300000 m 10.750000 13.500000 l 11.150000 13.700000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(task exit msg) dup sw 2 div 14.250000 ex sub 14.000000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.733333 srgb +n 10.250000 13.500000 m 10.250000 16.500000 l 10.750000 16.500000 l 10.750000 13.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.250000 13.500000 m 10.250000 16.500000 l 10.750000 16.500000 l 10.750000 13.500000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 10.750000 15.000000 m 22.250000 15.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 21.850000 15.200000 m 22.250000 15.000000 l 21.850000 14.800000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 21.850000 15.200000 m 22.250000 15.000000 l 21.850000 14.800000 l cp s +0.537255 0.537255 0.749020 srgb +n 22.250000 15.000000 m 22.250000 16.000000 l 22.750000 16.000000 l 22.750000 15.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 22.250000 15.000000 m 22.250000 16.000000 l 22.750000 16.000000 l 22.750000 15.000000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(run epilog req) dup sw 2 div 13.500000 ex sub 14.875000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.600000 scf sf +(run epilog reply) dup sw 2 div 13.500000 ex sub 17.000000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.749020 srgb +n 16.250000 15.500000 m 16.250000 16.500000 l 16.750000 16.500000 l 16.750000 15.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 16.250000 15.500000 m 16.250000 16.500000 l 16.750000 16.500000 l 16.750000 15.500000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 10.750000 15.500000 m 16.250000 15.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 15.850000 15.700000 m 16.250000 15.500000 l 15.850000 15.300000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 15.850000 15.700000 m 16.250000 15.500000 l 15.850000 15.300000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 16.250000 16.500000 m 10.750000 16.500000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 11.150000 16.300000 m 10.750000 16.500000 l 11.150000 16.700000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 11.150000 16.300000 m 10.750000 16.500000 l 11.150000 16.700000 l cp s +0.080000 slw +[] 0 sd +[] 0 sd +0 slc +n 22.250000 16.000000 m 10.750000 16.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 11.150000 15.800000 m 10.750000 16.000000 l 11.150000 16.200000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 11.150000 15.800000 m 10.750000 16.000000 l 11.150000 16.200000 l cp s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 0.500000 m 5.000000 16.500000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 0.500000 m 4.500000 1.000000 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 1.173910 m 4.500000 1.673910 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 1.847830 m 4.500000 2.347830 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 2.521740 m 4.500000 3.021740 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 3.195650 m 4.500000 3.695650 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 3.869570 m 4.500000 4.369570 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 4.543480 m 4.500000 5.043480 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 5.217390 m 4.500000 5.717390 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 5.891300 m 4.500000 6.391300 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 6.565220 m 4.500000 7.065220 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 7.239130 m 4.500000 7.739130 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 7.913040 m 4.500000 8.413040 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 8.586960 m 4.500000 9.086960 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 9.260870 m 4.500000 9.760870 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 9.934780 m 4.500000 10.434800 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 10.608700 m 4.500000 11.108700 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 11.282600 m 4.500000 11.782600 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 11.956500 m 4.500000 12.456500 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 12.630400 m 4.500000 13.130400 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 13.304300 m 4.500000 13.804300 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 13.978300 m 4.500000 14.478300 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 14.652200 m 4.500000 15.152200 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 15.326100 m 4.500000 15.826100 l s +0.050000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 16.000000 m 4.500000 16.500000 l s +0.537255 0.537255 0.749020 srgb +n 18.500000 8.500000 m 18.500000 9.000000 l 19.000000 9.000000 l 19.000000 8.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 18.500000 8.500000 m 18.500000 9.000000 l 19.000000 9.000000 l 19.000000 8.500000 l cp s +0.537255 0.537255 0.749020 srgb +n 18.500000 12.500000 m 18.500000 13.000000 l 19.000000 13.000000 l 19.000000 12.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 18.500000 12.500000 m 18.500000 13.000000 l 19.000000 13.000000 l 19.000000 12.500000 l cp s +/Courier-Bold-latin1 ff 0.500000 scf sf +(script) 18.750000 8.000000 m gs 1 -1 sc sh gr +0.100000 slw +[0.200000] 0 sd +[0.100000] 0 sd +0 slc +n 19.750000 8.500000 m 19.750000 9.000000 l s +/Helvetica-latin1 ff 0.650000 scf sf +(User) dup sw 2 div 1.750000 ex sub 0.625000 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.600000 scf sf +(submit) dup sw 2 div 2.250000 ex sub 4.375000 m gs 1 -1 sc sh gr +(exit status) dup sw 2 div 2.250000 ex sub 4.975000 m gs 1 -1 sc sh gr +0.537255 0.537255 0.733333 srgb +n 10.250000 2.000000 m 10.250000 3.125000 l 10.750000 3.125000 l 10.750000 2.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.250000 2.000000 m 10.250000 3.125000 l 10.750000 3.125000 l 10.750000 2.000000 l cp s +0.537255 0.537255 0.733333 srgb +n 10.250000 5.500000 m 10.250000 6.625000 l 10.750000 6.625000 l 10.750000 5.500000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.250000 5.500000 m 10.250000 6.625000 l 10.750000 6.625000 l 10.750000 5.500000 l cp s +/Helvetica-latin1 ff 0.500000 scf sf +(job) 11.000000 3.250000 m gs 1 -1 sc sh gr +(queued) 11.000000 3.750000 m gs 1 -1 sc sh gr +0.100000 slw +[0.200000] 0 sd +[0.100000] 0 sd +0 slj +0 slc +n 10.500000 3.125000 m 10.500000 4.000000 l 11.000000 4.000000 l 10.000000 4.625000 l 10.500000 4.625000 l 10.500000 5.500000 l s +/Helvetica-Bold-latin1 ff 0.500000 scf sf +(srun batch) dup sw 2 div 4.250000 ex sub 1.875000 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.500000 scf sf +(prolog) 23.850000 9.883330 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.500000 scf sf +(epilog) 23.750000 15.125000 m gs 1 -1 sc sh gr +0.080000 slw +[0.100000] 0 sd +[0.200000] 0 sd +0 slc +n 22.750000 15.000000 m 23.750000 15.000000 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 23.350000 15.200000 m 23.750000 15.000000 l 23.350000 14.800000 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 23.350000 15.200000 m 23.750000 15.000000 l 23.350000 14.800000 l cp s +0.080000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 22.750000 9.812500 m 23.622400 9.799450 l s +0 slj +1.000000 1.000000 1.000000 srgb +n 23.225436 10.005410 m 23.622400 9.799450 l 23.219453 9.605455 l f +0.080000 slw +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 23.225436 10.005410 m 23.622400 9.799450 l 23.219453 9.605455 l cp s +showpage diff --git a/executable_names/doc/figures/rms.dat b/executable_names/doc/figures/rms.dat new file mode 100644 index 0000000000000000000000000000000000000000..e8b1a062322e2bb9f57a51c36a3ba9f0283919a6 --- /dev/null +++ b/executable_names/doc/figures/rms.dat @@ -0,0 +1,12 @@ +# RMS, times for /bin/hostname 2 tasks per node +1 0.077 +2 0.082 +3 0.091 +4 0.116 +5 0.17 +6 0.294 +7 0.304 +8 0.548 +9 1.34 +10 2.84 +11 4.619 diff --git a/executable_names/doc/figures/slurm-arch.dia b/executable_names/doc/figures/slurm-arch.dia new file mode 100644 index 0000000000000000000000000000000000000000..9edf9558efcee3988822b8daac5fed41da4b7033 --- /dev/null +++ b/executable_names/doc/figures/slurm-arch.dia @@ -0,0 +1,8 @@ + +#Letter##Partition Manager##Node Manager##slurmctld##srun##User:##slurmd##Machine +Status##Job +Control##Remote +Execution##Globus and/or +Metascheduler +(optional)##Stream Copy##Job Manager##Job +Status# diff --git a/executable_names/doc/figures/slurm-arch.eps b/executable_names/doc/figures/slurm-arch.eps new file mode 100644 index 0000000000000000000000000000000000000000..21644d7b7e6a7fbad93b3a59fb6446f4ce20ff3f --- /dev/null +++ b/executable_names/doc/figures/slurm-arch.eps @@ -0,0 +1,652 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ../figures/slurm-arch.dia +%%Creator: Dia v0.88.1 +%%CreationDate: Thu Apr 3 14:26:16 2003 +%%For: grondo +%%Magnification: 1.0000 +%%Orientation: Portrait +%%BoundingBox: 0 0 595 412 +%%Pages: 1 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/Times-Roman-latin1 + /Times-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Italic-latin1 + /Times-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-Bold-latin1 + /Times-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Times-BoldItalic-latin1 + /Times-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Book-latin1 + /AvantGarde-Book findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-BookOblique-latin1 + /AvantGarde-BookOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-Demi-latin1 + /AvantGarde-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/AvantGarde-DemiOblique-latin1 + /AvantGarde-DemiOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Light-latin1 + /Bookman-Light findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-LightItalic-latin1 + /Bookman-LightItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-Demi-latin1 + /Bookman-Demi findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Bookman-DemiItalic-latin1 + /Bookman-DemiItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-latin1 + /Courier findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Oblique-latin1 + /Courier-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-Bold-latin1 + /Courier-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Courier-BoldOblique-latin1 + /Courier-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-latin1 + /Helvetica findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Oblique-latin1 + /Helvetica-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Bold-latin1 + /Helvetica-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-BoldOblique-latin1 + /Helvetica-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-latin1 + /Helvetica-Narrow findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Oblique-latin1 + /Helvetica-Narrow-Oblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-Bold-latin1 + /Helvetica-Narrow-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Helvetica-Narrow-BoldOblique-latin1 + /Helvetica-Narrow-BoldOblique findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Roman-latin1 + /NewCenturySchoolbook-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Italic-latin1 + /NewCenturySchoolbook-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-Bold-latin1 + /NewCenturySchoolbook-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/NewCenturySchoolbook-BoldItalic-latin1 + /NewCenturySchoolbook-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Roman-latin1 + /Palatino-Roman findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Italic-latin1 + /Palatino-Italic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-Bold-latin1 + /Palatino-Bold findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Palatino-BoldItalic-latin1 + /Palatino-BoldItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/Symbol-latin1 + /Symbol findfont +definefont pop +/ZapfChancery-MediumItalic-latin1 + /ZapfChancery-MediumItalic findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/ZapfDingbats-latin1 + /ZapfDingbats findfont + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding isolatin1encoding def + currentdict end +definefont pop +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +28.346000 -28.346000 scale +1.559000 -16.000000 translate +%%EndProlog + + +0.447059 0.447059 0.686275 srgb +n -1.350000 6.000000 m -1.350000 10.000000 l 14.984400 10.000000 l 14.984400 6.000000 l f +0.000000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n -1.350000 6.000000 m -1.350000 10.000000 l 14.984400 10.000000 l 14.984400 6.000000 l cp s +1.000000 1.000000 1.000000 srgb +n 4.900000 7.200000 m 4.900000 9.200000 l 9.058000 9.200000 l 9.058000 7.200000 l f +n 4.900000 7.700000 m 4.900000 7.700000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 9.058000 7.700000 m 9.058000 7.700000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 4.400000 7.700000 m 4.400000 8.700000 l 9.558000 8.700000 l 9.558000 7.700000 l f +n 4.900000 8.700000 m 4.900000 8.700000 0.500000 0.500000 90.000000 180.000000 ellipse f +n 9.058000 8.700000 m 9.058000 8.700000 0.500000 0.500000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 4.900000 7.200000 m 9.058000 7.200000 l s +n 4.900000 9.200000 m 9.058000 9.200000 l s +n 4.900000 7.700000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 9.058000 7.700000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 4.400000 7.700000 m 4.400000 8.700000 l s +n 9.558000 7.700000 m 9.558000 8.700000 l s +n 4.900000 8.700000 0.500000 0.500000 90.000000 180.000000 ellipse s +n 9.058000 8.700000 0.500000 0.500000 0.000000 90.000000 ellipse s +/Helvetica-latin1 ff 0.500000 scf sf +(Partition Manager) dup sw 2 div 6.979000 ex sub 8.433065 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n -0.218000 7.200000 m -0.218000 9.232450 l 3.268000 9.232450 l 3.268000 7.200000 l f +n -0.218000 7.700000 m -0.218000 7.700000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 3.268000 7.700000 m 3.268000 7.700000 0.500000 0.500000 270.000000 360.000000 ellipse f +n -0.718000 7.700000 m -0.718000 8.732450 l 3.768000 8.732450 l 3.768000 7.700000 l f +n -0.218000 8.732450 m -0.218000 8.732450 0.500000 0.500000 90.000000 180.000000 ellipse f +n 3.268000 8.732450 m 3.268000 8.732450 0.500000 0.500000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n -0.218000 7.200000 m 3.268000 7.200000 l s +n -0.218000 9.232450 m 3.268000 9.232450 l s +n -0.218000 7.700000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 3.268000 7.700000 0.500000 0.500000 270.000000 360.000000 ellipse s +n -0.718000 7.700000 m -0.718000 8.732450 l s +n 3.768000 7.700000 m 3.768000 8.732450 l s +n -0.218000 8.732450 0.500000 0.500000 90.000000 180.000000 ellipse s +n 3.268000 8.732450 0.500000 0.500000 0.000000 90.000000 ellipse s +/Helvetica-latin1 ff 0.500000 scf sf +(Node Manager) dup sw 2 div 1.525000 ex sub 8.449290 m gs 1 -1 sc sh gr +/Courier-Bold-latin1 ff 0.600000 scf sf +(slurmctld) dup sw 2 div 0.500000 ex sub 6.700000 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 3.650000 8.216220 m 4.400000 8.200000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.003922 0.003922 0.003922 srgb +n 17.375000 3.500000 m 16.787500 2.750000 l 16.500000 2.987500 l 17.262500 3.962500 l 16.850000 5.425000 l 17.312500 5.425000 l 17.562500 4.475000 l 17.800000 5.425000 l 18.225000 5.425000 l 17.900000 4.175000 l 18.537500 4.550000 l 18.712500 4.225000 l 17.837500 3.675000 l 17.800000 3.487500 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 17.600000 3.234686 0.338980 0.338980 121.081372 58.918628 ellipse s +/Courier-Bold-latin1 ff 0.600000 scf sf +0.000000 0.000000 0.000000 srgb +(srun) dup sw 2 div 18.416900 ex sub 6.153730 m gs 1 -1 sc sh gr +/Helvetica-latin1 ff 0.600000 scf sf +(User:) dup sw 2 div 16.774300 ex sub 6.186360 m gs 1 -1 sc sh gr +0.647059 0.247059 0.247059 srgb +n -1.350000 12.125000 m -1.350000 16.000000 l 17.766700 16.000000 l 17.766700 12.125000 l f +0.000000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n -1.350000 12.125000 m -1.350000 16.000000 l 17.766700 16.000000 l 17.766700 12.125000 l cp s +/Courier-Bold-latin1 ff 0.600000 scf sf +(slurmd) dup sw 2 div -0.125000 ex sub 15.750000 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n -0.586750 12.850000 m -0.586750 14.800000 l 1.750000 14.800000 l 1.750000 12.850000 l f +n -0.586750 13.250000 m -0.586750 13.250000 0.400000 0.400000 180.000000 270.000000 ellipse f +n 1.750000 13.250000 m 1.750000 13.250000 0.400000 0.400000 270.000000 360.000000 ellipse f +n -0.986750 13.250000 m -0.986750 14.400000 l 2.150000 14.400000 l 2.150000 13.250000 l f +n -0.586750 14.400000 m -0.586750 14.400000 0.400000 0.400000 90.000000 180.000000 ellipse f +n 1.750000 14.400000 m 1.750000 14.400000 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n -0.586750 12.850000 m 1.750000 12.850000 l s +n -0.586750 14.800000 m 1.750000 14.800000 l s +n -0.586750 13.250000 0.400000 0.400000 180.000000 270.000000 ellipse s +n 1.750000 13.250000 0.400000 0.400000 270.000000 360.000000 ellipse s +n -0.986750 13.250000 m -0.986750 14.400000 l s +n 2.150000 13.250000 m 2.150000 14.400000 l s +n -0.586750 14.400000 0.400000 0.400000 90.000000 180.000000 ellipse s +n 1.750000 14.400000 0.400000 0.400000 0.000000 90.000000 ellipse s +/Helvetica-latin1 ff 0.500000 scf sf +(Machine ) dup sw 2 div 0.581625 ex sub 13.808065 m gs 1 -1 sc sh gr +(Status) dup sw 2 div 0.581625 ex sub 14.308065 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n 6.500000 12.900000 m 6.500000 14.800000 l 8.750000 14.800000 l 8.750000 12.900000 l f +n 6.500000 13.300000 m 6.500000 13.300000 0.400000 0.400000 180.000000 270.000000 ellipse f +n 8.750000 13.300000 m 8.750000 13.300000 0.400000 0.400000 270.000000 360.000000 ellipse f +n 6.100000 13.300000 m 6.100000 14.400000 l 9.150000 14.400000 l 9.150000 13.300000 l f +n 6.500000 14.400000 m 6.500000 14.400000 0.400000 0.400000 90.000000 180.000000 ellipse f +n 8.750000 14.400000 m 8.750000 14.400000 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 6.500000 12.900000 m 8.750000 12.900000 l s +n 6.500000 14.800000 m 8.750000 14.800000 l s +n 6.500000 13.300000 0.400000 0.400000 180.000000 270.000000 ellipse s +n 8.750000 13.300000 0.400000 0.400000 270.000000 360.000000 ellipse s +n 6.100000 13.300000 m 6.100000 14.400000 l s +n 9.150000 13.300000 m 9.150000 14.400000 l s +n 6.500000 14.400000 0.400000 0.400000 90.000000 180.000000 ellipse s +n 8.750000 14.400000 0.400000 0.400000 0.000000 90.000000 ellipse s +/Helvetica-latin1 ff 0.500000 scf sf +(Job) dup sw 2 div 7.625000 ex sub 13.833065 m gs 1 -1 sc sh gr +(Control) dup sw 2 div 7.625000 ex sub 14.333065 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n 10.000000 12.900000 m 10.000000 14.775000 l 12.515250 14.775000 l 12.515250 12.900000 l f +n 10.000000 13.300000 m 10.000000 13.300000 0.400000 0.400000 180.000000 270.000000 ellipse f +n 12.515250 13.300000 m 12.515250 13.300000 0.400000 0.400000 270.000000 360.000000 ellipse f +n 9.600000 13.300000 m 9.600000 14.375000 l 12.915250 14.375000 l 12.915250 13.300000 l f +n 10.000000 14.375000 m 10.000000 14.375000 0.400000 0.400000 90.000000 180.000000 ellipse f +n 12.515250 14.375000 m 12.515250 14.375000 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.000000 12.900000 m 12.515250 12.900000 l s +n 10.000000 14.775000 m 12.515250 14.775000 l s +n 10.000000 13.300000 0.400000 0.400000 180.000000 270.000000 ellipse s +n 12.515250 13.300000 0.400000 0.400000 270.000000 360.000000 ellipse s +n 9.600000 13.300000 m 9.600000 14.375000 l s +n 12.915250 13.300000 m 12.915250 14.375000 l s +n 10.000000 14.375000 0.400000 0.400000 90.000000 180.000000 ellipse s +n 12.515250 14.375000 0.400000 0.400000 0.000000 90.000000 ellipse s +/Helvetica-latin1 ff 0.500000 scf sf +(Remote) dup sw 2 div 11.257625 ex sub 13.820565 m gs 1 -1 sc sh gr +(Execution) dup sw 2 div 11.257625 ex sub 14.320565 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.700000 13.850000 m 6.100000 13.850000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 9.150000 13.850000 m 9.600000 13.837500 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 4.150000 12.900000 m 4.150000 10.968500 l 11.400000 10.968500 l 11.400000 12.900000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 7.600000 11.000000 m 7.625000 12.900000 l s +0.466667 0.686275 0.466667 srgb +n 0.204380 1.500000 m 0.204380 4.500000 l 5.849780 4.500000 l 5.849780 1.500000 l f +0.000000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.204380 1.500000 m 0.204380 4.500000 l 5.849780 4.500000 l 5.849780 1.500000 l cp s +/Helvetica-latin1 ff 0.600000 scf sf +(Globus and/or) dup sw 2 div 3.027080 ex sub 2.659677 m gs 1 -1 sc sh gr +(Metascheduler) dup sw 2 div 3.027080 ex sub 3.259677 m gs 1 -1 sc sh gr +(\(optional\)) dup sw 2 div 3.027080 ex sub 3.859677 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.985400 3.007280 m 13.350000 3.000000 l 13.350000 7.200000 l s +0.100000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slj +0 slc +n 5.849780 3.000000 m 11.400000 3.000000 l 11.419100 7.200000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.400000 3.000000 m 15.400000 11.000000 l 12.100000 11.000000 l 12.086400 12.900000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 11.400000 9.200000 m 11.400000 11.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 9.558000 8.200000 m 10.400000 8.205050 l s +1.000000 1.000000 1.000000 srgb +n 13.900000 12.900000 m 13.900000 14.775000 l 16.971250 14.775000 l 16.971250 12.900000 l f +n 13.900000 13.400000 m 13.900000 13.400000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 16.971250 13.400000 m 16.971250 13.400000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 13.400000 13.400000 m 13.400000 14.275000 l 17.471250 14.275000 l 17.471250 13.400000 l f +n 13.900000 14.275000 m 13.900000 14.275000 0.500000 0.500000 90.000000 180.000000 ellipse f +n 16.971250 14.275000 m 16.971250 14.275000 0.500000 0.500000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 13.900000 12.900000 m 16.971250 12.900000 l s +n 13.900000 14.775000 m 16.971250 14.775000 l s +n 13.900000 13.400000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 16.971250 13.400000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 13.400000 13.400000 m 13.400000 14.275000 l s +n 17.471250 13.400000 m 17.471250 14.275000 l s +n 13.900000 14.275000 0.500000 0.500000 90.000000 180.000000 ellipse s +n 16.971250 14.275000 0.500000 0.500000 0.000000 90.000000 ellipse s +/Helvetica-latin1 ff 0.500000 scf sf +(Stream Copy) dup sw 2 div 15.435625 ex sub 14.070565 m gs 1 -1 sc sh gr +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 15.400000 10.600000 m 15.400000 12.900000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 12.915300 13.837500 m 13.400000 13.837500 l s +0.100000 slw +[0.200000] 0 sd +[0.200000] 0 sd +0 slc +n 6.979000 7.200000 m 6.900000 3.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 0.563434 9.250000 m 0.581625 12.850000 l s +1.000000 1.000000 1.000000 srgb +n 10.900000 7.200000 m 10.900000 9.210110 l 13.976500 9.210110 l 13.976500 7.200000 l f +n 10.900000 7.700000 m 10.900000 7.700000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 13.976500 7.700000 m 13.976500 7.700000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 10.400000 7.700000 m 10.400000 8.710110 l 14.476500 8.710110 l 14.476500 7.700000 l f +n 10.900000 8.710110 m 10.900000 8.710110 0.500000 0.500000 90.000000 180.000000 ellipse f +n 13.976500 8.710110 m 13.976500 8.710110 0.500000 0.500000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.900000 7.200000 m 13.976500 7.200000 l s +n 10.900000 9.210110 m 13.976500 9.210110 l s +n 10.900000 7.700000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 13.976500 7.700000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 10.400000 7.700000 m 10.400000 8.710110 l s +n 14.476500 7.700000 m 14.476500 8.710110 l s +n 10.900000 8.710110 0.500000 0.500000 90.000000 180.000000 ellipse s +n 13.976500 8.710110 0.500000 0.500000 0.000000 90.000000 ellipse s +/Helvetica-latin1 ff 0.500000 scf sf +(Job Manager) dup sw 2 div 12.438250 ex sub 8.438120 m gs 1 -1 sc sh gr +1.000000 1.000000 1.000000 srgb +n 3.000000 12.900000 m 3.000000 14.800000 l 5.300000 14.800000 l 5.300000 12.900000 l f +n 3.000000 13.300000 m 3.000000 13.300000 0.400000 0.400000 180.000000 270.000000 ellipse f +n 5.300000 13.300000 m 5.300000 13.300000 0.400000 0.400000 270.000000 360.000000 ellipse f +n 2.600000 13.300000 m 2.600000 14.400000 l 5.700000 14.400000 l 5.700000 13.300000 l f +n 3.000000 14.400000 m 3.000000 14.400000 0.400000 0.400000 90.000000 180.000000 ellipse f +n 5.300000 14.400000 m 5.300000 14.400000 0.400000 0.400000 0.000000 90.000000 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 3.000000 12.900000 m 5.300000 12.900000 l s +n 3.000000 14.800000 m 5.300000 14.800000 l s +n 3.000000 13.300000 0.400000 0.400000 180.000000 270.000000 ellipse s +n 5.300000 13.300000 0.400000 0.400000 270.000000 360.000000 ellipse s +n 2.600000 13.300000 m 2.600000 14.400000 l s +n 5.700000 13.300000 m 5.700000 14.400000 l s +n 3.000000 14.400000 0.400000 0.400000 90.000000 180.000000 ellipse s +n 5.300000 14.400000 0.400000 0.400000 0.000000 90.000000 ellipse s +/Helvetica-latin1 ff 0.500000 scf sf +(Job ) dup sw 2 div 4.150000 ex sub 13.833065 m gs 1 -1 sc sh gr +(Status) dup sw 2 div 4.150000 ex sub 14.333065 m gs 1 -1 sc sh gr +showpage diff --git a/executable_names/doc/figures/slurm.dat b/executable_names/doc/figures/slurm.dat new file mode 100644 index 0000000000000000000000000000000000000000..276fbb85ebeb19768a78f334b7e560c92b3369c2 --- /dev/null +++ b/executable_names/doc/figures/slurm.dat @@ -0,0 +1,12 @@ +# SLURM, times for /bin/hostname 2 tasks per node +1 0.049 +2 0.051 +3 0.052 +4 0.061 +5 0.074 +6 0.091 +7 0.166 +8 0.550 +9 1.020 +10 2.200 +11 3.734 diff --git a/executable_names/doc/figures/times.eps b/executable_names/doc/figures/times.eps new file mode 100644 index 0000000000000000000000000000000000000000..4db99fef5baade8ae6bf142dc69e25d2ad2121e4 --- /dev/null +++ b/executable_names/doc/figures/times.eps @@ -0,0 +1,485 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: figures/times.eps +%%Creator: gnuplot 3.7 patchlevel 1 +%%CreationDate: Wed Sep 10 13:10:35 2003 +%%DocumentFonts: (atend) +%%BoundingBox: 50 50 391 289 +%%Orientation: Portrait +%%EndComments +/gnudict 256 dict def +gnudict begin +/Color false def +/Solid false def +/gnulinewidth 5.000 def +/userlinewidth gnulinewidth def +/vshift -46 def +/dl {10 mul} def +/hpt_ 31.5 def +/vpt_ 31.5 def +/hpt hpt_ def +/vpt vpt_ def +/M {moveto} bind def +/L {lineto} bind def +/R {rmoveto} bind def +/V {rlineto} bind def +/vpt2 vpt 2 mul def +/hpt2 hpt 2 mul def +/Lshow { currentpoint stroke M + 0 vshift R show } def +/Rshow { currentpoint stroke M + dup stringwidth pop neg vshift R show } def +/Cshow { currentpoint stroke M + dup stringwidth pop -2 div vshift R show } def +/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def + /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def +/DL { Color {setrgbcolor Solid {pop []} if 0 setdash } + {pop pop pop Solid {pop []} if 0 setdash} ifelse } def +/BL { stroke userlinewidth 2 mul setlinewidth } def +/AL { stroke userlinewidth 2 div setlinewidth } def +/UL { dup gnulinewidth mul /userlinewidth exch def + 10 mul /udl exch def } def +/PL { stroke userlinewidth setlinewidth } def +/LTb { BL [] 0 0 0 DL } def +/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def +/LT0 { PL [] 1 0 0 DL } def +/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def +/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def +/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def +/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def +/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def +/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def +/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def +/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def +/Pnt { stroke [] 0 setdash + gsave 1 setlinecap M 0 0 V stroke grestore } def +/Dia { stroke [] 0 setdash 2 copy vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke + Pnt } def +/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V + currentpoint stroke M + hpt neg vpt neg R hpt2 0 V stroke + } def +/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke + Pnt } def +/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M + hpt2 vpt2 neg V currentpoint stroke M + hpt2 neg 0 R hpt2 vpt2 V stroke } def +/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke + Pnt } def +/Star { 2 copy Pls Crs } def +/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath fill } def +/TriUF { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath fill } def +/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke + Pnt } def +/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath fill} def +/DiaF { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath fill } def +/Pent { stroke [] 0 setdash 2 copy gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore Pnt } def +/PentF { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath fill grestore } def +/Circle { stroke [] 0 setdash 2 copy + hpt 0 360 arc stroke Pnt } def +/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def +/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def +/C1 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + vpt 0 360 arc closepath } bind def +/C2 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C3 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C4 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C5 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc + 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc } bind def +/C6 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C7 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C8 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C9 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 450 arc closepath fill + vpt 0 360 arc closepath } bind def +/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill + 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C11 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C12 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C13 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C14 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 360 arc closepath fill + vpt 0 360 arc } bind def +/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } bind def +/Square { dup Rec } bind def +/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def +/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def +/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def +/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def +/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill + exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill + 2 copy vpt Square fill + Bsquare } bind def +/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def +/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill + Bsquare } bind def +/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill + Bsquare } bind def +/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def +/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy vpt Square fill Bsquare } bind def +/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def +/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def +/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def +/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def +/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def +/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def +/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def +/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def +/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def +/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def +/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def +/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def +/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def +/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def +/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def +/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def +/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def +/DiaE { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke } def +/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke } def +/TriUE { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke } def +/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke } def +/PentE { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore } def +/CircE { stroke [] 0 setdash + hpt 0 360 arc stroke } def +/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def +/DiaW { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V Opaque stroke } def +/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V Opaque stroke } def +/TriUW { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V Opaque stroke } def +/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V Opaque stroke } def +/PentW { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + Opaque stroke grestore } def +/CircW { stroke [] 0 setdash + hpt 0 360 arc Opaque stroke } def +/BoxFill { gsave Rec 1 setgray fill grestore } def +end +%%EndProlog +gnudict begin +gsave +50 50 translate +0.050 0.050 scale +0 setgray +newpath +(Helvetica) findfont 140 scalefont setfont +1.000 UL +LTb +1.000 UL +LTa +630 420 M +6139 0 V +1.000 UL +LTb +630 420 M +31 0 V +6108 0 R +-31 0 V +1.000 UL +LTa +630 925 M +6139 0 V +1.000 UL +LTb +630 925 M +63 0 V +6076 0 R +-63 0 V +546 925 M +(0.1) Rshow +1.000 UL +LTa +630 2098 M +6139 0 V +1.000 UL +LTb +630 2098 M +31 0 V +6108 0 R +-31 0 V +1.000 UL +LTa +630 2603 M +6139 0 V +1.000 UL +LTb +630 2603 M +63 0 V +6076 0 R +-63 0 V +-6160 0 R +(1) Rshow +1.000 UL +LTa +630 3777 M +6139 0 V +1.000 UL +LTb +630 3777 M +31 0 V +6108 0 R +-31 0 V +1.000 UL +LTa +630 4282 M +6139 0 V +1.000 UL +LTb +630 4282 M +63 0 V +6076 0 R +-63 0 V +-6160 0 R +(10) Rshow +630 420 M +0 63 V +0 4304 R +0 -63 V +1142 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(1) Cshow +1653 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(2) Cshow +2165 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(4) Cshow +2676 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(8) Cshow +3188 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(16) Cshow +3699 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(32) Cshow +4211 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(64) Cshow +4723 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(128) Cshow +5234 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(256) Cshow +5746 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(512) Cshow +6257 420 M +0 63 V +0 4304 R +0 -63 V +0 -4444 R +(950) Cshow +6769 420 M +0 63 V +0 4304 R +0 -63 V +1.000 UL +LTb +630 420 M +6139 0 V +0 4367 V +-6139 0 V +630 420 L +140 2603 M +currentpoint gsave translate 90 rotate 0 0 M +(Seconds) Cshow +grestore +3699 70 M +(Nodes) Cshow +1.000 UP +1.000 UL +LT0 +6118 4654 M +(SLURM) Rshow +6202 4654 M +399 0 V +1400 420 M +253 14 V +512 15 V +511 116 V +512 141 V +511 150 V +512 439 V +512 873 V +511 450 V +512 560 V +511 386 V +1653 434 Pls +2165 449 Pls +2676 565 Pls +3188 706 Pls +3699 856 Pls +4211 1295 Pls +4723 2168 Pls +5234 2618 Pls +5746 3178 Pls +6257 3564 Pls +6401 4654 Pls +1.000 UP +1.000 UL +LT1 +6118 4514 M +(RMS) Rshow +6202 4514 M +399 0 V +1142 735 M +511 46 V +512 75 V +511 177 V +512 279 V +511 399 V +512 25 V +512 429 V +511 652 V +512 547 V +511 355 V +1142 735 Crs +1653 781 Crs +2165 856 Crs +2676 1033 Crs +3188 1312 Crs +3699 1711 Crs +4211 1736 Crs +4723 2165 Crs +5234 2817 Crs +5746 3364 Crs +6257 3719 Crs +6401 4514 Crs +1.000 UP +1.000 UL +LT2 +6118 4374 M +(LoadLeveler) Rshow +6202 4374 M +399 0 V +1142 4169 M +511 19 V +512 23 V +511 2 V +512 52 V +1142 4169 Star +1653 4188 Star +2165 4211 Star +2676 4213 Star +3188 4265 Star +6401 4374 Star +stroke +grestore +end +showpage +%%Trailer +%%DocumentFonts: Helvetica diff --git a/executable_names/doc/figures/times.gpl b/executable_names/doc/figures/times.gpl new file mode 100644 index 0000000000000000000000000000000000000000..ebd71858e4a71206aa2a9c62e0a88189c4362116 --- /dev/null +++ b/executable_names/doc/figures/times.gpl @@ -0,0 +1,32 @@ +set terminal postscript eps +set output "figures/times.eps" + +set size 0.95,0.95 + +set format y "%g" +set xtics ( "" 0, \ + "1" 1, \ + "2" 2, \ + "4" 3, \ + "8" 4, \ + "16" 5, \ + "32" 6, \ + "64" 7, \ + "128" 8, \ + "256" 9, \ + "512" 10, \ + "950" 11, \ + "" 12) + +set xlabel "Nodes" +set ylabel "Seconds" + +set yrange [0.05:20] +set mytics 2 + +set logscale y +set grid noxtics ytics mytics + +plot [0:12] "figures/slurm.dat" title "SLURM" with linespoint, \ + "figures/rms.dat" title "RMS" with linespoint, \ + "figures/ll.dat" title "LoadLeveler" with linespoint diff --git a/executable_names/doc/figures/times.gpl.png b/executable_names/doc/figures/times.gpl.png new file mode 100644 index 0000000000000000000000000000000000000000..33537dfffb8b789361c571142960a8cb9abd63b4 --- /dev/null +++ b/executable_names/doc/figures/times.gpl.png @@ -0,0 +1,32 @@ +set terminal png +set output "times.png" + +set size 0.95,0.95 + +set format y "%g" +set xtics ( "" 0, \ + "1" 1, \ + "2" 2, \ + "4" 3, \ + "8" 4, \ + "16" 5, \ + "32" 6, \ + "64" 7, \ + "128" 8, \ + "256" 9, \ + "512" 10, \ + "950" 11, \ + "" 12) + +set xlabel "Nodes" +set ylabel "Seconds" + +set yrange [0.05:20] +set mytics 2 + +set logscale y +set grid noxtics ytics mytics + +plot [0:12] "slurm.dat" title "SLURM" with linespoint, \ + "rms.dat" title "RMS" with linespoint, \ + "ll.dat" title "LoadLeveler" with linespoint diff --git a/executable_names/doc/html/Makefile.am b/executable_names/doc/html/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..97446744ee856925309f5f8bcaa229cf7a19cc3e --- /dev/null +++ b/executable_names/doc/html/Makefile.am @@ -0,0 +1,69 @@ + +htmldir = ${prefix}/share/doc/@PACKAGE@-@VERSION@/html + +generated_html = \ + api.html \ + authplugins.html \ + big_sys.html \ + bluegene.html \ + checkpoint_plugins.html \ + cons_res.html \ + dist_plane.html \ + documentation.html \ + download.html \ + faq.html \ + help.html \ + ibm.html \ + jobacctplugins.html \ + jobcompplugins.html \ + mail.html \ + maui.html \ + mc_support.html \ + moab.html \ + mpiplugins.html \ + news.html \ + overview.html \ + platforms.html \ + plugins.html \ + proctrack_plugins.html \ + programmer_guide.html \ + publications.html \ + quickstart_admin.html \ + quickstart.html \ + schedplugins.html \ + selectplugins.html \ + slurm.html \ + switchplugins.html \ + team.html \ + testimonials.html \ + troubleshoot.html + +html_DATA = \ + ${generated_html} \ + arch.gif \ + configurator.html \ + coding_style.pdf \ + entities.gif \ + lll.gif \ + mc_support.gif \ + plane_ex1.gif \ + plane_ex2.gif \ + plane_ex3.gif \ + plane_ex4.gif \ + plane_ex5.gif \ + plane_ex6.gif \ + plane_ex7.gif \ + slurm_banner_filler.jpg \ + slurm_banner_left.jpg \ + slurm_banner_right.jpg \ + slurm_design.pdf \ + slurmstyles.css + +MOSTLYCLEANFILES = ${generated_html} + +EXTRA_DIST = $(html_DATA) + +SUFFIXES = .html + +.shtml.html: + `dirname $<`/shtml2html.py $< diff --git a/executable_names/doc/html/Makefile.in b/executable_names/doc/html/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..7910358848af0dbad319f9cd943592c009bce148 --- /dev/null +++ b/executable_names/doc/html/Makefile.in @@ -0,0 +1,508 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = doc/html +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/configurator.html.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = configurator.html +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(htmldir)" +htmlDATA_INSTALL = $(INSTALL_DATA) +DATA = $(html_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +htmldir = ${prefix}/share/doc/@PACKAGE@-@VERSION@/html +generated_html = \ + api.html \ + authplugins.html \ + big_sys.html \ + bluegene.html \ + checkpoint_plugins.html \ + cons_res.html \ + dist_plane.html \ + documentation.html \ + download.html \ + faq.html \ + help.html \ + ibm.html \ + jobacctplugins.html \ + jobcompplugins.html \ + mail.html \ + maui.html \ + mc_support.html \ + moab.html \ + mpiplugins.html \ + news.html \ + overview.html \ + platforms.html \ + plugins.html \ + proctrack_plugins.html \ + programmer_guide.html \ + publications.html \ + quickstart_admin.html \ + quickstart.html \ + schedplugins.html \ + selectplugins.html \ + slurm.html \ + switchplugins.html \ + team.html \ + testimonials.html \ + troubleshoot.html + +html_DATA = \ + ${generated_html} \ + arch.gif \ + configurator.html \ + coding_style.pdf \ + entities.gif \ + lll.gif \ + mc_support.gif \ + plane_ex1.gif \ + plane_ex2.gif \ + plane_ex3.gif \ + plane_ex4.gif \ + plane_ex5.gif \ + plane_ex6.gif \ + plane_ex7.gif \ + slurm_banner_filler.jpg \ + slurm_banner_left.jpg \ + slurm_banner_right.jpg \ + slurm_design.pdf \ + slurmstyles.css + +MOSTLYCLEANFILES = ${generated_html} +EXTRA_DIST = $(html_DATA) +SUFFIXES = .html +all: all-am + +.SUFFIXES: +.SUFFIXES: .html .shtml +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/html/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/html/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +configurator.html: $(top_builddir)/config.status $(srcdir)/configurator.html.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-htmlDATA: $(html_DATA) + @$(NORMAL_INSTALL) + test -z "$(htmldir)" || $(mkdir_p) "$(DESTDIR)$(htmldir)" + @list='$(html_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(htmlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \ + $(htmlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \ + done + +uninstall-htmlDATA: + @$(NORMAL_UNINSTALL) + @list='$(html_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -f "$(DESTDIR)$(htmldir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(htmldir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-htmlDATA + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-htmlDATA uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-htmlDATA install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-htmlDATA uninstall-info-am + + +.shtml.html: + `dirname $<`/shtml2html.py $< +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/doc/html/api.shtml b/executable_names/doc/html/api.shtml new file mode 100644 index 0000000000000000000000000000000000000000..3742713a0dc56c73d6af3cebf1dba9350c75ef78 --- /dev/null +++ b/executable_names/doc/html/api.shtml @@ -0,0 +1,331 @@ + + +

    SLURM Switch Plugin API

    + +

    Overview

    +

    All of the SLURM commands utilize a collection of Application Progamming +Interfaces (APIs). +User and system applications can directly use these APIs as desired to +achieve tighter integration with SLURM. +For example, SLURM data structures and error codes can be directly +examined rather than executing SLURM commands and parsing their output. +This document describes SLURM APIs. +You should see the man pages for individual APIs to get more details.

    + +

    Get Overall SLURM Information

    +
      + +
    • slurm_api_version—Get SLURM API version number.
    • + +
    • slurm_load_ctl_conf—Load system-wide configuration +specifications. Free with slurm_free_ctl_conf to avoid memory +leak.
    • + +
    • slurm_print_ctl_conf—Print system-wide configuration +specifications.
    • + +
    • slurm_free_ctl_conf—Free storage allocated by +slurm_load_ctl_conf.
    • + +
    + + + +

    Get Job Information

    +
      + +
    • slurm_pid2jobid—For a given process ID on a node +get the corresponding SLURM job ID.
    • + +
    • slurm_get_end_time—For a given SLURM job ID +get the expected termination time.
    • + +
    • slurm_load_jobs—Load job information. +Free with slurm_free_job_info_msg to avoid memory leak.
    • + +
    • slurm_print_job_info_msg—Print information about +all jobs.
    • + +
    • slurm_print_job_info—Print information about +a specific job.
    • + +
    • slurm_get_select_jobinfo—Get select plugin +specific information associated with the job. The information +available is will vary by select plugin type configured.
    • + +
    • slurm_free_job_info_msg—Free storage allocated by +slurm_load_jobs.
    • + +
    + + + +

    Get Job Step Information

    +
      + +
    • slurm_get_job_steps—Load job step information. +Free with slurm_free_job_step_info_response_msg to +avoid memory leak.
    • + +
    • slurm_print_job_step_info_msg—Print information about +all job steps.
    • + +
    • slurm_print_job_step_info—Print information about +a specific job step.
    • + +
    • slurm_free_job_step_info_response_msg—Free storage +allocated by slurm_get_job_steps.
    • + +
    + + + +

    Get Node Information

    +
      + +
    • slurm_load_node—Load node information. +Free with slurm_free_node_info to avoid memory leak.
    • + +
    • slurm_print_node_info_msg—Print information about +all nodes.
    • + +
    • slurm_print_node_table—Print information about +a specific node.
    • + +
    • slurm_free_node_info—Free storage +allocated by slurm_load_node.
    • + +
    + + + +

    Get Partition Information

    +
      + +
    • slurm_load_partitions—Load partition (queue) information. +Free with slurm_free_partition_info to avoid memory leak.
    • + +
    • slurm_print_partition_info_msg—Print information about +all partitions.
    • + +
    • slurm_print_partition_info—Print information about +a specific partition.
    • + +
    • slurm_free_partition_info—Free storage +allocated by slurm_load_partitions.
    • + +
    + + + +

    Error Handling

    +
      + +
    • slurm_get_errno—Return the error code set by the +last SLURM API function executed.
    • + +
    • slurm_perror—Print SLURM error information to +standard output.
    • + +
    • slurm_strerror—Return a string describing a specific +SLURM error code.
    • + +
    + + + +

    Resource Allocation

    +
      + +
    • slurm_init_job_desc_msg—Initialize the data structure +used in resource allocation requests. You can then just set the fields +of particular interest and let the others use default values.
    • + +
    • slurm_job_will_run—Determine if a job would be +immediately initiated if submitted now.
    • + +
    • slurm_allocate_resources—Allocate resources for a job. +Response message must be freed using +slurm_free_resource_allocation_response_msg to avoid a +memory leak.
    • + +
    • slurm_free_resource_allocation_response_msg— +Frees memory allocated by slurm_allocate_resources.
    • + +
    • slurm_allocate_resources_and_run—Allocate resources for a +job and spawn a job step. Response message must be freed using +slurm_free_resource_allocation_and_run_response_msg to avoid a +memory leak.
    • + +
    • slurm_free_resource_allocation_and_run_response_msg— +Frees memory allocated by slurm_allocate_resources_and_run.
    • + +
    • slurm_submit_batch_job—Submit a script for later +execution. Response message must be freed using +slurm_free_submit_response_response_msg to avoid a +memory leak.
    • + +
    • slurm_free_submit_response_response_msg— +Frees memory allocated by slurm_submit_batch_job.
    • + +
    • slurm_confirm_allocation—Test if a resource allocation has +already been made for a given job id. Response message must be freed using +slurm_free_resource_allocation_response_msg to avoid a +memory leak. This can be used to confirm that an +allocation is still active or for error recovery.
    • + +
    + + + +

    Job Step Creation

    +

    SLURM job steps involve numerous interactions with the +slurmd daemon. The job step creation is only the +first step in the process. We don't advise direct user +creation of job steps, but include the information here +for completeness.

    +
      + +
    • slurm_job_step_create—Initiate a job step. +Allocated memory must be freed by +slurm_free_job_step_create_response_msg to avoid a +memory leak.
    • + +
    • slurm_free_job_step_create_response_msg—Free +memory allocated by slurm_job_step_create. + +
    • slurm_step_ctx_create—Create job step context. +Destroy using slurm_step_ctx_destroy.
    • + +
    • slurm_step_ctx_destroy—Destroy a job step context +created by slurm_step_ctx_create.
    • + +
    • slurm_step_ctx_get—Get values from job step context.
    • + +
    • slurm_step_ctx_set—Set values in job step context.
    • + +
    • slurm_jobinfo_ctx_get—Get values from a jobinfo +field as returned by slurm_step_ctx_get.
    • + +
    • slurm_spawn—Spawn tasks and establish communcations.
    • + +
    • slurm_spawn_kill—Signal spawned tasks.
    • + +
    + + + +

    Job and Job Step Signaling and Cancelling

    +
      + +
    • slurm_kill_job—Signal or cancel a job.
    • + +
    • slurm_kill_job_step—Signal or cancel a job step.
    • + +
    + + + +

    Job Completion

    +
      + +
    • slurm_complete_job—Note completion of a job. +Releases resource allocation for the job.
    • + +
    • slurm_complete_job_step—Note completion of a +job step.
    • + +
    + + + +

    Checkpoint

    +
      + +
    • slurm_checkpoint_able—Note that a specific job or +job step is elligible for checkpoint.
    • + +
    • slurm_checkpoint_complete—Note that a requested +checkpoint has completed.
    • + +
    • slurm_checkpoint_create—Request a checkpoint for +a specific job step. Continue execution upon completion of the +checkpoint.
    • + +
    • slurm_checkpoint_vacate—Request a checkpoint for +a specific job step. Terminate execution upon completion of the +checkpoint.
    • + +
    • slurm_checkpoint_disable—Make the identified job step +non-checkpointable.
    • + +
    • slurm_checkpoint_enable—Make the identified job +step checkpointable.
    • + +
    • slurm_checkpoint_error—Get error information for +the last checkpoint operation on a given job step.
    • + +
    • slurm_checkpoint_restart—Request that a previously +checkpointed job resume execution.
    • + +
    + + + +

    Administrative Functions

    +

    Most of these functions can only be exected by user root.

    +
      + +
    • slurm_reconfigure—Update slurm daemons +based upon current slurm.conf configuration file. +Use this after updating the configuration file to +insure that it takes effect.
    • + +
    • slurm_shutdown—Terminate slurm daemons.
    • + +
    • slurm_update_job—Update state +information associated with a given job.
    • + +
    • slurm_update_node—Update state +information associated with a given node. NOTE: Most +of a node's characteristics can not be modified.
    • + +
    • slurm_init_part_desc_msg—Initialize a +partition update descriptor. Used this to initialize +the data structure used in slurm_update_partition.
    • + +
    • slurm_update_partition—Update state +information associated with a given partition.
    • + +
    • slurm_delete_partition—Destroy a partition.
    • + +
    + + + +

    SLURM Host List Support

    +

    SLURM uses a condensed format to express node names. +For example linux[1-3,6] represents linux1, +linux2, linux3, and linux6. These +functions permit you to translate the SLURM expression +into a list of individual node names.

    + +
      + +
    • slurm_hostlist_create—Translate a SLURM +node name expression into a record used for parsing. +Use slurm_hostlist_destroy to free the allocated +storage.
    • + +
    • slurm_hostlist_shift—Get the next node +name.
    • + +
    • slurm_hostlist_destroy—Release storage +allocated by slurm_hostlist_create. + +
    + + +

    Last modified 25 October 2005

    + + diff --git a/executable_names/doc/html/arch.gif b/executable_names/doc/html/arch.gif new file mode 100644 index 0000000000000000000000000000000000000000..f605a1c5cc6ddbd4390fdeff5b500e2217abb0cc Binary files /dev/null and b/executable_names/doc/html/arch.gif differ diff --git a/executable_names/doc/html/authplugins.shtml b/executable_names/doc/html/authplugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..ff5accf674b9e8d83289a4ba4e96517bbace89b6 --- /dev/null +++ b/executable_names/doc/html/authplugins.shtml @@ -0,0 +1,203 @@ + + +

    SLURM Authentication Plugin API

    + +

    Overview

    +

    This document describes SLURM authentication plugins and the API that defines +them. It is intended as a resource to programmers wishing to write their own SLURM +authentication plugins. This is version 0 of the API.

    +

    SLURM authentication plugins are SLURM plugins that implement the SLURM authentication +API described herein. They must conform to the SLURM Plugin API with the following +specifications:

    +

    const char plugin_type[]
    +The major type must be "auth." The minor type can be any recognizable +abbreviation for the type of authentication. We recommend, for example:

    +
      +
    • none—A plugin that implements the API without providing any actual +authentication service. This may be used for testing purposes, but is not suitable for +production use due to lack of effective security.
    • +
    • authd—Brett Chun's Linux authd.
    • +
    • munge—LLNL's munge protocol (recommended plugin for production use).
    • +
    • krb5—Kerberos 5 (not implemented as of 8 June 2004).
    • +
    +

    The plugin_name and plugin_version +symbols required by the SLURM Plugin API require no specialization for authentication. +Note carefully, however, the versioning discussion below.

    +

    The programmer is urged to study src/plugins/auth/none/auth_none.c +for an example implementation of a SLURM authentication plugin.

    + +

    Data Objects

    +

    The implementation must support an opaque class, which it defines, to be used +as an authentication "credential." This class must encapsulate all user-specific +information necessary for the operation of the API specification below. The credential +is referred to in SLURM code by an anonymous pointer (void *).

    +

    The implementation must maintain (though not necessarily directly export) an +enumerated errno to allow SLURM to discover as practically as possible +the reason for any failed API call. The following enumerated integer values (declared +in src/common/slurm_auth.h) must be used when +appropriate.

    +

    SLURM_AUTH_BADARG—an argument to an API function +was invalid or malformed.
    +SLURM_AUTH_MEMORY—a request could not be satisfied because memory for it +could not be allocated.
    +SLURM_AUTH_NOUSER—a credential is improper because it refers to an unknown +user.
    +SLURM_AUTH_INVALID—a credential is improper because the validation of it +has failed. This is specifically distinct from the expiration of a credential.
    +SLURM_AUTH_MISMATCH—a credential could not be properly unpacked because it +is of an incompatible type or version.

    +

    These values must not be used as return values in integer-valued functions +in the API. The proper error return value from integer-valued functions is SLURM_ERROR. +While it is most practical to associate a different errno with each instance of +a credential, this is not necessarily enforced by the API. The implementation +should endeavor to provide useful and pertinent information by whatever means +is practical. In most cases, this means an errno for each credential, since plugins +must be re-entrant. If a plugin maintains a global errno in place of or in addition +to a per-credential errno, it is not required to enforce mutual exclusion on it. +Successful API calls are not required to reset any errno to a known value. However, +the initial value of any errno, prior to any error condition arising, should be +SLURM_SUCCESS.

    +

    Plugins may assign implementation-specific values to errno so long as they +do not conflict with the values assigned above. This is done programmatically +by assigning plugin-specific errno values which are arithmetically greater than +or equal to the symbol SLURM_AUTH_FIRST_LOCAL_ERROR.

    + + +

    API Functions

    +

    The following functions must appear. Functions which are not implemented should +be stubbed.

    +

    void *slurm_auth_alloc (void);

    +

    Description: Allocates from the free store +an anonymous credential object and returns a pointer to it. The pointer should +be valid until passed to slurm_auth_destroy() for +disposal. SLURM will not pass +credentials to the API which have not been allocated by this function.

    +

    Arguments: None.

    +

    Returns: A pointer to a newly allocated credential +if successful. On failure, the plugin should return NULL and set its errno to +an appropriate value to indicate the reason for failure.

    +

    int slurm_auth_destroy (void *cr);

    +

    Description: Deallocates a credential that +was allocated with slurm_auth_alloc() and any +associated storage that has been allocated for it during its use.

    +

    Arguments: cr  +  (input) pointer to the credential that is to be deallocated. Cannot +be NULL.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int slurm_auth_verify (void *cr );

    +

    Description: Verifies that a credential is +in order and correctly identifies the associated user. It also verifies that the +credential has not expired. If verification is successful, the return values of +slurm_auth_get_uid() and slurm_auth_get_gid() +in subsequent calls must correspond to the actual verified system UID and GID +of the user associated with the credential. Verification must fail if the credential +has not previously been activated, even if a credential implementation cannot +exist in an unactivated state. A credential's valid term is defined at activation +and verification must fail if the credential has expired, even if it would otherwise +be valid.

    +

    Arguments: cr +  (input) pointer to the credential which is to be verified. Cannot +be NULL.

    +

    Returns: SLURM_SUCCESS if the credential is +verified to be in order and has not expired. If the credential cannot be verified, +or if the credential has expired, the function should return SLURM_ERROR and set +its errno to an appropriate value to indicate the reason for failure.

    +

    uid_t slurm_auth_get_uid (void *cr);
    +gid_t slurm_auth_get_gid (void *cr);

    +

    Description: Extracts the numerical UID (GID) +of the user corresponding to the given credential. SLURM considers this value +trustworthy only if the credential has been successfully verified using slurm_auth_verify(). +An unverified credential does not immediately give rise to an error condition +in these functions, since this would require a plugin to distinguish between a +verified and an unverified credential, which may be computationally expensive. +A plugin may consider the lack of verification as an error.

    +

    Arguments: cr +   (input) pointer to the credential containing the desired identification. +Cannot be NULL.

    +

    Returns: If successful, the Linux UID (GID) +associated with the credential. In case of error, SLURM_AUTH_NOBODY should be +returned and errno set appropriately to indicate the cause of the failure.

    + +

    int slurm_auth_pack (void *cr, Buf buf);

    +

    Description: Marshals a credential into a buffer +for transmission according to the SLURM packing protocol. All authentication plugins +must first pack the plugin_type and then the plugin_version data before any plugin-specific +data elements are packed. slurm_auth_pack() and slurm_auth_pack() are strictly +reciprocal. The esult of a packing followed by an unpacking must be a functionally +equivalent credential. A credential is deemed appropriate for marshalling at any +time after its allocation and before its destruction.

    +

    Arguments:
    +cr    (input) pointer to the credential +to pack.
    +buf    (input/output) the buffer +into which the credential should be packed.

    +

    Returns: SLURM_SUCCESS if successful. On failure +the plugin should return SLURM_ERROR and set the errno to indicate the reason +for the failure.

    +

    int slurm_auth_unpack (void *cr, Buf buf);

    +

    Description: Unmarshals a credential from a +buffer according to the SLURM packing protocol into a supplied (and presumed empty) +credential object. The unmarshalled credential is not assumed to be activated +or verified. The plugin_type and plugin_version +data should first be unpacked from the buffer and verified for applicability. +The API does not enforce that they must be equivalent, merely compatible. Compatibility +is implementation-dependent.

    +

    Arguments:
    +cr    (output) pointer to the +credential to pack.
    +buf    (input/output) the buffer +from which the credential should be unpacked.

    +

    Returns: SLURM_SUCCESS if the credential was +successfully unpacked. In case of failure, the function should return SLURM_ERROR +and set errno appropriately to indicate the cause of the failure. If the function +fails, no assumptions are made about the state of the credential except its suitability +for destruction via slurm_auth_destroy().

    +

    int slurm_auth_print (void *cr, FILE *fp);

    +

    Description: Writes a human-readable representation +of the credential to a standard I/O stream. There are no strict API constraints +on the behavior of this function, however it is recommended that the information +be as complete and as concise as possible. For example, lengthy digital "signatures" +need not be printed bitwise, but may be represented by their checksum. The intent +is to provide a depiction of the credential for debugging purposes.

    +

    Arguments: None.

    +

    Returns: SLURM_SUCCESS if successful. On failure +the plugin should return SLURM_ERROR and set the errno appropriately to indicate +the cause of failure.

    + +

    int slurm_auth_errno (void *cr);

    +

    Description: Returns the current value of errno. +Whether the value is associated with the given credential or with the plugin as +a whole is implementation-dependent. Because this function can be used to discover +the reason why a credential allocation has failed, the argument is advisory.

    +

    Arguments: cr     +(input) pointer to the credential, the status of whose most recently executed +API function is to be returned. This value may be NULL, indicating that the most +recent errno value applicable to the plugin as a whole is to be returned.

    +

    Returns: The current value of errno or SLURM_SUCCESS +if there is no error to report.

    +

    const char *slurm_auth_errstr (int errno);

    +

    Description: Provides a human-readable string +associated with the given errno. The plugin need only supply error strings for +the errno values it defines and not for errno values listed above that are required +by the API.

    +

    Arguments: errno    +(input) the plugin-specific errno for which a corresponding error message is desired.

    +

    Returns: A pointer to a static error message. +This function must always return a pointer to a string, even if the string is +empty or ambiguous such as "unknown error."

    + +

    Versioning

    +

    This document describes version 0 of the SLURM Authentication API. Future +releases of SLURM may revise this API. An authentication plugin conveys its ability +to implement a particular API version using the mechanism outlined for SLURM plugins. +In addition, the credential is transmitted along with the version number of the +plugin that transmitted it. It is at the discretion of the plugin author whether +to maintain data format compatibility across different versions of the plugin.

    + + +

    Last modified 8 June 2004

    + + diff --git a/executable_names/doc/html/big_sys.shtml b/executable_names/doc/html/big_sys.shtml new file mode 100644 index 0000000000000000000000000000000000000000..0aa2e6e0673303b36924a86a472294305cb0dad4 --- /dev/null +++ b/executable_names/doc/html/big_sys.shtml @@ -0,0 +1,69 @@ + + +

    Large Cluster Administration Guide

    + +

    This document contains SLURM administrator information specifically +for clusters containing 1,024 nodes or more. +Virtually all SLURM components have been validated (through emulation) +for clusters containing up to 16,384 compute nodes. +Getting good performance at that scale does require some tuning and +this document should help you off to a good start. +A working knowledge of SLURM should be considered a prerequisite +for this material.

    + +

    Node Selection Plugin (SelectType)

    + +

    While allocating individual processors within a node is great +for smaller clusters, the overhead of keeping track of the individual +processors and memory within each node adds significant overhead. +For best scalability, the consumable resource plugin (select/cons_res) +is best avoided.

    + +

    Job Accounting Plugin (JobAcctType)

    + +

    Job accounting relies upon the slurmstepd daemon on each compute +node periodically sampling data. +This data collection will take compute cycles away from the application +inducing what is known as system noise. +For large parallel applications, this system noise can detract for +application scalability. +For optimal application performance, disabling job accounting +is best (jobacct/none). +Consider use of job completion records (JobCompType) for accounting +purposes as this entails far less overhead. +If job accounting is required, configure the sampling interval +to a relatively large size (e.g. JobAcctFrequency=300). +Some experimentation may also be required to deal with collisions +on data transmission.

    + +

    Node Configuration

    + +

    While SLURM can track the amount of memory and disk space actually found +on each compute node and use it for scheduling purposes, this entails +extra overhead. +Optimize performance by specifying the expected configuration using +the available parameters (RealMemory, Procs, and +TmpDisk). +If the node is found to contain less resources than configured, +it will be marked DOWN and not used. +Also set the FastSchedule parameter. +While SLURM can easily handle a heterogeneous cluster, configuring +the nodes using the minimal number of lines in slurm.conf +will both make for easier administration and better performance.

    + +

    Timers

    + +

    The configuration parameter SlurmdTimeout determines the interval +at which slurmctld routinely communicates with slurmd. +Communications occur at half the SlurmdTimeout value. +The purpose of this is to determine when a compute node fails +and thus should not be allocated work. +Longer intervals decrease system noise on compute nodes (we do +synchronize these requests across the cluster, but there will +be some impact upon applications). +For really large clusters, SlurmdTimeoutl values of +120 seconds or more are reasonable.

    + +

    Last modified 28 January 2006

    + + diff --git a/executable_names/doc/html/bluegene.shtml b/executable_names/doc/html/bluegene.shtml new file mode 100644 index 0000000000000000000000000000000000000000..475667eea26a0ade55cafd119a1eee23bc8d2f4f --- /dev/null +++ b/executable_names/doc/html/bluegene.shtml @@ -0,0 +1,558 @@ + + +

    BlueGene User and Administrator Guide

    + +

    Overview

    + +

    This document describes the unique features of SLURM on the +IBM BlueGene systems. +You should be familiar with the SLURM's mode of operation on Linux clusters +before studying the relatively few differences in BlueGene operation +described in this document.

    + +

    BlueGene systems have several unique features making for a few +differences in how SLURM operates there. +The BlueGene system consists of one or more base partitions or +midplanes connected in a three-dimensional torus. +Each base partition consists of 512 c-nodes each containing two processors; +one designed primarily for computations and the other primarily for managing communications. +The c-nodes can execute only one process and thus are unable to execute both +the user's jobs and SLURM's slurmd daemon. +Thus the slurmd daemon executes on one of the BlueGene Front End Nodes. +This single slurmd daemon provides (almost) all of the normal SLURM services +for every base partition on the system.

    + +

    Internally SLURM treats each base partition as one node with +1024 processors, which keeps the number of entities being managed reasonable. +Since the current BlueGene software can sub-allocate a base partition +into blocks of 32 and/or 128 c-nodes, more than one user job can execute +on each base partition (subject to system administrator configuration). +To effectively utilize this environment, SLURM tools present the user with +the view that each c-nodes is a separate node, so allocation requests +and status information use c-node counts (this is a new feature in +SLURM version 1.1). +Since the c-node count can be very large, the suffix "k" can be used +to represent multiples of 1024 (e.g. "2k" is equivalent to "2048").

    + +

    User Tools

    + +

    The normal set of SLURM user tools: srun, scancel, sinfo, squeue and scontrol +provide all of the expected services except support for job steps. +SLURM performs resource allocation for the job, but initiation of tasks is performed +using the mpirun command. SLURM has no concept of a job step on BlueGene. +Three new srun options are available: +--geometry (specify job size in each dimension), +--no-rotate (disable rotation of geometry), +--conn-type (specify interconnect type between base partitions, mesh or torus). +The --nodes option with a minimum and (optionally) maximum node count continues +to be available. +Note that this is a c-node count.

    + +

    To reiterate: srun is used to submit a job script, but mpirun is used to launch the parallel tasks. +It is highly recommended that the srun --batch option be used to submit a script. +Note that a SLURM batch job's default stdout and stderr file names are generated +using the SLURM job ID. +When the SLURM control daemon is restarted, SLURM job ID values can be repeated, +therefore it is recommended that batch jobs explicitly specify unique names for +stdout and stderr files using the srun options --output and --error +respectively. +While the srun --allocate option may be used to create an interactive SLURM job, +it will be the responsibility of the user to insure that the bgblock +is ready for use before initiating any mpirun commands. +SLURM will assume this responsibility for batch jobs. +The script that you submit to SLURM can contain multiple invocations of mpirun as +well as any desired commands for pre- and post-processing. +The mpirun command will get its bgblock information from the +MPIRUN_PARTITION as set by SLURM. A sample script is shown below. +

    +#!/bin/bash
    +# pre-processing
    +date
    +# processing
    +mpirun -exec /home/user/prog -cwd /home/user -args 123
    +mpirun -exec /home/user/prog -cwd /home/user -args 124
    +# post-processing
    +date 
    +

    + + +

    The naming of base partitions includes a three-digit suffix representing the its +coordinates in the X, Y and Z dimensions with a zero origin. +For example, "bg012" represents the base partition whose coordinate is at X=0, Y=1 and Z=2. In a system +configured with small blocks (any block less than a full base partition) there will be divisions +into the base partition notation. For example, bg012.0 represents the first quarter of a midplane in +BlueGene/L this would be 128 c-node block, and bg012.1.0 would represent the first nodecard in the second +quarter of the base partition, or a 32 c-node block. +Since jobs must allocate consecutive base partitions in all three dimensions, we have developed +an abbreviated format for describing the base partitions in one of these three-dimensional blocks. +The base partition has a prefix determined from the system which is followed by the end-points +of the block enclosed in square-brackets. +For example, "bg[620x731]" is used to represent the eight base partitions enclosed in a block +with endpoints bg620 and bg731 (bg620, bg621, bg630, bg631, bg720, bg721, +bg730 and bg731).

    + +

    One new tool provided is smap. +Smap is aware of system topography and provides a map of what base partitions +are allocated to jobs, partitions, etc. +See the smap man page for details. +A sample of smap output is provided below showing the location of five jobs. +Note the format of the list of base partitions allocated to each job. +Also note that idle (unassigned) base partitions are indicated by a period. +Down and drained base partitions (those not available for use) are +indicated by a number sign (bg703 in the display below). +The legend is for illustrative purposes only. +The origin (zero in every dimension) is shown at the rear left corner of the bottom plane. +Each set of four consecutive lines represents a plane in the Y dimension. +Values in the X dimension increase to the right. +Values in the Z dimension increase down and toward the left.

    + +
    +   a a a a b b d d    ID JOBID PARTITION BG_BLOCK USER   NAME ST TIME NODES BP_LIST
    +  a a a a b b d d     a  12345 batch     RMP0     joseph tst1 R  43:12  32k bg[000x333]
    + a a a a b b c c      b  12346 debug     RMP1     chris  sim3 R  12:34   8k bg[420x533]
    +a a a a b b c c       c  12350 debug     RMP2     danny  job3 R   0:12   4k bg[622x733]
    +                      d  12356 debug     RMP3     dan    colu R  18:05   8k bg[600x731]
    +   a a a a b b d d    e  12378 debug     RMP4     joseph asx4 R   0:34   2k bg[612x713]
    +  a a a a b b d d
    + a a a a b b c c
    +a a a a b b c c
    +
    +   a a a a . . d d
    +  a a a a . . d d
    + a a a a . . e e              Y
    +a a a a . . e e               |
    +                              |
    +   a a a a . . d d            0----X
    +  a a a a . . d d            /
    + a a a a . . . .            /
    +a a a a . . . #            Z
    +
    + +

    Note that jobs enter the SLURM state RUNNING as soon as the have been +allocated a bgblock. +If the bgblock is in a READY state, the job will begin execution almost +immediately. +Otherwise the execution of the job will not actually begin until the +bgblock is in a READY state, which can require booting the block and +a delay of minutes to do so. +You can identify the bgblock associated with your job using the command +smap -Dj -c and the state of the bgblock with the command +smap -Db -c. +The time to boot a bgblock is related to its size, but should range from +from a few minutes to about 15 minutes for a bgblock containing 128 +base partitions. +Only after the bgblock is READY will your job's output file be created +and the script execution begin. +If the bgblock boot fails, SLURM will attempt to reboot several times +before draining the associated base partitions and aborting the job.

    + +

    The job will continue to be in a RUNNING state until the bgjob has +completed and the bgblock ownership is changed. +The time for completing a bgjob has frequently been on the order of +five minutes. +In summary, your job may appear in SLURM as RUNNING for 15 minutes +before the script actually begins to 5 minutes after it completes. +These delays are the result of the BlueGene infrastructure issues and are +not due to anything in SLURM.

    + +

    When using smap in default output mode you can scroll through +the different windows using the arrow keys. +The up and down arrow keys scroll +the window containing the grid, and the left and right arrow +keys scroll the window containing the text information.

    + + + +

    System Administration

    + +

    As of IBM's REV 2 driver SLURM must be built in 64-bit mode. +This can be done by specifying CFLAGS=-m64. +CFLAGS must be set for SLURM to compile correctly.

    + +

    Building a BlueGene compatible system is dependent upon the +configure program locating some expected files. +In particular, the configure script searches for libdb2.so in the +directories /home/bgdb2cli/sqllib and /u/bgdb2cli/sqllib. +If your DB2 library file is in a different location, use the configure +option --with-db2-dir=PATH to specify the parent directory. +If you have the same version of the operating system on both the +Service Node (SN) and the Front End Nodes (FEN) then you can configure +and build one set of files on the SN and install them on both the SN and FEN. +Note that all smap functionality will be provided on the FEN +except for the ability to map SLURM node names to and from +row/rack/midplane data, which requires direct use of the Bridge API +calls only available on the SN.

    + +

    If you have different versions of the operating system on the SN and FEN +(as was the case for some early system installations), then you will need +to configure and build two sets of files for installation. +One set will be for the Service Node (SN), which has direct access to the +Bridge APIs. +The second set will be for the Front End Nodes (FEN), whick lack access to the +Bridge APIs and interact with using Remote Procedure Calls to the slurmctld +daemon. +You should see "#define HAVE_BG 1" and "#define HAVE_FRONT_END 1" in the "config.h" +file for both the SN and FEN builds. +You should also see "#define HAVE_BG_FILES 1" in config.h on the SN before +building SLURM.

    + +

    The slurmctld daemon should execute on the system's service node. +If an optional backup daemon is used, it must be in some location where +it is capable of executing Bridge APIs. +One slurmd daemon should be configured to execute on one of the front end nodes. +That one slurmd daemon represents communications channel for every base partition. +You can use the scontrol command to drain individual nodes as desired and +return them to service.

    + +

    The slurm.conf (configuration) file needs to have the value of InactiveLimit +set to zero or not specified (it defaults to a value of zero). +This is because there are no job steps and we don't want to purge jobs prematurely. +The value of SelectType must be set to "select/bluegene" in order to have +node selection performed using a system aware of the system's topography +and interfaces. +The value of SchedulerType should be set to "sched/builtin". +The value of Prolog should be set to the full pathname of a program that +will delay execution until the bgblock identified by the MPIRUN_PARTITION +environment variable is ready for use. It is recommended that you construct a script +that serves this function and calls the supplied program sbin/slurm_prolog. +The value of Epilog should be set to the full pathname of a program that +will wait until the bgblock identified by the MPIRUN_PARTITION environment +variable is no longer usable by this job. It is recommended that you construct a script +that serves this function and calls the supplied program sbin/slurm_epilog. +The prolog and epilog programs are used to insure proper synchronization +between the slurmctld daemon, the user job, and MMCS. +A multitude of other functions may also be placed into the prolog and +epilog as desired (e.g. enabling/disabling user logins, puring file systmes, +etc.). Sample prolog and epilog scripts follow.

    + +
    +#!/bin/bash
    +# Sample BlueGene Prolog script
    +#
    +# Wait for bgblock to be ready for this job's use
    +/usr/sbin/slurm_prolog
    +
    +
    +#!/bin/bash
    +# Sample BlueGene Epilog script
    +#
    +# Cancel job to start the termination process for this job
    +# and release the bgblock
    +/usr/bin/scancel $SLURM_JOBID
    +#
    +# Wait for bgblock to be released from this job's use
    +/usr/sbin/slurm_epilog
    +
    + +

    Since jobs with different geometries or other characteristics do not interfere +with each other's scheduling, backfill scheduling is not presently meaningful. +SLURM's builtin scheduler on BlueGene will sort pending jobs and then attempt +to schedule all of them in priority order. +This essentially functions as if there is a separate queue for each job size. +Note that SLURM does support different partitions with an assortment of +different scheduling parameters. +For example, SLURM can have defined a partition for full system jobs that +is enabled to execute jobs only at certain times; while a default partition +could be configured to execute jobs at other times. +Jobs could still be queued in a partition that is configured in a DOWN +state and scheduled to execute when changed to an UP state. +Base partitions can also be moved between slurm partitions either by changing +the slurm.conf file and restarting the slurmctld daemon or by using +the scontrol reconfig command.

    + +

    SLURM node and partition descriptions should make use of the +naming conventions described above. For example, +"NodeName=bg[000x733] NodeAddr=frontend0 NodeHostname=frontend0 Procs=1024" +is used in slurm.conf to define a BlueGene system with 128 midplanes +in an 8 by 4 by 4 matrix. +The node name prefix of "bg" defined by NodeName can be anything you want, +but needs to be consistent throughout the slurm.conf file. +Note that the values of both NodeAddr and NodeHostname for all +128 base partitions is the name of the front-end node executing +the slurmd daemon. +No computer is actually expected to a hostname of "bg000" and no +attempt will be made to route message traffic to this address.

    + +

    While users are unable to initiate SLURM job steps on BlueGene systems, +this restriction does not apply to user root or SlurmUser. +Be advised that the one slurmd supporting all nodes is unable to manage a +large number of job steps, so this ability should be used only to verify normal +SLURM operation. +If large numbers of job steps are initiated by slurmd, expect the daemon to +fail due to lack of memory or other resources. +It is best to minimize other work on the front-end node executing slurmd +so as to maximize its performance and minimize other risk factors.

    + +

    In addition to the normal slurm.conf file, a new +bluegene.conf configuration file is required with information pertainate +to the sytem. +Put bluegene.conf into the SLURM configuration directory with +slurm.conf. +A sample file is installed in bluegene.conf.example. +System administrators should use the smap tool to build appropriate +configuration file for static partitioning. +Note that smap -Dc can be run without the SLURM daemons +active to establish the initial configuration. +Note that the defined bgblocks may not overlap (except for the +full-system bgblock, which is implicitly created). +See the smap man page for more information.

    + +

    There are 3 different modes which the system administrator can define +BlueGene partitions (or bgblocks) available to execute jobs: static, +overlap, and dynamic. +Jobs must then execute in one of the created bgblocks. +(NOTE: bgblocks are unrelated to SLURM partitions.)

    + +

    The default mode of partitioning is static. +In this mode, the system administrator must explicitly define each +of the bgblocks in the bluegene.conf file. +Each of these bgblocks are explicitly configured with either a +mesh or torus interconnect. +They must also not overlap, except for the implicitly defined full-system +bgblock. +Note that bgblocks are not rebooted between jobs in the mode +except when going to/from full-system jobs. +Eliminating bgblock booting can significantly improve system +utilization (eliminating boot time) and reliability.

    + +

    The second mode is overlap partitioning. +Overlap partitioning is very similar to static partitioning in that +each bgblocks must be explicitly defined in the bluegene.conf +file, but these partitions can overlap each other. +In this mode it is highly recommended that none of the bgblocks +have any passthroughs in the X-dimension associated to them. +Usually this is only an issue on larger BlueGene systems. +It is advisable to use this mode with extreme caution. +Make sure you know what you doing to assure the bgblocks will +boot without dependency on the state of any base partition +not included the bgblock.

    + +

    In the two previous modes you must insure that the base +partitions defined in bluegene.conf are consistent with +those defined in slurm.conf. +Note the bluegene.conf file contains only the numeric +coordinates of base partitions while slurm.conf contains +the name prefix in addition to the numeric coordinates.

    + +

    The final mode is dynamic partitioning. +Dynamic partitioning was developed primarily for smaller BlueGene systems, +but can be used on larger systems. +Dynamic partitioning may introduce fragmentation of resources. +This fragementaiton may be severe since SLURM will run a job anywhere +resources are avaliable with little thought of the future. +As with overlap partitioning, use dynamic partitioning with +caution! +This mode can result in job starvation since smaller jobs will run +if resources are avaliable and prevent larger jobs from running. +Bgblocks need not be assigned in the bluegene.conf file +for this mode.

    + +

    Blocks can be freed or set in an error state with scontrol, +(i.e. "scontrol update BlockName=RMP0 state=error"). +This will end any job on the block and set the state of the block to ERROR +making it so no job will run on the block. To set it back to a usuable +state set the state to free (i.e. +"scontrol update BlockName=RMP0 state=free"). + +

    One of these modes must be defined in the bluegene.conf file +with the option LayoutMode=MODE (where MODE=STATIC, DYNAMIC or OVERLAP).

    + +

    The number of c-nodes in a base partition and in a node card must +be defined. +This is done using the keywords BasePartitionNodeCnt=NODE_COUNT +and NodeCardNodeCnt=NODE_COUNT respectively in the bluegene.conf +file (i.e. BasePartitionNodeCnt=512 and NodeCardNodeCnt=32).

    + +

    Note that the Image and Numpsets values defined in +bluegene.conf are used only when SLURM creates bgblocks. +If previously defined bgblocks are used by SLURM, their configurations +are not altered. +If you change the bgblock layout, then slurmctld and slurmd should +both be cold-started (e.g. /etc/init.d/slurm startclean). +If you which to modify the Image and Numpsets values +for existing bgblocks, either modify them manually or destroy the bgblocks +and let SLURM recreate them. +Note that in addition to the bgblocks defined in bluegene.conf, an +additional bgblock is created containing all resources defined +all of the other defined bgblocks. +Make use of the SLURM partition mechanism to control access to these +bgblocks. +A sample bluegene.conf file is shown below. +

    +###############################################################################
    +# Global specifications for BlueGene system
    +#
    +# BlrtsImage:           BlrtsImage used for creation of all bgblocks.
    +# LinuxImage:           LinuxImage used for creation of all bgblocks.
    +# MloaderImage:         MloaderImage used for creation of all bgblocks.
    +# RamDiskImage:         RamDiskImage used for creation of all bgblocks.
    +# LayoutMode:           Mode in which slurm will create blocks:
    +#                       STATIC:  Use defined non-overlapping bgblocks
    +#                       OVERLAP: Use defined bgblocks, which may overlap
    +#                       DYNAMIC: Create bgblocks as needed for each job
    +# BasePartitionNodeCnt: Number of c-nodes per base partition  
    +# NodeCardNodeCnt:      Number of c-nodes per node card.
    +# Numpsets:             The Numpsets used for creation of all bgblocks 
    +#                       equals this value multiplied by the number of 
    +#                       base partitions in the bgblock.
    +#
    +# BridgeAPILogFile:  Pathname of file in which to write the 
    +#                    Bridge API logs.
    +# BridgeAPIVerbose:  How verbose the BG Bridge API logs should be
    +#                    0: Log only error and warning messages
    +#                    1: Log level 0 and information messages
    +#                    2: Log level 1 and basic debug messages
    +#                    3: Log level 2 and more debug message
    +#                    4: Log all messages
    +#
    +# NOTE: The bgl_serial value is set at configuration time using the 
    +#       "--with-bgl-serial=" option. Its default value is "BGL".
    +###############################################################################
    +BlrtsImage=/bgl/BlueLight/ppcfloor/bglsys/bin/rts_hw.rts
    +LinuxImage=/bgl/BlueLight/ppcfloor/bglsys/bin/zImage.elf
    +MloaderImage=/bgl/BlueLight/ppcfloor/bglsys/bin/mmcs-mloader.rts
    +RamDiskImage=/bgl/BlueLight/ppcfloor/bglsys/bin/ramdisk.elf
    +LayoutMode=STATIC
    +BasePartitionNodeCnt=512
    +NodeCardNodeCnt=32
    +Numpsets=8
    +BridgeAPILogFile=/var/log/slurm/bridgeapi.log
    +BridgeAPIVerbose=0
    +
    +###############################################################################
    +# Define the static/overlap partitions (bgblocks)
    +#
    +# BPs: The base partitions (midplanes) in the bgblock using XYZ coordinates
    +# Type:  Connection type "MESH" or "TORUS" or "SMALL", default is "TORUS" 
    +#        Type SMALL will divide a midplane into multiple bgblocks
    +#        based off options NodeCards and Quarters to determine type of 
    +#        small blocks.
    +#
    +# IMPORTANT NOTES:
    +# * Ordering is very important for laying out switch wires.  Please create
    +#   blocks with smap, and once done don't move the order of blocks
    +#   created.
    +# * A bgblock is implicitly created containing all resources on the system
    +# * Bgblocks must not overlap (except for implicitly created bgblock)
    +#   This will be the case when smap is used to create a configuration file
    +# * All Base partitions defined here must also be defined in the slurm.conf file
    +# * Define only the numeric coordinates of the bgblocks here. The prefix
    +#   will be based upon the name defined in slurm.conf
    +###############################################################################
    +# LEAVE NEXT LINE AS A COMMENT, Full-system bgblock, implicitly created
    +# BPs=[000x001] Type=TORUS       # 1x1x2 = 2 midplanes
    +###############################################################################
    +# volume = 1x1x1 = 1
    +BPs=[000x000] Type=TORUS                         # 1x1x1 =  1 midplane
    +BPs=[001x001] Type=SMALL NodeCards=4 Quarters=3  # 1x1x1 = 4-Nodecard sized 
    +                                                 # cnode blocks 3-Base 
    +                                                 # Partition Quarter sized 
    +                                                 # c-node blocks
    +
    +

    + +

    The above bluegene.conf file defines multiple bgblocks to be +created in a single midplane (see the "SMALL" option). +Using this mechanism, up to 32 independent jobs can be executed +simultaneously on a one-rack BlueGene system. +If defining bgblocks of Type=SMALL, the SLURM partition +containing them as defined in slurm.conf must have the +parameter Shared=force to enable scheduling of multiple +jobs on what SLURM considers a single node. +SLURM partitions that do not contain bgblocks of Type=SMALL +may have the parameter Shared=no for a slight improvement in +scheduler performance. +As in all SLURM configuration files, parameters and values +are case insensitive.

    + +

    One more thing is required to support SLURM interactions with +the DB2 database (at least as of the time this was written). +DB2 database access is required by the slurmctld daemon only. +All other SLURM daemons and commands interact with DB2 using +remote procedure calls, which are processed by slurmctld. +DB2 access is dependent upon the environment variable +BRIDGE_CONFIG_FILE. +Make sure this is set appropriate before initiating the +slurmctld daemon. +If desired, this environment variable and any other logic +can be executed through the script /etc/sysconfig/slurm, +which is automatically executed by /etc/init.d/slurm +prior to initiating the SLURM daemons.

    + +

    When slurmctld is initially started on an idle system, the bgblocks +already defined in MMCS are read using the Bridge APIs. +If these bgblocks do not correspond to those defined in the bluegene.conf +file, the old bgblocks with a prefix of "RMP" are destroyed and new ones +created. +When a job is scheduled, the appropriate bgblock is identified, +its user set, and it is booted. +Node use (virtual or coprocessor) is set from the mpirun command line now, +SLURM has nothing to do with setting the node use. +Subsequent jobs use this same bgblock without rebooting by changing +the associated user field. +The only time bgblocks should be freed and rebooted, in normal operation, +is when going to or from full-system +jobs (two or more bgblocks sharing base partitions can not be in a +ready state at the same time). +When this logic became available at LLNL, approximately 85 percent of +bgblock boots were eliminated and the overhead of job startup went +from about 24% to about 6% of total job time. +Note that bgblocks will remain in a ready (booted) state when +the SLURM daemons are stopped. +This permits SLURM daemon restarts without loss of running jobs +or rebooting of bgblocks.

    + +

    Be aware that SLURM will issue multiple bgblock boot requests as +needed (e.g. when the boot fails). +If the bgblock boot requests repeatedly fail, SLURM will configure +the failing base partitions to a DRAINED state so as to avoid continuing +repeated reboots and the likely failure of user jobs. +A system administrator should address the problem before returning +the base partitions to service.

    + +

    If you cold-start slurmctld (/etc/init.d/slurm startclean +or slurmctld -c) it is recommended that you also cold-start +the slurmd at the same time. +Failure to do so may result in errors being reported by both slurmd +and slurmctld due to bgblocks that previously existed being deleted.

    + +

    A new tool sfree has also been added to help system +administrators free a bgblock on request (i.e. +"sfree --bgblock=<blockname>"). +Run sfree --help for more information.

    + +

    Debugging

    + +

    All of the testing and debugging guidance provided in + Quick Start Administrator Guide +apply to BlueGene systems. +One can start the slurmctld and slurmd in the foreground +with extensive debugging to establish basic functionality. +Once running in production, the configured SlurmctldLog and +SlurmdLog files will provide historical system information. +On BlueGene systems, there is also a BridgeAPILogFile defined +in bluegene.conf which can be configured to contain detailed +information about every Bridge API call issued.

    + +

    Note that slurmcltld log messages of the sort +Nodes bg[000x133] not responding are indicative of the slurmd +daemon serving as a front-end to those base partitions is not responding (on +non-BlueGene systems, the slurmd actually does run on the compute +nodes, so the message is more meaningful there).

    + +

    Note that you can emulate a BlueGene system on stand-alone Linux +system. +Run configure with the --enable-bluegene-emulation option. +This will define "HAVE_BG" and "HAVE_FRONT_END" in the config.h file. +Then execute make normally. +These variables will build the code as if it were running +on an actual BlueGene computer, but avoid making calls to the +Bridge libary (that is controlled by the variable "HAVE_BG_FILES", +which is left undefined). You can use this to test configurations, +scheduling logic, etc.

    + + + +

    Last modified 29 September 2006

    + + diff --git a/executable_names/doc/html/checkpoint_plugins.shtml b/executable_names/doc/html/checkpoint_plugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..1313e86f07b11c392ce878672cb5ff7d015f8a92 --- /dev/null +++ b/executable_names/doc/html/checkpoint_plugins.shtml @@ -0,0 +1,151 @@ + + +

    SLURM Job Checkpoint Plugin API

    + +

    Overview

    +

    This document describes SLURM job checkpoint plugins and the API that defines +them. It is intended as a resource to programmers wishing to write their own SLURM +job checkpoint plugins. This is version 0 of the API.

    + +

    SLURM job checkpoint plugins are SLURM plugins that implement the SLURM +API for checkpointing and restarting jobs. +The plugins must conform to the SLURM Plugin API with the following specifications:

    + +

    const char plugin_type[]
    +The major type must be "checkpoint." The minor type can be any recognizable +abbreviation for the type of scheduler. We recommend, for example:

    +
      +
    • none—No job checkpoint.
    • +
    • aix—AIX system checkpoint.
    • +

    + +

    The plugin_name and +plugin_version +symbols required by the SLURM Plugin API require no specialization for +job checkpoint support. +Note carefully, however, the versioning discussion below.

    + +

    The programmer is urged to study +src/plugins/checkpoint/checkpoint_aix.c +for a sample implementation of a SLURM job checkpoint plugin.

    + + +

    Data Objects

    +

    The implementation must maintain (though not necessarily directly export) an +enumerated errno to allow SLURM to discover +as practically as possible the reason for any failed API call. Plugin-specific enumerated +integer values may be used when appropriate. + +

    These values must not be used as return values in integer-valued functions +in the API. The proper error return value from integer-valued functions is SLURM_ERROR. +The implementation should endeavor to provide useful and pertinent information by +whatever means is practical. +Successful API calls are not required to reset any errno to a known value. However, +the initial value of any errno, prior to any error condition arising, should be +SLURM_SUCCESS.

    + +

    There is also a checkpoint-specific error code and message that may be associated +with each job step.

    + + +

    API Functions

    +

    The following functions must appear. Functions which are not implemented should +be stubbed.

    + +

    int slurm_ckpt_alloc_job (check_jobinfo_t *jobinfo);

    +

    Description: Allocate storage for job-step specific +checkpoint data.

    +

    Argument: jobinfo  +  (output) returns pointer to the allocated storage.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int slurm_ckpt_free_job (check_jobinfo_t jobinfo);

    +

    Description: Release storage for job-step specific +checkpoint data that was previously allocated by slurm_ckpt_alloc_job.

    +

    Argument: jobinfo  +  (input) pointer to the previously allocated storage.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int slurm_ckpt_pack_job (check_jobinfo_t jobinfo, Buf buffer);

    +

    Description: Store job-step specific checkpoint data +into a buffer.

    +

    Arguments:
    + jobinfo  +  (input) pointer to the previously allocated storage.
    +Buf    (input/output) buffer to which +jobinfo has been appended.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int slurm_ckpt_unpack_job (check_jobinfo_t jobinfo, Buf buffer);

    +

    Description: Retrieve job-step specific checkpoint data +from a buffer.

    +

    Arguments:
    + jobinfo  +  (output) pointer to the previously allocated storage.
    +Buf    (input/output) buffer from which +jobinfo has been removed.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int slurm_ckpt_op ( uint16_t op, uint16_t data, +struct step_record * step_ptr, time_t * event_time, +uint32_t *error_code, char **error_msg );

    +

    Description: Perform some checkpoint operation on a +specific job step.

    +

    Arguments:
    + op  +  (input) specifies the operation to be performed. Currently supported +operations include CHECK_ABLE (is job step currently able to be checkpointed), +CHECK_DISABLE (disable checkpoints for this job step), +CHECK_ENABLE (enable checkpoints for this job step), +CHECK_CREATE (create a checkpoint for this job step and continue its execution), +CHECK_VACATE (create a checkpoint for this job step and terminate it), +CHECK_RESTART (restart this previously checkpointed job step), and +CHECK_ERROR (return checkpoint-specific error information for this job step).
    +data    (input) operation-specific +data.
    +step_ptr   (input/output) identifies +the job step to be operated upon.
    +event_time    (output) identifies +the time of a checkpoint or restart operation.
    +error_code    (output) returns +checkpoint-specific error code associated with an operation.
    +error_msg    (output) identifies +checkpoint-specific error message associated with an operation.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the error_code and error_msg to an +appropriate value to indicate the reason for failure.

    + +

    int slurm_ckpt_comp ( struct step_record * step_ptr, time_t event_time, +uint32_t error_code, char *error_msg );

    +

    Description: Note the completion of a checkpoint operation.

    +

    Arguments:
    +step_ptr   (input/output) identifies +the job step to be operated upon.
    +event_time    (input) identifies +the time that the checkpoint operation began.
    +error_code    (input) +checkpoint-specific error code associated with an operation.
    +error_msg    (input) +checkpoint-specific error message associated with an operation.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the error_code and error_msg to an +appropriate value to indicate the reason for failure.

    + + +

    Versioning

    +

    This document describes version 0 of the SLURM checkpoint API. Future +releases of SLURM may revise this API. A scheduler plugin conveys its ability +to implement a particular API version using the mechanism outlined for SLURM plugins.

    + + +

    Last modified 10 July 2005

    + + diff --git a/executable_names/doc/html/coding_style.pdf b/executable_names/doc/html/coding_style.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d7f5fdf2bce8d60e50983a7d1d4081aedd739ecf Binary files /dev/null and b/executable_names/doc/html/coding_style.pdf differ diff --git a/executable_names/doc/html/configurator.html.in b/executable_names/doc/html/configurator.html.in new file mode 100644 index 0000000000000000000000000000000000000000..30a193b68df4685de200b93a2a3816a60f6f65e9 --- /dev/null +++ b/executable_names/doc/html/configurator.html.in @@ -0,0 +1,622 @@ + + +SLURM System Configuration Tool + + + +
    +

    SLURM Configration Tool, Version @SLURM_MAJOR@.@SLURM_MINOR@

    +

    This form can be used to create a SLURM configuration file with +you controlling many of the important configuration parameters. +This tool supports SLURM version @SLURM_MAJOR@.@SLURM_MINOR@. +Configuration files for other versions of SLURM should be built +using the tool distributed with it in doc/html/configurator.html. +Some parameters will be set to default values, but you can +manually edit the resulting slurm.conf as desired +for greater flexibiilty. See man slurm.conf for more +details about the configuration parameters. + +

    After you have filled in the fields of interest, use the +"Submit" button on the bottom of the page to build the slurm.conf +file. It will appear on your web browser. Save the file in text format +as slurm.conf for use by SLURM. + +

    For more information about SLURM, see +http://www.llnl.gov/linux/slurm +

    +Privacy and legal notice + +

    Control Machines

    +Define the hostname of the computer on which the SLURM controller and +optional backup controller will execute. You can also specify addresses +of these computers if desired (defaults to their hostnames). +The IP addresses can be either numeric IP addresses or names. +Hostname values should should not be the fully qualified domain +name (e.g. use linux rather than linux.llnl.gov). +

    + ControlMachine: +Master Controller Hostname +

    + ControlAddr: Master Controller +Address (optional) +

    + BackupController: Backup +Controller Hostname (optional) +

    + BackupAddr: Backup Controller +Address (optional) +

    + +

    Compute Machines

    +Define the machines on which user applications can run. +You can also specify addresses of these computers if desired +(defaults to their hostnames). +Only a few of the possible parameters associated with the nodes will +be set by this tool, but many others are available. +All of the nodes will be placed into a single partition (or queue) +with global access. Many options are availble to group nodes into +partitions with a wide variety of configuration parameters. +Manually edit the slurm.conf produced to exercise these options. +Node names and addresses may be specified using a numeric range specification. + +

    + NodeName: +Compute nodes +

    + NodeAddr: Compute node addresses +(optional) +

    + PartitionName: +Name of the one partition to be created +

    + MaxTime: +Maximum time limit of jobs in minutes or INFINITE +

    +The following parameters are optional, +but can be specified when using FastSchedule=1: +

    + Procs: Count of processors +on each compute node. +If Procs is omitted, it will be inferred from: +Sockets, CoresPerSocket, and ThreadsPerCore. +

    + +Sockets: +Number of physical processor sockets/chips on the node. +If Sockets is omitted, it will be inferred from: +Procs, CoresPerSocket, and ThreadsPerCore. +

    + +CoresPerSocket: +Number of cores in a single physical processor socket. +The CoresPerSocket value describes physical cores, not +the logical number of processors per socket. +

    + +ThreadsPerCore: +Number of logical threads in a single physical core. +

    + Memory: Amount +of real memory. This parameter is required when specifying Memory as a +consumable resource with the select/cons_res plug-in. See below +under Resource Selection. +

    + +

    SLURM User

    +The SLURM controller (slurmctld) can run without elevated privileges, +so it is recommended that a user "slurm" be created for it. For testing +purposes any user name can be used. +

    + SlurmUser +

    + +

    Group ID Caching

    + +If you have a slow NIS environment, big parallel jobs take a long time +to start up (and may eventually time-out) because the NIS server(s) +may not be able to quickly respond to simultaneous requests from +multiple slurmd's. You can instruct slurmd to cache /etc/groups +entries to prevent this from happening by setting +CacheGroups=1. Reconfiguring ("scontrol reconfig") with +CacheGroups=0 will cause slurmd to purge the cache. Select one +value for CacheGroups:
    + +0: for normal environment.
    + +1: for slow NIS environment. +

    +WARNING: The group ID cache does not try to keep itself in sync with +the system. You MUST run "scontrol reconfig" to update the cache +after making any changes to system password or group databases. +

    + +

    SLURM Port Numbers

    +The SLURM controller (slurmctld) requires a unique port for communcations +as do the SLURM compute node deamonds (slurmd). If not set, slurm ports +are set by checking for an entry in /etc/services and if that +fails by using an interal default set at SLURM build time. +

    + SlurmctldPort +

    + SlurmdPort +

    + +

    Authentication

    +Define the method used for authenticating communicating between SLURM components.
    +Select one value for AuthType:
    + None: No authentication, +not recommended production use
    + Authd: Brent Chun's authd
    + Munge: LLNL's Munge
    +

    +Define the location of public and private SSL keys used by SLURM. +These need to be generated by the SLURM administrator. +Specify fully qualified pathnames. Both values are required. +

    + JobCredentialPrivateKey +

    + JobCredentialPublicCertificate +

    + +

    State Preservation

    +Define the location of a directory where the slurmctld daemon saves its state. +This should be a fully qualified pathname which can be read and written to +by the SLURM user on both the control machine and backup controller (if configured). +The location of a directory where slurmd saves state should also be defined. +This must be a unique directory on each compute server (local disk). +

    + StateSaveLocation: +Slurmctld state save directory +

    + SlurmdSpoolDir: +Slurmd state save directory +

    +Define when a non-responding (DOWN) node is returned to service.
    +Select one value for ReturnToService:
    + +0: When explicitly restored to service by an administrator.
    + +1: Automatically, when slurmd daemon registers with valid configuration
    +

    + +

    Scheduling

    +Define the mechanism to be used for controlling job ordering.
    +Select one value for SchedulerType:
    + Builtin: First-In +First-Out (FIFO)
    + Backfill: +FIFO with backfill
    + Wiki: Wiki interface to Maui +(configuration parameters SchedulerAuth and SchedulerPort must specified)
    +

    + SchedulerPort: scheduler +communcations port (used by Wiki only) +

    +Define what node configuration should be used. +Using values defined in the configuration file will provide faster scheduling.
    +Select one value for FastSchedule:
    + +1: Use node configuration values defined in configuration file
    + +0: Use node configuration values actually found on each node +

    + +

    Interconnect

    +Define the node interconnect used.
    +Select one value for SwitchType:
    + Elan: Quadrics Elan3 or Elan4
    + Federation: IBM +Federation Switch
    + None: No special +handling required (InfiniBand, Myrinet, Ethernet, etc.)
    +

    + +

    Default MPI Type

    +Specify the type of MPI to be used by default. SLURM will configure environment +variables accordingly. Users can over-ride this specification with an srun option.
    +Select one value for MpiDefault:
    + Mpich-Gm
    + MVAPICH
    + None: This works +for most other MPI types including LAM MPI and Open MPI
    +

    + +

    Process Tracking

    +Define the algorithm used to identify which processes are associated with a +given job. This is used signal, kill, and account for the processes associated +with a job step.
    +Select one value for ProctrackType:
    + AIX: Use AIX kernel +extension, recommended for AIX systems
    + Pgid: Use Unix +Process Group ID, processes changing their process group ID can escape from SLURM +control
    + LinuxProc: Use +parent process ID records, required for MPICH-GM use, processes can escape +from SLURM control
    + RMS: Use Quadrics +kernel infrastructure, recommended for systems where this is available
    + SGI's PAGG +module: Use SGI's Process +Aggregates (PAGG) kernel module, recommended where available
    +

    + +

    Resource Selection

    +Define resource (node) selection algorithm to be used.
    +Select one value for SelectType:
    + +Cons_res: Allocate +individual processors and memory
    +
    +
    +
    SelectTypeParameters (As used by SelectType=Cons_res only): +
    Note: The -E extension for sockets, cores, and threads + are ignored within the node allocation mechanism + when CR_CPU or CR_CPU_MEMORY is selected. + They are considered to compute the total number of + tasks when -n is not specified +
    Note: All CR_s assume Shared=No or Shared=Force EXCEPT for + CR_MEMORY which assumes Shared=Yes +
    + CR_CPU: (default) + CPUs as consumable resources. +
    No notion of sockets, cores, or threads. + On a multi-core system, cores will be considered CPUs. + On a multi-core/hyperthread system, threads will be considered CPUs. + On a single-core systems CPUs are CPUs. ;-) +
    + CR_Socket: Sockets as a consumable resource. +
    + CR_Core: Cores as a consumable resource. +
    + CR_Memory: Memory as a consumable resource. +
    Note: CR_Memory assumes Shared=Yes +
    + CR_CPU_Memory: + CPU and Memory as consumable resources. +
    + CR_Socket_Memory: + Socket and Memory as consumable resources. +
    + CR_Core_Memory: + Core and Memory as consumable resources. +
    +
    + +Linear: Node-base +resource allocation, does not manage indivual processor allocation
    + +BlueGene: For IBM Blue Gene systems only
    +

    + +

    Task Launch

    +Define a task launch plugin. This may be used to +provide resource management within a node (e.g. pinning +tasks to specific processors). +Select one value for TaskPlugin:
    + None: No task launch actions
    + Affinity: +CPU affinity support +(see srun man pages for the --cpu_bind, --mem_bind, and -E options) +

    + +

    Prolog and Epilog

    +

    +Prolog/Epilog: Fully qualified path that will be executed as +root on every node of a user's job before the job's tasks +will be initiated there and after that job has terminated. +These parameters are optional. +

    +
    Prolog +
    Epilog +
    + +

    +SrunProlog/Epilog: Fully qualified path to be executed by srun at +job step initiation and termination. These parameters may be overridden by +srun's --prolog and --epilog options +These parameters are optional. +

    +
    SrunProlog +
    SrunEpilog +
    + +

    +TaskProlog/Epilog: Fully qualified path to be executed as the user +before each task begins execution and after each task terminates. +These parameters are optional. +

    +
    TaskProlog +
    TaskEpilog +
    + +

    Event Logging

    +Slurmctld and slurmd daemons can each be configured with different +levels of logging verbosity from 0 (quiet) to 7 (extremely verbose). +Each may also be configured to use debug files. Use fully qualified +pathnames for the files. +

    + SlurmctldDebug (0 to 7) +

    + SlurmctldLogFile (default is none, log goes to syslog) +

    + SlurmdDebug (0 to 7) +

    + SlurmdLogFile (default is none, +log goes to syslog, string "%h" in name gets replaced with hostname) +

    + +

    Job Completion Logging

    +Define the job completion logging mechanism to be used.
    +Select one value for JobCompType:
    + None: No job +completion logging
    + FileTxt: Write job +completion status to a text file
    + Script: Use an +arbitrary script to log job completion
    +

    + JobCompLoc: Location specification. +This is the location of the text file to be written to or the script to be run (depends +upon logging mode). Use a fully qualified pathname. +

    + +

    Job Accounting

    +SLURM accounts for resource use per job. System specifics can be polled +determined by system type
    +Select one value for JobAcctType:
    + None: No +job accounting
    + Linux: Specifc +Linux proc table information gathered, use with Linux systems only
    + JobAcctFrequency: +polling interval in seconds.
    + JobAcctLogFile: +Location specification. +This is the location of the text file to be written to (used by Log only). +Use a fully qualified pathname. +

    + +

    Process ID Logging

    +Define the location into which we can record the daemon's process ID. +This is used for locate the appropriate daemon for signalling. +Specify a specify the fully qualified pathname for the file. +

    + +SlurmctldPidFile +

    + +SlurmdPidFile +

    + +

    Timers

    +SLURM has a variety of timers to control when to consider a node DOWN, +when to purge job records, how long to give a job to gracefully terminate, etc. +

    + +SlurmctldTimeout: How many seconds the backup controller waits before +becoming the master controller +

    + +SlurmdTimeout: How many seconds the SLURM controller waits for the slurmd +to respond to a request before considering the node DOWN +

    + +InactiveLimit: How many seconds the SLURM controller waits for srun +commands to respond before considering the job or job step inactive and +terminating it. A value of zero indicates unlimited wait +

    + +MinJobAge: How many seconds the SLURM controller waits after a +job terminates before purging its record. A record of the job will +persist in job completion and/or accounting records indefinitely, +but will no longer be visible with the squeue command after puring +

    + +KillWait: How many seconds a job is given to gracefully terminate +after reaching its time limit and being sent SIGTERM before sending +a SIGKILLL +

    + +WaitTime: How many seconds after a job step's first task terminates +before terminating all remaining tasks. A value of zero indicates unlimited wait +

    + +
    +
    + + +

    +

    +
    + + + diff --git a/executable_names/doc/html/cons_res.shtml b/executable_names/doc/html/cons_res.shtml new file mode 100644 index 0000000000000000000000000000000000000000..d4649fbc727d0c38831e1c2a1ae2c3ca63da6b3c --- /dev/null +++ b/executable_names/doc/html/cons_res.shtml @@ -0,0 +1,484 @@ + + +

    Consumable Resources in SLURM

    + +

    SLURM, using the default node allocation plug-in, allocates nodes to jobs in +exclusive mode. This means that even when all the resources within a node are +not utilized by a given job, another job will not have access to these resources. +Nodes possess resources such as processors, memory, swap, local +disk, etc. and jobs consume these resources. The exclusive use default policy +in SLURM can result in inefficient utilization of the cluster and of its nodes +resources. + +

    A plug-in supporting CPUs as a consumable resource is available in +SLURM 0.5.0 and newer versions of SLURM. Information on how to use +this plug-in is described below. +

    + +

    Using the Consumable Resource Node Allocation Plugin: select/cons_res

    + +
      +
    1. SLURM v0.5 and up to SLURM v1.1: ONLY CPUs as a consumable resource
    2. +
        +
      • Managing CPUs as a consumable resource means that SLURM will + not overallocate CPUs. In this implementation it is possible to oversubscribe + memory if co-located jobs are using more memory than is available on the node. + See features for SLURM 1.2 (below) for memory as a consumable resource.
      • +
      • The consumable resource plugin is enabled via SelectType in the + slurm.conf (e.g. SelectType=select/cons_res).
      • +
        +#
        +# "SelectType"			: node selection logic for scheduling.
        +#	"select/bluegene"	: the default on BlueGene systems, aware of
        +#				  system topology, manages bglblocks, etc.
        +#	"select/cons_res"	: allocate individual consumable resources
        +#				  (i.e. processors, memory, etc.)
        +#	"select/linear"		: the default on non-BlueGene systems,
        +#				  no topology awareness, oriented toward
        +#				  allocating nodes to jobs rather than
        +#				  resources within a node (e.g. CPUs)
        +#
        +# SelectType=select/linear
        +SelectType=select/cons_res
        +
        +
      • The select/cons_res plug-in requires SHARED=No at the + partition level.
      • +
      • Using the --overcommit or -O switch in the + select/cons_res environment is only possible when users + request dedicated nodes using --exclusive.
      • + Overcommiting CPUs in a non-dedicated environment would impact + jobs that are co-located on the nodes which is not a desirable + feature. This feature is available in SLURM 1.2 (see below). +
      +
    3. SLURM 1.2 and newer versions of SLURM
    4. +
        +
      • Consumable resources has been enhanced with several new resources + --namely CPU (same as in previous version), Socket, Core, Memory + as well as any combination of the logical processors with Memory:
      • +
          +
        • CPU (CR_CPU): CPU as a consumable resource. +
            +
          • No notion of sockets, cores, or threads.
          • +
          • On a multi-core system CPUs will be cores.
          • +
          • On a multi-core/hyperthread system CPUs will be threads.
          • +
          • On a single-core systems CPUs are CPUs. ;-)
          • +
          +
        • Socket (CR_Socket): Socket as a consumable + resource.
        • +
        • Core (CR_Core): Core as a consumable + resource.
        • +
        • Memory (CR_Memory) Memory only as a + consumable resource. Note! CR_Memory assumes Shared=Yes
        • +
        • Socket and Memory (CR_Socket_Memory): Socket + and Memory as consumable resources.
        • +
        • Core and Memory (CR_Core_Memory): Core and + Memory as consumable resources.
        • +
        • CPU and Memory (CR_CPU_Memory) CPU and Memory + as consumable resources.
        • +
        +
      • In the cases where Memory is the consumable resource or one of + the two consumable resources the Memory parameter which + defines a node amount of real memory in slurm.conf must be + set when fastschedule=1. +
      • srun's -E extension for sockets, cores, and threads are + ignored within the node allocation mechanism when CR_CPU or + CR_CPU_MEMORY is selected. It is considered to compute the total + number of tasks when -n is not specified.
      • +
      • A new srun switch --job-mem=MB was added to allow users + to specify the maximum amount of real memory per node required + by their application. This switch is needed in the environments + were Memory is a consumable resource. It is important to specify + enough memory since slurmd will not allow the application to use + more than the requested amount of real memory per node. The + default value for --job-mem is 1 MB. see srun man page for more + details.
      • +
      • All CR_s assume Shared=No or Shared=Force EXCEPT for + CR_MEMORY which assumes Shared=Yes
      • +
      • The consumable resource plugin is enabled via SelectType and + SelectTypeParameter in the slurm.conf.
      • +
        +#
        +# "SelectType"			: node selection logic for scheduling.
        +#	"select/bluegene"	: the default on BlueGene systems, aware of
        +#				  system topology, manages bglblocks, etc.
        +#	"select/cons_res"	: allocate individual consumable resources
        +#				  (i.e. processors, memory, etc.)
        +#	"select/linear"		: the default on non-BlueGene systems,
        +#				  no topology awareness, oriented toward
        +#				  allocating nodes to jobs rather than
        +#				  resources within a node (e.g. CPUs)
        +#
        +# SelectType=select/linear
        +SelectType=select/cons_res
        +
        +# o Define parameters to describe the SelectType plugin. For
        +#    - select/bluegene - this parameter is currently ignored
        +#    - select/linear   - this parameter is currently ignored
        +#    - select/cons_res - the parameters available are
        +#          - CR_CPU     (1) - CPUs as consumable resources. 
        +#                      	No notion of sockets, cores, or threads. 
        +#                      	On a multi-core system CPUs will be cores
        +#                      	On a multi-core/hyperthread system CPUs will 
        +#                      		       be threads
        +#                      	On a single-core systems CPUs are CPUs. ;-)
        +#          - CR_Socket (2) - Sockets as a consumable resource.
        +#          - CR_Core   (3) - Cores as a consumable resource. 
        +#				(Not yet implemented)
        +#          - CR_Memory (4) - Memory as a consumable resource. 
        +#				Note! CR_Memory assumes Shared=Yes
        +#          - CR_Socket_Memory (5) - Socket and Memory as consumable 
        +#				resources.
        +#          - CR_Core_Memory (6) - Core and Memory as consumable 
        +#				resources. (Not yet implemented)	
        +#          - CR_CPU_Memory (7) - CPU and Memory as consumable 
        +#				resources.
        +#
        +# (#) refer to the output of "scontrol show config"
        +#
        +# NB!:	The -E extension for sockets, cores, and threads 
        +#	are ignored within the node allocation mechanism 
        +#	when CR_CPU or CR_CPU_MEMORY is selected. 
        +#	They are considered to compute the total number of 
        +#	tasks when -n is not specified
        +#
        +# NB! All CR_s assume Shared=No or Shared=Force EXCEPT for 
        +#	CR_MEMORY which assumes Shared=Yes
        +#
        +#SelectTypeParameters=CR_CPU (default)
        +
        +
      • Using --overcommit or -O is allowed in this new version + of consumable resources. When the process to logical processor pinning is + enabled (task/affinity plug-in) the extra processes will not affect + co-scheduled jobs other than other jobs started with the -O flag. + We are currently investigating alternative approaches of handling the + pinning of jobs started with --overcommit
      • +
      • -c or --cpus-per-task works in this version of + consumable resources
      • +
      +
    5. General comments
    6. +
        +
      • SLURM's default select/linear plugin is using a best fit algorithm based on + number of consecutive nodes. The same node allocation approach is used in + select/cons_res for consistency.
      • +
      • The select/cons_res plugin is enabled or disabled cluster-wide.
      • +
      • In the case where select/cons_res is not enabled, the normal SLURM behaviors + are not disrupted. The only changes, users see when using the select/cons_res + plug-in, are that jobs can be co-scheduled on nodes when resources permits it. + The rest of SLURM such as srun and switches (except srun -s ...), etc. are not + affected by this plugin. SLURM is, from a user point of view, working the same + way as when using the default node selection scheme.
      • +
      • The --exclusive srun switch allows users to request nodes in + exclusive mode even when consumable resources is enabled. see "man srun" + for details.
      • +
      • srun's -s or --share is incompatible with the consumable resource + environment and will therefore not be honored. Since in this environment nodes + are shared by default, --exclusive allows users to obtain dedicated nodes.
      • +
      +
    + + + +

    Limitation and future work

    + +We are aware of several limitations with the current consumable +resource plug-in and plan to make enhancement the plug-in as we get +time as well as request from users to help us prioritize the features. + +Please send comments and requests about the consumable resources to +slurm-dev@lists.llnl.gov. + +
      +
    1. Issue with --max_nodes, --max_sockets_per_node, --max_cores_per_socket and --max_threads_per_core
    2. +
        +
      • Problem: The example below was achieve when using CR_CPU + (default mode). The systems are all "dual socket, dual core, + single threaded systems (= 4 cpus per system)".
      • +
      • The first 3 serial jobs are being allocated to node hydra12 + which means that one CPU is still available on hydra12.
      • +
      • The 4th job "srun -N 2-2 -E 2:2 sleep 100" requires 8 CPUs + and since the algorithm fills up nodes in a consecutive order + (when not in dedicated mode) the algorithm will want to use the + remaining CPUs on Hydra12 first. Because the user has requested + a maximum of two nodes the allocation will put the job on + hold until hydra12 becomes available or if backfill is enabled + until hydra12's remaining CPU gets allocated to another job + which will allow the 4th job to get two dedicated nodes
      • +
      • Note! If you want to specify --max_???? this + problem can be solved in the current implementation by asking + for the nodes in dedicated mode using --exclusive
      • . + +
        +# srun sleep 100 &
        +# srun sleep 100 &
        +# srun sleep 100 &
        +# squeue
        +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
        +   1132  allNodes    sleep   sballe   R       0:05      1 hydra12
        +   1133  allNodes    sleep   sballe   R       0:04      1 hydra12
        +   1134  allNodes    sleep   sballe   R       0:02      1 hydra12
        +# srun -N 2-2 -E 2:2 sleep 100 &
        +srun: job 1135 queued and waiting for resources
        +#squeue
        +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
        +   1135  allNodes    sleep   sballe  PD       0:00      2 (Resources)
        +   1132  allNodes    sleep   sballe   R       0:24      1 hydra12
        +   1133  allNodes    sleep   sballe   R       0:23      1 hydra12
        +   1134  allNodes    sleep   sballe   R       0:21      1 hydra12
        +#
        +
        +
      • Proposed solution: Enhance the selection mechanism to go through {node,socket,core,thread}-tuplets to find available match for specific request (bounded knapsack problem).
      • +
      +
    3. Binding of processes in the case when --overcommit is specified.
    4. +
        +
      • In the current implementation (SLURM 1.2) we have chosen not + to bind process that have been started with --overcommit + flag. The reasoning behind this decision is that the Linux + scheduler will move non-bound processes to available resources + when jobs with process pinning enabled are started. The + non-bound jobs do not affect the bound jobs but co-scheduled + non-bound job would affect each others runtime. We have decided + that for now this is an adequate solution. +
      + +
    + + + +

    Examples of CR_Memory, CR_Socket_Memory, and CR_CPU_Memory type consumable resources

    + +
    +sinfo -lNe
    +NODELIST     NODES PARTITION  STATE  CPUS  S:C:T MEMORY 
    +hydra[12-16]     5 allNodes*  ...       4  2:2:1   2007 
    +
    + +Using select/cons_res plug-in with CR_Memory +
    +Example:
    +srun -N 5 -n 20 --job-mem=1000 sleep 100 &  <-- running
    +srun -N 5 -n 20 --job-mem=10 sleep 100 &    <-- running 
    +srun -N 5 -n 10 --job-mem=1000 sleep 100 &  <-- queued and waiting for resources
    +
    +squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +   1820  allNodes    sleep   sballe  PD       0:00      5 (Resources)
    +   1818  allNodes    sleep   sballe   R       0:17      5 hydra[12-16]
    +   1819  allNodes    sleep   sballe   R       0:11      5 hydra[12-16]
    +
    + +Using select/cons_res plug-in with CR_Socket_Memory (2 sockets/node) +
    +Example 1:
    +srun -N 5 -n 5 --job-mem=1000 sleep 100 &        <-- running
    +srun -n 1 -w hydra12 --job-mem=2000 sleep 100 &  <-- queued and waiting for resources
    +
    +squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +   1890  allNodes    sleep   sballe  PD       0:00      1 (Resources)
    +   1889  allNodes    sleep   sballe   R       0:08      5 hydra[12-16]
    +
    +Example 2:
    +srun -N 5 -n 10 --job-mem=10 sleep 100 & <-- running 
    +srun -n 1 --job-mem=10 sleep 100 & <-- queued and waiting for resourcessqueue
    +
    +squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +   1831  allNodes    sleep   sballe  PD       0:00      1 (Resources)
    +   1830  allNodes    sleep   sballe   R       0:07      5 hydra[12-16]
    +
    + +Using select/cons_res plug-in with CR_CPU_Memory (4 CPUs/node) +
    +Example 1:
    +srun -N 5 -n 5 --job-mem=1000 sleep 100 &  <-- running 
    +srun -N 5 -n 5 --job-mem=10 sleep 100 &    <-- running
    +srun -N 5 -n 5 --job-mem=1000 sleep 100 &  <-- queued and waiting for resources
    +
    +squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +   1835  allNodes    sleep   sballe  PD       0:00      5 (Resources)
    +   1833  allNodes    sleep   sballe   R       0:10      5 hydra[12-16]
    +   1834  allNodes    sleep   sballe   R       0:07      5 hydra[12-16]
    +
    +Example 2:
    +srun -N 5 -n 20 --job-mem=10 sleep 100 & <-- running 
    +srun -n 1 --job-mem=10 sleep 100 &       <-- queued and waiting for resources
    +
    +squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +   1837  allNodes    sleep   sballe  PD       0:00      1 (Resources)
    +   1836  allNodes    sleep   sballe   R       0:11      5 hydra[12-16]
    +
    + + + +

    Example of Node Allocations Using Consumable Resource Plugin

    + +

    The following example illustrates the different ways four jobs +are allocated across a cluster using (1) SLURM's default allocation +(exclusive mode) and (2) a processor as consumable resource +approach.

    + +

    It is important to understand that the example listed below is a +contrived example and is only given here to illustrate the use of cpu as +consumable resources. Job 2 and Job 3 call for the node count to equal +the processor count. This would typically be done because +that one task per node requires all of the memory, disk space, etc. The +bottleneck would not be processor count.

    + +

    Trying to execute more than one job per node will almost certainly severely +impact parallel job's performance. +The biggest beneficiary of cpus as consumable resources will be serial jobs or +jobs with modest parallelism, which can effectively share resources. On a lot +of systems with larger processor count, jobs typically run one fewer task than +there are processors to minimize interference by the kernel and daemons.

    + +

    The example cluster is composed of 4 nodes (10 cpus in total):

    + +
      +
    • linux01 (with 2 processors),
    • +
    • linux02 (with 2 processors),
    • +
    • linux03 (with 2 processors), and
    • +
    • linux04 (with 4 processors).
    • +
    + +

    The four jobs are the following:

    + +
      +
    • [2] srun -n 4 -N 4 sleep 120 &
    • +
    • [3] srun -n 3 -N 3 sleep 120 &
    • +
    • [4] srun -n 1 sleep 120 &
    • +
    • [5] srun -n 3 sleep 120 &
    • +
    + +

    The user launches them in the same order as listed above.

    + + + +

    Using SLURM's Default Node Allocation (Non-shared Mode)

    + +

    The four jobs have been launched and 3 of the jobs are now +pending, waiting to get resources allocated to them. Only Job 2 is running +since it uses one cpu on all 4 nodes. This means that linux01 to linux03 each +have one idle cpu and linux04 has 3 idle cpus.

    + +
    +# squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +      3       lsf    sleep     root  PD       0:00      3 (Resources)
    +      4       lsf    sleep     root  PD       0:00      1 (Resources)
    +      5       lsf    sleep     root  PD       0:00      1 (Resources)
    +      2       lsf    sleep     root   R       0:14      4 xc14n[13-16]
    +
    + +

    Once Job 2 is finished, Job 3 is scheduled and runs on +linux01, linux02, and linux03. Job 3 is only using one cpu on each of the 3 +nodes. Job 4 can be allocated onto the remaining idle node (linux04) so Job 3 +and Job 4 can run concurrently on the cluster.

    + +

    Job 5 has to wait for idle nodes to be able to run.

    + +
    +# squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +      5       lsf    sleep     root  PD       0:00      1 (Resources)
    +      3       lsf    sleep     root   R       0:11      3 xc14n[13-15]
    +      4       lsf    sleep     root   R       0:11      1 xc14n16
    +
    + +

    Once Job 3 finishes, Job 5 is allocated resources and can run.

    + +

    The advantage of the exclusive mode scheduling policy is +that the a job gets all the resources of the assigned nodes for optimal +parallel performance. The drawback is +that jobs can tie up large amount of resources that it does not use and which +cannot be shared with other jobs.

    + + + +

    Using a Processor Consumable Resource Approach

    + +

    The output of squeue shows that we +have 3 out of the 4 jobs allocated and running. This is a 2 running job +increase over the default SLURM approach.

    + +

    Job 2 is running on nodes linux01 +to linux04. Job 2's allocation is the same as for SLURM's default allocation +which is that it uses one cpu on each of the 4 nodes. Once Job 2 is scheduled +and running, nodes linux01, linux02 and linux03 still have one idle cpu each +and node linux04 has 3 idle cpus. The main difference between this approach and +the exclusive mode approach described above is that idle cpus within a node +are now allowed to be assigned to other jobs.

    + +

    It is important to note that +assigned doesn't mean oversubscription. The consumable resource approach +tracks how much of each available resource (in our case cpus) must be dedicated +to a given job. This allows us to prevent per node oversubscription of +resources (cpus).

    + +

    Once Job 2 is running, Job 3 is +scheduled onto node linux01, linux02, and Linux03 (using one cpu on each of the +nodes) and Job 4 is scheduled onto one of the remaining idle cpus on Linux04.

    + +

    Job 2, Job 3, and Job 4 are now running concurrently on the cluster.

    + +
    +
    +# squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +      5       lsf    sleep     root  PD       0:00      1 (Resources)
    +      2       lsf    sleep     root   R       0:13      4 linux[01-04]
    +      3       lsf    sleep     root   R       0:09      3 linux[01-03]
    +      4       lsf    sleep     root   R       0:05      1 linux04
    +
    +# sinfo -lNe
    +NODELIST     NODES PARTITION       STATE CPUS MEMORY TMP_DISK WEIGHT FEATURES REASON
    +linux[01-03]    3      lsf*   allocated    2   2981        1      1   (null) none
    +linux04         1      lsf*   allocated    4   3813        1      1   (null) none
    +
    + +

    Once Job 2 finishes, Job 5, which was pending, is allocated available resources and is then +running as illustrated below:

    + +
    +# squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +      3       lsf    sleep     root   R       1:58      3 linux[01-03]
    +      4       lsf    sleep     root   R       1:54      1 linux04
    +      5       lsf    sleep     root   R       0:02      3 linux[01-03]
    +# sinfo -lNe
    +NODELIST     NODES PARTITION       STATE CPUS MEMORY TMP_DISK WEIGHT FEATURES REASON
    +linux[01-03]     3      lsf*   allocated    2   2981        1      1   (null) none
    +linux04          1      lsf*        idle    4   3813        1      1   (null) none
    +
    + +

    Job 3, Job 4, and Job 5 are now running concurrently on the cluster.

    + +
    +# squeue
    +  JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    +      5       lsf    sleep     root   R       1:52      3 linux[01-03]
    +
    + +

    Job 3 and Job 4 have finshed and Job 5 is still running on nodes linux[01-03].

    + +

    The advantage of the consumable resource scheduling policy +is that the job throughput can increase dramatically. The overall job +throughput/productivity of the cluster increases thereby reducing the amount of +time users have to wait for their job to complete as well as increasing the +overall efficiency of the use of the cluster. The drawback is that users do not +have the entire node dedicated to their job since they have to share nodes with +other jobs if they do not use all of the resources on the nodes.

    + +

    We have added a "--exclusive" switch to srun which allow users +to specify that they would like their allocated +nodes in exclusive mode. For more information see "man srun". +The reason for that is if users have mpi//threaded/openMP +programs that will take advantage of all the cpus within a node but only need +one mpi process per node.

    + + + +

    Last modified 25 September 2006

    + + diff --git a/executable_names/doc/html/dist_plane.shtml b/executable_names/doc/html/dist_plane.shtml new file mode 100644 index 0000000000000000000000000000000000000000..72bedd988cde9486cfae063cb8c84119bc3bcae2 --- /dev/null +++ b/executable_names/doc/html/dist_plane.shtml @@ -0,0 +1,149 @@ + + +

    Plane distribution: -m plane=plane_size

    + +

    The plane distribution allocates tasks in blocks of size +plane_size in a round-robin fashion across allocated nodes. + +

    To specify the plane distribution add to the srun command line +--distribution=plane=plane_size or -m plane=plane_size +where plane_size is the requested plane/block size. + +

    Examples of plane distributions

    + +

    In the examples below we assume we have 21 tasks and that the +task list is: 0, 1, 2, 3, 4, ..., 19, 20. + +

    On One (1) node: srun -N 1-1 -n 21 -m plane=4 -s <...>. + +

    The distribution results in a plane distribution with plane_size 21. +Even thought the user specified a plane_size of 4 the final plane +distribution results in a plane_size of 21. + +

    +

    + +

    Figure 1: Process layout for srun -N 1-1 -n 21 -m plane=4 -s <...> +

    + +

    On four (4) nodes: srun -N 4-4 -n 21 -m plane=4 -s <...>. + +

    The plane distribution with a plane_size of 4 results in the +following allocation of the task ids: + +

    +

    + +

    Figure 2: Process layout for srun -N 4-4 -n 21 -m plane=4 -s <...> +

    + +

    On four (4) nodes: srun -N 4-4 -n 21 -m plane=2 -s <...> +. + +

    The plane distribution with a plane_size of 2 results in the +following allocation of the task ids: + +

    +

    + +

    Figure 3: Process layout for srun -N 4-4 -n 21 -m plane=2 -s <...> +

    + + + +

    Assumptions and Limitations

    + +

    SLURM assumes that the number of tasks divided by the plane_size is +greater or equal to the number of nodes specified. + +

    In other words if the following is true SLURM will generate an +error message: +

    +if ((n/plane_size < min_nodes) ((N-1)*plane_size >= n))
    +            generate an error message: Too few processes for the
    +	           requested {plane, node} distribution.  
    +
    +where min_nodes is the minimum number of nodes requested for the job.
    +
    + + + +

    Plane distribution and task affinity

    + +

    The concept behind this distribution is to divide the clusters into +planes. Each plane includes a number of the lowest level of logical +processors (CPU, cores, threads depending on the architecture) on each +node. We then schedule within each plane first and then across planes. + +

    We ensure that the processes are located correctly by setting the +process affinity to the specified/appropriate logical processor. Process +affinity is available in SLURM when the task affinity plug-in is +enabled. + +

    On a dual-processor node with quad-core processors (see figure 4) +the plane distribution results in: + +

      +
    • One plane if the plane_size=8. In this case the processors are +scheduled by first filling up the nodes and then scheduled across the +nodes.
    • +
    • Eight planes if the plane_size=1. In this case we would always +schedule across the node first.
    • +
    + +

    +

    + +

    Figure 4: Quad-core dual-processor system +

    + +

    In a multi-core/hyper-threaded environment, two planes would +provide better locality but potentially more contention for other +resources. + +

    On the other hand, four planes (scheduling across processors) would +minimize contention for cache and memory. + +

    + +

    Examples of plane distributions with process +affinity enabled

    + +

    In the examples below we assume we have 21 tasks and that the +task list is: 0, 1, 2, 3, 4, ..., 19, 20. + +

    On One (1) node: srun -N 1-1 -n 21 -m plane=4 -s <...>. +Even thought the user specified a plane_size of 4 the final plane +distribution results in a plane distribution with plane_size=8. + +

    +

    + +

    Figure 5: Process layout for srun -N 1-1 -n 21 -m plane=4 -s <...>. +

    + +

    On four (4) nodes: srun -N 4-4 -n 21 -m plane=4 -s <...> +. The plane distribution with a plane_size of 4 results in the +following allocation of the task ids: + +

    +

    + +

    Figure 6: Process layout for srun -N 4-4 -n 21 -m plane=4 -s <...>. +

    + +

    On four (4) nodes: srun -N 4-4 -n 21 -m plane=2 -s <...> +. The plane distribution with a plane_size of 2 results in the +following allocation of the task ids: + +

    +

    + +

    Figure 7: Process layout for srun -N 4-4 -n 21 -m plane=2 -s <...>. +

    + + + +

    Last modified 12 October 2006

    + + diff --git a/executable_names/doc/html/documentation.shtml b/executable_names/doc/html/documentation.shtml new file mode 100644 index 0000000000000000000000000000000000000000..484aeb438410e1c2b522d8e78335401275bc9ddb --- /dev/null +++ b/executable_names/doc/html/documentation.shtml @@ -0,0 +1,52 @@ + + +

    Documentation

    + +

    SLURM Users

    + + +

    SLURM Administrators

    + + +

    SLURM Developers

    + + +

    Last modified 12 October 2006

    + + diff --git a/executable_names/doc/html/download.shtml b/executable_names/doc/html/download.shtml new file mode 100644 index 0000000000000000000000000000000000000000..4d243dece3e3ae62788877ae2445b07803bd96c8 --- /dev/null +++ b/executable_names/doc/html/download.shtml @@ -0,0 +1,72 @@ + + +

    Download

    +

    +SLURM source can be downloaded from
    + +ftp://ftp.llnl.gov/pub/linux/slurm
    +The latest stable release is version 1.1.

    + +

    NOTE: This server will only download files to computers +on which it can perform a reverse DNS lookup for the IP address +issuing the request. +This is a LLNL site-wide policy for security purposes that we have +no control over. +Some firewalls prevent reverse DNS lookup, so you may need to download +the files to some computer outside of your firewall.

    + +

    Other software available for download includes +

      +
    • PAM Modules (pam_slurm)
      +Pluggable Authentication Module (PAM) for restricting access to compute nodes +where SLURM performs resource management. Access to the node is restricted to +user root and users who have been allocated resources on that node.
      +pam_slurm is available for download from +ftp://ftp.llnl.gov/pub/linux/pam_slurm +
    +

    Related Software

    + + +

    Last modified 29 September 2006

    + + diff --git a/executable_names/doc/html/entities.gif b/executable_names/doc/html/entities.gif new file mode 100644 index 0000000000000000000000000000000000000000..803dfa69d7c626f7b0cea45921f119e392a00e2c Binary files /dev/null and b/executable_names/doc/html/entities.gif differ diff --git a/executable_names/doc/html/faq.shtml b/executable_names/doc/html/faq.shtml new file mode 100644 index 0000000000000000000000000000000000000000..f0c24e0ddce47f862e6756c3b25922dca116f1a8 --- /dev/null +++ b/executable_names/doc/html/faq.shtml @@ -0,0 +1,422 @@ + + +

    Frequently Asked Questions

    +

    For Users

    +
      +
    1. Why is my job/node in COMPLETING state?
    2. +
    3. Why do I see the error "Can't propagate RLIMIT_..."?
    4. +
    5. Why is my job not running?
    6. +
    7. Why does the srun --overcommit option not permit multiple jobs +to run on nodes?
    8. +
    9. Why is my job killed prematurely?
    10. +
    11. Why are my srun options ignored?
    12. +
    13. Why are "Invalid job credential" errors generated?
    14. +
    15. Why is the SLURM backfill scheduler not starting my +job?
    16. +
    17. How can I run multiple jobs from within a single script?
    18. +
    +

    For Administrators

    +
      +
    1. How is job suspend/resume useful?
    2. +
    3. How can I configure SLURM to use the resources actually +found on a node rather than what is defined in slurm.conf?
    4. +
    5. Why is a node shown in state DOWN when the node +has registered for service?
    6. +
    7. What happens when a node crashes?
    8. +
    9. How can I control the execution of multiple +jobs per node?
    10. +
    11. When the SLURM daemon starts, it prints +"cannot resolve X plugin operations" and exits. What does this mean?
    12. +
    13. Why are user tasks intermittently dying at launch with SIGPIPE +error messages?
    14. +
    15. How can I dry up the workload for a maintenance +period?
    16. +
    17. How can PAM be used to control a user's limits on or +access to compute nodes?
    18. +
    19. Why are jobs allocated nodes and then unable to initiate +programs on some nodes?
    20. +
    21. Why does slurmctld log that some nodes +are not responding even if they are not in any partition?
    22. +
    23. How should I relocated the primary or backup +controller?
    24. +
    25. Can multiple SLURM systems be run in +parallel for testing purposes?
    26. +
    27. Can multiple slurmd daemons be run +on the compute node(s) to emulate a larger cluster?
    28. +
    + +

    For Users

    +

    1. Why is my job/node in COMPLETING state?
    +When a job is terminating, both the job and its nodes enter the state "completing." +As the SLURM daemon on each node determines that all processes associated with +the job have terminated, that node changes state to "idle" or some other +appropriate state. When every node allocated to a job has determined that all +processes associated with it have terminated, the job changes state to "completed" +or some other appropriate state. Normally, this happens within a fraction of one +second. However, if the job has processes that cannot be terminated with a SIGKILL, +the job and one or more nodes can remain in the completing state for an extended +period of time. This may be indicative of processes hung waiting for a core file +to complete I/O or operating system failure. If this state persists, the system +administrator should use the scontrol command +to change the node's state to DOWN (e.g. "scontrol update +NodeName=name State=DOWN Reason=hung_completing"), reboot the node, +then reset the node's state to IDLE (e.g. "scontrol update +NodeName=name State=RESUME").

    + +

    2. Why do I see the error "Can't propagate RLIMIT_..."?
    +When the srun command executes, it captures the +resource limits in effect at that time. These limits are propagated to the allocated +nodes before initiating the user's job. If the soft resource limits on the job +submit host are higher than the hard resource limits on the allocated host, SLURM +will be unable to propagate the resource limits and print an error of the type +shown above. It is recommended that the system administrator establish uniform +hard resource limits on all nodes within a cluster to prevent this from occurring.

    + +

    3. Why is my job not running?
    +The answer to this question depends upon the scheduler used by SLURM. Executing +the command

    +
    +

    scontrol show config | grep SchedulerType

    +
    +

    will supply this information. If the scheduler type is builtin, then +jobs will be executed in the order of submission for a given partition. Even if +resources are available to initiate your job immediately, it will be deferred +until no previously submitted job is pending. If the scheduler type is backfill, +then jobs will generally be executed in the order of submission for a given partition +with one exception: later submitted jobs will be initiated early if doing so does +not delay the expected execution time of an earlier submitted job. In order for +backfill scheduling to be effective, users jobs should specify reasonable time +limits. If jobs do not specify time limits, then all jobs will receive the same +time limit (that associated with the partition), and the ability to backfill schedule +jobs will be limited. The backfill scheduler does not alter job specifications +of required or excluded nodes, so jobs which specify nodes will substantially +reduce the effectiveness of backfill scheduling. See the +backfill section for more details. If the scheduler type is wiki, +this represents + +The Maui Scheduler or + +Moab Cluster Suite. +Please refer to its documentation for help. For any scheduler, you can check priorities +of jobs using the command scontrol show job.

    +

    4. Why does the srun --overcommit option not permit multiple jobs +to run on nodes?
    +The --overcommit option is a means of indicating that a job or job step is willing +to execute more than one task per processor in the job's allocation. For example, +consider a cluster of two processor nodes. The srun execute line may be something +of this sort +

    +

    srun --ntasks=4 --nodes=1 a.out

    +
    +This will result in not one, but two nodes being allocated so that each of the four +tasks is given its own processor. Note that the srun --nodes option specifies +a minimum node count and optionally a maximum node count. A command line of +
    +

    srun --ntasks=4 --nodes=1-1 a.out

    +
    +would result in the request being rejected. If the --overcommit option +is added to either command line, then only one node will be allocated for all +four tasks to use. +

    More than one job can execute simultaneously on the same nodes through the use +of srun's --shared option in conjunction with the Shared parameter +in SLURM's partition configuration. See the man pages for srun and slurm.conf for +more information. +

    5. Why is my job killed prematurely?
    +SLURM has a job purging mechanism to remove inactive jobs (resource allocations) +before reaching its time limit, which could be infinite. +This inactivity time limit is configurable by the system administrator. +You can check it's value with the command +

    +

    scontrol show config | grep InactiveLimit

    +
    +The value of InactiveLimit is in seconds. +A zero value indicates that job purging is disabled. +A job is considered inactive if it has no active job steps or if the srun +command creating the job is not responding. +In the case of a batch job, the srun command terminates after the job script +is submitted. +Therefore batch job pre- and post-processing is limited to the InactiveLimit. +Contact your system administrator if you believe the InactiveLimit value +should be changed. + +

    6. Why are my srun options ignored?
    +Everything after the command srun is +examined to determine if it is a valid option for srun. The first +token that is not a valid option for srun is considered the command +to execute and everything after that is treated as an option to +the command. For example: +

    +

    srun -N2 hostname -pdebug

    +
    +srun processes "-N2" as an option to itself. "hostname" is the +command to execute and "-pdebug" is treated as an option to the +hostname command. Which will change the name of the computer +on which SLURM executes the command - Very bad, Don't run +this command as user root!

    + +

    7. Why are "Invalid job credential" errors generated? +
    +This error is indicative of SLURM's job credential files being inconsistent across +the cluster. All nodes in the cluster must have the matching public and private +keys as defined by JobCredPrivateKey and JobCredPublicKey in the +slurm configuration file slurm.conf. + +

    8. Why is the SLURM backfill scheduler not starting my job? +
    +There are significant limitations in the current backfill scheduler plugin. +It was designed to perform backfill node scheduling for a homogeneous cluster. +It does not manage scheduling on individual processors (or other consumable +resources). It also does not update the required or excluded node list of +individual jobs. These are the current limiations. You can use the +scontrol show command to check if these conditions apply. +

      +
    • partition: State=UP
    • +
    • partition: RootOnly=NO
    • +
    • partition: Shared=NO
    • +
    • job: ReqNodeList=NULL
    • +
    • job: ExcNodeList=NULL
    • +
    • job: Contiguous=0
    • +
    • job: Features=NULL
    • +
    • job: MinProcs, MinMemory, and MinTmpDisk satisfied by all nodes in +the partition
    • +
    • job: MinProcs or MinNodes not to exceed partition's MaxNodes
    • +
    +As soon as any priority-ordered job in the partition's queue fail to +satisfy the request, no lower priority job in that partition's queue +will be considered as a backfill candidate. Any programmer wishing +to augment the existing code is welcome to do so. + +

    9. How can I run multiple jobs from within a +single script?
    +A SLURM job is just a resource allocation. You can execute many +job steps within that allocation, either in parallel or sequentially. +Some jobs actually launch thousands of job steps this way. The job +steps will be allocated nodes that are not already allocated to +other job steps. This essential provides a second level of resource +management within the job for the job steps.

    + + + +

    For Administrators

    +

    1. How is job suspend/resume useful?
    +Job suspend/resume is most useful to get particularly large jobs initiated +in a timely fashion with minimal overhead. Say you want to get a full-system +job initiated. Normally you would need to either cancel all running jobs +or wait for them to terminate. Canceling jobs results in the loss of +their work to that point from either their beginning or last checkpoint. +Waiting for the jobs to terminate can take hours, depending upon your +system configuration. A more attractive alternative is to suspend the +running jobs, run the full-system job, then resume the suspended jobs. +This can easily be accomplished by configuring a special queue for +full-system jobs and using a script to control the process. +The script would stop the other partitions, suspend running jobs in those +partitions, and start the full-system partition. +The process can be reversed when desired. +One can effectively gang schedule (time-slice) multiple jobs +using this mechanism, although the algorithms to do so can get quite +complex. +Suspending and resuming a job makes use of the SIGSTOP and SIGCONT +signals respectively, so swap and disk space should be sufficient to +accommodate all jobs allocated to a node, either running or suspended. + +

    2. How can I configure SLURM to use +the resources actually found on a node rather than what is defined +in slurm.conf?
    +SLURM can either base it's scheduling decisions upon the node +configuration defined in slurm.conf or what each node +actually returns as available resources. +This is controlled using the configuration parameter FastSchedule. +Set it's value to zero in order to use the resources actually +found on each node, but with a higher overhead for scheduling. +A value of one is the default and results in the node configuration +defined in slurm.conf being used. See "man slurm.conf" +for more details.

    + +

    3. Why is a node shown in state +DOWN when the node has registered for service?
    +The configuration parameter ReturnToService in slurm.conf +controls how DOWN nodes are handled. +Set its value to one in order for DOWN nodes to automatically be +returned to service once the slurmd daemon registers +with a valid node configuration. +A value of zero is the default and results in a node staying DOWN +until an administrator explicity returns it to service using +the command "scontrol update NodeName=whatever State=RESUME". +See "man slurm.conf" and "man scontrol" for more +details.

    + +

    4. What happens when a node crashes?
    +A node is set DOWN when the slurmd daemon on it stops responding +for SlurmdTimeout as defined in slurm.conf. +The node can also be set DOWN when certain errors occur or the +node's configuration is inconsistent with that defined in slurm.conf. +Any active job on that node will be killed unless it was submitted +with the srun option --no-kill. +Any active job step on that node will be killed. +See the slurm.conf and srun man pages for more information.

    + +

    5. How can I control the execution of multiple +jobs per node?
    +There are two mechanism to control this. +If you want to allocate individual processors on a node to jobs, +configure SelectType=select/cons_res. +See Consumable Resources in SLURM +for details about this configuration. +If you want to allocate whole nodes to jobs, configure +configure SelectType=select/linear. +Each partition also has a configuration parameter Shared +that enables more than one job to execute on each node. +See man slurm.conf for more information about these +configuration paramters.

    + +

    6. When the SLURM daemon starts, it +prints "cannot resolve X plugin operations" and exits. +What does this mean?
    +This means that symbols expected in the plugin were +not found by the daemon. This typically happens when the +plugin was built or installed improperly or the configuration +file is telling the plugin to use an old plugin (say from the +previous version of SLURM). Restart the daemon in verbose mode +for more information (e.g. "slurmctld -Dvvvvv"). + +

    7. Why are user tasks intermittently dying +at launch with SIGPIPE error messages?
    +If you are using ldap or some other remote name service for +username and groups lookup, chances are that the underlying +libc library functions are triggering the SIGPIPE. You can likely +work around this problem by setting CacheGroups=1 in your slurm.conf +file. However, be aware that you will need to run "scontrol +reconfigure " any time your groups database is updated. + +

    8. How can I dry up the workload for a +maintenance period?
    +There isn't a mechanism to tell SLURM that all jobs should be +completed by a specific time. The best way to address this is +to shorten the MaxTime associated with the partitions so +as to avoid initiating jobs that will not have completed by +the maintenance period. + +

    9. How can PAM be used to control a user's limits on +or access to compute nodes?
    +First, enable SLURM's use of PAM by setting UsePAM=1 in +slurm.conf.
    +Second, establish a PAM configuration file for slurm in /etc/pam.d/slurm. +A basic configuration you might use is:
    +

    +auth     required  pam_localuser.so
    +account  required  pam_unix.so
    +session  required  pam_limits.so
    +
    +Third, set the desired limits in /etc/security/limits.conf. +For example, to set the locked memory limit to unlimited for all users:
    +
    +*   hard   memlock   unlimited
    +*   soft   memlock   unlimited
    +
    +Finally, you need to disable SLURM's forwarding of the limits from the +session from which the srun initiating the job ran. By default +all resource limits are propogated from that session. For example, adding +the following line to slurm.conf will prevent the locked memory +limit from being propagated:PropagateResourceLimitsExcept=MEMLOCK. + +

    We also have a PAM module for SLURM that prevents users from +logging into nodes that they have not been allocated (except for user +root, which can always login. pam_slurm is available for download from +ftp://ftp.llnl.gov/pub/linux/pam_slurm +The use of pam_slurm does not require UsePAM being set. The +two uses of PAM are independent. + +

    10. Why are jobs allocated nodes and then unable +to initiate programs on some nodes?
    +This typically indicates that the time on some nodes is not consistent +with the node on which the slurmctld daemon executes. In order to +initiate a job step (or batch job), the slurmctld daemon generates +a credential containing a time stamp. If the slurmd daemon +receives a credential containing a time stamp later than the current +time or more than a few minutes in the past, it will be rejected. +If you check in the SlurmdLog on the nodes of interest, you +will likely see messages of this sort: "Invalid job credential from +<some IP address>: Job credential expired." Make the times +consistent across all of the nodes and all should be well. + +

    11. Why does slurmctld log that some nodes +are not responding even if they are not in any partition?
    +The slurmctld daemon periodically pings the slurmd +daemon on every configured node, even if not associated with any +partition. You can control the frequency of this ping with the +SlurmdTimeout configuration parameter in slurm.conf. + +

    12. How should I relocated the primary or +backup controller?
    +If the cluster's computers used for the primary or backup controller +will be out of service for an extended period of time, it may be desirable +to relocate them. In order to do so, follow this procedure: +

      +
    1. Stop all SLURM daemons
    2. +
    3. Modify the ControlMachine, ControlAddr, +BackupController, and/or BackupAddr in the slurm.conf file
    4. +
    5. Distribute the updated slurm.conf file file to all nodes
    6. +
    7. Restart all SLURM daemons
    8. +
    +There should be no loss of any running or pending jobs. Insure that +any nodes added to the cluster have a current slurm.conf file +installed. +CAUTION: If two nodes are simultaneously configured as the primary +controller (two nodes on which ControlMachine specify the local host +and the slurmctld daemon is executing on each), system behavior will be +destructive. If a compute node has an incorrect ControlMachine or +BackupController parameter, that node may be rendered unusable, but no +other harm will result. + +

    13. Can multiple SLURM systems be run in +parallel for testing purposes?
    +Yes, this is a great way to test new versions of SLURM. +Just install the test version in a different location with a different +slurm.conf. +The test system's slurm.conf should specify different +pathnames and port numbers to avoid conflicts. +The only problem is if more than one version of SLURM is configured +with switch/elan or switch/federation. +In that case, there can be conflicting switch window requests from +the different SLURM systems. +This can be avoided by configuring the test system with switch/none. +MPI jobs started on an Elan or Federation switch system without the +switch windows configured will not execute properly, but other jobs +will run fine. +Another option for testing on Elan or Federation systems is to use +a different set of nodes for the different SLURM systems. +That will permit both systems to allocate switch windows without +conflicts. + +

    14. Can multiple slurmd daemons be run +on the compute node(s) to emulate a larger cluster?
    +Yes, this can be useful for testing purposes. +It has also been used to partition "fat" nodes into multiple SLURM nodes. +

      +
    1. When executing the configure program, use the option +--multiple-slurmd (or add that option to your ~/.rpmmacros +file).
    2. +
    3. Build and install SLURM in the usual manner.
    4. +
    5. In slurm.conf define the desired node names (arbitrary +names used only by SLURM) as NodeName along with the actual +address of the physical node in NodeHostname. Multiple +NodeName values can be mapped to a single +NodeHostname. Note that each NodeName on a single +physical node needs to be configured to use a different port number. You +will also want to use the "%n" symbol in slurmd related path options in +slurm.conf.
    6. +
    7. When starting the slurmd daemon, include the NodeName +of the node that it is supposed to serve on the execute line.
    8. +
    +It is strongly recommended that SLURM version 1.2 or higher be used +for this due to it's improved support for multiple slurmd daemons. + +See the +Programmers Guide +for more details about configuring multiple slurmd support. + + + +

    Last modified 11 October 2006

    + + diff --git a/executable_names/doc/html/footer.txt b/executable_names/doc/html/footer.txt new file mode 100644 index 0000000000000000000000000000000000000000..275db69e362437b88a47bbc4a8d3adfc0c2a3760 --- /dev/null +++ b/executable_names/doc/html/footer.txt @@ -0,0 +1,17 @@ + + + + + + diff --git a/executable_names/doc/html/header.txt b/executable_names/doc/html/header.txt new file mode 100644 index 0000000000000000000000000000000000000000..29314017996b4e5992677c779ca4731b7b4db42c --- /dev/null +++ b/executable_names/doc/html/header.txt @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + +Simple Linux Utility for Resource Management + + + +
    + + + + + +
    + diff --git a/executable_names/doc/html/help.shtml b/executable_names/doc/html/help.shtml new file mode 100644 index 0000000000000000000000000000000000000000..d406a4ef774e7208e0feb3f554e93facaa8384eb --- /dev/null +++ b/executable_names/doc/html/help.shtml @@ -0,0 +1,20 @@ + + +

    Getting Help

    +

    Try the following steps if you are having problems with SLURM:

    +
      +
    1. See if the problem is addressed in the SLURM FAQ +or SLURM Troubleshooting Guide.
    2. +
    3. For run-time problems, try running the command or daemons in verbose mode +(-v option), and see if additional information +helps you resolve the problem.
    4. +
    5. Customers of HP, Linux NetworX and others providing commercial support +for SLURM should contact their support staff.
    6. +
    7. Send a detailed description of the problem, the output from the command +"scontrol show config", logs, back traces from any core files, etc. to +slurm-dev@lists.llnl.gov.
    8. +
    + +

    Last modified 13 October 2006

    + + diff --git a/executable_names/doc/html/ibm.shtml b/executable_names/doc/html/ibm.shtml new file mode 100644 index 0000000000000000000000000000000000000000..313d027e224762c5e4c609543e7b576a03e5c9d5 --- /dev/null +++ b/executable_names/doc/html/ibm.shtml @@ -0,0 +1,90 @@ + + +

    IBM AIX User and Administrator Guide

    + +

    Overview

    + +

    This document describes the unique features of SLURM on the +IBM AIX computers with a Federation switch. +You should be familiar with the SLURM's mode of operation on Linux clusters +before studying the relatively few differences in IBM system operation +described in this document.

    + +

    User Tools

    + +

    The normal set of SLURM user tools: srun, scancel, sinfo, smap, squeue and scontrol +provide all of the expected services except support for job steps. +While the srun command will launch the tasks of a job step on an IBM +AIX system, it does not support use of the Federation switch or IBM's MPI. +Job steps should be launched using IBM's poe command. +This architecture insures proper operation of all IBM tools.

    + +

    You will use srun to submit a batch script to SLURM. +This script should contain one or more invocations of poe to launch +the tasks. +If you want to run a job interactively, just execute poe directly. +Poe will recognize that it lacks a SLURM job allocation (the SLURM_JOBID +environment variable will be missing) and create the SLURM allocation +prior to launching tasks.

    + +

    Each poe invocation (or SLURM job step) can have it's own network +specification. +For example one poe may use IP mode communications and the next use +User Space (US) mode communcations. +This enhancement to normal poe functionality may be accomplished by +setting the SLURM_NETWORK environment variable. +The format of SLURM_NETWORK is "network.[protocol],[type],[usage],[mode]". +For example "network.mpi,en0,shared,ip". +See LoadLeveler documentation for more details.

    + +

    Checkpoint

    + +

    SLURM supports checkpoint via poe. +In order to enable checkpoint, the shell executing the poe command must +itself be initiated with the environment variable CHECKPOINT=yes. +One file is written for each node on which the job is executing, plus +another for the script executing poe.a +By default, the checkpoint files will be written to the current working +directory of the job. +Names and locations of these files can be controled using the +environment variables MP_CKPTFILE and MP_CKPTDIR. +Use the squeue command to identify the job and job step of interest. +To initiate a checkpoint in which the job step will continue execution, +use the command:
    +scontrol check create job_id.step_id
    +To initiate a checkpoint in which the job step will terminate afterwards, +use the command:
    +scontrol check vacate job_id.step_id

    + +

    System Administration

    + +

    Three unique components are required to use SLURM on an IBM system. +

      +
    1. The Federation switch plugin is required. +This component is packaged with the SLURM distrbution.
    2. +
    3. There is a process tracking kernel extension required. +This is used to insure that all processes associated with a job +are tracked. +SLURM normatlly uses session ID and process group ID on Linux systems, +but these mechanisms can not prevent user processes from establishing +their own session or process group and thus "escape" from SLURM +tracking. +This kernel extension is not packaged with SLURM, but is available +upon request.
    4. +
    5. The final component is a library that accepts poe library calls +and performs actions in SLURM to satisfy these requests, such +as launching tasks. +This library is based upon IBM Confidential information and is +not at this time available for distribution. +Interested parties are welcome to pursue the possible distribution +of this library with IBM and SLURM developers.
    6. +
    +Until this last issue is resolved, use of SLURM on an IBM AIX system +should not be viewed as a supported configuration (at least outside +of LLNL, which established a contract with IBM for this purpose).

    + + + +

    Last modified 31 August 2005

    + + diff --git a/executable_names/doc/html/jobacctplugins.shtml b/executable_names/doc/html/jobacctplugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..9c4b7154f5e9ea9c36f2d04e6be031939b103764 --- /dev/null +++ b/executable_names/doc/html/jobacctplugins.shtml @@ -0,0 +1,347 @@ + + +

    SLURM Job Accounting Plugin API

    + +

    Overview

    +

    This document describes SLURM job accounting plugins and the API that +defines them. It is intended as a resource to programmers wishing to write +their own SLURM job accounting plugins. This is version 1 of the API. + + +

    SLURM job accounting plugins must conform to the +SLURM Plugin API with the following specifications: + +

    const char +plugin_name[]="full text name" +

    +A free-formatted ASCII text string that identifies the plugin. + +

    const char +plugin_type[]="major/minor"
    +

    +The major type must be "jobacct." +The minor type can be any suitable name +for the type of accounting package. We currently use +

      +
    • linux—Gathers information from linux proctable and addes this +information to the standard rusage information also gathered for each job. +
    • none—No information gathered. +
    +The sacct program can be used to display gathered data from regular +accounting and from these plugins. +

    The programmer is urged to study +src/plugins/jobacct/linux and +src/plugins/jobacct/common +for a sample implementation of a SLURM job accounting plugin. +

    API Functions

    + +The job accounting API uses hooks in the slurmctld, slurmd, and slurmstepd. + +

    All of the following functions are required. Functions which are not +implemented must be stubbed. + +

    Functions called by all slurmstepd processes

    + +

    int jobacct_p_startpoll(int frequency) +

    Description: +jobacct_p_startpoll() is called at the start of the slurmstepd, +this starts a thread that should poll information to be queried at any time +during throughout the end of the process. +Put global initialization here. +

    Arguments: +frequency (input) poll frequency for polling +thread. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    int jobacct_p_endpoll() +

    Description: +jobacct_p_endpoll() is called when the process is finished to stop the +polling thread. +

    Arguments: +none +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    void jobacct_p_suspendpoll() +

    Description: +jobacct_p_suspendpoll() is called when the process is suspended or resumed. +This causes the polling thread to halt until the process is resumed. +

    Arguments: +none +

    Returns: +none + +

    int jobacct_p_add_task(pid_t pid, uint16_t tid) +

    Description: +jobacct_p_add_task() used to add a task to the poller. +

    Arguments: + pid (input) Process id + tid (input) slurm global task id +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    jobacctinfo_t *jobacct_p_stat_task(pid_t pid) +

    Description: +jobacct_p_stat_task() used to get most recent information about task. +You need to FREE the information returned by this function! +

    Arguments: + pid (input) Process id +

    Returns: +jobacctinfo structure pointer on success, or +NULL on failure. + +

    jobacctinfo_t *jobacct_p_remove_task(pid_t pid) +

    Description: +jobacct_p_remove_task() used to remove a task from the poller. +You need to FREE the information returned by this function! +

    Arguments: + pid (input) Process id +

    Returns: +Pointer to removed jobacctinfo_t structure +on success, or +NULL on failure. + +

    Functions called by the slurmctld process

    + +

    int jobacct_p_init_slurmctld(char *job_acct_log) +

    Description: +jobacct_p_init_slurmctld() is called at the start of the slurmctld, +this opens the logfile to be written to. +Put global initialization here. +

    Arguments: +job_acct_log (input) logfile name. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    int jobacct_p_fini_slurmctld() +

    Description: +jobacct_p_fini_slurmctld() is called at the end of the slurmctld, +this closes the logfile. +

    Arguments: +none +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    +int jobacct_p_job_start_slurmctld(struct job_record *job_ptr) +

    Description: +jobacct_p_job_start_slurmctld() is called at the allocation of a new job in +the slurmctld, this prints out beginning information about a job. +

    Arguments: +job_ptr (input) information about the job in +slurmctld. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    +int jobacct_p_job_complete_slurmctld(struct job_record *job_ptr) +

    Description: +jobacct_p_job_complete_slurmctld() is called at the end of a job in +the slurmctld, this prints out ending information about a job. +

    Arguments: +job_ptr (input) information about the job in +slurmctld. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    +int jobacct_p_step_start_slurmctld(struct step_record *step_ptr) +

    Description: +jobacct_p_step_start_slurmctld() is called at the allocation of a new step in +the slurmctld, this prints out beginning information about a step. +

    Arguments: +step_ptr (input) information about the step in +slurmctld. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    +int jobacct_p_step_complete_slurmctld(struct step_record *step_ptr) +

    Description: +jobacct_p_step_complete_slurmctld() is called at the end of a step in +the slurmctld, this prints out ending information about a step. +

    Arguments: +step_ptr (input) information about the step in +slurmctld. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    +int jobacct_p_suspend_slurmctld(struct job_record *job_ptr) +

    Description: +jobacct_p_suspend_slurmctld() is called when a job is suspended or resumed in +the slurmctld, this prints out information about the suspension of the job +to the logfile. +

    Arguments: +job_ptr (input) information about the job in +slurmctld. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    Functions common to all processes

    + +

    +int jobacct_p_init_struct(jobacctinfo_t *jobacct, uint16_t tid) +

    Description: +jobacct_p_init_struct() is called to set the values of a jobacctinfo_t to +initial values. +

    Arguments: +jobacct +(input/output) structure to be altered. +tid +(input) id of the task send in (uint16_t)NO_VAL if no specfic task. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    jobacctinfo_t *jobacct_p_alloc(uint16_t tid) +

    Description: +jobacct_p_alloc() used to alloc a pointer to and initialize a +new jobacctinfo structure.
    +You will need to free the information returned by this function! +

    Arguments: +tid +(input) id of the task send in (uint16_t)NO_VAL if no specfic task. +

    Returns: +jobacctinfo structure pointer on success, or +NULL on failure. + +

    void jobacct_p_free(jobacctinfo_t *jobacct) +

    Description: +jobacct_p_free() used to free the allocation made by jobacct_p_alloc(). +

    Arguments: +jobacct +(input) structure to be freed. +none +

    Returns: +none + +

    +int jobacct_p_setinfo(jobacctinfo_t *jobacct, + enum jobacct_data_type type, void *data) +

    Description: +jobacct_p_setinfo() is called to set the values of a jobacctinfo_t to +specific values based on inputs. +

    Arguments: +jobacct +(input/output) structure to be altered. +type +(input) enum of specific part of jobacct to alter. +data +(input) corresponding data to set jobacct part to. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    +int jobacct_p_getinfo(jobacctinfo_t *jobacct, + enum jobacct_data_type type, void *data) +

    Description: +jobacct_p_getinfo() is called to get the values of a jobacctinfo_t +specific values based on inputs. +

    Arguments: +jobacct +(input) structure to be queried. +type +(input) enum of specific part of jobacct to get. +data +(output) corresponding data to from jobacct part. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    +void jobacct_p_aggregate(jobacctinfo_t *dest, jobacctinfo_t *from) +

    Description: +jobacct_p_aggregate() is called to aggregate and get max values from two +different jobacctinfo structures. +

    Arguments: +dest +(input/output) initial structure to be applied to. +from +(input) new info to apply to dest. +

    Returns: +none + +

    +void jobacct_p_2_sacct(sacct_t *sacct, jobacctinfo_t *jobacct) +

    Description: +jobacct_p_2_sacct() is called to transfer information from data structure +jobacct to structure sacct. +

    Arguments: +sacct +(input/output) initial structure to be applied to. +jobacct +(input) jobacctinfo_t structure containing information to apply to sacct. +

    Returns: +none + +

    +void jobacct_p_pack(jobacctinfo_t *jobacct, Buf buffer) +

    Description: +jobacct_p_pack() pack jobacctinfo_t in a buffer to send across the network. +

    Arguments: +jobacct +(input) structure to pack. +buffer +(input/output) buffer to pack structure into. +

    Returns: +none + +

    +void jobacct_p_unpack(jobacctinfo_t *jobacct, Buf buffer) +

    Description: +jobacct_p_unpack() unpack jobacctinfo_t from a buffer received from +the network. +You will need to free the jobacctinfo_t returned by this function! +

    Arguments: +jobacct +(input/output) structure to fill. +buffer +(input) buffer to unpack structure from. +

    Returns: +SLURM_SUCCESS on success, or +SLURM_FAILURE on failure. + +

    Parameters

    +

    Rather than proliferate slurm.conf parameters for new or evolved +plugins, the job accounting API counts on three parameters: +

    +
    JobAcctType +
    Specifies which plugin should be used. +
    JobAcctFrequency +
    Let the plugin know how long between pollings. +
    JobAcctLogFile +
    Let the plugin the name of the logfile to use. +
    + +

    Versioning

    +

    This document describes version 1 of the SLURM Job Accounting API. Future +releases of SLURM may revise this API. A job accounting plugin conveys its +ability to implement a particular API version using the mechanism outlined +for SLURM plugins. +

    Last modified 6 April 2006

    + + diff --git a/executable_names/doc/html/jobcompplugins.shtml b/executable_names/doc/html/jobcompplugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..93f21b5bc070e429d4f43c35431cc23f64301048 --- /dev/null +++ b/executable_names/doc/html/jobcompplugins.shtml @@ -0,0 +1,103 @@ + + +

    SLURM Job Completion Logging Plugin API

    + +

    Overview

    +

    This document describes SLURM job completion logging plugins and the API that defines +them. It is intended as a resource to programmers wishing to write their own SLURM +job completion logging plugins. This is version 0 of the API.

    +

    SLURM job completion logging plugins are SLURM plugins that implement the SLURM +API for logging job information upon their completion. This may be used to log job information +to a text file, database, etc. The plugins must conform to the SLURM Plugin API with the following +specifications:

    +

    const char plugin_type[]
    +The major type must be "jobcomp." The minor type can be any recognizable +abbreviation for the type of scheduler. We recommend, for example:

    +
      +
    • none—No job logging.
    • +
    • filetxt—Log job information to a text file.
    • +
    • script—Execute a script passing in job information in environment variables.
    • +
    +

    The plugin_name and +plugin_version +symbols required by the SLURM Plugin API require no specialization for +job completion logging support. +Note carefully, however, the versioning discussion below.

    +

    The programmer is urged to study +src/plugins/jobcomp/jobcomp_filetxt.c and +src/plugins/jobcomp/jobcomp_none.c +for sample implementations of a SLURM job completion logging plugin.

    + + +

    Data Objects

    +

    The implementation must maintain (though not necessarily directly export) an +enumerated errno to allow SLURM to discover +as practically as possible the reason for any failed API call. Plugin-specific enumerated +integer values should be used when appropriate. It is desirable that these values +be mapped into the range ESLURM_JOBCOMP_MIN and ESLURM_JOBCOMP_MAX +as defined in slurm/slurm_errno.h. +The error number should be returned by the function +slurm_jobcomp_get_errno() +and this error number can be converted to an appropriate string description using the +slurm_jobcomp_strerror() +function described below.

    + +

    These values must not be used as return values in integer-valued functions +in the API. The proper error return value from integer-valued functions is SLURM_ERROR. +The implementation should endeavor to provide useful and pertinent information by +whatever means is practical. +Successful API calls are not required to reset any errno to a known value. However, +the initial value of any errno, prior to any error condition arising, should be +SLURM_SUCCESS.

    + + +

    API Functions

    +

    The following functions must appear. Functions which are not implemented should +be stubbed.

    + +

    int slurm_jobcomp_set_location (char * location);

    +

    Description: Specify the location to be used for job logging.

    +

    Argument: location  +  (input) specification of where logging should be done. The interpretation of +this string is at the discression of the plugin implementation.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int slurm_jobcomp_log_record ( struct job_record *job_ptr);

    +

    Description: Note termation of a job with the specified +characteristics.

    +

    Argument:
    + job_ptr   (input) Pointer to job record as defined +in src/slurmctld/slurmctld.h

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + + +

    int slurm_jobcomp_get_errno (void);

    +

    Description: Return the number of a job completion +logger specific error.

    +

    Arguments: None

    +

    Returns: Error number for the last failure encountered by +the job completion logging plugin.

    + +

    const char *slurm_jobcomp_strerror(int errnum);

    +

    Description: Return a string description of a job completion +logger specific error code.

    +

    Arguments: + errnum    (input) a job completion logger +specific error code.

    +

    Returns: Pointer to string describing the error +or NULL if no description found in this plugin.

    + + +

    Versioning

    +

    This document describes version 0 of the SLURM job completion API. Future +releases of SLURM may revise this API. A job completion plugin conveys its ability +to implement a particular API version using the mechanism outlined for SLURM plugins.

    + + +

    Last modified 10 July 2005

    + + diff --git a/executable_names/doc/html/lci.7.tutorial.pdf b/executable_names/doc/html/lci.7.tutorial.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4232dab419cffb2a46cdcdda9f870c3e6a11ec0e Binary files /dev/null and b/executable_names/doc/html/lci.7.tutorial.pdf differ diff --git a/executable_names/doc/html/lll.gif b/executable_names/doc/html/lll.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1227248e0ac713e2206273b4009d96d3f5184b3 Binary files /dev/null and b/executable_names/doc/html/lll.gif differ diff --git a/executable_names/doc/html/mail.shtml b/executable_names/doc/html/mail.shtml new file mode 100644 index 0000000000000000000000000000000000000000..78e4a20a2668bd70308b794e5bcca19d8aab038c --- /dev/null +++ b/executable_names/doc/html/mail.shtml @@ -0,0 +1,19 @@ + + +

    Mailing Lists

    +

    We maintain two SLURM mailing lists: +

      +
    • slurm-announce is designated for communications about SLURM releases +[low traffic].
    • +
    • slurm-dev is designated for communications to SLURM developers +[high traffic at times].
    • +
    +To subscribe to either list, send a message to +majordomo@lists.llnl.gov with the body of the +message containing the word "subscribe" followed by the list name and your e-mail address +(if not the sender). For example:
    +subscribe slurm-announce bob@yahoo.com

    + +

    Last modified 13 May 2005

    + + diff --git a/executable_names/doc/html/maui.shtml b/executable_names/doc/html/maui.shtml new file mode 100644 index 0000000000000000000000000000000000000000..bf00627b86fdf9c26a34a88a9af1ba3639c17590 --- /dev/null +++ b/executable_names/doc/html/maui.shtml @@ -0,0 +1,92 @@ + + +

    Maui Scheduler Integration Guide

    +

    Overview

    +

    Maui configuration is quite complicated and is really beyond the scope +of any documents we could supply with SLURM. +The best resource for Maui configuration information is the +online documents at Cluster Resources Inc.: + +http://www.clusterresources.com/products/maui/docs/mauiadmin.shtml. + +

    Configuration

    +

    First, download the Maui scheduler kit from their web site + +http://www.clusterresources.com/pages/products/maui-cluster-scheduler.php. +Note: maui-3.2.6p9 has been validated with SLURM, other versions +should also work properly.

    + +

    Make sure that SLURM is installed and running before building Maui. +Then build Maui from its source distribution. This is a two step process: +

      +
    1. ./configure --with-key=42 --with-wiki +
    2. gmake +
    +The key of 42 is arbitrary. You can use any value, but will need to +specify the same value as a SLURM configuration parameter.

    + +

    Update the Maui configuration file maui.conf (Copy the file +maui-3.2.6p9/maui.cfg.dist to maui.conf). Add the following configuration +paramters to maui.conf: +

    +RMCFG[host]       TYPE=WIKI
    +RMPORT            7321            # or whatever you choose as a port
    +RMHOST            host
    +RMAUTHTYPE[host]  NONE
    +
    +host is the hostname where the SLURM controller is running. +This must match the value of ControlMachine configured in +slurm.conf. Note that localhost doesn't work. If you run Maui +and SLURM on the same machine, you must specify the actual host name. +The above example uses a TCP port number of 7321 for +communications between SLURM and Maui, but you can pick any port that +is available and accessible. You can also set a polling interval with +
    +RMPOLLINTERVAL  00:00:20
    +
    +I like Maui to poll SLURM quite often -- in this case every 20 seconds. +Note that a job submitted to an idle cluster will not be initiated until +the Maui daemon polls SLURM and decides to make it run, so the value of +RMPOLLINTERVAL should be set to a value appropriate for your site +considering both the desired system responsiveness and the overhead of +executing Maui daemons too frequently.

    + +

    In order for Maui to be able to access your SLURM partition, you will +need to define in maui.conf a partition with the same name as the SLURM +partition(s). For example if nodes "linux[0-3]" are in SLURM partition +"PartA", slurm.conf includes a line of this sort: +

    +PartitionName=PartA Default=yes Nodes=linux[0-3]
    +
    +The add the corresponding lines to maui.cfg: +
    +PARTITIONMODE ON
    +NODECFG[linux0]   PARTITION=PartA
    +NODECFG[linux1]   PARTITION=PartA
    +NODECFG[linux2]   PARTITION=PartA
    +NODECFG[linux3]   PARTITION=PartA
    +
    + +

    +Set the slurm.conf scheduler parameters as follows: +

    +SchedulerType=sched/wiki
    +SchedulerPort=7321
    +SchedulerAuth=42
    +
    +In this case, "SchedulerAuth" has been set to 42, which was the key +specified when Maui was configured above. Just make sure the numbers match. +The Maui folks have assured me that the key won't always be a compiled-in +feature.

    + +

    Set the following environment variables and path: +

    +set path=(/root/MAUI/maui-3.2.6p9/bin $path)
    +setenv MAUIHOMEDIR /root/MAUI/maui-3.2.6p9
    +
    + + + +

    Last modified 24 August 2006

    + + diff --git a/executable_names/doc/html/mc_support.gif b/executable_names/doc/html/mc_support.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc2180292c6a9bdfd494aab235e5aec6bc40536d Binary files /dev/null and b/executable_names/doc/html/mc_support.gif differ diff --git a/executable_names/doc/html/mc_support.shtml b/executable_names/doc/html/mc_support.shtml new file mode 100644 index 0000000000000000000000000000000000000000..0a18e61a60ddd0882e8078dfef3350aedf061cbd --- /dev/null +++ b/executable_names/doc/html/mc_support.shtml @@ -0,0 +1,1050 @@ + + +

    Support for Multi-core/Multi-thread Architectures

    + +Note: This document describes features added to SLURM version 1.2. + +

    Contents

    + + + + +

    Definitions

    + +

    Socket/Core/Thread - Figure 1 illustrates the notion of +Socket, Core and Thread as it is defined in SLURM's multi-core/multi-thread +support documentation.

    + +
    + +
    +Figure 1: Socket vs. Core vs. Multi-threading +
    + +
    +
    Affinity +
    The state of being bound to a specific logical processor. +
    Affinity Mask +
    A bitmask where indices correspond to logical processors. +The least significant bit corresponds to the first +logical processor number on the system, while the most +significant bit corresponds to the last logical processor +number on the system. +A '1' in a given position indicates a process can run +on the associated logical processor. +
    Fat Masks +
    Affinity masks with more than 1 bit set +allowing a process to run on more than one logical processor. +
    + + + +

    Overview of new srun flags

    + +

    Several new flags have been defined to allow users to +better take advantage of the new architecture by +explicitly specifying the number of sockets, cores, and threads required +by their application. Table 1 summarizes the new multi-core flags. + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Low-level (explicit binding) +
    --cpu_bind=... Explicit process affinity binding and control options +
    +High-level (automatic mask generation) +
    --sockets-per-node=SNumber of sockets in a node to dedicate to a job (minimum or range) +
    --cores-per-cpu=C Number of cores in a CPU to dedicate to a job (minimum or range) +
    --threads-per-core=T Number of threads in a core +to dedicate to a job (minimum or range) +
    -B S[:C[:T]] Combined shorcut option for --sockets-per-node, --cores-per_cpu, --threads-per_core +
    +New Distributions +
    -m / --distribution Distributions of: block | cyclic | hostfile + | plane=x + | [block|cyclic]:[block|cyclic] +
    +New Constraints +
    --minsockets=MinS Nodes must meet this minimum number of sockets +
    --mincores=MinC Nodes must meet this minimum number of cores per socket +
    --minthreads=MinT Nodes must meet this minimum number of threads per core +
    +Memory as a consumable resource +
    --job-mem=mem maximum amount of real memory per node required by the job. +
    +Task invocation control +
    --ntasks-per-node=ntasks number of tasks to invoke on each node +
    --ntasks-per-socket=ntasks number of tasks to invoke on each socket +
    --ntasks-per-core=ntasks number of tasks to invoke on each core +
    +Application hints +
    --hint=compute_bound use all cores in each physical CPU +
    --hint=memory_bound use only one core in each physical CPU +
    --hint=[no]multithread [don't] use extra threads with in-core multi-threading +
    + +

    +

    +Table 1: New srun flags to support the multi-core/multi-threaded environment +
    + +

    It is important to note that many of these +flags are only meaningful if the processes' affinity is set. In order for +the affinity to be set, the task/affinity plugin must be first enabled in +slurm.conf: + +

    +        TaskPlugin=task/affinity          # enable task affinity   
    +
    + +

    See the "Task Launch" section if generating slurm.conf via +configurator.html. + + +

    Low-level --cpu_bind=... - Explicit binding interface

    + +

    The following srun flag provides a low-level core binding interface:

    + + +
    +    --cpu_bind=        Bind tasks to CPUs
    +        q[uiet]         quietly bind before task runs (default)
    +        v[erbose]       verbosely report binding before task runs
    +        no[ne]          don't bind tasks to CPUs (default)
    +        rank            bind by task rank
    +        map_cpu:<list>  specify a CPU ID binding for each task
    +                        where <list> is <cpuid1>,<cpuid2>,...<cpuidN>
    +        mask_cpu:<list> specify a CPU ID binding mask for each task
    +                        where <list> is <mask1>,<mask2>,...<maskN>
    +        sockets         auto-generated masks bind to sockets
    +        cores           auto-generated masks bind to cores
    +        threads         auto-generated masks bind to threads
    +        help            show this help message
    +
    + +

    The affinity can be either set to either a specific logical processor +(socket, core, threads) or at a coarser granularity than the lowest level +of logical processor (core or thread). +In the later case the processes are allowed to roam within a specific +socket or core. + +

    Examples:

    + +
      +
        +
      • srun -n 8 -N 4 --cpu_bind=mask_cpu:0x1,0x4 a.out +
      • srun -n 8 -N 4 --cpu_bind=mask_cpu:0x3,0xD a.out +
      +
    + +

    See also 'srun --cpu_bind=help' and 'man srun'

    + + +

    High-level -B S[:C[:T]] - Automatic mask generation interface

    + +

    We have updated the node +selection infrastructure with a mechanism that allows selection of logical +processors at a finer granularity. Users are able to request a specific number +of nodes, sockets,  cores, and threads:

    + +
    +    -B --extra-node-info=S[:C[:T]]            Expands to:
    +        --sockets-per-node=S      number of sockets per node to allocate
    +        --cores-per-socket=C      number of cores per socket to allocate
    +        --threads-per-core=T      number of threads per core to allocate
    +                               each field can be 'min[-max]' or wildcard '*'
    +
    +     Total cpus requested = (Nodes) x (S x C x T)
    +
    + +

    Examples: + +

      +
        +
      • srun -n 8 -N 4 -B 2:1 a.out +
      • srun -n 8 -N 4 -B 2 a.out +
        +note: compare the above with the previous corresponding --cpu_bind=... examples + +
      • srun -n 16 -N 4 a.out +
      • srun -n 16 -N 4 -B 2:2:1 a.out +
      • srun -n 16 -N 4 -B 2-2:2-2:1-1 a.out +
              or +
      • srun -n 16 -N 4 --sockets-per-node 2-2 --cores-per-socket 2-2 --threads-per-core 1-1 a.out +
      • srun -n 16 -N 2-4 -B '1-2:*:1' a.out +
      • srun -n 16 -N 4:2 -B '2:*:1-1' a.out +
      • srun -n 16 -N 4:4 -B '1-1:1-1' a.out +
      +
    + +

    Notes:

    +
      +
    • Adding --cpu_bind=no to the command line will cause the processes + to not be bound the logical processors. +
    • Adding --cpu_bind=verbose to the command line (or setting the + CPU_BIND environment variable to "verbose") will cause each task + to report the affinity mask in use +
    • Binding is on by default when -B is used. The default binding on + multi-core/multi-threaded systems is equivalent to the level of + resource enumerated in the -B option. +
    + +

    See also 'srun --help' and 'man srun'

    + + +

    New distributions: Extensions to -m / --distribution

    + +

    The -m / --distribution option for distributing processes across nodes +has been extended to also describe the distribution within the lowest level +of logical processors. +Available distributions include: +
    +block | cyclic | hostfile | plane=x | [block|cyclic]:[block|cyclic]) +

    + +

    The new plane distribution (plane=x) +results in a block cyclic distribution of blocksize equal to x. +In the following we use "lowest level of logical processors" +to describe sockets, cores or threads depending of the architecture. +The new distribution divides +the cluster into planes (including a number of the lowest level of logical +processors on each node) and then schedule first within each plane and then +across planes.

    + +

    For the two dimensional distributions ([block|cyclic]:[block|cyclic]), +the second distribution (after ":") allows users to specify a distribution +method for processes within a node and applies to the lowest level of logical +processors (sockets, core or thread depending on the architecture).

    + +

    The binding is enabled automatically when high level flags are used as long as the task/affinity plug-in +is enabled. To disable binding at the job level use --cpu_bind=no.

    + +

    The distribution flags can be combined with the other switches: + +

      +
        +
      • srun -n 16 -N 4 -B '2:*:1' -m block:cyclic --cpu_bind=socket a.out +
      • srun -n 16 -N 4 -B '2:*:1' -m plane=2 --cpu_bind=core a.out +
      • srun -n 16 -N 4 -B '2:*:1' -m plane=2 a.out +
      +
    + +

    The default distribution on multi-core/multi-threaded systems is equivalent +to -m block:cyclic with --cpu_bind=thread.

    + +

    See also 'srun --help'

    + + +

    New Constraints

    + +To compliment the existing SLURM job minimum constraints +(CPUs, memory, temp disk), +constraint flags have also been added to allow a user to +specify a minimum number of sockets, cores, or threads: + +
    +      --mincpus=n             minimum number of logical cpus per node
    +      --minsockets=n          minimum number of sockets per node
    +      --mincores=n            minimum number of cores per cpu
    +      --minthreads=n          minimum number of threads per core
    +      --mem=MB                minimum amount of real memory
    +      --tmp=MB                minimum amount of temporary disk
    +
    + +These constraints are separate from the -N or -B allocation minimums. +Using these constraints allows the user to exclude smaller nodes from +the allocation request. + +

    See also 'srun --help' and 'man srun'

    + + +

    Memory as a Consumable Resource

    + +The --job-mem flag specifies the maximum amount of memory in MB +needed by the job per node. This flag is used to support the memory +as a consumable resource allocation strategy. + +
    +      --job-mem=MB            maximum amount of real memory per node
    +                              required by the job.
    +                              --mem >= --job-mem if --mem is specified.
    +
    + +This flag allows the scheduler to co-allocate jobs on specific nodes +given that their added memory requirement do not exceed the amount +of memory on the nodes. + + +

    In order to use memory as a consumable resource, the select/cons_res +plugin must be first enabled in slurm.conf: +

    +        SelectType=select/cons_res        # enable consumable resources
    +        SelectTypeParameters=CR_Memory    # memory as a consumable resource
    +
    + +

    Using memory as a consumable resource can also be combined with +the CPU, Socket, or Core consumable resources via: +

    +        CR_CPU_Memory, CR_Socket_Memory, CR_Core_Memory
    +
    + +

    See the "Resource Selection" section if generating slurm.conf +via configurator.html. + +

    See also 'srun --help' and 'man srun'

    + + +

    Task invocation as a function of logical processors

    + +The --ntasks-per-{node,socket,core}=ntasks flags +allow the user to request that no more than ntasks +be invoked on each node, socket, or core. +This is similiar to using --cpus-per-task=ncpus +but does not require knowledge of the actual number of cpus on +each node. In some cases, it is more convenient to be able to +request that no more than a specific number of ntasks be invoked +on each node, socket, or core. Examples of this include submitting +a hybrid MPI/OpenMP app where only one MPI "task/rank" should be +assigned to each node while allowing the OpenMP portion to utilize +all of the parallelism present in the node, or submitting a single +setup/cleanup/monitoring job to each node of a pre-existing +allocation as one step in a larger job script. +This can now be specified via the following flags: + +
    +      --ntasks-per-node=n     number of tasks to invoke on each node
    +      --ntasks-per-socket=n   number of tasks to invoke on each socket
    +      --ntasks-per-core=n     number of tasks to invoke on each core
    +
    + +For example, given a cluster with nodes containing two sockets, +each containing two cores, the following commands illustrate the +behavior of these flags: +
    +        % srun -n 4 hostname
    +        hydra12
    +        hydra12
    +        hydra12
    +        hydra12
    +        % srun -n 4 --ntasks-per-node=1 hostname
    +        hydra12
    +        hydra14
    +        hydra15
    +        hydra13
    +        % srun -n 4 --ntasks-per-node=2 hostname
    +        hydra12
    +        hydra13
    +        hydra13
    +        hydra12
    +        % srun -n 4 --ntasks-per-socket=1 hostname
    +        hydra12
    +        hydra13
    +        hydra13
    +        hydra12
    +        % srun -n 4 --ntasks-per-core=1 hostname
    +        hydra12
    +        hydra12
    +        hydra12
    +        hydra12
    +
    + +

    See also 'srun --help' and 'man srun'

    + + +

    Application hints

    + +Different applications will have various levels of resource +requirements. Some applications tend to be computationally intensive +but require little to no inter-process communication. Some applications +will be memory bound, saturating the memory bandwidth of a processor +before exhausting the computational capabilities. Other applications +will be highly communication intensive causing processes to block +awaiting messages from other processes. Applications with these +different properties tend to run well on a multi-core system given +the right mappings. + +For computationally intensive applications, all cores in a multi-core +system would normally be used. For memory bound applications, only +using a single core on each CPU will result in the highest per +core memory bandwidth. For communication intensive applications, +using in-core multi-threading (e.g. hyperthreading, SMT, or TMT) +may also improve performance. +The following command line flags can be used to communicate these +types of application hints to the SLURM multi-core support: + +
    +    --hint=             Bind tasks according to application hints
    +        compute_bound   use all cores in each physical CPU
    +        memory_bound    use only one core in each physical CPU
    +        [no]multithread [don't] use extra threads with in-core multi-threading
    +        help            show this help message
    +
    + +For example, given a cluster with nodes containing two sockets, +each containing two cores, the following commands illustrate the +behavior of these flags: +
    +        % srun -n 4 --hint=compute_bound --cpu_bind=verbose sleep 1
    +        setting affinity of task 0 pid 15425 on host hydra12 to mask 0x1
    +        setting affinity of task 2 pid 15427 on host hydra12 to mask 0x2
    +        setting affinity of task 1 pid 15426 on host hydra12 to mask 0x4
    +        setting affinity of task 3 pid 15428 on host hydra12 to mask 0x8
    +
    +        % srun -n 4 --hint=memory_bound --cpu_bind=verbose sleep 1
    +        setting affinity of task 1 pid 15551 on host hydra12 to mask 0x4
    +        setting affinity of task 0 pid 15550 on host hydra12 to mask 0x1
    +        setting affinity of task 2 pid 14974 on host hydra13 to mask 0x1
    +        setting affinity of task 3 pid 14975 on host hydra13 to mask 0x4
    +
    + +

    See also 'srun --hint=help' and 'man srun'

    + + +

    Motivation behind high-level srun flags

    + +

    The motivation behind allowing users to use higher level srun +flags instead of --cpu_bind is that the later can be difficult to use. The +proposed high-level flags are easier to use than --cpu_bind because:

    + +
      +
    • Affinity mask generation happens automatically when using the high-level flags.
    • +
    • The length and complexity of the --cpu_bind flag vs. the length +of the combination of -B and --distribution flags make the high-level +flags much easier to use.
    • +
    + +

    Also as illustrated in the example below it is much simpler to specify +a different layout using the high-level flags since users do not have to +recalculate mask or CPU IDs. The new approach is very effortless compared to +rearranging the mask or map.

    + +

    Given a 32-process MPI job and a four dual-CPU dual-core node +cluster, we want to use a block distribution across the four nodes and then a +cyclic distribution within the node across the physical processors. We have had +several requests from users that they would like this distribution to be the +default distribution on multi-core clusters. Below we show how to obtain the +wanted layout using 1) the new high-level flags and 2) --cpubind

    + +

    High-Level flags

    + +

    Using SLURM's new high-level flag, users can obtain the above layout with:

    + +
    +
    +

    % mpirun -srun -n 32 -N 4 -B 4:2 --distribution=block:cyclic a.out

    +      or +

    % mpirun -srun -n 32 -N 4 -B 4:2 a.out

    +
    +
    + +

    (since --distribution=block:cyclic is the default distribution)

    + +

    The cores are shown as c0 and c1 and the processors are shown +as p0 through p3. The resulting task IDs are:

    + + + + + + + +
    + + + + + +
    c0c1
    p0 0 4
    p2 2 6
    +
    + + + + + + +
    c0c1
    p1 1 5
    p3 3 7
    +
    + +

    The computation and assignment of the task IDs is transparent +to the user. Users don't have to worry about the core numbering (Section +Pinning processes to cores) or any setting any CPU affinities. By default CPU affinity +will be set when using multi-core supporting flags.

    + +

    Low-level flag --cpu_bind

    + +

    Using SLURM's --cpu_bind flag, users must compute the CPU IDs or +masks as well as make sure they understand the core numbering on their +system. Another problem arises when core numbering is not the same on all +nodes. The --cpu_bind option only allows users to specify a single +mask for all the nodes. Using SLURM high-level flags remove this limitation +since SLURM will correctly generate the appropriate masks for each requested nodes.

    + +

    On a four dual-CPU dual-core node cluster with core block numbering

    + +

    The cores are shown as c0 and c1 and the processors are shown +as p0 through p3. The CPU IDs within a node in the block numbering are: +(this information is available from the /proc/cpuinfo file on the system)

    + + + + + + + +
    + + + + + +
    c0c1
    p0 0 1
    p2 4 5
    +
    + + + + + + +
    c0c1
    p1 2 3
    p3 6 7
    +
    + +

     resulting in the following mapping for processor/cores +and task IDs which users need to calculate:

    + +
    +mapping for processors/cores +
    + + + + + + +
    + + + + + +
    c0c1
    p0 0x01 0x02
    p2 0x10 0x20
    +
    + + + + + + +
    c0c1
    p1 0x04 0x08
    p3 0x40 0x80
    +
    + +

    +

    +task IDs +
    + + + + + + +
    + + + + + +
    c0c1
    p0 0 4
    p2 2 6
    +
    + + + + + + +
    c0c1
    p1 1 5
    p3 3 7
    +
    + +

    The above maps and task IDs can be translated into the +following mpirun command:

    + +
    +
    +

    % mpirun -srun -n 32 -N 4 --cpu_bind=mask_cpu:1,4,10,40,2,8,20,80 a.out

    +      or +

    % mpirun -srun -n 32 -N 4 --cpu_bind=map_cpu:0,2,4,6,1,3,5,7 a.out

    +
    +
    + +

    Same cluster but with its core numbered cyclic instead of block

    + +

    On a system with cyclically numbered cores, the correct mask +argument to the mpirun/srun command looks like: (this will +achieve the same layout as the command above on a system with core block +numbering.)

    + +
    +
    +

    % mpirun -srun -n 32 -N 4 --cpu_bind=map_cpu:0,1,2,3,4,5,6,7 a.out

    +
    +
    + +

    Block map_cpu on a system with cyclic core numbering

    + +

    If users do not check their system’s core numbering before specifying +the map_cpu list and thereby do not realize that the new system has cyclic core +numbering instead of block numbering then they will not get the expected +layout.. For example, if they decide to re-use their mpirun command from above:

    + +
    +
    +

    % mpirun -srun -n 32 -N 4 --cpu_bind=map_cpu:0,2,4,6,1,3,5,7 a.out

    +
    +
    + +

    they get the following unintentional task ID layout:

    + + + + + + + +
    + + + + + +
    c0c1
    p0 0 2
    p2 1 3
    +
    + + + + + + +
    c0c1
    p1 4 6
    p3 5 7
    +
    + +

    since the processor IDs within a node in the cyclic numbering are:

    + + + + + + + +
    + + + + + +
    c0c1
    p0 0 4
    p2 2 6
    +
    + + + + + + +
    c0c1
    p1 1 5
    p3 3 7
    +
    + +

    The important conclusion is that using the --cpu_bind flag is not +trivial and that it assumes that users are experts.

    + + + +

    Extensions to sinfo/squeue/scontrol

    + +Several extensions have also been made to the other SLURM utilities to +make working with multi-core/multi-threaded systems easier. + + +

    sinfo

    + +

    The long version (-l) of the sinfo node listing (-N) has been +extended to display the sockets, cores, and threads present for each +node. For example: + +

    +% sinfo -N
    +NODELIST     NODES PARTITION STATE 
    +hydra[12-15]     4    parts* idle  
    +
    +% sinfo -lN
    +Thu Sep 14 17:47:13 2006
    +NODELIST     NODES PARTITION       STATE CPUS    S:C:T MEMORY TMP_DISK WEIGHT FEATURES REASON
    +hydra[12-15]     4    parts*        idle   8+ 2+:4+:1+   2007    41447      1   (null) none
    +
    +% sinfo -lNe
    +Thu Sep 14 17:47:18 2006
    +NODELIST     NODES PARTITION       STATE CPUS    S:C:T MEMORY TMP_DISK WEIGHT FEATURES REASON
    +
    +hydra[12-14]     3    parts*        idle    8    2:4:1   2007    41447      1   (null) none
    +hydra15          1    parts*        idle   64    8:4:2   2007    41447      1   (null) none
    +
    + +For user specified output formats (-o/--format) and sorting (-S/--sort), +the following identifiers are available: + +
    +        %X  Number of sockets per node
    +        %Y  Number of cores per socket
    +        %Z  Number of threads per core
    +        %z  Extended processor information: number of
    +	    sockets, core, threads (S:C:T) per node
    +
    + +For example: + +
    +% sinfo -o '%9P %4c %8z %8X %8Y %8Z'
    +PARTITION CPUS S:C:T    SOCKETS  CORES    THREADS 
    +parts*    4    2:2:1    2        2        1       
    +
    + +

    See also 'sinfo --help' and 'man sinfo'

    + + +

    squeue

    + +For user specified output formats (-o/--format) and sorting (-S/--sort), +the following identifiers are available: + +
    +        %H  Minimum number of sockets per node requested by the job.
    +            This reports the value of the srun --minsockets option.
    +        %I  Minimum number of cores per socket requested by the job.
    +            This reports the value of the srun --mincores option.
    +        %J  Minimum number of threads per core requested by the job.
    +            This reports the value of the srun --minthreads option.
    +        %m  Minimum size of memory (in MB) requested by the job
    +        %X  Number of requested sockets per node
    +        %Y  Number of requested cores per socket
    +        %Z  Number of requested threads per core
    +        %z  Extended processor information: number of requested
    +	    sockets, cores, threads (S:C:T) per node
    +
    + +Below is an example squeue output after running 7 copies of: + +
      +
        +
        % srun -n 4 -B 2:2:1 + --minsockets=4 --mincores=2 --minthreads=1 --mem=1024 sleep 100 & +
      +
    + +
    +% squeue -o '%.5i %.2t %.4M %.5D %7X %7Y %7Z %7z %R'
    +JOBID ST TIME NODES SOCKETS CORES   THREADS S:C:T   NODELIST(REASON)
    +   17 PD 0:00     1 2       2       1       2:2:1   (Resources) 
    +   18 PD 0:00     1 2       2       1       2:2:1   (Resources) 
    +   19 PD 0:00     1 2       2       1       2:2:1   (Resources) 
    +   13  R 1:27     1 2       2       1       2:2:1   hydra12 
    +   14  R 1:26     1 2       2       1       2:2:1   hydra13 
    +   15  R 1:26     1 2       2       1       2:2:1   hydra14 
    +   16  R 1:26     1 2       2       1       2:2:1   hydra15 
    +
    +% squeue -o '%.5i %.2t %.4M %.5D %9c %11H %9I %11J'
    +JOBID ST TIME NODES MIN_PROCS MIN_SOCKETS MIN_CORES MIN_THREADS
    +   17 PD 0:00     1 1         4           2         1          
    +   18 PD 0:00     1 1         4           2         1          
    +   19 PD 0:00     1 1         4           2         1          
    +   13  R 1:29     1 0         0           0         0          
    +   14  R 1:28     1 0         0           0         0          
    +   15  R 1:28     1 0         0           0         0          
    +   16  R 1:28     1 0         0           0         0          
    +
    + +

    +The display of the minimum size of memory requested by the job has +been extended to also show the amount of memory requested by +the --job-mem flag. If --job-mem and --mem are set to the +same value, a single number is display for MIN_MEMORY. Otherwise +a range is reported: + +

    submit job 21: +

    +    % srun sleep 100 &
    +
    + +

    submit job 22: +

    +    % srun --job-mem=2048MB --mem=1024MB sleep 100 &
    +    srun: mem < job-mem - resizing mem to be equal to job-mem
    +
    + +

    submit job 23: +

    +    % srun --job-mem=2048MB --mem=10240MB sleep 100 &
    +
    + +
    +% squeue -o "%.5i %.2t %.4M %.5D %m"
    +JOBID ST TIME NODES MIN_MEMORY
    +   21 PD 0:00     1 0-1
    +   22 PD 0:00     1 2048
    +   23 PD 0:00     1 2048-10240
    +   17  R 1:12     1 0
    +   18  R 1:11     1 0
    +   19  R 1:11     1 0
    +   20  R 1:10     1 0
    +
    + +

    In the above examples, note that once a job starts running, the +MIN_* constraints are all reported as zero regardless of what +their initial values were (since they are meaningless once +the job starts running). + +

    See also 'squeue --help' and 'man squeue'

    + + +

    scontrol

    + +

    The following job settings can be adjusted using scontrol: + +

    +    Requested Allocation:
    +       ReqSockets=<count>   Set the job's count of required sockets
    +       ReqCores=<count>     Set the job's count of required cores
    +       ReqThreads=<count>   Set the job's count of required threads
    +
    +    Constraints:
    +       MinSockets=<count>   Set the job's minimum number of sockets per node
    +       MinCores=<count>     Set the job's minimum number of cores per socket
    +       MinThreads=<count>   Set the job's minimum number of threads per core
    +
    + +For example: + +
    +# scontrol update JobID=18 MinThreads=2
    +# scontrol update JobID=18 MinCores=4
    +# scontrol update JobID=18 MinSockets=8
    +
    +% squeue -o '%.5i %.2t %.4M %.5D %9c %11H %9I %11J'
    +JOBID ST TIME NODES MIN_PROCS MIN_SOCKETS MIN_CORES MIN_THREADS
    +   17 PD 0:00     1 1         4           2         1          
    +   18 PD 0:00     1 1         8           4         2          
    +   19 PD 0:00     1 1         4           2         1          
    +   13  R 1:35     1 0         0           0         0          
    +   14  R 1:34     1 0         0           0         0          
    +   15  R 1:34     1 0         0           0         0          
    +   16  R 1:34     1 0         0           0         0          
    +
    + +

    The 'scontrol show job' command can be used to display +the number of allocated CPUs per node as well as the socket, cores, +and threads specified in the request and contraints. + +

    +% srun -N 2 -B 2:1-1 sleep 100 &
    +% scontrol show job 20
    +JobId=20 UserId=(30352) GroupId=users(1051)
    +   Name=sleep
    +   Priority=4294901749 Partition=parts BatchFlag=0
    +   AllocNode:Sid=hydra16:3892 TimeLimit=UNLIMITED
    +   JobState=RUNNING StartTime=09/25-17:17:30 EndTime=NONE
    +   NodeList=hydra[12-14] NodeListIndices=0,2,-1
    +   AllocCPUs=1,2,1
    +   ReqProcs=4 ReqNodes=2 ReqS:C:T=2:1-1
    +   Shared=0 Contiguous=0 CPUs/task=0
    +   MinProcs=0 MinSockets=0 MinCores=0 MinThreads=0
    +   MinMemory=0 MinTmpDisk=0 Features=(null)
    +   Dependency=0 Account=(null) Reason=None Network=(null)
    +   ReqNodeList=(null) ReqNodeListIndices=-1
    +   ExcNodeList=(null) ExcNodeListIndices=-1
    +   SubmitTime=09/25-17:17:30 SuspendTime=None PreSusTime=0
    +
    + +

    See also 'scontrol --help' and 'man scontrol'

    + + + +

    Configuration settings in slurm.conf

    + +

    Several slurm.conf settings are available to control the multi-core +features described above. + +

    In addition to the description below, also see the "Task Launch" and +"Resource Selection" sections if generating slurm.conf +via configurator.html. + +

    As previously mentioned, in order for the affinity to be set, the +task/affinity plugin must be first enabled in slurm.conf: + +

    +        TaskPlugin=task/affinity          # enable task affinity   
    +
    + +This setting is part of the task launch specific parameters: + +
    +# o Define task launch specific parameters
    +#
    +#    "TaskProlog" : Define a program to be executed as the user before each 
    +#                   task begins execution.
    +#    "TaskEpilog" : Define a program to be executed as the user after each 
    +#                   task terminates.
    +#    "TaskPlugin" : Define a task launch plugin. This may be used to 
    +#                   provide resource management within a node (e.g. pinning
    +#                   tasks to specific processors). Permissible values are:
    +#      "task/none"     : no task launch actions, the default.
    +#      "task/affinity" : CPU affinity support
    +#
    +# Example:
    +#
    +# TaskProlog=/usr/local/slurm/etc/task_prolog # default is none
    +# TaskEpilog=/usr/local/slurm/etc/task_epilog # default is none
    +# TaskPlugin=task/affinity                    # default is task/none
    +
    + +

    SLURM will automatically detect the architecture of the nodes used +by examining /proc/cpuinfo. If, for some reason, the administrator +wishes to override the automatically selected architecture, the +NodeName parameter can be used in combination with FastSchedule: + +

    +        FastSchedule=1
    +        NodeName=dualcore[01-16] Procs=4 CoresPerSocket=2 ThreadsPerCore=1
    +
    + +

    Below is a more complete description of the configuration possible +using NodeName: + +

    +#
    +#  o Node configuration
    +#
    +#    The configuration information of nodes (or machines) to be managed 
    +#    by SLURM is described here. The only required value in this section
    +#    of the config file is the "NodeName" field, which specifies the 
    +#    hostnames of the node or nodes to manage. It is recommended, however,
    +#    that baseline values for the node configuration be established
    +#    using the following parameters (see slurm.config(5) for more info): 
    +#
    +#     "NodeName"   : The only required node configuration parameter, NodeName
    +#                    specifies a node or set of nodes to be managed by SLURM.
    +#                    The special NodeName of "DEFAULT" may be used to establish
    +#                    default node configuration parameters for subsequent node
    +#                    records. Typically this would be the string that 
    +#                    `/bin/hostname -s` would return on the node. However 
    +#                    NodeName may be an arbitrary string if NodeHostname is 
    +#                    used (see below).
    +#
    +#     "Feature"    : comma separated list of "features" for the given node(s) 
    +#
    +#     "NodeAddr"   : preferred address for contacting the node. This may be 
    +#                    either a name or IP address.
    +#
    +#     "NodeHostname"
    +#                  : the string that `/bin/hostname -s` would return on the
    +#                    node.  In other words, NodeName may be the name other than
    +#                    the real hostname.
    +#
    +#     "RealMemory" : Amount of real memory (in Megabytes)
    +#
    +#     "Procs"      : Number of logical processors on the node.
    +#                    If Procs is omitted, it will be inferred from:
    +#                           Sockets, CoresPerSocket, and ThreadsPerCore.
    +#
    +#     "Sockets"    : Number of physical processor sockets/chips on the node.
    +#                    If Sockets is omitted, it will be inferred from:
    +#                           Procs, CoresPerSocket, and ThreadsPerCore.
    +#
    +#     "CoresPerSocket"
    +#                  : Number of cores in a single physical processor socket
    +#                    The CoresPerSocket value describes physical cores, not
    +#                    the logical number of processors per socket.
    +#                    The default value is 1.
    +#
    +#     "ThreadsPerCore"
    +#                  : Number of logical threads in a single physical core.
    +#                    The default value is 1.
    +#
    +#     "State"      : Initial state (IDLE, DOWN, etc.)
    +#
    +#     "TmpDisk"    : Temporary disk space available on node
    +#
    +#     "Weight"     : Priority of node for scheduling purposes
    +#
    +#   If any of the above values are set for a node or group of nodes, and
    +#   that node checks in to the slurm controller with less than the 
    +#   configured resources, the node's state will be set to DOWN, in order
    +#   to avoid scheduling any jobs on a possibly misconfigured machine.
    +#
    +# Example Node configuration:
    +#
    +# NodeName=DEFAULT Procs=2 TmpDisk=64000 State=UNKNOWN
    +# NodeName=host[0-25] NodeAddr=ehost[0-25] Weight=16
    +# NodeName=host26     NodeAddr=ehost26     Weight=32 Feature=graphics_card
    +# NodeName=dualcore01  Procs=4 CoresPerSocket=2 ThreadsPerCore=1
    +# NodeName=dualcore02  Procs=4 Sockets=2 CoresPerSocket=2 ThreadsPerCore=1
    +# NodeName=multicore03 Procs=64 Sockets=8 CoresPerSocket=4 ThreadsPerCore=2
    +
    + + +

    Last modified 9 October 2006

    + + + diff --git a/executable_names/doc/html/moab.shtml b/executable_names/doc/html/moab.shtml new file mode 100644 index 0000000000000000000000000000000000000000..fd01b64d3c52eef3186c596b81c323d1d985a0b8 --- /dev/null +++ b/executable_names/doc/html/moab.shtml @@ -0,0 +1,116 @@ + + +

    Moab Cluster Suite Integration Guide

    +

    Overview

    +

    Moab Cluster Suite configuration is quite complicated and is +beyond the scope of any documents we could supply with SLURM. +The best resource for Moab configuration information is the +online documents at Cluster Resources Inc.: + +http://www.clusterresources.com/products/mwm/docs/slurmintegration.shtml. + +

    Configuration

    +

    First, download the Moab scheduler kit from their web site + +http://www.clusterresources.com/pages/products/moab-cluster-suite.php. +Note: Moab version 4.5.0 or higher and SLURM version 1.1.10 or higher.

    + +

    SLURM configuration

    +

    Set the slurm.conf scheduler parameters as follows: +

    +SchedulerType=sched/wiki2   (NOTE: "sched/wiki" in slurm version 1.2)
    +SchedulerPort=7321
    +
    +Running multiple jobs per mode can be accomplished using the +Shared=yes parameter on partitions. +The SelectType=select/cons_res parameter is not compatable +with the sched/wiki plugin (both would try to schedule the +individual processors within a node).

    + +

    SLURM's wiki configuration is stored in a file +specific to the wiki-plugin named wiki.conf. +This file should be protected from reading by users. +It only needs to be readable by SlurmUser (as configured +in slurm.conf) and only needs to exist on computers +where the slurmctld daemon executes. +More information about wiki.conf is available in +a man page distributed with SLURM.

    + +

    The currently supported wiki.conf keywords include:

    + +

    AuthKey is a DES based encryption key used to sign +communctions between SLURM and Maui or Moab. +This use of this key is essential to insure that a user +not build his own program to cancel other user's jobs in +SLURM. +This should be a numeric value and match the the +encryption key in Maui (--with-key on the +configure line) or Moab (KEY parameter in the +moab-private.cfg file). +Note that SLURM's wiki plugin does not include a mechanism +to submit new jobs, so even without this key nobody could +run jobs as another user.

    + +

    EPort is an event notification port in Moab. +When a job is submitted to or terminates in SLURM, +Moab is sent a message on this port to begin an attempt +to schedule the computer. +This numeric value should match EPORT configured +in the moab.cnf file.

    + +

    JobAggregationTime is used to avoid notifying Moab +of large numbers of events occuring about the same time. +If an event occurs within this number of seconds since Moab was +last notified of an event, another notification is not sent. +This should be an integer number of seconds. +The default value is 10 seconds. +The value should match JOBAGGREGATIONTIME configured +in the moab.cnf file.

    + +

    JobPriority controls the scheduling of newly arriving +jobs in SLURM. +SLURM can either place all newly arriving jobs in a HELD state +(priority = 0) and let Moab decide when and where to run the jobs +or SLURM can control when and where to run jobs. +In the later case, Moab can modify the priorities of pending jobs +to re-order the job queue or just monitor system state. +Possible values are "hold" and "run" with "hold" being the default.

    + +

    Here is a sample wiki.conf file +

    +# wiki.conf
    +# SLURM's wiki plugin configuration file
    +#
    +# Matches KEY in moab-private.cfg
    +AuthKey=1234
    +#
    +# Have Moab control job scheduling
    +JobPriority=hold
    +#
    +# Moab event notification port, matches EPORT in moab.cfg
    +EPort=15017
    +#
    +# Moab event notifcation throttle, matches JOBAGGREGATIONTIME
    +# in moab.cfg (integer value in seconds)
    +JobAggregationTime=15
    +
    +

    + +

    Moab Configuration

    + +

    Moab has support for SLURM's WIKI interface by default. +Specify this interface in the moab.cfg file as follows:

    +
    +RMCFG[slurm]         TYPE=wiki:slurm AUTHTYPE=CHECKSUM
    +
    +

    In moab-private.cfg specify the private key as follows:

    +
    +KEY=1234
    +
    +

    Insure that this file is protected from viewing by users.

    + + + +

    Last modified 29 September 2006

    + + diff --git a/executable_names/doc/html/mpiplugins.shtml b/executable_names/doc/html/mpiplugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..bffb028a7c1e8917a3217e70bc5a329d15095366 --- /dev/null +++ b/executable_names/doc/html/mpiplugins.shtml @@ -0,0 +1,109 @@ + + +

    SLURM MPI Plugin API

    + +

    Overview

    +

    This document describes SLURM MPI selection plugins and the API that defines +them. It is intended as a resource to programmers wishing to write their own SLURM +node selection plugins. This is version 0 of the API.

    + +

    SLURM mpi selection plugins are SLURM plugins that implement the which version of +mpi is used during execution of the new SLURM job. API described herein. They are +intended to provide a mechanism for both selecting mpi versions for pending jobs and +performing any mpi-specific tasks for job launch or termination. The plugins must +conform to the SLURM Plugin API with the following specifications:

    +

    const char plugin_type[]
    +The major type must be "mpi." The minor type can be any recognizable +abbreviation for the type of node selection algorithm. We recommend, for example:

    +
      +
    • lam—For use with LAM MPI and Open MPI.
    • +
    • mpich-gm—For use with Myrinet.
    • +
    • mvapich—For use with Infiniband.
    • +
    • none—For use with most other versions of MPI.
    • +
    +

    The plugin_name and +plugin_version +symbols required by the SLURM Plugin API require no specialization for node selection support. +Note carefully, however, the versioning discussion below.

    + +

    A simplified flow of logic follows: +
    +srun is able to specify the correct mpi to use. with --mpi=MPITYPE +
    +srun calls +
    +mpi_p_thr_create((srun_job_t *)job); +
    +which will set up the correct enviornment for the specified mpi. +
    +slurmd daemon runs +
    +mpi_p_init((slurmd_job_t *)job, (int)rank); +
    +which will set configure the slurmd to use the correct mpi as well to interact with the srun. +
    + +

    + +

    Data Objects

    +

    These functions are expected to read and/or modify data structures directly in +the slurmd daemon's and srun memory. Slurmd is a multi-threaded program with independent +read and write locks on each data structure type. Thererfore the type of operations +permitted on various data structures is identified for each function.

    + + + +

    API Functions

    +

    The following functions must appear. Functions which are not implemented should +be stubbed.

    + +

    int mpi_p_init (slurmd_job_t *job, int rank);

    +

    Description: Used by slurmd to configure the slurmd's environment +to that of the correct mpi.

    +

    Arguments:
    job  +  (input) Pointer to the slurmd_job that is running. Cannot be NULL.
    + rank  +  (input) Primarially there for MVAPICH. Used to send the rank fo the mpirun job. +This can be 0 if no rank information is needed for the mpi type.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR.

    + +

    int mpi_p_thr_create (srun_job_t *job);

    +

    Description: Used by srun to spawn the thread for the mpi processes. +Most all the real proccessing happens here.

    +

    Arguments: job  +  (input) Pointer to the srun_job that is running. Cannot be NULL.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return -1.

    + +

    int mpi_p_single_task ();

    +

    Description: Tells the system whether or not multiple tasks +can run at the same time

    +

    Arguments: + none

    +

    Returns: false if multiple tasks can run and true if only +a single task can run at one time.

    + +

    int mpi_p_exit();

    +

    Description: Cleans up anything that needs cleaning up after +execution.

    +

    Arguments: + none

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR, causing slurmctld to exit.

    + + + +

    Versioning

    +

    This document describes version 0 of the SLURM node selection API. Future +releases of SLURM may revise this API. A node selection plugin conveys its ability +to implement a particular API version using the mechanism outlined for SLURM plugins. +In addition, the credential is transmitted along with the version number of the +plugin that transmitted it. It is at the discretion of the plugin author whether +to maintain data format compatibility across different versions of the plugin.

    + + + +

    Last modified 11 April 2006

    + + diff --git a/executable_names/doc/html/news.shtml b/executable_names/doc/html/news.shtml new file mode 100644 index 0000000000000000000000000000000000000000..3535859815b4e59be86055ad1e0dc6d3e43da597 --- /dev/null +++ b/executable_names/doc/html/news.shtml @@ -0,0 +1,105 @@ + + +

    What's New

    + +

    Index

    + + +

    Major Updates in SLURM Version 0.6

    +

    SLURM Version 0.6 became available in September 2005. +Major enhancements include: +

      +
    • Support for Infiniband
    • +
    • Support for configurable resource limit propagation.
    • +
    • MPI support moved into plugin (substantive configuration changes required for MPICH-GM).
    • +
    • Srun options can be specified in job script (#SLURM ...)
    • +
    • Names (not just numbers) for job step identification.
    • +
    + +

    Major Updates in SLURM Version 1.0

    +

    SLURM Version 1.0 became available in January 2006. +Major enhancements include: +

      +
    • I/O streams for all tasks on a node are transmitted through a single +socket instead of distinct sockets for each task. This improves performance +and scalability.
    • +
    • Task affinity for binding tasks to CPUs.
    • +
    • Nodes can be in multiple partitions, providing more flexibility in +managing the SLURM partitions as queues.
    • +
    • Support for task communication/synchronization primitives (PMI) +as required by MPICH2.
    • +
    • E-mail notification option on job state changes.
    • +
    • Better control over task distribution (hostfile support).
    • +
    • User control of job prioritization via nice option.
    • +
    • Web-based configuration tool.
    • +
    • Support to preempt/resume jobs.
    • +
    • Support for deferred job initiation time specification.
    • +
    • Compute node job shepherd now exec'ed program, slurmstepd. +This eliminates use of SysV shared memory and some problems +in support of the Native Posix Thread Library.
    • +
    • Several bug fixes in interface with Maui Scheduler.
    • +
    • For Blue Gene systems: support for small bglblocks.
    • +
    + +

    Major Updates in SLURM Version 1.1

    +

    SLURM Version 1.1 became available in May 2006. +Major enhancements include: +

      +
    • Communications enhancements, validated up to 16,384 node clusters.
    • +
    • File broadcast support (new sbcast command).
    • +
    • Support for distinct executables and arguments by task ID +(see srun --multi-prog option).
    • +
    • Support for binding tasks to the memory on a processor.
    • +
    • The configuration parameter HeartbeatInterval is defunct. +Half the values of configuration parameters SlurmdTimeout and +SlurmctldTimeout are used as the commununication frequency for +the slurmctld and slurmd daemons respecitively.
    • +
    • Support for PAM to control resource limits by user on each +compute node used. See UsePAM configuration parameter.
    • +
    • Support added for xcpu job launch.
    • +
    • Add support for 1/16 midplane BlueGene blocks.
    • +
    • Add support for overlapping BlueGene blocks.
    • +
    • Add support for dynamic BlueGene block creation on demand.
    • +
    • BlueGene node count specifications are now c-node counts +rather than base partition counts.
    • +
    + +

    Major Updates in SLURM Version 1.2

    +

    We expect to make SLURM Version 1.2 available late in 2006. +Major enhancements include: +

      +
    • More complete support for resource management down to the core level +on a node.
    • +
    • Treat memory as a consumable resource on a compute node.
    • +
    • New graphical user interface provided, sview.
    • +
    • Added support for OS X.
    • +
    • Permit batch jobs to be requeued.
    • +
    • Expanded support of Moab and Maui schedulers.
    • +
    • Srun command augmented by new commands for each operation: +salloc, slaunch, sbatch, and sattach.
    • +
    • Sched/wiki plugin (for Moab and Maui Schedulers) rewritten to +provide vastly improved integration.
    • +
    + +

    Major Updates in SLURM Version 1.3 and beyond

    +

    Detailed plans for release dates and contents of future SLURM releases have +not been finalized. Anyone desiring to perform SLURM development should notify +slurm-dev@lists.llnl.gov +to coordinate activies. Future development plans includes: +

      +
    • Gang scheduling of jobs (without external scheduler).
    • +
    • Permit resource allocations (jobs) to change size.
    • +
    • Add Kerberos credential support including credential forwarding +and refresh.
    • +
    + + +

    Last modified 13 October 2006

    + + diff --git a/executable_names/doc/html/overview.shtml b/executable_names/doc/html/overview.shtml new file mode 100644 index 0000000000000000000000000000000000000000..575d264e3eed2ae225b54f72c41b285e7e01a437 --- /dev/null +++ b/executable_names/doc/html/overview.shtml @@ -0,0 +1,153 @@ + + +

    Overview

    +

    The Simple Linux Utility for Resource Management (SLURM) is an open source, +fault-tolerant, and highly scalable cluster management and job scheduling system +for large and small Linux clusters. SLURM requires no kernel modifications for +its operation and is relatively self-contained. As a cluster resource manager, +SLURM has three key functions. First, it allocates exclusive and/or non-exclusive +access to resources (compute nodes) to users for some duration of time so they +can perform work. Second, it provides a framework for starting, executing, and +monitoring work (normally a parallel job) on the set of allocated nodes. Finally, +it arbitrates conflicting requests for resources by managing a queue of pending +work.

    + +

    SLURM has been developed through the collaborative efforts of +Lawrence Livermore National Laboratory (LLNL), +Hewlett-Packard, and +Linux NetworX. +HP distributes and supports SLURM as a component in their XC System Software.

    + +

    Architecture

    +

    SLURM has a centralized manager, slurmctld, to monitor resources and +work. There may also be a backup manager to assume those responsibilities in the +event of failure. Each compute server (node) has a slurmd daemon, which +can be compared to a remote shell: it waits for work, executes that work, returns +status, and waits for more work. +The slurmd daemons provide fault-tolerant hierarchical communciations. +User tools include srun to initiate jobs, +scancel to terminate queued or running jobs, sinfo to report system +status, and squeue to report the status of jobs. +The smap and sview commands graphically reports system and +job status including network topology. There is also an administrative +tool scontrol available to monitor and/or modify configuration and state +information. APIs are available for all functions.

    + +
    +
    + Figure 1. SLURM components +
    + +

    SLURM has a general-purpose plugin mechanism available to easily support various +infrastructures. This permits a wide variety of SLURM configurations using a +building block approach. These plugins presently include: +

    + +

    The entities managed by these SLURM daemons, shown in Figure 2, include nodes, +the compute resource in SLURM, partitions, which group nodes into logical +sets, jobs, or allocations of resources assigned to a user for +a specified amount of time, and job steps, which are sets of (possibly +parallel) tasks within a job. +The partitions can be considered job queues, each of which has an assortment of +constraints such as job size limit, job time limit, users permitted to use it, etc. +Priority-ordered jobs are allocated nodes within a partition until the resources +(nodes, processors, memory, etc.) within that partition are exhausted. Once +a job is assigned a set of nodes, the user is able to initiate parallel work in +the form of job steps in any configuration within the allocation. For instance, +a single job step may be started that utilizes all nodes allocated to the job, +or several job steps may independently use a portion of the allocation.

    + +
    +
    + Figure 2. SLURM entities +
    + + + +

    Configurability

    +

    Node state monitored include: count of processors, size of real memory, size +of temporary disk space, and state (UP, DOWN, etc.). Additional node information +includes weight (preference in being allocated work) and features (arbitrary information +such as processor speed or type). Nodes are grouped into disjoint partitions. +Partition information includes: name, list of associated nodes, state (UP or DOWN), +maximum job time limit, maximum node count per job, group access list, and shared +node access (YES, NO or FORCE). Bit maps are used to represent nodes and scheduling +decisions can be made by performing a small number of comparisons and a series +of fast bit map manipulations. A sample (partial) SLURM configuration file follows.

    +
    +# 
    +# Sample /etc/slurm.conf
    +#
    +ControlMachine=linux0001
    +BackupController=linux0002
    +#
    +AuthType=auth/munge
    +Epilog=/usr/local/slurm/sbin/epilog
    +PluginDir=/usr/local/slurm/lib
    +Prolog=/usr/local/slurm/sbin/prolog
    +SlurmctldPort=7002
    +SlurmctldTimeout=120
    +SlurmdPort=7003
    +SlurmdSpoolDir=/var/tmp/slurmd.spool
    +SlurmdTimeout=120
    +StateSaveLocation=/usr/local/slurm/slurm.state
    +SwitchType=switch/elan
    +TmpFS=/tmp
    +#
    +# Node Configurations
    +#
    +NodeName=DEFAULT TmpDisk=16384 State=IDLE
    +NodeName=lx[0001-0002] State=DRAINED
    +NodeName=lx[0003-8000] Procs=16 RealMemory=2048 Weight=16
    +NodeName=lx[8001-9999] Procs=32 RealMemory=4096 Weight=40 Feature=1200MHz
    +#
    +# Partition Configurations
    +#
    +PartitionName=DEFAULT MaxTime=30 MaxNodes=2
    +PartitionName=login Nodes=lx[0001-0002] State=DOWN
    +PartitionName=debug Nodes=lx[0003-0030] State=UP    Default=YES
    +PartitionName=class Nodes=lx[0031-0040] AllowGroups=students
    +PartitionName=batch Nodes=lx[0041-9999] MaxTime=UNLIMITED MaxNodes=4096
    +
    + +

    Last modified 29 September 2006

    + + diff --git a/executable_names/doc/html/plane_ex1.gif b/executable_names/doc/html/plane_ex1.gif new file mode 100755 index 0000000000000000000000000000000000000000..fbf93c340edd6ae3fec6170b0cc6eea4fc33af64 Binary files /dev/null and b/executable_names/doc/html/plane_ex1.gif differ diff --git a/executable_names/doc/html/plane_ex2.gif b/executable_names/doc/html/plane_ex2.gif new file mode 100755 index 0000000000000000000000000000000000000000..892ee3789bc66ffa1a5232e52b6d241ed78c457f Binary files /dev/null and b/executable_names/doc/html/plane_ex2.gif differ diff --git a/executable_names/doc/html/plane_ex3.gif b/executable_names/doc/html/plane_ex3.gif new file mode 100755 index 0000000000000000000000000000000000000000..fdd3ce2220e4aa998de9ba949dd6aee48995e85d Binary files /dev/null and b/executable_names/doc/html/plane_ex3.gif differ diff --git a/executable_names/doc/html/plane_ex4.gif b/executable_names/doc/html/plane_ex4.gif new file mode 100755 index 0000000000000000000000000000000000000000..6c6cdc64192ace6416581ad72d414adbd041b27b Binary files /dev/null and b/executable_names/doc/html/plane_ex4.gif differ diff --git a/executable_names/doc/html/plane_ex5.gif b/executable_names/doc/html/plane_ex5.gif new file mode 100755 index 0000000000000000000000000000000000000000..5c466a8e85fa260b5f27eb5fed6ecb40eb0a99dd Binary files /dev/null and b/executable_names/doc/html/plane_ex5.gif differ diff --git a/executable_names/doc/html/plane_ex6.gif b/executable_names/doc/html/plane_ex6.gif new file mode 100755 index 0000000000000000000000000000000000000000..6e6a19a2b5636494194f00d3cffc5ec09db3040a Binary files /dev/null and b/executable_names/doc/html/plane_ex6.gif differ diff --git a/executable_names/doc/html/plane_ex7.gif b/executable_names/doc/html/plane_ex7.gif new file mode 100755 index 0000000000000000000000000000000000000000..a70d55ac86df7ff4f55f6dd38fe49a4807b27eba Binary files /dev/null and b/executable_names/doc/html/plane_ex7.gif differ diff --git a/executable_names/doc/html/platforms.shtml b/executable_names/doc/html/platforms.shtml new file mode 100644 index 0000000000000000000000000000000000000000..b700b458ce8028bb6540f3027ade70c6a80bfe38 --- /dev/null +++ b/executable_names/doc/html/platforms.shtml @@ -0,0 +1,29 @@ + + +

    Platforms

    +

    Operating Systems

    +
      +
    • AIX—SLURM support for AIX has been thoroughly tested.
    • +
    • Blue Gene—SLURM support for IBM's Blue Gene system has been +thoroughly tested.
    • +
    • Linux—SLURM has been thoroughly tested on Red Hat Linux using +i386, ia64, and x86_64 architectures.
    • +
    • OS X—SLURM support for OS X is available in version 1.2.
    • +
    • Other—SLURM ports to other systems will be gratefully accepted.
    • +
    +

    Interconnects

    +
      +
    • Ethernet—Ethernet requires no special support from SLURM and has +been thoroughly tested.
    • +
    • IBM Federation—SLURM support for IBM's Federation Switch +has been thoroughly tested.
    • +
    • Infiniband—Infiniband support has been thoroughly tested.
    • +
    • Myrinet—Myrinet and MPICH-GM are support.
    • +
    • Quadrics Elan—SLURM support for Quadrics Elan 3 and Elan 4 switches +are available in all versions of SLURM and have been thoroughly tested.
    • +
    • Other—SLURM ports to other systems will be gratefully accepted.
    • +
    + +

    Last modified 29 September 2006

    + + diff --git a/executable_names/doc/html/plugins.shtml b/executable_names/doc/html/plugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..7e0c45c5f3bbcd31851073f44ab3c8de58688d96 --- /dev/null +++ b/executable_names/doc/html/plugins.shtml @@ -0,0 +1,113 @@ + + +

    SLURM Plugin API

    +

    Overview

    +

    A SLURM plugin is a dynamically linked code object which is loaded explicitly +at run time by the SLURM libraries. A plugin provides a customized implementation +of a well-defined API connected to tasks such as authentication, interconnect +fabric, and task scheduling.

    +

    Identification

    +

    A SLURM plugin identifies itself by a short character string formatted similarly +to a MIME type: <major>/<minor>. The major type identifies +which API the plugin implements. The minor type uniquely distinguishes a plugin +from other plugins that implement that same API, by such means as the intended +platform or the internal algorithm. For example, a plugin to interface to the +Maui scheduler would give its type as "sched/maui." It would implement +the SLURM Scheduler API.

    +

    Versioning

    +

    SLURM plugin version numbers comprise a major and minor revision number. As +SLURM evolves, changes to the individual plugin APIs may be necessary to implement +new features. The major number identifies the version of the applicable API that +the plugin implements. Incrementing the major version number denotes that the +API has changed significantly and possibly incompatibly over prior versions.

    +

    Because plugins are separate code objects and perhaps under the control of +third parties, version skew may occur in a SLURM installation. SLURM may support +multiple versions of each API in a backward-compatible fashion to provide time +for plugin authors to update their plugins. Conversely, the plugin may support +multiple versions of the API in order to be transparently portable across different +SLURM installations. The version of the API spoken in an installation will be +the highest-numbered version which is common to both SLURM and the plugin. Each +SLURM release will document which API versions it supports. From time to time +ancient API versions will be deprecated.

    +

    The minor version number is incremented at the discretion of the plugin author +and denotes revisions or upgrades particular to that implementation. If two or +more plugins of the same type are provided in an installation, the plugin with +the highest minor revision will be selected.

    + +

    Data Objects

    +

    A plugin must define and export the following symbols:

    +
      +
    • char plugin_type[]
      +
      a unique, short, formatted string to identify the plugin's purpose as +described above. A "null" plugin (i.e., one that implements the desired +API as stubs) should have a minor type of "none."
    • +
    • char plugin_name[]
      +
      a free-form string that identifies the plugin in human-readable terms, +such as "Kerberos authentication." SLURM will use this string to identify +the plugin to end users.
    • +
    • const uint32_t plugin_version
      +a 32-bit unsigned integer giving the version of the plugin as described above. +The major revision number is multiplied by 1,000 and added to the minor revision +number to produce the integer value. Thus, a plugin with a major revision number +of 2 and a minor revision number of 35 will have a plugin_version +value of 2035.
    • +
    +

    A plugin may optionally define and export the following symbols:

    +
      +
    • const uint32_t plugin_legacy
      +a 32-bit unsigned integer formatted the same as plugin_version +giving the lowest API version number with which this plugin is compatible. If +this symbol is omitted, its value is assumed to be equivalent to the plugin_version +rounded to the next lowest 1,000. Only the major version number of this symbol +is significant.
    • +
    + +

    API Functions

    +

    int init (void);

    +

    Description: If present, this function is called +just after the plugin is loaded. This allows the plugin to perform any global +initialization prior to any actual API calls.

    +

    Arguments: None.

    +

    Returns: SLURM_SUCCESS if the plugin's initialization +was successful. Any other return value indicates to SLURM that the plugin should +be unloaded and not used.

    +

    void fini (void);

    +

    Description: If present, this function is called +just before the plugin is unloaded. This allows the plugin to do any finalization +after the last plugin-specific API call is made.

    +

    Arguments: None.

    +

    Returns: None.

    +

    Note: These functions are not the same as those described in the dlopen +(3) system library. The C run-time system co-opts those symbols for its +own initialization. The system init() is called +before the SLURM plugininit(), and the SLURM +fini() is called before the system's fini().

    +

    The functions need not appear. The plugin may provide either init() +or fini() or both.

    + +

    Thread Safety

    +

    SLURM is a multithreaded application. The SLURM plugin library may exercise +the plugin functions in a re-entrant fashion. It is the responsibility of the +plugin author to provide the necessarily mutual exclusion and synchronization +in order to avoid the pitfalls of re-entrant code.

    +

    Run-time Support

    +

    The standard system libraries are available to the plugin. The SLURM libraries +are also available and plugin authors are encouraged to make use of them rather +than develop their own substitutes. Plugins should use the SLURM log to print +error messages.

    +

    The plugin author is responsible for specifying any specific non-standard libraries +needed for correct operation. Plugins will not load if their dependent libraries +are not available, so it is the installer's job to make sure the specified libraries +are available.

    +

    Performance

    +

    All plugin functions are expected to execute very quickly. If any function +entails delays (e.g. transations with other systems), it should be written to +utilize a thread for that functionality. This thread may be created by the +init() function and deleted by the +fini() functions. See plugins/sched/backfill +for an example of how to do this.

    + + +

    Last modified 9 July 2004

    + + diff --git a/executable_names/doc/html/proctrack_plugins.shtml b/executable_names/doc/html/proctrack_plugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..260a3380424ff0c9373c73a01bd1e5a2b1e029eb --- /dev/null +++ b/executable_names/doc/html/proctrack_plugins.shtml @@ -0,0 +1,145 @@ + + +

    SLURM Process Tracking Plugin API

    + +

    Overview

    +

    This document describes SLURM process tracking plugins and the API +that defines them. +It is intended as a resource to programmers wishing to write their +own SLURM process tracking plugins. +This is version 0 of the API.

    + +

    SLURM process tracking plugins are SLURM plugins that implement +the SLURM process tracking API described herein. +They must conform to the SLURM Plugin API with the following +specifications:

    + +

    const char plugin_type[]
    +The major type must be "proctrack." +The minor type can be any recognizable abbreviation for the type +of proctrack. We recommend, for example:

    +
      +
    • aix—Perform process tracking on an AIX platform. +NOTE: This requires a kernel extension that records +ever process creation and termination.
    • +
    • linuxproc—Perform process tracking based upon a scan +of the Linux process table and use the parent process ID to determine +what processes are members of a SLURM job. NOTE: This mechanism is +not entirely reliable for process tracking.
    • +
    • pgid—Use process group ID to determine +what processes are members of a SLURM job. NOTE: This mechanism is +not entirely reliable for process tracking.
    • +
    • rms—Use a Quadrics RMS kernel patch to +establish what processes are members of a SLURM job. +NOTE: This requires a kernel patch that records +every process creation and termination.
    • +
    • sgj_job—Use +SGI's Process Aggregates (PAGG) kernel module. +NOTE: This kernel module records every process creation +and termination.
    • +
    + +

    The plugin_name and +plugin_version symbols required +by the SLURM Plugin API require no specialization for process tracking. +Note carefully, however, the versioning discussion below.

    + +

    The programmer is urged to study +src/plugins/proctrack/pgid/proctrack_pgid.c +for an example implementation of a SLURM proctrack plugin.

    + + +

    Data Objects

    +

    The implementation must support a container id of type uint32_t. +This container ID is maintained by the plugin directly in the slurmd +job structure using the field named cont_id.

    + +

    The implementation must maintain (though not necessarily directly export) an +enumerated errno to allow SLURM to discover as practically as possible +the reason for any failed API call. +These values must not be used as return values in integer-valued functions +in the API. +The proper error return value from integer-valued functions is SLURM_ERROR. +The implementation should endeavor to provide useful and pertinent information +by whatever means is practical. +Successful API calls are not required to reset errno to a known value.

    + + + +

    API Functions

    +

    The following functions must appear. Functions which are not implemented should +be stubbed.

    + +

    int slurm_container_create (slurmd_job_t *job);

    +

    Description: Create a container. +The container should be valid +slurm_container_destroy() is called. +This function must put the container ID directoy in the job structure's +variable cont_id.

    +

    Argument: + job    (input/output) +Pointer to a slurmd job structure.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int slurm_container_add (slurmd_job_t *job, pid_t pid);

    +

    Description: Add a specific process ID +to a given job's container.

    +

    Arguments:
    + job    (input) +Pointer to a slurmd job structure.
    + pid    (input) +The ID of the process to add to this job's container.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int slurm_container_signal (uint32_t id, int signal);

    +

    Description: Signal all processes in a given +job's container.

    +

    Arguments:
    + id   (input) +Job container's ID.
    + signal   (input) +Signal to be sent to processes. Note that a signal of zero +just tests for the existence of processes in a given job container.

    +

    Returns: SLURM_SUCCESS if the signal +was sent. +If the signal can not be sent, the function should return SLURM_ERROR and set +its errno to an appropriate value to indicate the reason for failure.

    + + + +

    int slurm_container_destroy (uint32_t id);

    +

    Description: Destroy or otherwise +invalidate a job container. +This does not imply the container is empty, just that it is no longer +needed.

    +

    Arguments: + id    (input) +Job container's ID.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    uint32_t slurm_container_find (pid_t pid);

    +

    Description: +Given a process ID, return its job container ID.

    +

    Arguments: + pid    (input) +A process ID.

    +

    Returns: The job container ID +with this process or zero if none is found.

    + +

    Versioning

    +

    This document describes version 0 of the SLURM Process Tracking API. +Future releases of SLURM may revise this API. A process tracking plugin +conveys its ability to implement a particular API version using the +mechanism outlined for SLURM plugins.

    + + + +

    Last modified 6 June 2006

    + + diff --git a/executable_names/doc/html/programmer_guide.shtml b/executable_names/doc/html/programmer_guide.shtml new file mode 100644 index 0000000000000000000000000000000000000000..5764769fac3cec3f0366826b4fa55f49342112e5 --- /dev/null +++ b/executable_names/doc/html/programmer_guide.shtml @@ -0,0 +1,233 @@ + + +

    SLURM Programmer's Guide

    + +

    Overview

    + +

    Simple Linux Utility for Resource Management (SLURM) is an open source, fault-tolerant, +and highly scalable cluster management and job scheduling system for large and +small Linux clusters. Components include machine status, partition management, +job management, scheduling, and stream copy modules. SLURM requires no kernel +modifications for it operation and is relatively self-contained. +

    There is an overview of the components and their interactions available in +a separate document, SLURM: Simple Linux Utility for +Resource Management [PDF]. + +

    SLURM is written in the C language and uses a GNU autoconf configuration +engine. While initially written for Linux, other UNIX-like operating systems should +be easy porting targets. Code should adhere to the +Linux kernel coding style. (Some components of SLURM have been taken from +various sources. Some of these components are written in C++ or do not conform +to the Linux kernel coding style. However, new code written for SLURM should +follow these standards.) + +

    Many of these modules have been built and tested on a variety of Unix computers +including Red Hat Linux, IBM's AIX, Sun's Solaris, and Compaq's Tru-64. The only +module at this time that is operating system dependent is src/slurmd/read_proc.c. +We will be porting and testing on additional platforms in future releases. + +

    Plugins

    + +

    To make the use of different infrastructures possible, SLURM uses a general +purpose plugin mechanism. A SLURM plugin is a dynamically linked code object that +is loaded explicitly at run time by the SLURM libraries. It provides a customized +implementation of a well-defined API connected to tasks such as authentication, +interconnect fabric, task scheduling, etc. A set of functions is defined for use +by all of the different infrastructures of a particular variety. When a SLURM +daemon is initiated, it reads the configuration file to determine which of the +available plugins should be used. A plugin developer's +guide is available with general information about plugins. Most plugin +types also have their own documenation available, such as +SLURM Authentication Plugin API and +SLURM Job Completion Logging API.

    + + + +

    Directory Structure

    + +

    The contents of the SLURM directory structure will be described below in increasing +detail as the structure is descended. The top level directory contains the scripts +and tools required to build the entire SLURM system. It also contains a variety +of subdirectories for each type of file.

    +

    General build tools/files include: acinclude.m4, autogen.sh, +configure.ac, Makefile.am, Make-rpm.mk, META, README, +slurm.spec.in, and the contents of the auxdir directory. autoconf +and make commands are used to build and install +SLURM in an automated fashion. NOTE: autoconf +version 2.52 or higher is required to build SLURM. Execute +autoconf -V to check your version number. +The build process is described in the README file. + +

    Copyright and disclaimer information are in the files COPYING and DISCLAIMER. +All of the top-level subdirectories are described below.

    +

    auxdir—Used for building SLURM.
    +doc—Documentation including man pages.
    +etc—Sample configuration files.
    +slurm—Header files for API use. These files must be installed. Placing +these header files in this location makes for better code portability.
    +src—Contains all source code and header files not in the "slurm" subdirectory +described above.
    +testsuite—DejaGnu is used as a testing framework and all of its files +are here.

    + + + +

    Documentation

    +

    All of the documentation is in the subdirectory doc. Man pages for the +APIs, configuration file, commands, and daemons are in doc/man. Various +documents suitable for public consumption are in doc/html. Overall SLURM +design documents including various figures are in doc/pubdesign. Various +design documents (many of which are dated) can be found in doc/slides and +doc/txt. A survey of available resource managers as of 2001 is in doc/survey. +

    Source Code

    + +

    Functions are divided into several categories, each in its own subdirectory. +The details of each directory's contents are proved below. The directories are +as follows:

    + +

    api—Application Program Interfaces into +the SLURM code. Used to send and get SLURM information from the central manager. +These are the functions user applications might utilize.
    +api—Application Programming Interfaces for SLURM commands and +user application use.
    +common—General purpose functions for widespread use throughout +SLURM.
    +plugins—Plugin functions for various infrastructure. A separate +subdirectory is used for each plugin class:
    +

      +
    • auth for user authentication,
      +
    • checkpoint for system-initiated checkpoint +and restart of user jobs,
      +
    • jobacct for job accounting,
      +
    • jobcomp for job completion logging,
      +
    • mpi for MPI support,
      +
    • proctrack for process tracking,
      +
    • sched for job scheduler,
      +
    • select for a job's node selection,
      +
    • switch for switch (interconnect) specific +functions,
      +
    • task for task affinity to processors.
      +
    +salloc—User command to allocate resources for a job.
    +sattach—User command to attach standard input, output and error +files to a running job or job step.
    +sbatch—User command to submit a batch job (script for later execution).
    +sbcast—User command to broadcast a file to all nodes associated +with an existing SLURM job.
    +scancel—User command to cancel (or signal) a job or job step.
    +scontrol—Administrator tool to manage SLURM.
    +sinfo—User command to get information on SLURM nodes and partitions.
    +slaunch—User command to launch tasks within an existing job allocateion.
    +slurmctld—SLURM central manager daemon code.
    +slurmd—SLURM daemon code to manage the compute server nodes including +the execution of user applications.
    +smap—User command to view layout of nodes, partitions, and jobs. +This is particularly valuable on systems like Blue Gene, which has a three +dimension torus topography.
    +squeue—User command to get information on SLURM jobs and job steps.
    +srun—User command to submit a job, get an allocation, and/or +initiation a parallel job step.

    +sview—User command to view and update node, partition, and job +job state information.
    + + + +

    Configuration

    +

    Sample configuration files are included in the etc subdirectory. +The slurm.conf can be built using a configuration tool. +See doc/man/man5/slurm.conf.5 and the man pages for other configuration files +for more details. +init.d.slurm is a script that determines which +SLURM daemon(s) should execute on any node based upon the configuration file contents. +It will also manage these daemons: starting, signalling, restarting, and stopping them.

    + +

    Test Suite

    +

    The testsuite files use a DejaGnu framework for testing. These tests +are very limited in scope.

    + +

    We also have a set of Expect SLURM tests available under the testsuite/expect +directory. These tests are executed after SLURM has been installed +and the daemons initiated. About 250 test scripts exercise all SLURM commands +and options including stress tests. The file testsuite/expect/globals +contains default paths and procedures for all of the individual tests. At +the very least, you will need to set the slurm_dir variable to the correct +value. To avoid conflicts with other developers, you can override variable settings +in a seperate file named testsuite/expect/globals.local.

    + +

    Set your working directory to testsuite/expect before +starting these tests. Tests may be executed individually by name +(e.g. test1.1) +or the full test suite may be executed with the single command regression. +See testsuite/expect/README for more information.

    + + +

    Adding Files and Directories

    +

    If you are adding files and directories to SLURM, it will be necessary to +re-build configuration files before executing the configure command. +Update Makefile.am files as needed then execute +autogen.sh before executing configure. + +

    Tricks of the Trade

    +

    HAVE_FRONT_END

    +

    You can make a single node appear to SLURM as a Linux cluster by manually +defining HAVE_FRONT_END to have a non-zero value in the file config.h. +All (fake) nodes should be defined in the slurm.conf file. +These nodes should be configured with a single NodeAddr value +indicating the node on which single slurmd daemon +executes. Initiate one slurmd and one +slurmctld daemon. Do not initiate too many +simultaneous job steps to avoid overloading the +slurmd daemon executing them all.

    + +

    Multiple slurmd support

    +

    It is possible to run mutiple slurmd daemons on a single node, each using +a different port number and NodeName alias. This is very useful for testing +networking and protocol changes, or anytime you want to simulate a larger +cluster than you really have. The author uses this on his desktop to simulate +multiple nodes. However, it is important to note that not all slurm functions +will work with multiple slurmd support enabled (e.g. many switch plugins will +not work, it is best to use switch/none).

    + +

    Multiple support is enabled at configure-time with the +"--enable-multiple-slurmd" parameter. This enables a new parameter in the +slurm.conf file on the NodeName line, "Port=", and adds a new +command line parameter to slurmd, "-N".

    + +

    Each slurmd needs to have its own NodeName, and its own TCP port number. Here +is an example of the NodeName lines for running three slurmd daemons on each +of ten nodes:

    + +
    +NodeName=foo[1-10] NodeHostname=host[1-10]  Port=17001
    +NodeName=foo[11-20] NodeHostname=host[1-10] Port=17002
    +NodeName=foo[21-30] NodeHostname=host[1-10] Port=17003
    +
    + +

    +It is likely that you will also want to use the "%n" symbol in any slurmd +related paths in the slurm.conf file, for instance SlurmdLogFile, +SlurmdPidFile, and especially SlurmdSpoolDir. Each slurmd replaces the "%n" +with its own NodeName. Here is an example:

    + +
    +SlurmdLogFile=/var/log/slurm/slurmd.%n.log
    +SlurmdPidFile=/var/run/slurmd.%n.pid
    +SlurmdSpoolDir=/var/spool/slurmd.%n
    +
    + +

    +It is up to you to start each slurmd daemon with the proper NodeName. +For example, to start the slurmd daemons for host1 from the +above slurm.conf example:

    + +
    +host1> slurmd -N foo1
    +host1> slurmd -N foo11
    +host1> slurmd -N foo21
    +
    + + + +

    Last modified 29 September 2006

    + + diff --git a/executable_names/doc/html/publications.shtml b/executable_names/doc/html/publications.shtml new file mode 100644 index 0000000000000000000000000000000000000000..2bd1a423ff8628b5650c403de2760b878f811686 --- /dev/null +++ b/executable_names/doc/html/publications.shtml @@ -0,0 +1,19 @@ + + +

    Publications

    +

    +SLURM: Simple Linux Utility for Resource Management [PDF], +M. Jette and M. Grondona, +Proceedings of ClusterWorld Conference and Expo, +San Jose, California, June 2003.

    + +

    SLURM: Simple Linux Utility for Resource Management, +A. Yoo, M. Jette, and M. Grondona, +Job Scheduling Strategies for Parallel Processing, +volume 2862 of Lecture Notes in Computer Science, +pages 44-60, +Springer-Verlag, 2003.

    + +

    Last modified 4 January 2006

    + + diff --git a/executable_names/doc/html/quickstart.shtml b/executable_names/doc/html/quickstart.shtml new file mode 100644 index 0000000000000000000000000000000000000000..7de0187abbebb09435c1b6adda9de8e4d3c5c597 --- /dev/null +++ b/executable_names/doc/html/quickstart.shtml @@ -0,0 +1,300 @@ + + +

    Quick Start User Guide

    + +

    Overview

    +

    The Simple Linux Utility for Resource Management (SLURM) is an open source, +fault-tolerant, and highly scalable cluster management and job scheduling system +for large and small Linux clusters. SLURM requires no kernel modifications for +its operation and is relatively self-contained. As a cluster resource manager, +SLURM has three key functions. First, it allocates exclusive and/or non-exclusive +access to resources (compute nodes) to users for some duration of time so they +can perform work. Second, it provides a framework for starting, executing, and +monitoring work (normally a parallel job) on the set of allocated nodes. Finally, +it arbitrates conflicting requests for resources by managing a queue of pending +work.

    + +

    Architecture

    +

    As depicted in Figure 1, SLURM consists of a slurmd daemon running on +each compute node and a central slurmctld daemon running on a management node +(with optional fail-over twin). +The slurmd daemons provide fault-tolerant hierarchical communciations. +The user commands include: srun, sbcast, scancel, +sinfo, srun, smap, squeue, and scontrol. +All of the commands can run anywhere in the cluster.

    + +
    +
    + Figure 1. SLURM components +
    + +

    The entities managed by these SLURM daemons, shown in Figure 2, include nodes, +the compute resource in SLURM, partitions, which group nodes into logical +sets, jobs, or allocations of resources assigned to a user for +a specified amount of time, and job steps, which are sets of (possibly +parallel) tasks within a job. +The partitions can be considered job queues, each of which has an assortment of +constraints such as job size limit, job time limit, users permitted to use it, etc. +Priority-ordered jobs are allocated nodes within a partition until the resources +(nodes, processors, memory, etc.) within that partition are exhausted. Once +a job is assigned a set of nodes, the user is able to initiate parallel work in +the form of job steps in any configuration within the allocation. For instance, +a single job step may be started that utilizes all nodes allocated to the job, +or several job steps may independently use a portion of the allocation.

    + +
    +
    + Figure 2. SLURM entities +
    + + + +

    Commands

    +

    Man pages exist for all SLURM daemons, commands, and API functions. The command +option --help also provides a brief summary of +options. Note that the command options are all case insensitive.

    +

    srun is used to submit a job for execution, +allocate resources, attach to an existing allocation, or initiate job steps. Jobs +can be submitted for immediate or later execution (e.g., batch). srun +has a wide variety of options to specify resource requirements, including: minimum +and maximum node count, processor count, specific nodes to use or not use, and +specific node characteristics (so much memory, disk space, certain required features, +etc.). Besides securing a resource allocation, srun +is used to initiate job steps. These job steps can execute sequentially or in +parallel on independent or shared nodes within the job's node allocation.

    + +

    sbcast is used to transfer a file +from local disk to local disk on the nodes allocated to a job. This can be +used to effectively use diskless compute nodes or provide improved performance +relative to a shared file system.

    + +

    scancel is used to cancel a pending +or running job or job step. It can also be used to send an arbitrary signal to +all processes associated with a running job or job step.

    + +

    scontrol is the administrative tool +used to view and/or modify SLURM state. Note that many scontrol +commands can only be executed as user root.

    + +

    sinfo reports the state of partitions +and nodes managed by SLURM. It has a wide variety of filtering, sorting, and formatting +options.

    + +

    squeue reports the state of jobs or +job steps. It has a wide variety of filtering, sorting, and formatting options. +By default, it reports the running jobs in priority order and then the pending +jobs in priority order.

    + +

    smap reports state information for +jobs, partitions, and nodes managed by SLURM, but graphically displays the +information to reflect network topology.

    + +

    sview is a graphical user interface to +get and update state information for jobs, partitions, and nodes managed by SLURM.

    + + + +

    Examples

    +

    Execute /bin/hostname on four nodes (-N4). +Include task numbers on the output (-l). The +default partition will be used. One task per node will be used by default.

    +
    +adev0: srun -N4 -l /bin/hostname
    +0: adev9
    +1: adev10
    +2: adev11
    +3: adev12
    +

    Execute /bin/hostname in four +tasks (-n4). Include task numbers on the output +(-l). The default partition will be used. One +processor per task will be used by default (note that we don't specify a node +count).

    +
    +adev0: srun -n4 -l /bin/hostname
    +0: adev9
    +1: adev9
    +2: adev10
    +3: adev10
    +

    Submit the script my.script for later execution (-b). +Explicitly use the nodes adev9 and adev10 (-w "adev[9-10]"; +note the use of a node range expression). One processor per task will be used +by default. The output will appear in the file my.stdout (-o +my.stdout). By default, one task will be initiated per processor on the +nodes. Note that my.script contains the command /bin/hostname +that executed on the first node in the allocation (where the script runs) plus +two job steps initiated using the srun command +and executed sequentially.

    +
    +adev0: cat my.script
    +#!/bin/sh
    +/bin/hostname
    +srun -l /bin/hostname
    +srun -l /bin/pwd
    +
    +adev0: srun -w "adev[9-10]" -o my.stdout -b my.script
    +srun: jobid 469 submitted
    +
    +adev0: cat my.stdout
    +adev9
    +0: adev9
    +1: adev9
    +2: adev10
    +3: adev10
    +0: /home/jette
    +1: /home/jette
    +2: /home/jette
    +3: /home/jette
    +
    + +

    Submit a job, get its status, and cancel it.

    +
    +adev0: srun -b my.sleeper
    +srun: jobid 473 submitted
    +
    +adev0: squeue
    +  JobId Partition Name     User     St TimeLimit Prio Nodes                        
    +    473 batch     my.sleep jette    R  UNLIMITED 0.99 adev9 
    +                       
    +adev0: scancel 473
    +
    +adev0: squeue
    +  JobId Partition Name     User     St TimeLimit Prio Nodes            
    +
    + +

    Get the SLURM partition and node status.

    +
    +adev0: sinfo
    +PARTITION  NODES STATE     CPUS    MEMORY    TMP_DISK NODES
    +--------------------------------------------------------------------------------
    +debug          8 IDLE         2      3448       82306 adev[0-7]
    +batch          1 DOWN         2      3448       82306 adev8
    +               7 IDLE         2 3448-3458       82306 adev[9-15]
    +
    + + +

    MPI

    +

    MPI use depends upon the type of MPI being used. +Instructions for using several varieties of MPI with SLURM are +provided below.

    + +

    Open MPI relies upon +SLURM to allocate resources for the job and then mpirun to initiate the +tasks. For example: +

    +$ srun -n4 -A	# allocates four processors and spawns shell for job
    +> mpirun -np 4 a.out
    +> exit          # exits shell spawned by initial srun command
    +
    +Note that any direct use of srun +will only launch one task per node when the LAM/MPI plugin is used. +To launch more than one task per node usng the +srun command, the --mpi=none +option will be required to explicitly disable the LAM/MPI plugin.

    + +

    Quadrics MPI relies upon SLURM to +allocate resources for the job and srun +to initiate the tasks. One would build the MPI program in the normal manner +then initiate it using a command line of this sort:

    +
    +$ srun [OPTIONS] <program> [program args]
    +
    + +

    LAM/MPI relies upon the SLURM +srun command to allocate resources using +either the --allocate or the +--batch option. In either case, specify +the maximum number of tasks required for the job. Then execute the +lamboot command to start lamd daemons. +lamboot utilizes SLURM's +srun command to launch these daemons. +Do not directly execute the srun command +to launch LAM/MPI tasks. For example: +

    +$ srun -n16 -A     # allocates 16 processors and spawns shell for job
    +> lamboot
    +> mpirun -np 16 foo args
    +1234 foo running on adev0 (o)
    +2345 foo running on adev1
    +etc.
    +> lamclean
    +> lamhalt
    +> exit             # exits shell spawned by initial srun command
    +
    +Note that any direct use of srun +will only launch one task per node when the LAM/MPI plugin is configured +as the default plugin. To launch more than one task per node usng the +srun command, the --mpi=none +option would be required to explicitly disable the LAM/MPI plugin +if that is the system default.

    + + + +

    HP-MPI uses the +mpirun command with the -srun +option to launch jobs. For example: +

    +$MPI_ROOT/bin/mpirun -TCP -srun -N8 ./a.out
    +

    + +

    MPICH2 jobs +are launched using the srun command. Just link your program with +SLURM's implementation of the PMI library so that tasks can communicate +host and port information at startup. (The system administrator can add +these option to the mpicc and mpif77 commands directly, so the user will not +need to bother). For example: +

    +$ mpicc -L<path_to_slurm_lib> -lpmi ...
    +$ srun -n20 a.out
    +
    +NOTES: +
      +
    • Some MPICH2 functions are not currently supported by the PMI +libary integrated with SLURM
    • +
    • Set the environment variable PMI_DEBUG to a numeric value +of 1 or higher for the PMI libary to print debugging information
    • +

    + +

    MVAPICH +jobs can be launched directly by srun command. +SLURM's mvapich MPI plugin must be used to establish communications +between the laucnhed tasks. This can be accomplished either using the SLURM +configuration parameter MpiDefault=mvapich in slurm.conf +or srun's --mpi=mvapich option. +

    +$ mpicc ...
    +$ srun -n16 --mpi=mvapich a.out
    +
    + +

    MVAPICH2 +jobs can be launched directly by srun command. +SLURM's none MPI plugin must be used to establish communications +between the laucnhed tasks. This can be accomplished either using the SLURM +configuration parameter MpiDefault=none in slurm.conf +or srun's --mpi=none option. The program must also be linked with +SLURM's implementation of the PMI library so that tasks can communicate +host and port information at startup. (The system administrator can add +these option to the mpicc and mpif77 commands directly, so the user will not +need to bother). Do not use SLURM's MVAPICH plugin for MVAPICH2. +

    +$ mpicc -L<path_to_slurm_lib> -lpmi ...
    +$ srun -n16 --mpi=none a.out
    +
    + +

    BlueGene MPI relies +upon SLURM to create the resource allocation and then uses the native +mpirun command to launch tasks. +Build a job script containing one or more invocations of the +mpirun command. Then submit +the script to SLURM using srun +command with the --batch option. For example: +

    +$ srun -N2 --batch my.script
    +
    +Note that the node count specified with the -N option indicates +the base partition count. +See BlueGene User and Administrator Guide +for more information.

    + +

    Last modified 29 September 2006

    + + diff --git a/executable_names/doc/html/quickstart_admin.shtml b/executable_names/doc/html/quickstart_admin.shtml new file mode 100644 index 0000000000000000000000000000000000000000..0659b41ff12ca3e5a440671ea6254e188b030157 --- /dev/null +++ b/executable_names/doc/html/quickstart_admin.shtml @@ -0,0 +1,609 @@ + + +

    Quick Start Administrator Guide

    +

    Overview

    +Please see the Quick Start User Guide for a general +overview. + +

    Super Quick Start

    +
      +
    1. bunzip2 the distributed tar-ball and untar the files:
      +tar --bzip -x -f slurm*tar.bz2
    2. +
    3. cd to the directory containing the SLURM source and type +./configure with appropriate options, typically --prefix= +and --sysconfdir=
    4. +
    5. Type make to compile SLURM.
    6. +
    7. Type make install to install the programs, documentation, libaries, +header files, etc.
    8. +
    9. Build a configuration file using your favorite web browser and +doc/html/configurator.html.
    10. +
    11. Install the configuration file in <sysconfdir>/slurm.conf.
    12. +
    13. Create OpenSSL Keys:
      +openssl genrsa -out <sysconfdir>/slurm.key 1024
      +openssl rsa -in <sysconfdir>/slurm.key -pubout -out <sysconfdir>/slurm.cert
    14. +
    15. Start the slurmctld and slurmd daemons.
    16. +
    +

    NOTE: Items 1 through 4 can be replaced with

    +
      +
    1. rpmbuild -ta slurm*.tar.bz2
    2. +
    3. rpm --install <the rpm files>
    4. +
    + +

    Building and Installing

    + +

    Instructions to build and install SLURM manually are shown below. +See the README and INSTALL files in the source distribution for more details. +

    +
      +
    1. bunzip2 the distributed tar-ball and untar the files:
      +tar --bzip -x -f slurm*tar.bz2 +
    2. cd to the directory containing the SLURM source and type +./configure with appropriate options.
    3. +
    4. Type make to compile SLURM.
    5. +
    6. Type make install to install the programs, documentation, libaries, +header files, etc.
    7. +
    +

    The most commonly used arguments to the configure +command include:

    +

    --enable-debug
    +Enable additional debugging logic within SLURM.

    +

    --prefix=PREFIX
    +
    +Install architecture-independent files in PREFIX; default value is /usr/local.

    +

    --sysconfdir=DIR
    + +Specify location of SLURM configuration file. The default value is PREFIX/etc

    + +

    If required libraries or header files are in non-standard locations, +set CFLAGS and LDFLAGS environment variables accordingly. +Type configure --help for a more complete description of options. +Optional SLURM plugins will be built automatically when the +configure script detects that the required +build requirements are present. Build dependencies for various plugins +and commands are denoted below. +

    +
      +
    • Munge The auth/munge plugin will be built if Chris Dunlap's Munge + library is installed.
    • +
    • Authd The auth/authd plugin will be built and installed if + the libauth library and its dependency libe are installed. +
    • +
    • Federation The switch/federation plugin will be built and installed + if the IBM Federation switch libary is installed. +
    • QsNet support in the form of the switch/elan plugin requires + that the qsnetlibs package (from Quadrics) be installed along + with its development counterpart (i.e. the qsnetheaders + package.) The switch/elan plugin also requires the + presence of the libelanosts library and /etc/elanhosts + configuration file. (See elanhosts(5) man page in that + package for more details). Define the nodes in the SLURM + configuration file slurm.conf in the same order as + defined in the elanhosts configuration file so that + node allocation for jobs can be performed so as to optimize + their performance. We highly recommend assigning the nodes + a numeric suffix equal to its Elan address for ease of + administration and because the Elan driver does not seem + to function otherwise + (e.g. /etc/elanhosts to contain two lines of this sort:
      + eip [0-15] linux[0-15]
      + eth [0-15] linux[0-15]
      + for fifteen nodes with a prefix of "linux" and + numeric suffix between zero and 15). Finally, the + "ptrack" kernel patch is required for process + tracking. +
    • sview The sview command will be built only if libglade-2.0 + and gtk+-2.0 are installed
    • +
    +Please see the Download page for references to +required software to build these plugins.

    + +

    To build RPMs directly, copy the distributed tar-ball into the directory +/usr/src/redhat/SOURCES and execute a command of this sort (substitute +the appropriate SLURM version number):
    +rpmbuild -ta slurm-0.6.0-1.tar.bz2

    + +

    You can control some aspects of the RPM built with a .rpmmacros +file in your home directory. Special macro definitions will likely +only be required if files are installed in unconventional locations. +Some macro definitions that may be used in building SLURM include: +

    +
    _enable_debug +
    Specify if debugging logic within SLURM is to be enabled +
    _prefix +
    Pathname of directory to contain the SLURM files +
    _sysconfdir +
    Pathname of directory containing the slurm.conf configuration file +
    with_munge +
    Specifies munge (authentication library) installation location +
    with_proctrack +
    Specifies AIX process tracking kernel extension header file location +
    with_ssl +
    Specifies SSL libary installation location +
    +To build SLURM on our AIX system, the following .rpmmacros file is used: +
    +# .rpmmacros
    +# For AIX at LLNL
    +# Override some RPM macros from /usr/lib/rpm/macros
    +# Set other SLURM-specific macros for unconventional file locations
    +#
    +%_enable_debug     "--with-debug"
    +%_prefix           /admin/llnl
    +%_sysconfdir       %{_prefix}/etc/slurm
    +%with_munge        "--with-munge=/admin/llnl"
    +%with_proctrack    "--with-proctrack=/admin/llnl/include"
    +%with_ssl          "--with-ssl=/opt/freeware"
    +

    + + + +

    Daemons

    +

    slurmctld is sometimes called the "controller" daemon. It +orchestrates SLURM activities, including queuing of job, monitoring node state, +and allocating resources (nodes) to jobs. There is an optional backup controller +that automatically assumes control in the event the primary controller fails. +The primary controller resumes control whenever it is restored to service. The +controller saves its state to disk whenever there is a change. +This state can be recovered by the controller at startup time. +State changes are saved so that jobs and other state can be preserved when +controller moves (to or from backup controller) or is restarted.

    + +

    We recommend that you create a Unix user slurm for use by +slurmctld. This user name will also be specified using the +SlurmUser in the slurm.conf configuration file. +Note that files and directories used by slurmctld will need to be +readable or writable by the user SlurmUser (the slurm configuration +files must be readable; the log file directory and state save directory +must be writable).

    + +

    The slurmd daemon executes on every compute node. It resembles a remote +shell daemon to export control to SLURM. Because slurmd initiates and manages +user jobs, it must execute as the user root.

    + +

    slurmctld and/or slurmd should be initiated at node startup time +per the SLURM configuration. +A file etc/init.d/slurm is provided for this purpose. +This script accepts commands start, startclean (ignores +all saved state), restart, and stop.

    + +

    Infrastructure

    +

    Authentication of SLURM communications

    +

    All communications between SLURM components are authenticated. The +authentication infrastructure is provided by a dynamically loaded +plugin chosen at runtame via the AuthType keyword in the SLURM +configuration file. Currently available authentication types include +authd, +munge, and none. +The default authentication infrastructure is "none". This permits any user to execute +any job as another user. This may be fine for testing purposes, but certainly not for production +use. Configure some AuthType value other than "none" if you want any security. +We recommend the use of Munge unless you are experienced with authd. +

    +

    While SLURM itself does not rely upon synchronized clocks on all nodes +of a cluster for proper operation, its underlying authentication mechanism +may have this requirement. For instance, if SLURM is making use of the +auth/munge plugin for communication, the clocks on all nodes will need to +be synchronized.

    + +

    MPI support

    +

    Quadrics MPI works directly with SLURM on systems having Quadrics +interconnects and is the preferred version of MPI for those systems. +Set the MpiDefault=none configuration parameter in slurm.conf.

    + +

    For Myrinet systems, MPICH-GM +is preferred. In order to use MPICH-GM, set MpiDefault=mpichgm and +ProctrackType=proctrack/linuxproc configuration parameters in +slurm.conf.

    + +

    HP customers would be well served by using +HP-MPI.

    + +

    A good open-source MPI for use with SLURM is +LAM MPI. LAM MPI uses the command +lamboot to initiate job-specific daemons on each node using SLURM's +srun +command. This places all MPI processes in a process-tree under the control of +the slurmd daemon. LAM/MPI version 7.1 or higher contains support for +SLURM. +Set the MpiDefault=none configuration parameters in slurm.conf. +LAM MPI will explicitly set the mpi plugin type to "lam" on the +srun execute line as needed.

    + +

    Another good open-source MPI for use with SLURM is +Open MPI. Open MPI initiates its +processes using SLURM's srun +command. +Set the MpiDefault=none configuration parameters in slurm.conf. +Open MPI will explicitly set the mpi plugin type to "lam" on the +srun execute line as needed.

    + +

    Note that the ordering of tasks within an job's allocation matches that of +nodes in the slurm.conf configuration file. SLURM presently lacks the ability +to arbitrarily order tasks across nodes.

    + +

    Scheduler support

    +

    The scheduler used by SLURM is controlled by the SchedType configuration +parameter. This is meant to control the relative importance of pending jobs. +SLURM's default scheduler is FIFO (First-In First-Out). A backfill scheduler +plugin is also available. Backfill scheduling will initiate a lower-priority job +if doing so does not delay the expected initiation time of higher priority jobs; +essentially using smaller jobs to fill holes in the resource allocation plan. +SLURM also supports a plugin for use of + +The Maui Scheduler or + +Moab Cluster Suite which offer sophisticated scheduling algorithms. +Motivated users can even develop their own scheduler plugin if so desired.

    + +

    Node selection

    +

    The node selection mechanism used by SLURM is controlled by the +SelectType configuration parameter. +If you want to execute multiple jobs per node, but apportion the processors, +memory and other resources, the cons_res (consumable resources) +plugin is recommended. +If you tend to dedicate entire nodes to jobs, the linear plugin +is recommended. +For more information, please see +Consumable Resources in SLURM. +For BlueGene systems, bluegene plugin is required (it is topology +aware and interacts with the BlueGene bridge API).

    + +

    Logging

    +

    SLURM uses the syslog function to record events. It uses a range of importance +levels for these messages. Be certain that your system's syslog functionality +is operational.

    + +

    Corefile format

    +

    SLURM is designed to support generating a variety of core file formats for +application codes that fail (see the --core option of the srun +command). As of now, SLURM only supports a locally developed lightweight +corefile library which has not yet been released to the public. It is +expected that this library will be available in the near future.

    + +

    Parallel debugger support

    +

    SLURM exports information for parallel debuggers using the specification +detailed here. +This is meant to be exploited by any parallel debugger (notably, TotalView), +and support is unconditionally compiled into SLURM code. +

    +

    We use a patched version of TotalView that looks for a "totalview_jobid" +symbol in srun that it then uses (configurably) to perform a bulk +launch of the tvdsvr daemons via a subsequent srun. Otherwise +it is difficult to get TotalView to use srun for a bulk launch, since +srun will be unable to determine for which job it is launching tasks. +

    +

    Another solution would be to run TotalView within an existing srun +--allocate session. Then the Totalview bulk launch command to srun +could be set to ensure only a single task per node. This functions properly +because the SLRUM_JOBID environment variable is set in the allocation shell +environment. +

    + +

    Compute node access

    +

    SLURM does not by itself limit access to allocated compute nodes, +but it does provide mechanisms to accomplish this. +There is a Pluggable Authentication Module (PAM) for restricting access +to compute nodes available for download. +When installed, the SLURM PAM module will prevent users from logging +into any node that has not be assigned to that user. +On job termination, any processes initiated by the user outside of +SLURM's control may be killed using an Epilog script configured +in slurm.conf. +An example of such a script is included as etc/slurm.epilog.clean. +Without these mechanisms any user can login to any compute node, +even those allocated to other users.

    + + + +

    Configuration

    +

    The SLURM configuration file includes a wide variety of parameters. +This configuration file must be available on each node of the cluster. A full +description of the parameters is included in the slurm.conf man page. Rather than +duplicate that information, a minimal sample configuration file is shown below. +Your slurm.conf file should define at least the configuration parameters defined +in this sample and likely additional ones. Any text +following a "#" is considered a comment. The keywords in the file are +not case sensitive, although the argument typically is (e.g., "SlurmUser=slurm" +might be specified as "slurmuser=slurm"). The control machine, like +all other machine specifications, can include both the host name and the name +used for communications. In this case, the host's name is "mcri" and +the name "emcri" is used for communications. +In this case "emcri" is the private management network interface +for the host "mcri". Port numbers to be used for +communications are specified as well as various timer values.

    + +

    A description of the nodes and their grouping into partitions is required. +A simple node range expression may optionally be used to specify +ranges of nodes to avoid building a configuration file with large +numbers of entries. The node range expression can contain one +pair of square brackets with a sequence of comma separated +numbers and/or ranges of numbers separated by a "-" +(e.g. "linux[0-64,128]", or "lx[15,18,32-33]"). +On BlueGene systems only, the square brackets should contain +pairs of three digit numbers separated by a "x". +These numbers indicate the boundaries of a rectangular prism +(e.g. "bgl[000x144,400x544]"). +See our Blue Gene User and Administrator Guide +for more details. +Presently the numeric range must be the last characters in the +node name (e.g. "unit[0-31]rack1" is invalid).

    + +

    Node names can have up to three name specifications: +NodeName is the name used by all SLURM tools when referring to the node, +NodeAddr is the name or IP address SLURM uses to communicate with the node, and +NodeHostname is the name returned by the command /bin/hostname -s. +Only NodeName is required (the others default to the same name), +although supporting all three parameters provides complete control over +naming and addressing the nodes. See the slurm.conf man page for +details on all configuration parameters.

    + +

    Nodes can be in more than one partition and each partition can have different +constraints (permitted users, time limits, job size limits, etc.). +Each partition can thus be considered a separate queue. +Partition and node specifications use node range expressions to identify +nodes in a concise fashion. This configuration file defines a 1154-node cluster +for SLURM, but it might be used for a much larger cluster by just changing a few +node range expressions. Specify the minimum processor count (Procs), real memory +space (RealMemory, megabytes), and temporary disk space (TmpDisk, megabytes) that +a node should have to be considered available for use. Any node lacking these +minimum configuration values will be considered DOWN and not scheduled. +Note that a more extensive sample configuration file is provided in +etc/slurm.conf.example. We also have a web-based +configuration tool which can +be used to build a simple configuration file.

    +
    +# 
    +# Sample /etc/slurm.conf for mcr.llnl.gov
    +#
    +ControlMachine=mcri   ControlAddr=emcri
    +BackupMachine=mcrj    BackupAddr=emcrj 
    +#
    +AuthType=auth/munge
    +Epilog=/usr/local/slurm/etc/epilog
    +FastSchedule=1
    +JobCompLoc=/var/tmp/jette/slurm.job.log
    +JobCompType=jobcomp/filetxt
    +JobCredentialPrivateKey=/usr/local/etc/slurm.key
    +JobCredentialPublicCertificate=/usr/local/etc/slurm.cert
    +PluginDir=/usr/local/slurm/lib/slurm
    +Prolog=/usr/local/slurm/etc/prolog
    +SchedulerType=sched/backfill
    +SelectType=select/linear
    +SlurmUser=slurm
    +SlurmctldPort=7002
    +SlurmctldTimeout=300
    +SlurmdPort=7003
    +SlurmdSpoolDir=/var/tmp/slurmd.spool
    +SlurmdTimeout=300
    +StateSaveLocation=/tmp/slurm.state
    +SwitchType=switch/elan
    +TreeWidth=50
    +#
    +# Node Configurations
    +#
    +NodeName=DEFAULT Procs=2 RealMemory=2000 TmpDisk=64000 State=UNKNOWN
    +NodeName=mcr[0-1151] NodeAddr=emcr[0-1151]
    +#
    +# Partition Configurations
    +#
    +PartitionName=DEFAULT State=UP    
    +PartitionName=pdebug Nodes=mcr[0-191] MaxTime=30 MaxNodes=32 Default=YES
    +PartitionName=pbatch Nodes=mcr[192-1151]
    +
    +

    Security

    +

    You will should create unique job credential keys for your site +using the program openssl. +You must use openssl and not ssh-genkey to construct these keys. +An example of how to do this is shown below. Specify file names that +match the values of JobCredentialPrivateKey and +JobCredentialPublicCertificate in your configuration file. +The JobCredentialPrivateKey file must be readable only by SlurmUser. +The JobCredentialPublicCertificate file must be readable by all users. +Both files must be available on all nodes in the cluster. +These keys are used by slurmctld to construct a job credential, +which is sent to srun and then forwarded to slurmd to +initiate job steps.

    + +

    +openssl genrsa -out <sysconfdir>/slurm.key 1024
    +openssl rsa -in <sysconfdir>/slurm.key -pubout -out <sysconfdir>/slurm.cert +

    +

    SLURM does not use reserved ports to authenticate communication between +components, but relies upon an external entity to determine the user who +initiated a request. +You must specify one "auth" plugin for this purpose. +Currently, only three +authentication plugins are supported: auth/none, auth/authd, and +auth/munge. The auth/none plugin is built and used by default, but either +Brent Chun's authd, or Chris Dunlap's +munge should be installed in order to +get properly authenticated communications. +Unless you are experience with authd, we recommend the use of munge. +The configure script in the top-level directory of this distribution will determine +which authentication plugins may be built. The configuration file specifies which +of the available plugins will be utilized.

    + +

    A PAM module (Pluggable Authentication Module) is available for SLURM that +can prevent a user from accessing a node which he has not been allocated, if that +mode of operation is desired.

    + + +

    Starting the Daemons

    +

    For testing purposes you may want to start by just running slurmctld and slurmd +on one node. By default, they execute in the background. Use the -D +option for each daemon to execute them in the foreground and logging will be done +to your terminal. The -v option will log events +in more detail with more v's increasing the level of detail (e.g. -vvvvvv). +You can use one window to execute "slurmctld -D -vvvvvv", +a second window to execute "slurmd -D -vvvvv". +You may see errors such as "Connection refused" or "Node X not responding" +while one daemon is operative and the other is being started, but the +daemons can be started in any order and proper communications will be +established once both daemons complete initialization. +You can use a third window to execute commands such as +"srun -N1 /bin/hostname" to confirm functionality.

    + +

    Another important option for the daemons is "-c" +to clear previous state information. Without the "-c" +option, the daemons will restore any previously saved state information: node +state, job state, etc. With the "-c" option all +previously running jobs will be purged and node state will be restored to the +values specified in the configuration file. This means that a node configured +down manually using the scontrol command will +be returned to service unless also noted as being down in the configuration file. +In practice, SLURM restarts with preservation consistently.

    +

    A thorough battery of tests written in the "expect" language is also +available.

    + + +

    Administration Examples

    +

    scontrol can be used to print all system information +and modify most of it. Only a few examples are shown below. Please see the scontrol +man page for full details. The commands and options are all case insensitive.

    +

    Print detailed state of all jobs in the system.

    +
    +adev0: scontrol
    +scontrol: show job
    +JobId=475 UserId=bob(6885) Name=sleep JobState=COMPLETED
    +   Priority=4294901286 Partition=batch BatchFlag=0
    +   AllocNode:Sid=adevi:21432 TimeLimit=UNLIMITED
    +   StartTime=03/19-12:53:41 EndTime=03/19-12:53:59
    +   NodeList=adev8 NodeListIndecies=-1
    +   ReqProcs=0 MinNodes=0 Shared=0 Contiguous=0
    +   MinProcs=0 MinMemory=0 Features=(null) MinTmpDisk=0
    +   ReqNodeList=(null) ReqNodeListIndecies=-1
    +
    +JobId=476 UserId=bob(6885) Name=sleep JobState=RUNNING
    +   Priority=4294901285 Partition=batch BatchFlag=0
    +   AllocNode:Sid=adevi:21432 TimeLimit=UNLIMITED
    +   StartTime=03/19-12:54:01 EndTime=NONE
    +   NodeList=adev8 NodeListIndecies=8,8,-1
    +   ReqProcs=0 MinNodes=0 Shared=0 Contiguous=0
    +   MinProcs=0 MinMemory=0 Features=(null) MinTmpDisk=0
    +   ReqNodeList=(null) ReqNodeListIndecies=-1
    +

    Print the detailed state of job 477 and change its priority to +zero. A priority of zero prevents a job from being initiated (it is held in "pending" +state).

    +
    +adev0: scontrol
    +scontrol: show job 477
    +JobId=477 UserId=bob(6885) Name=sleep JobState=PENDING
    +   Priority=4294901286 Partition=batch BatchFlag=0
    +   more data removed....
    +scontrol: update JobId=477 Priority=0
    +
    + +

    Print the state of node adev13 and drain it. To drain a node specify a new +state of DRAIN, DRAINED, or DRAINING. SLURM will automatically set it to the appropriate +value of either DRAINING or DRAINED depending on whether the node is allocated +or not. Return it to service later.

    +
    +adev0: scontrol
    +scontrol: show node adev13
    +NodeName=adev13 State=ALLOCATED CPUs=2 RealMemory=3448 TmpDisk=32000
    +   Weight=16 Partition=debug Features=(null) 
    +scontrol: update NodeName=adev13 State=DRAIN
    +scontrol: show node adev13
    +NodeName=adev13 State=DRAINING CPUs=2 RealMemory=3448 TmpDisk=32000
    +   Weight=16 Partition=debug Features=(null) 
    +scontrol: quit
    +Later
    +adev0: scontrol 
    +scontrol: show node adev13
    +NodeName=adev13 State=DRAINED CPUs=2 RealMemory=3448 TmpDisk=32000
    +   Weight=16 Partition=debug Features=(null) 
    +scontrol: update NodeName=adev13 State=IDLE
    +

    Reconfigure all SLURM daemons on all nodes. This should +be done after changing the SLURM configuration file.

    +
    +adev0: scontrol reconfig
    +

    Print the current SLURM configuration. This also reports if the +primary and secondary controllers (slurmctld daemons) are responding. To just +see the state of the controllers, use the command ping.

    +
    +adev0: scontrol show config
    +Configuration data as of 03/19-13:04:12
    +AuthType          = auth/munge
    +BackupAddr        = eadevj
    +BackupController  = adevj
    +ControlAddr       = eadevi
    +ControlMachine    = adevi
    +Epilog            = (null)
    +FastSchedule      = 1
    +FirstJobId        = 1
    +InactiveLimit     = 0
    +JobCompLoc        = /var/tmp/jette/slurm.job.log
    +JobCompType       = jobcomp/filetxt
    +JobCredPrivateKey = /etc/slurm/slurm.key
    +JobCredPublicKey  = /etc/slurm/slurm.cert
    +KillWait          = 30
    +MaxJobCnt         = 2000
    +MinJobAge         = 300
    +PluginDir         = /usr/lib/slurm
    +Prolog            = (null)
    +ReturnToService   = 1
    +SchedulerAuth     = (null)
    +SchedulerPort     = 65534
    +SchedulerType     = sched/backfill
    +SlurmUser         = slurm(97)
    +SlurmctldDebug    = 4
    +SlurmctldLogFile  = /tmp/slurmctld.log
    +SlurmctldPidFile  = /tmp/slurmctld.pid
    +SlurmctldPort     = 7002 
    +SlurmctldTimeout  = 300
    +SlurmdDebug       = 65534
    +SlurmdLogFile     = /tmp/slurmd.log
    +SlurmdPidFile     = /tmp/slurmd.pid
    +SlurmdPort        = 7003
    +SlurmdSpoolDir    = /tmp/slurmd
    +SlurmdTimeout     = 300
    +TreeWidth         = 50
    +JobAcctLogFile    = /tmp/jobacct.log
    +JobAcctFrequncy   = 5
    +JobAcctType       = jobacct/linux
    +SLURM_CONFIG_FILE = /etc/slurm/slurm.conf
    +StateSaveLocation = /usr/local/tmp/slurm/adev
    +SwitchType        = switch/elan
    +TmpFS             = /tmp
    +WaitTime          = 0
    +
    +Slurmctld(primary/backup) at adevi/adevj are UP/UP
    +

    Shutdown all SLURM daemons on all nodes.

    +
    +adev0: scontrol shutdown
    +
    + +

    Testing

    +

    An extensive test suite is available within the SLURM distribution +in testsuite/expect. +There are about 250 tests which will execute on the order of 2000 jobs +and 4000 job steps. +Depending upon your system configuration and performance, this test +suite will take roughly 40 minutes to complete. +The file testsuite/expect/globals contains default paths and +procedures for all of the individual tests. You will need to edit this +file to specify where SLURM and other tools are installed. +Set your working directory to testsuite/expect before +starting these tests. +Tests may be executed individually by name (e.g. test1.1) +or the full test suite may be executed with the single command +regression. +See testsuite/expect/README for more information.

    + +

    Upgrades

    +

    When upgrading to a new major or minor release of SLURM (e.g. 1.1.x to 1.2.x) +all running and pending jobs will be purged due to changes in state save +information. It is possible to develop software to translate state information +between versions, but we do not normally expect to do so. +When upgrading to a new micro release of SLURM (e.g. 1.2.1 to 1.2.2) all +running and pending jobs will be preserved. Just install a new version of +SLURM and restart the daemons. +An exception to this is that jobs may be lost when installing new pre-release +versions (e.g. 1.3.0-pre1 to 1.3.0-pre2). We'll try to note these cases +in the NEWS file. + +

    + +

    Last modified 5 October 2006

    + + diff --git a/executable_names/doc/html/review_release.html b/executable_names/doc/html/review_release.html new file mode 100644 index 0000000000000000000000000000000000000000..84bd793370420bf6430f9d9d4630893b6de18dd1 --- /dev/null +++ b/executable_names/doc/html/review_release.html @@ -0,0 +1,50 @@ + + + +SLURM Web pages for Review and Release + + + +

    SLURM Web pages for Review and Release

    +NOTE: Do not follow links. + + + + diff --git a/executable_names/doc/html/schedplugins.shtml b/executable_names/doc/html/schedplugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..0188a793fa3a7e38ce4bc38341814251d79b914d --- /dev/null +++ b/executable_names/doc/html/schedplugins.shtml @@ -0,0 +1,123 @@ + + +

    SLURM Scheduler Plugin API

    + +

    Overview

    +

    This document describes SLURM scheduler plugins and the API that defines +them. It is intended as a resource to programmers wishing to write their own SLURM +scheduler plugins. This is version 0 of the API.

    + +

    It is noteworthy that two different models are used for job scheduling. +The backfill scheduler lets SLURM establish the initial job priority +and can periodically alter job priorities to change their order within the queue. +The wiki scheduler establishes an initial priority of zero (held) for +all jobs. These jobs only begin execution when the wiki scheduler +explicitly raises the their priority (releasing them). +Developers may use the model that best fits their needs. +Note that a separate node selection plugin +is available for controlling that aspect of scheduling.

    + +

    SLURM scheduler plugins are SLURM plugins that implement the SLURM scheduler +API described herein. They must conform to the SLURM Plugin API with the following +specifications:

    +

    const char plugin_type[]
    +The major type must be "sched." The minor type can be any recognizable +abbreviation for the type of scheduler. We recommend, for example:

    +
      +
    • builtin—A plugin that implements the API without providing any actual +scheduling services. This is the default behavior and implements first-in-first-out scheduling.
    • +
    • backfill—Raise the priority of jobs if doing so results in their starting earlier +without any delay in the expected initiation time of any higher priority job.
    • +
    • wiki—Use + +The Maui Scheduler (Wiki version) or + +Moab Cluster Suite as an external entity to control SLURM job scheduling.
    • +
    +

    The plugin_name and +plugin_version +symbols required by the SLURM Plugin API require no specialization for scheduler support. +Note carefully, however, the versioning discussion below.

    +

    The programmer is urged to study +src/plugins/sched/backfill and +src/plugins/sched/builtin +for sample implementations of a SLURM scheduler plugin.

    + + +

    Data Objects

    +

    The implementation must maintain (though not necessarily directly export) an +enumerated errno to allow SLURM to discover +as practically as possible the reason for any failed API call. Plugin-specific enumerated +integer values should be used when appropriate. It is desirable that these values +be mapped into the range ESLURM_SCHED_MIN and ESLURM_SCHED_MAX +as defined in slurm/slurm_errno.h. +The error number should be returned by the function +slurm_sched_get_errno() +and string describing the error's meaning should be returned by the function +slurm_sched_strerror() +described below.

    + +

    These values must not be used as return values in integer-valued functions +in the API. The proper error return value from integer-valued functions is SLURM_ERROR. +The implementation should endeavor to provide useful and pertinent information by +whatever means is practical. In some cases this means an errno for each credential, +since plugins must be re-entrant. If a plugin maintains a global errno in place of or in +addition to a per-credential errno, it is not required to enforce mutual exclusion on it. +Successful API calls are not required to reset any errno to a known value. However, +the initial value of any errno, prior to any error condition arising, should be +SLURM_SUCCESS.

    + + +

    API Functions

    +

    The following functions must appear. Functions which are not implemented should +be stubbed.

    + +

    int slurm_sched_plugin_schedule (void);

    +

    Description: For passive schedulers, invoke a scheduling pass.

    +

    Arguments: None

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    uint32_t slurm_sched_plugin_initial_priority (uint32_t last_prio);

    +

    Description: Establish the initial priority of a new job.

    +

    Arguments: last_prio  +  (input) default priority of the previously submitted job. This can be used to +provide First-In-First-Out scheduling by assigning the new job a priority lower than this value. +This could also be used to establish an initial priority of zero for all jobs, representing a +"held" state. The scheduler plugin can then decide where and when to initiate pending jobs +by altering their priority and (optionally) list of required nodes.

    +

    Returns: The priority to be assigned to this job.

    + +

    void slurm_sched_plugin_job_is_pending (void);

    +

    Description: Note that some job is pending execution..

    +

    Arguments: None

    +

    Returns: Nothing.

    + + +

    int slurm_sched_get_errno (void);

    +

    Description: Return the number of a scheduler +specific error.

    +

    Arguments: None

    +

    Returns: Error number for the last failure encountered by +the scheduler plugin.

    + +

    const char *slurm_sched_strerror(int errnum);

    +

    Description: Return a string description of a scheduler +specific error code.

    +

    Arguments: + errnum    (input) a scheduler +specific error code.

    +

    Returns: Pointer to string describing the error +or NULL if no description found in this plugin.

    + + +

    Versioning

    +

    This document describes version 0 of the SLURM Scheduler API. Future +releases of SLURM may revise this API. A scheduler plugin conveys its ability +to implement a particular API version using the mechanism outlined for SLURM plugins.

    + + +

    Last modified 24 August 2006

    + + diff --git a/executable_names/doc/html/selectplugins.shtml b/executable_names/doc/html/selectplugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..eb55406522928b2775da912c4bae86763ed6c520 --- /dev/null +++ b/executable_names/doc/html/selectplugins.shtml @@ -0,0 +1,368 @@ + + +

    SLURM Node Selection Plugin API

    + +

    Overview

    +

    This document describes SLURM node selection plugins and the API that defines +them. It is intended as a resource to programmers wishing to write their own SLURM +node selection plugins. This is version 0 of the API.

    + +

    SLURM node selection plugins are SLURM plugins that implement the SLURM node selection +API described herein. They are intended to provide a mechanism for both selecting +nodes for pending jobs and performing any system-specific tasks for job launch or +termination. The plugins must conform to the SLURM Plugin API with the following +specifications:

    +

    const char plugin_type[]
    +The major type must be "select." The minor type can be any recognizable +abbreviation for the type of node selection algorithm. We recommend, for example:

    +
      +
    • linear—A plugin that selects nodes assuming a one-dimensional +array of nodes. The nodes are selected so as to minimize the number of consecutive +sets of nodes utilizing a best-fit algorithm. While supporting shared nodes, +this plugin does not allocate individual processors, memory, etc. +This plugin is recommended for systems without shared nodes.
    • +
    • cons_res—A plugin that can allocate individual processors, +memory, etc. within nodes. This plugin is recommended for systems with +many non-parallel programs sharing nodes. For more information see +Consumable Resources in SLURM.
    • +
    • bluegeneIBM Blue Gene +node selector. Note that this plugin not only selects the nodes for a job, but performs +some initialization and termination functions for the job.
    • +
    +

    The plugin_name and +plugin_version +symbols required by the SLURM Plugin API require no specialization for node selection support. +Note carefully, however, the versioning discussion below.

    + +

    A simplified flow of logic follows: +

    +slurmctld daemon starts
    +if (select_p_state_restore)() != SLURM_SUCCESS)
    +   abort
    +
    +slurmctld reads the rest of its configuration and state information
    +if (select_p_node_init() != SLURM_SUCCESS)
    +   abort
    +if (select_p_block_init() != SLURM_SUCCESS)
    +   abort
    +
    +wait for job 
    +if (select_p_job_test(all available nodes) != SLURM_SUCCESS) {
    +   if (select_p_job_test(all configured nodes) != SLURM_SUCCESS)
    +      reject the job and tell the user it can never run
    +   else
    +      leave the job queued for later execution
    +} else {
    +   update job's node list and node bitmap
    +   if (select_p_job_begin() != SLURM_SUCCESS)
    +      leave the job queued for later execution
    +   else {
    +      while (!select_p_job_ready())
    +        wait
    +      execute the job
    +      wait for job to end or be terminated
    +      select_p_job_fini()
    +    }
    +}
    +
    +wait for slurmctld shutdown request
    +select_p_state_save()
    +
    +Depending upon failure modes, it is possible that +select_p_state_save() +will not be called at slurmctld terminatation. +When slurmctld is restarted, other function calls may be replayed. +select_p_node_init() may be used +to syncronize the plugin's state with that of slurmctld.

    + + + +

    Data Objects

    +

    These functions are expected to read and/or modify data structures directly in +the slurmctld daemon's memory. Slurmctld is a multi-threaded program with independent +read and write locks on each data structure type. Thererfore the type of operations +permitted on various data structures is identified for each function.

    + +

    These functions make use of bitmaps corresponding to the nodes in a table. +The function select_p_node_init() should +be used to establish the initial mapping of bitmap entries to nodes. +Functions defined in src/common/bitmap.h should be used for bitmap +manipulations (these functions are directly accessible from the plugin).

    + + + +

    API Functions

    +

    The following functions must appear. Functions which are not implemented should +be stubbed.

    + +

    Global Node Selection Functions

    +

    int select_p_state_save (char *dir_name);

    +

    Description: Save any global node selection state +information to a file within the specified directory. The actual file name used is plugin specific. +It is recommended that the global switch state contain a magic number for validation purposes. +This function is called by the slurmctld deamon on shutdown.

    +

    Arguments: dir_name  +  (input) fully-qualified pathname of a directory into which user SlurmUser (as defined +in slurm.conf) can create a file and write state information into that file. Cannot be NULL.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR.

    + +

    int select_p_state_restore (char *dir_name);

    +

    Description: Restore any global node selection state +information from a file within the specified directory. The actual file name used is plugin specific. +It is recommended that any magic number associated with the global switch state be verified. +This function is called by the slurmctld deamon on startup.

    +

    Arguments: dir_name  +  (input) fully-qualified pathname of a directory containing a state information file +from which user SlurmUser (as defined in slurm.conf) can read. Cannot be NULL.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR, causing slurmctld to exit.

    + +

    int select_p_node_init (struct node_record *node_ptr, int node_cnt);

    +

    Description: Note the initialization of the node record data +structure. This function is called when the node records are initially established and again +when any nodes are added to or removed from the data structure.

    +

    Arguments:
    + node_ptr   (input) pointer +to the node data records. Data in these records can read. Nodes deleted after initiialization +may have their the name field in the record cleared (zero length) rather than +rebuilding the node records and bitmaps.
    + node_cnt    (input) number +of node data records.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR, causing slurmctld to exit.

    + +

    int select_p_block_init (List block_list);

    +

    Description: Note the initialization of the partition record data +structure. This function is called when the partition records are initially established and again +when any partition configurations change.

    +

    Arguments: + part_list   (input) list of partition +record entries. Note that some of these partitions may have no associated nodes. Also +consider that nodes can be removed from one partition and added to a different partition.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR, causing slurmctld to exit.

    + +

    int select_p_update_block (update_part_msg_t *part_desc_ptr);

    +

    Description: This function is called when the admin needs to manually update the state of a block.

    +

    Arguments: + part_desc_ptr   (input) partitition +description variable. Containing the block name and the state to set the block.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR.

    + +

    int select_p_pack_node_info (time_t last_query_time, Buf *buffer_ptr);

    +

    Description: pack node specific information into a buffer.

    +

    Arguments: + last_query_time   (input) time that the data +was last saved. If it has not changed since this time, return SLURM_NO_CHANGE_IN_DATA.
    + buffer_ptre   (input/output) buffer into +which the node data is appended.

    +

    Returns: SLURM_SUCCESS if successful, +SLURM_NO_CHANGE_IN_DATA if data has not changed since last packed, otherwise SLURM_ERROR

    + + + +

    Job-Specific Node Selection Functions

    +

    int select_p_job_test (struct job_record *job_ptr, +bitstr_t *bitmap, int min_nodes, int max_nodes, int req_nodes, bool test_only);

    +

    Description: Given a job's scheduling requirement +specification and a set of nodes which might be used to satisfy the request, identify +the nodes which "best" satify the request. Note that nodes being considered for allocation +to the job may include nodes already allocated to other jobs, even if node sharing is +not permitted. This is done to ascertain whether or not job may be allocated resources +at some later time (when the other jobs complete). This permits SLURM to reject +non-runnable jobs at submit time rather than after they have spent hours queued. +Informing users of problems at job submission time permits them to quickly resubmit +the job with appropriate constraints.

    +

    Arguments:
    + job_ptr    (input) pointer +to the job being considered for scheduling. Data in this job record may safely be read. +Data of particular interst include details->contiguous (set if allocated nodes +should be contiguous), num_procs (minimum processors in allocation) and +details->req_node_bitmap (specific required nodes).
    + bitmap    (input/output) +bits representing nodes which might be allocated to the job are set on input. +This function should clear the bits representing nodes not required to satisfy +job's scheduling request. +Bits left set will represent nodes to be used for this job. Note that the job's +required nodes (details->req_node_bitmap) will be a superset +bitmap when the function is called.
    + min_nodes    (input) +minimum number of nodes to allocate to this job. Note this reflects both job +and partition specifications.
    + max_nodes    (input) +maximum number of nodes to allocate to this job. Note this reflects both job +and partition specifications.
    + req_nodes    (input) +the requested (desired) of nodes to allocate to this job. This reflects job's +maximum node specification (if supplied).
    + test_only    (input) +if set then we only want to test our ability to run the job at some time, +not necesarily now with currently available resources.
    +

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and future attempts may be made to schedule +the job.

    + +

    int select_p_job_begin (struct job_record *job_ptr);

    +

    Description: Note the initiation of the specified job +is about to begin. This function is called immediately after +select_p_job_test() sucessfully completes for this job. +

    Arguments: + job_ptr    (input) pointer +to the job being initialized. Data in this job record may safely be read or written. +The nodes and node_bitmap fields of this job record identify the +nodes which have already been selected for this job to use. For an example of +a job record field that the plugin may write into, see select_id.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR, which causes the job to be requeued for +later execution.

    + +

    int select_p_job_ready (struct job_record *job_ptr);

    +

    Description: Test if resources are configured +and ready for job execution. This function is only used in the job prolog for +BlueGene systems to determine if the bglblock has been booted and is ready for use.

    +

    Arguments: + job_ptr    (input) pointer +to the job being initialized. Data in this job record may safely be read. +The nodes and node_bitmap fields of this job record identify the +nodes which have already been selected for this job to use.

    +

    Returns: 1 if the job may begin execution, +0 otherwise.

    + +

    int select_p_job_fini (struct job_record *job_ptr);

    +

    Description: Note the termination of the +specified job. This function is called as the termination process for the +job begins (prior to killing the tasks).

    +

    Arguments: + job_ptr    (input) pointer +to the job being terminated. Data in this job record may safely be read or written. +The nodes and/or node_bitmap fields of this job record identify the +nodes which were selected for this job to use.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR.

    + +

    int select_p_job_suspend (struct job_record *job_ptr);

    +

    Description: Suspend the specified job. +Release resources for use by other jobs.

    +

    Arguments: + job_ptr    (input) pointer +to the job being suspended. Data in this job record may safely be read or +written. The nodes and/or node_bitmap fields of this job record +identify the nodes which were selected for this job to use.

    +

    Returns: SLURM_SUCCESS if successful. On +failure, the plugin should return a SLURM error code.

    + +

    int select_p_job_resume (struct job_record *job_ptr);

    +

    Description: Resume the specified job +which was previously suspended.

    +

    Arguments: + job_ptr    (input) pointer +to the job being resumed. Data in this job record may safely be read or +written. The nodes and/or node_bitmap fields of this job record +identify the nodes which were selected for this job to use.

    +

    Returns: SLURM_SUCCESS if successful. On +failure, the plugin should return a SLURM error code.

    + + + +

    Get/set plugin information

    +

    int select_p_get_extra_jobinfo(struct node_record *node_ptr, +struct job_record *job_ptr, enum select_data_info info, void *data);

    +

    Description: Get plugin-specific information +related to the specified job and/or node.

    +

    Arguments:
    + node_ptr    (input) pointer +to the node for which information is requested.
    + job_ptr    (input) pointer +to the job for which information is requested.
    + info    (input) identifies +the type of data requested.
    + data    (output) the requested data.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR.

    + +

    int select_p_get_select_nodeinfo(struct node_record *node_ptr, +enum select_data_info info, void *data);

    +

    Description: Get plugin-specific information +related to the specified node.

    +

    Arguments:
    + node_ptr    (input) pointer +to the node for which information is requested.
    + info    (input) identifies +the type of data requested.
    + data    (output) the requested data.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR.

    + +

    int select_p_update_nodeinfo(struct node_record *node_ptr);

    +

    Description: Update plugin-specific information +related to the specified node. This is called after changes in a node's configuration.

    +

    Argument: + node_ptr    (input) pointer +to the node for which information is requested.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR.

    + +

    int select_p_get_info_from_plugin(enum select_data_info info, void *data);

    +

    Description: Get plugin-specific information.

    +

    Arguments:
    + info    (input) identifies +the type of data to be updated.
    + data    (output) the requested data.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR.

    + +

    int select_p_job_init(List job_list);

    +

    Description: Used at slurm startup to +syncrhonize plugin (and node) state with that of currectly active jobs.

    +

    Arguments: + job_list    (input) +list of slurm jobs from slurmctld job records.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR.

    + +

    int select_p_update_node_state (int index, uint16_t state);

    +

    Description: push a change of state +into the plugin the index should be the index from the slurmctld of +the entire system. The state should be the same state the node_record +was set to in the slurmctld.

    +

    Arguments: + index   (input) index +of the node in reference to the entire system.
    + state   (input) new +state of the node.

    +

    Returns: SLURM_SUCCESS if successful, otherwise SLURM_ERROR

    + +

    int select_p_alter_node_cnt (enum +select_node_cnt type, void *data);

    +

    Description: Used for systems like +a Bluegene system where slurm sees 1 node where many nodes really +exists, in Bluegene's case 1 node reflects 512 nodes in real live, but +since usually 512 is the smallest allocatable block slurm only handles +it as 1 node. This is a function so the user can issue a 'real' +number and the fuction will alter it so slurm can understand what the +user really means in slurm terms.

    +

    Arguments: + type   (input) enum +telling the plug in what the user is really wanting.
    + data   (input/output) +Is a void * so depending on the type sent in argument 1 this should +adjust the variable returning what the user is asking for.

    +

    Returns: SLURM_SUCCESS if successful, otherwise SLURM_ERROR

    + + +

    Versioning

    +

    This document describes version 1 of the SLURM node selection API. Future +releases of SLURM may revise this API. A node selection plugin conveys its ability +to implement a particular API version using the mechanism outlined for SLURM plugins. +In addition, the credential is transmitted along with the version number of the +plugin that transmitted it. It is at the discretion of the plugin author whether +to maintain data format compatibility across different versions of the plugin.

    + + + +

    Last modified 12 October 2006

    + + diff --git a/executable_names/doc/html/shtml2html.py b/executable_names/doc/html/shtml2html.py new file mode 100755 index 0000000000000000000000000000000000000000..107d8c337312b2f601091aeb7e18cb337048df0f --- /dev/null +++ b/executable_names/doc/html/shtml2html.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +import re +import sys +import os + +include_pat = r'()' +include_regex = re.compile(include_pat) + +url_pat = r'(\s+href\s*=\s*")([^"#]+)(#[^"]+)?(")' +url_regex = re.compile(url_pat) + +dirname = '' + +def include_virtual(matchobj): + global dirname + if dirname: + filename = dirname + '/' + matchobj.group(2) + else: + filename = matchobj.group(2) + + if os.access(filename, os.F_OK): + #print 'Including file', filename + lines = file(filename, 'r').read() + return lines + else: + return matchobj.group(0) + +def url_rewrite(matchobj): + global dirname + if dirname: + localpath = dirname + '/' + matchobj.group(2) + else: + localpath = matchobj.group(2) + + if matchobj.group(2)[-6:] == '.shtml' and os.access(localpath, os.F_OK): + location = matchobj.group(2) + if matchobj.group(3) is None: + newname = location[:-6] + '.html' + else: + newname = location[:-6] + '.html' + matchobj.group(3) + #print 'Rewriting', location, 'to', newname + return matchobj.group(1) + newname + matchobj.group(4) + else: + return matchobj.group(0) + +# Make sure all of the files on the command line have the .shtml extension. +files = [] +for f in sys.argv[1:]: + if f[-6:] == '.shtml': + files.append(f) + else: + #print 'Skipping file %s (extension is not .shtml)' % f + pass + +for filename in files: + dirname, basefilename = os.path.split(filename) + newfilename = basefilename[:-6] + '.html' + print 'Converting', filename, '->', newfilename + shtml = file(filename, 'r') + html = file(newfilename, 'w') + + for line in shtml.readlines(): + line = include_regex.sub(include_virtual, line) + line = url_regex.sub(url_rewrite, line) + html.write(line) + + html.close() + shtml.close() diff --git a/executable_names/doc/html/slurm.shtml b/executable_names/doc/html/slurm.shtml new file mode 100644 index 0000000000000000000000000000000000000000..65fa98176631f063225d15de43b81e14259e5396 --- /dev/null +++ b/executable_names/doc/html/slurm.shtml @@ -0,0 +1,50 @@ + + +

    SLURM: A Highly Scalable Resource Manager

    +

    SLURM is an open-source resource manager designed for Linux clusters of all +sizes. It provides three key functions. First it allocates exclusive and/or non-exclusive +access to resources (computer nodes) to users for some duration of time so they +can perform work. Second, it provides a framework for starting, executing, and +monitoring work (typically a parallel job) on a set of allocated nodes. Finally, +it arbitrates conflicting requests for resources by managing a queue of pending +work.

    + +

    SLURM is not a sophisticated batch system, but it does provide an Applications +Programming Interface (API) for integration with external schedulers such as + +The Maui Scheduler and + +Moab Cluster Suite. +While other resource managers do exist, SLURM is unique in several respects: +

      +
    • Its source code is freely available under the +GNU General Public License.
    • +
    • It is designed to operate in a heterogeneous cluster with up to 65,536 nodes.
    • +
    • It is portable; written in C with a GNU autoconf configuration engine. While +initially written for Linux, other UNIX-like operating systems should be easy +porting targets. A plugin mechanism exists to support various interconnects, authentication +mechanisms, schedulers, etc.
    • +
    • SLURM is highly tolerant of system failures, including failure of the node +executing its control functions.
    • +
    • It is simple enough for the motivated end user to understand its source and +add functionality.
    • +

    + +

    SLURM provides resource management on about 1000 computers world-wide including +many of the most powerful computers in the world including: +

      +
    • BlueGene/L with 65,536 +dual-processor compute nodes
    • +
    • ASC Purple an IBM SP/AIX cluster +with 1532 nodes each having eight Power5 processors
    • +
    • Peloton with 1152 nodes each having four sockets with dual core Opteron processors and an InfiniBand switch
    • +
    +There are about 150 downloads of SLURM per month from LLNL's FTP server alone. +As of September 2006, SLURM has been downloaded over 3500 times to over 500 +distinct sites in 38 countries. +SLURM is also distributed and supported by +Hewlett-Packard as the resource manager in their XC System Software.

    + +

    Last modified 19 October 2006

    + + diff --git a/executable_names/doc/html/slurm_banner_filler.jpg b/executable_names/doc/html/slurm_banner_filler.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eeb049c851a37c02e01de2a93abcf86452acfc02 Binary files /dev/null and b/executable_names/doc/html/slurm_banner_filler.jpg differ diff --git a/executable_names/doc/html/slurm_banner_filler.png b/executable_names/doc/html/slurm_banner_filler.png new file mode 100644 index 0000000000000000000000000000000000000000..fca0ea1f38a15c9510b4efa71b8ea9341c0b45dd Binary files /dev/null and b/executable_names/doc/html/slurm_banner_filler.png differ diff --git a/executable_names/doc/html/slurm_banner_left.jpg b/executable_names/doc/html/slurm_banner_left.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ac4a81cf4b17ce979dedc32beddc87509f053cb Binary files /dev/null and b/executable_names/doc/html/slurm_banner_left.jpg differ diff --git a/executable_names/doc/html/slurm_banner_left.png b/executable_names/doc/html/slurm_banner_left.png new file mode 100644 index 0000000000000000000000000000000000000000..68bb4220fb1b1fd15401c90e489fa3d8ea9b1f37 Binary files /dev/null and b/executable_names/doc/html/slurm_banner_left.png differ diff --git a/executable_names/doc/html/slurm_banner_right.jpg b/executable_names/doc/html/slurm_banner_right.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b29fd3856b65c5ac395da612059809430a95cbc8 Binary files /dev/null and b/executable_names/doc/html/slurm_banner_right.jpg differ diff --git a/executable_names/doc/html/slurm_banner_right.png b/executable_names/doc/html/slurm_banner_right.png new file mode 100644 index 0000000000000000000000000000000000000000..70ac3d58f86d30695b7f099aacbbde44127ec756 Binary files /dev/null and b/executable_names/doc/html/slurm_banner_right.png differ diff --git a/executable_names/doc/html/slurm_design.pdf b/executable_names/doc/html/slurm_design.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fcfc634c73d9c00ecba624d3754a690c31768c23 Binary files /dev/null and b/executable_names/doc/html/slurm_design.pdf differ diff --git a/executable_names/doc/html/slurmstyles.css b/executable_names/doc/html/slurmstyles.css new file mode 100644 index 0000000000000000000000000000000000000000..e32e98011bc18a119824918d175c037258b5fe44 --- /dev/null +++ b/executable_names/doc/html/slurmstyles.css @@ -0,0 +1,104 @@ +body { + background-color: #000000; + font-family: arial, verdana, helvetica, sans-serif; +} +h1 { font-size: 150% } +h2 { font-size: 130% } +h3 { font-size: 115% } +p { font-size: 100% } + +pre { + width: 90%; + margin: 0 0 15px 20px; + padding: 15px; + border: 1px solid gray; + background-color: #ddd; + font-family: monospace; + white-space: pre; + overflow: auto; +} + +/* "container" wraps the entire web page */ +#container { + width: 95%; + margin: 10px auto; + background-color: #fff; + color: #333; + border: 0px solid gray; + line-height: 130%; +} + +#banner { + /* + * In IE6, the "banner" div is a little taller than the slurm_banner.jpg + * (who knows why...) and if the background-color was #000000, a line of + * black would appear under the banner. + */ + background-color: #FFFFFF; + /*background-color: #000000;*/ + background-image: url(slurm_banner_filler.jpg); + background-repeat: repeat-x; + /*border-bottom: 1px solid gray;*/ +} +#banner_right_img { + position: absolute; + right: 5%; + z-index: 1; +} + +#navigation { + float: left; + margin-left: 20px; + width: 160px; + overflow: auto; +} + +/* The main info of the page is wrapped in a "content" div */ +#content { + margin-left: 200px; + border-left: 1px solid gray; + padding: 1em; + /*max-width: 36em;*/ +} +#content h1 { text-align: center; } +#content dt { font-weight: bold; } /* normal, bold, 900 */ + +#footer { + clear: both; + margin: 0; + padding: .5em; + color: #333; + background-color: #ddd; + border-top: 1px solid gray; + text-align: center; +} + +div.figure { + /*float: right;*/ + margin: 0 0 15px 20px; + padding: 15px; + /*border: 1px solid gray;*/ + text-align: center; + font-style: italic; + overflow: auto; +} + +div.terminal { + width: 90%; + margin: 0 0 15px 20px; + padding: 15px; + border: 1px solid gray; + background-color: #ddd; + font-family: monospace; + white-space: pre; + overflow: auto; +} + +/* When printing, eliminate the nagivation column on the left, + * and make the content section fill the width of the page. + */ +@media print { + #navigation { display: none } + #content { margin-left: 0px; border-left: 0px solid gray; } + } +} diff --git a/executable_names/doc/html/switchplugins.shtml b/executable_names/doc/html/switchplugins.shtml new file mode 100644 index 0000000000000000000000000000000000000000..9703dba8a536c38c60885791921f62c35a193ed9 --- /dev/null +++ b/executable_names/doc/html/switchplugins.shtml @@ -0,0 +1,524 @@ + + +

    SLURM Switch Plugin API

    + +

    Overview

    +

    This document describes SLURM switch (interconnect) plugins and the API that defines +them. It is intended as a resource to programmers wishing to write their own SLURM +switch plugins. This is version 0 of the API. +Note that many of the API functions are used only by one of the daemons. For +example the slurmctld daemon builds a job step's switch credential +(switch_p_build_jobinfo) while the +slurmd daemon enables and disables that credential for the job step's +tasks on a particular node(switch_p_job_init, +etc.).

    + +

    SLURM switch plugins are SLURM plugins that implement the SLURM switch or interconnect +API described herein. They must conform to the SLURM Plugin API with the following +specifications:

    +

    const char plugin_type[]
    +The major type must be "switch." The minor type can be any recognizable +abbreviation for the type of switch. We recommend, for example:

    +
      +
    • none—A plugin that implements the API without providing any actual +switch service. This is the case for Ethernet and Myrinet interconnects.
    • +
    • elanQuadrics Elan3 or Elan4 +interconnect.
    • +
    • federation—IBM Federation interconnects (presently under development).
    • +
    +

    The plugin_name and +plugin_version +symbols required by the SLURM Plugin API require no specialization for switch support. +Note carefully, however, the versioning discussion below.

    +

    The programmer is urged to study +src/plugins/switch/switch_elan.c and +src/plugins/switch/switch_none.c +for sample implementations of a SLURM switch plugin.

    + + +

    Data Objects

    +

    The implementation must support two opaque data classes. +One is used as an job's switch "credential." +This class must encapsulate all job-specific information necessary +for the operation of the API specification below. +The second is a node's switch state record. +Both data classes are referred to in SLURM code using an anonymous +pointer (void *).

    + +

    The implementation must maintain (though not necessarily directly export) an +enumerated errno to allow SLURM to discover +as practically as possible the reason for any failed API call. Plugin-specific enumerated +integer values should be used when appropriate. It is desirable that these values +be mapped into the range ESLURM_SWITCH_MIN and ESLURM_SWITCH_MAX +as defined in slurm/slurm_errno.h. +The error number should be returned by the function +switch_p_get_errno() +and this error number can be converted to an appropriate string description using the +switch_p_strerror() +function described below.

    + +

    These values must not be used as return values in integer-valued functions +in the API. The proper error return value from integer-valued functions is SLURM_ERROR. +The implementation should endeavor to provide useful and pertinent information by +whatever means is practical. In some cases this means an errno for each credential, +since plugins must be re-entrant. If a plugin maintains a global errno in place of or in +addition to a per-credential errno, it is not required to enforce mutual exclusion on it. +Successful API calls are not required to reset any errno to a known value. However, +the initial value of any errno, prior to any error condition arising, should be +SLURM_SUCCESS.

    + + +

    API Functions

    +

    The following functions must appear. Functions which are not implemented should +be stubbed.

    + +

    Global Switch State Functions

    +

    int switch_p_libstate_save (char *dir_name);

    +

    Description: Save any global switch state to a file +within the specified directory. The actual file name used is plugin specific. It is recommended +that the global switch state contain a magic number for validation purposes. This function +is called by the slurmctld deamon on shutdown. Note that if the slurmctld daemon fails, +this function will not be called. The plugin may save state independently and/or make +use of the switch_p_job_step_allocated function to restore state.

    +

    Arguments: dir_name  +  (input) fully-qualified pathname of a directory into which user SlurmUser (as defined +in slurm.conf) can create a file and write state information into that file. Cannot be NULL.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_libstate_restore(char *dir_name, bool recover);

    +

    Description: Restore any global switch state from a file +within the specified directory. The actual file name used is plugin specific. It is recommended +that any magic number associated with the global switch state be verified. This function +is called by the slurmctld deamon on startup.

    +

    Arguments:
    + dir_name  +  (input) fully-qualified pathname of a directory containing a state information file +from which user SlurmUser (as defined in slurm.conf) can read. Cannot be NULL.
    + recover  +true of restart with state preserved, false if no state recovery.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_libstate_clear (void);

    +

    Description: Clear switch state information. +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    bool switch_p_no_frag(void);

    +

    Description: Report if resource fragmentation is important. +If so, delay scheduling a new job while another is in the process of terminating.

    +

    Arguments: None

    +

    Returns: TRUE if job scheduling should be delayed while +any other job is in the process of terminating.

    + + +

    Node's Switch State Monitoring Functions

    + +

    Nodes will register with current switch state information when the slurmd daemon +is initiated. The slurmctld daemon will also request that slurmd supply current +switch state information on a periodic basis.

    + +

    int switch_p_clear_node_state (void);

    +

    Description: Initialize node state. +If any switch state has previously been established for a job, it will be cleared. +This will be used to establish a "clean" state for the switch on the node upon +which it is executed.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_alloc_node_info(switch_node_info_t *switch_node);

    +

    Description: Allocate storage for a node's switch +state record. It is recommended that the record contain a magic number for validation +purposes.

    +

    Arguments: switch_node  +  (output) location for writing location of node's switch state record.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_build_node_info(switch_node_info_t switch_node);

    +

    Description: Fill in a previously allocated switch state +record for the node on which this function is executed. +It is recommended that the magic number be validated. +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_pack_node_info (switch_node_info_t switch_node, +Buf buffer);

    +

    Description: Pack the data associated with a +node's switch state into a buffer for network transmission.

    +

    Arguments:
    + switch_node    (input) an existing +node's switch state record.
    + buffer    (input/output) buffer onto +which the switch state information is appended.

    +

    Returns: +The number of bytes written should be returned if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_unpack_node_info (switch_node_info_t switch_node, +Buf buffer);

    +

    Description: Unpack the data associated with a +node's switch state record from a buffer.

    +

    Arguments:
    + switch_node    (input/output) a +previously allocated node switch state record to be filled in with data read from +the buffer.
    + buffer    (input/output) buffer from +which the record's contents are read.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    void switch_p_free_node_info (switch_node_info_t switch_node);

    +

    Description: Release the storage associated with +a node's switch state record.

    +

    Arguments: switch_node  +  (intput/output) a previously allocated node switch state record.

    +

    Returns: None

    + +

    char * switch_p_sprintf_node_info (switch_node_info_t switch_node, +char *buf, size_t size);

    +

    Description: Print the contents of a node's switch state +record to a buffer.

    +

    Arguments:
    + switch_node    (input) a +node's switch state record.
    + buf    (input/output) point to +buffer into which the switch state record is to be written.
    +of buf in bytes.
    + size    (input) size +of buf in bytes.

    +

    Returns: Location of buffer, same as buf.

    + +

    Job's Switch Credential Management Functions

    +

    int switch_p_alloc_jobinfo(switch_jobinfo_t *switch_job);

    +

    Description: Allocate storage for a job's switch credential. +It is recommended that the credential contain a magic number for validation purposes.

    +

    Arguments: switch_job  +  (output) location for writing location of job's switch credential.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_build_jobinfo (switch_jobinfo_t switch_job, +char *nodelist, int *tasks_per_node, int cyclic_alloc, char *network);

    +

    Description: Build a job's switch credential. +It is recommended that the credential's magic number be validated.

    +

    Arguments:
    +switch_job    (input/output) Job's +switch credential to be updated
    +nodelist    (input) List of nodes +allocated to the job. This may contain expressions to specify node ranges (e.g. +"linux[1-20]" or "linux[2,4,6,8]").
    +tasks_per_node    (input) List +of processes per node to be initiated as part of the job.
    +cyclic_alloc    (input) Non-zero +if job's processes are to be allocated across nodes in a cyclic fashion (task 0 on node 0, +task 1 on node 1, etc). If zero, processes are allocated sequentially on a node before +moving to the next node (tasks 0 and 1 on node 0, tasks 2 and 3 on node 1, etc.).
    +network    (input) Job's network +specification from srun command.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    switch_jobinfo_t switch_p_copy_jobinfo (switch_jobinfo_t switch_job);

    +

    Description: Allocate storage for a job's switch credential +and copy an existing credential to that location.

    +

    Arguments: switch_job  +  (input) an existing job switch credential.

    +

    Returns: A newly allocated job switch credential containing a +copy of the function argument.

    + +

    void switch_p_free_jobinfo (switch_jobinfo_t switch_job);

    +

    Description: Release the storage associated with a job's + switch credential.

    +

    Arguments: switch_job  +  (intput) an existing job switch credential.

    +

    Returns: None

    + +

    int switch_p_pack_jobinfo (switch_jobinfo_t switch_job, Buf buffer);

    +

    Description: Pack the data associated with a job's +switch credential into a buffer for network transmission.

    +

    Arguments:
    + switch_job    (input) an existing job +switch credential.
    + buffer    (input/output) buffer onto +which the credential's contents are appended.

    +

    Returns: +The number of bytes written should be returned if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_unpack_jobinfo (switch_jobinfo_t switch_job, Buf buffer);

    +

    Description: Unpack the data associated with a job's +switch credential from a buffer.

    +

    Arguments:
    + switch_job    (input/output) a previously +allocated job switch credential to be filled in with data read from the buffer.
    + buffer    (input/output) buffer from +which the credential's contents are read.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_get_jobinfo (switch_jobinfo_t switch_job, int data_type, void *data);

    +

    Description: Get some specific data from a job's switch credential.

    +

    Arguments:
    + switch_job    (input) a job's switch credential.
    + data_type    (input) identification +as to the type of data requested. The interpretation of this value is plugin dependent.
    + data    (output) filled in with the desired +data. The form of this data is dependent upon the value of data_type and the plugin.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_job_step_complete (switch_jobinfo_t switch_job, +char *nodelist);

    +

    Description: Note that the job step associated +with the specified nodelist has completed execution.

    +

    Arguments:
    + switch_job    (input) +The completed job's switch credential.
    + nodelist    (input) A list of nodes +on which the job has completed. This may contain expressions to specify node ranges. +(e.g. "linux[1-20]" or "linux[2,4,6,8]").

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_job_step_part_comp (switch_jobinfo_t switch_job, +char *nodelist);

    +

    Description: Note that the job step has completed +execution on the specified node list. The job step is not necessarily completed on all +nodes, but switch resources associated with it on the specified nodes are no longer +in use.

    +

    Arguments:
    + switch_job    (input) +The completed job's switch credential.
    + nodelist    (input) A list of nodes +on which the job step has completed. This may contain expressions to specify node ranges. +(e.g. "linux[1-20]" or "linux[2,4,6,8]").

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    bool switch_p_part_comp (void);

    +

    Description: Indicate if the switch plugin should +process partitial job step completions (i.e. switch_g_job_step_part_comp). Support +of partition completions is compute intensive, so it should be avoided unless switch +resources are in short supply (e.g. switch/federation).

    +

    Returns: True if partition step completions are +to be recorded. False if only full job step completions are to be noted.

    + +

    void switch_p_print_jobinfo(FILE *fp, switch_jobinfo_t switch_job);

    +

    Description: Print the contents of a job's +switch credential to a file.

    +

    Arguments:
    + fp    (input) pointer to an open file.
    + switch_job    (input) a job's +switch credential.

    +

    Returns: None.

    + +

    char *switch_p_sprint_jobinfo(switch_jobinfo_t switch_job, +char *buf, size_t size);

    +

    Description: Print the contents of a job's +switch credential to a buffer.

    +

    Arguments:
    + switch_job    (input) a job's +switch credential.
    + buf    (input/output) pointer to +buffer into which the job credential information is to be written.
    + size    (input) size of buf in +bytes

    +

    Returns: location of buffer, same as buf.

    + +

    int switch_p_get_data_jobinfo(switch_jobinfo_t switch_job, +int key, void *resulting_data);

    +

    Description: Get data from a job's +switch credential.

    +

    Arguments:
    + switch_job    (input) a job's +switch credential.
    + key    (input) identification +of the type of data to be retrieved from the switch credential. NOTE: The +interpretation of this key is dependent upon the switch type.
    + resulting_data    (input/output) +pointer to where the requested data should be stored.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + + + +

    Node Specific Switch Management Functions

    +

    int switch_p_node_init (void);

    +

    Description: This function is run from the top level slurmd +only once per slurmd run. It may be used, for instance, to perform some one-time +interconnect setup or spawn an error handling thread.

    +

    Arguments: None

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_node_fini (void);

    +

    Description: This function is called once as slurmd exits +(slurmd will wait for this function to return before continuing the exit process).

    +

    Arguments: None

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + + +

    Job Management Functions

    +
    +=========================================================================
    +Process 1 (root)        Process 2 (root, user)  |  Process 3 (user task) 
    +                                                |                        
    +switch_p_job_preinit                            |                        
    +fork ------------------ switch_p_job_init       |                        
    +waitpid                 setuid, chdir, etc.     |                        
    +                        fork N procs -----------+--- switch_p_job_attach 
    +                        wait all                |    exec mpi process    
    +                        switch_p_job_fini*      |                        
    +switch_p_job_postfini                           |                        
    +=========================================================================
    +
    + +

    int switch_p_job_preinit (switch_jobinfo_t jobinfo switch_job);

    +

    Description: Preinit is run as root in the first slurmd process, +the so called job manager. This function can be used to perform any initialization +that needs to be performed in the same process as switch_p_job_fini().

    +

    Arguments: + switch_job    (input) a job's +switch credential.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_job_init (switch_jobinfo_t jobinfo switch_job, uid_t uid);

    +

    Description: Initialize interconnect on node for a job. +This function is run from the second slurmd process (some interconnect implementations +may require the switch_p_job_init functions to be executed from a separate process +than the process executing switch_p_job_fini() [e.g. Quadrics Elan]).

    +

    Arguments:
    + switch_job    (input) a job's +switch credential.
    + uid    (input) the user id +to execute a job.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_job_attach ( switch_jobinfo_t switch_job, char ***env, +uint32_t nodeid, uint32_t procid, uint32_t nnodes, uint32_t nprocs, uint32_t rank );

    +

    Description: Attach process to interconnect +(Called from within the process, so it is appropriate to set interconnect specific +environment variables here).

    +

    Arguments:
    + switch_job    (input) a job's +switch credential.
    + env    (input/output) the +environment variables to be set upon job initiation. Switch specific environment +variables are added as needed.
    + nodeid    (input) zero-origin +id of this node.
    + procid    (input) zero-origin +process id local to slurmd and not equivalent to the global task id or MPI rank.
    + nnodes    (input) count of +nodes allocated to this job.
    + nprocs    (input) total count of +processes or tasks to be initiated for this job.
    + rank    (input) zero-origin +id of this task.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_job_fini (switch_jobinfo_t jobinfo switch_job);

    +

    Description: This function is run from the same process +as switch_p_job_init() after all job tasks have exited. It is *not* run as root, because +the process in question has already setuid to the job owner.

    +

    Arguments: + switch_job    (input) a job's +switch credential.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_job_postfini ( switch_jobinfo_t switch_job, +uid_t pgid, uint32_t job_id, uint32_t step_id );

    +

    Description: This function is run from the initial slurmd +process (same process as switch_p_job_preinit()), and is run as root. Any cleanup routines +that need to be run with root privileges should be run from this function.

    +

    Arguments:
    + switch_job    (input) a job's +switch credential.
    + pgid    (input) The process +group id associated with this task.
    + job_id    (input) the +associated SLURM job id.
    + step_id    (input) the +associated SLURM job step id.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + +

    int switch_p_job_step_allocated (switch_jobinfo_t +jobinfo switch_job, char *nodelist);

    +

    Description: Note that the identified +job step is active at restart time. This function can be used to +restore global switch state information based upon job steps known to be +active at restart time. Use of this function is prefered over switch state +saved and restored by the switch plugin. Direct use of job step switch +information eliminates the possibility of inconsistent state information +between the switch and job steps. +

    Arguments:
    + switch_job    (input) a job's +switch credential.
    + nodelist    (input) the nodes +allocated to a job step.

    +

    Returns: SLURM_SUCCESS if successful. On failure, +the plugin should return SLURM_ERROR and set the errno to an appropriate value +to indicate the reason for failure.

    + + +

    Error Handling Functions

    +

    int switch_p_get_errno (void);

    +

    Description: Return the number of a switch +specific error.

    +

    Arguments: None

    +

    Returns: Error number for the last failure encountered by +the switch plugin.

    + +

    char *switch_p_strerror(int errnum);

    +

    Description: Return a string description of a switch +specific error code.

    +

    Arguments: + errnum    (input) a switch +specific error code.

    +

    Returns: Pointer to string describing the error +or NULL if no description found in this plugin.

    + + +

    Versioning

    +

    This document describes version 0 of the SLURM Switch API. Future +releases of SLURM may revise this API. A switch plugin conveys its ability +to implement a particular API version using the mechanism outlined for SLURM plugins. +In addition, the credential is transmitted along with the version number of the +plugin that transmitted it. It is at the discretion of the plugin author whether +to maintain data format compatibility across different versions of the plugin.

    + + +

    Last modified 3 July 2006

    + + diff --git a/executable_names/doc/html/team.shtml b/executable_names/doc/html/team.shtml new file mode 100644 index 0000000000000000000000000000000000000000..50d238ef9394c48c0fee77b82c9bbaff01aed5e2 --- /dev/null +++ b/executable_names/doc/html/team.shtml @@ -0,0 +1,49 @@ + + +

    SLURM Team

    +

    SLURM development has been a joint effort of +Lawrence Livermore National Laboratory (LLNL), +HP, +Linux NetworX. + +

    The current SLURM development staff includes:

    +
      +
    • Morris Jette (LLNL, Project leader)
    • +
    • Danny Auble (LLNL)
    • +
    • Susanne Balle (HP)
    • +
    • Mark Grondona (LLNL)
    • +
    • Chris Holmes (HP)
    • +
    • Chris Morrone (LLNL)
    • +
    • Daniel Palermo (HP)
    • +
    • Andy Riebs (HP)
    • +
    + +

    SLURM contributers include:

    +
      +
    • Amjad Majid Ali (Colorado State University)
    • +
    • Ernest Artiaga (Barcelona Supercomputer Center, Spain)
    • +
    • Chuck Clouston (Bull)
    • +
    • Hongjia Cao (National University of Defense Techonogy, China)
    • +
    • Daniel Christians (HP)
    • +
    • Chris Dunlap (LLNL)
    • +
    • Joey Ekstrom (LLNL/Bringham Young University)
    • +
    • Jim Garlick (LLNL)
    • +
    • Takao Hatazaki (HP, Japan)
    • +
    • Nathan Huff (North Dakota State University)
    • +
    • David Jackson (Cluster Resources)
    • +
    • Greg Johnson (LANL)
    • +
    • Jason King (LLNL)
    • +
    • Bernard Li (Genome Sciences Centre, Canada)
    • +
    • Donna Mecozzi (LLNL)
    • +
    • Bryan O'Sullivan (Pathscale)
    • +
    • Gennaro Oliva (Institute of High Performance Computing and +Networking, Italy)
    • +
    • Dan Phung (LLNL/Columbia University)
    • +
    • Jeff Squyres (LAM MPI)
    • +
    • Kevin Tew (LLNL/Bringham Young University)
    • +
    • Jay Windley (Linux NetworX)
    • +
    + +

    Last modified 31 August 2006

    + + diff --git a/executable_names/doc/html/testimonials.shtml b/executable_names/doc/html/testimonials.shtml new file mode 100644 index 0000000000000000000000000000000000000000..285a0852a0d16a547361ef1f1cb9015aa493a5f5 --- /dev/null +++ b/executable_names/doc/html/testimonials.shtml @@ -0,0 +1,97 @@ + + +

    Customer Testimonials

    + + +"Today our largest IBM computers, BlueGene/L and Purple, ranked #1 and #3 +respectively on the November 2005 Top500 list, use SLURM. +This decision reduces large job launch times from tens of minutes to seconds. +This effectively provides +us with millions of dollars with of additional compute resources without +additional cost. It also allows our computational scientists to use their +time more effectively. SLURM is scalable to very large numbers of processors, +another essential ingredient for use at LLNL. This means larger computer +systems can be used than otherwise possible with a commensurate increase in +the scale of problems that can be solved. SLURM's scalability has eliminated +resource management from being a concern for computers of any foreseeable +size. It is one of the best things to happen to massively parallel computing." +

    +Dona Crawford, Associate Directory Lawrence Livermore National Laboratory +
    +
    + + +"We are extremely pleased with SLURM and strongly recommend it to others +because it is mature, the developers are highly responsive and +it just works."

    +Jeffrey M. Squyres, Pervasive Technology Labs at Indiana University +
    +
    + + +We adopted SLURM as our resource manager over two years ago when it was at +the 0.3.x release level. Since then it has become an integral and important +component of our production research services. Its stability, flexibility +and performance has allowed us to significantly increase the quality of +experience we offer to our researchers."

    +Dr. Greg Wettstein, Ph.D. North Dakota State University +
    +
    + + +"SLURM is the coolest thing since the invention of UNIX... +We now can control who can log into [compute nodes] or at least can control +which ones to allow logging into. This will be a tremendous help for users +who are developing their apps."

    +Dennis Gurgul, Research Computing, Partners Health Care +
    +
    + + +"SLURM is a great product that I'd recommend to anyone setting up a cluster, +or looking to reduce their costs by abandoning an existing commercial +resource manager."

    +Josh Lothian, National Center for Computational Sciences, +Oak Ridge National Laboratory +
    +
    + + +"SLURM is under active development, is easy to use, works quite well, +and most important to your harried author, it hasn't been a nightmare +to configure or manage. (Strong praise, that.) I would range SLURM as +the best of the three open source batching systems available, by rather +a large margin."

    +Bryan O'Sullivan, Pathscale +
    +
    + + +"SLURM was a great help for us in implementing our own very concise +job management system on top of it which could be taylored precisely +to our needs, and which at the same time is very simple to use for +our customers. +In general, we are impressed with the stability, scalability, and performance +of SLURM. Furthermore, SLURM is very easy to configure and use. The fact that +SLURM is open-source software with a free license is also advantageous for us +in terms of cost-benefit considerations."

    +Dr. Wilfried Juling, Direktor, Scientific Supercomputing Center, +University of Karlsruhe +
    +
    + + +"SLURM has been adopted as the parallel allocation infrastructure used +in HP's premier cluster stack, XC System Software. SLURM has permitted +easy scaling of parallel applications on cluster systems with thousands +of processors, and has also proven itself to be highly portable and +efficient between interconnects including Quadrics, QsNet, Myrinet, +Infiniband and Gigabit Ethernet." +

    +Bill Celmaster, XC Program Manager, Hewlett-Packard Company +
    +
    + +

    Last modified 3 April 2006

    + + diff --git a/executable_names/doc/html/troubleshoot.shtml b/executable_names/doc/html/troubleshoot.shtml new file mode 100644 index 0000000000000000000000000000000000000000..2a57d0668d900d41ed69da876f925becb16a6e3e --- /dev/null +++ b/executable_names/doc/html/troubleshoot.shtml @@ -0,0 +1,197 @@ + + +

    SLURM Troubleshooting Guide

    + +

    This guide is meant as a tool to help system administrators +or operators troubleshoot SLURM failures and restore services. +The Frequently Asked Questions document +may also prove useful.

    + + + + +

    SLURM is not responding

    + +
      +
    1. Execute "scontrol ping" to determine if the primary +and backup controllers are responding. + +
    2. If it responds for you, this could be a networking +or configuration problem specific to some user or node in the +cluster.
    3. + +
    4. If not responding, directly login to the machine and try again +to rule out network and configuration problems.
    5. + +
    6. If still not responding, check if there is an active slurmctld +dameon by executing "ps -el | grep slurmctld".
    7. + +
    8. If slurmctld is not running, restart it (typically as user root +using the command "/etc/init.d/slurm start"). +You should check the log file (SlurmctldLog in the +slurm.conf file) for an indication of why it failed. +If it keeps failing, you should contact the slurm team for help at +slurm-dev@lists.llnl.gov.
    9. + +
    10. If slurmctld is running but not responding (a very rare situation), +then kill and restart it (typically as user root using the commands +"/etc/init.d/slurm stop" and then "/etc/init.d/slurm start").
    11. + +
    12. If it hangs again, increase the verbosity of debug messages +(increase SlurmctldDebug in the slurm.conf file) +and restart. +Again check the log file for an indication of why it failed. +At this point, you should contact the slurm team for help at +slurm-dev@lists.llnl.gov.
    13. + +
    14. If it continues to fail without an indication as to the failure +mode, restart without preserving state (typically as user root +using the commands "/etc/init.d/slurm stop" +and then "/etc/init.d/slurm startclean"). +Note: All running jobs and other state information will be lost.
    15. +
    + + + +

    Jobs are not getting scheduled

    + +

    This is dependent upon the scheduler used by SLURM. +Executing the command "scontrol show config | grep SchedulerType" +to determine this. +For any scheduler, you can check priorities of jobs using the +command "scontrol show job".

    + +
      +
    • If the scheduler type is builtin, then jobs will be executed +in the order of submission for a given partition. +Even if resources are available to initiate jobs immediately, +it will be deferred until no previously submitted job is pending.
    • + +
    • If the scheduler type is backfill, then jobs will generally +be executed in the order of submission for a given partition with one +exception: later submitted jobs will be initiated early if doing so +does not delay the expected execution time of an earlier submitted job. +In order for backfill scheduling to be effective, users jobs should +specify reasonable time limits. +If jobs do not specify time limits, then all jobs will receive the +same time limit (that associated with the partition), and the ability +to backfill schedule jobs will be limited. +The backfill scheduler does not alter job specifications of required +or excluded nodes, so jobs which specify nodes will substantially +reduce the effectiveness of backfill scheduling. +See the backfill documentation +for more details.
    • + +
    • If the scheduler type is wiki, this represents + +The Maui Scheduler or + +Moab Cluster Suite. +Please refer to its documentation for help.
    • +
    + + + +

    Jobs and nodes are stuck in COMPLETING state

    + +

    This is typically due to non-killable processes associated with the job. +SLURM will continue to attempt terminating the processes with SIGKILL, but +some jobs may stuck performing I/O and non-killable. +This is typically due to a file system problem and may be addressed in +a couple of ways.

    +
      +
    1. Fix the file system and/or reboot the node. -OR-
    2. +
    3. Set the node to a DOWN state and then return it to service +("scontrol update NodeName=<node> State=down Reason=hung_proc" +and "scontrol update NodeName=<node> State=resume"). +This permits other jobs to use the node, but leaves the non-killable +process in place. +If the process should ever complete the I/O, the pending SIGKILL +should terminate it immediately.
    4. +
    + + + +

    Notes are getting set to a DOWN state

    + +
      +
    1. Check the reason why the node is down using the command +"scontrol show node <name>". +This will show the reason why the node was set down and the +time when it happened. +If there is insufficient disk space, memory space, etc. compared +to the parameters specified in the slurm.conf file then +either fix the node or change slurm.conf.
    2. + +
    3. If the reason is "Not responding", then check communications +between the control machine and the DOWN node using the command +"ping <address>" being sure to specify the +NodeAddr values configured in slurm.conf. +If ping fails, then fix the network or addressses in slurm.conf.
    4. + +
    5. Next login to a node that SLURM considers to be in a DOWN +state and check if the slurmd daemon is running with the command +"ps -el | grep slurmd". +If slurmd is not running, restart it (typically as user root +using the command "/etc/init.d/slurm start"). +You should check the log file (SlurmdLog in the +slurm.conf file) for an indication of why it failed. +If it keeps failing, you should contact the slurm team for help at +slurm-dev@lists.llnl.gov.
    6. + +
    7. If slurmd is running but not responding (a very rare situation), +then kill and restart it (typically as user root using the commands +"/etc/init.d/slurm stop" and then "/etc/init.d/slurm start").
    8. + +
    9. If still not responding, try again to rule out +network and configuration problems.
    10. + +
    11. If still not responding, increase the verbosity of debug messages +(increase SlurmdDebug in the slurm.conf file) +and restart. +Again check the log file for an indication of why it failed. +At this point, you should contact the slurm team for help at +slurm-dev@lists.llnl.gov.
    12. + +
    13. If still not responding without an indication as to the failure +mode, restart without preserving state (typically as user root +using the commands "/etc/init.d/slurm stop" +and then "/etc/init.d/slurm startclean"). +Note: All jobs and other state information on that node will be lost.
    14. +
    + + +

    Networking and configuration problems

    + +
      +
    1. Check the controller and/or slurmd log files (SlurmctldLog +and SlurmdLog in the slurm.conf file) for an indication +of why it is failing.
    2. + +
    3. Check for consistent slurm.conf and credential files on +the node(s) experiencing problems.
    4. + +
    5. If this is user-specific problem, check that the user is +configured on the controller computer(s) as well as the +compute nodes. +The user doesn't need to be able to login, but his user ID +must exist.
    6. + +
    7. Check that a consistent version of SLURM exists on all of +the nodes (execute "sinfo -V" or "rpm -qa | grep slurm"). +If the first two digits of the version number match it should +work fine, but version 1.1 commands will not work with +version 1.2 daemons or vise-versa.
    8. +
    + + + +

    Last modified 16 October 2006

    + + diff --git a/executable_names/doc/jsspp/Makefile b/executable_names/doc/jsspp/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..e3cf1e90cbd2119cd89532a50387691cf5a06c0f --- /dev/null +++ b/executable_names/doc/jsspp/Makefile @@ -0,0 +1,56 @@ +# The following comments are to remind me how the automatic variables work: +# $@ - target +# $% - target member +# $< - First prerequisite +# $? - All (newer) prerequisites +# $^ - All prerequisites +# $+ - $^ but with repetitions +# $* - $* stem of pattern (for "foo.c" in %.c:%.o this would be "foo") +# 'info "GNU make"': "Using variables": "Automatic" also lists a few more. + +REPORT = jsspp + +TEX = ../common/llnlCoverPage.tex $(REPORT).tex + +FIGDIR = ../figures +FIGS = $(FIGDIR)/allocate-init.eps \ + $(FIGDIR)/arch.eps \ + $(FIGDIR)/connections.eps \ + $(FIGDIR)/entities.eps \ + $(FIGDIR)/interactive-job-init.eps \ + $(FIGDIR)/queued-job-init.eps \ + $(FIGDIR)/slurm-arch.eps + +PLOTS = $(FIGDIR)/times.eps + +BIB = ../common/project.bib references.bib + +%.eps: %.dia + dia --nosplash -e $@ $< +%.eps: %.gpl + gnuplot $< +%.eps: %.fig + fig2dev -Lps $< $@ +%.eps: %.obj + tgif -print -eps $< +%.ps: %.dvi + dvips -K -t letter -o $(@F) $(}: +Specifies the number of processors cpus) required for each task +(or process) to run. +This may be useful if the job is multithreaded and requires more +than one cpu per task for optimal performance. +The default is one cpu per process. + +\item {\tt nodes=[-]}: +Specifies the number of nodes required by this job. +The node count may be either a specific value or a minimum and maximum +node count separated by a hyphen. +The partition's node limits supersede those of the job. +If a job's node limits are completely outside of the range permitted +for it's associated partition, the job will be left in a PENDING state. +The default is to allocate one cpu per process, such that nodes with +one cpu will run one task, nodes with 2 cpus will run two tasks, etc. +The distribution of processes across nodes may be controlled using +this option along with the {\tt nproc} and {\tt cpus-per-task} options. + +\item {\tt nprocs=}: +Specifies the number of processes to run. +Specification of the number of processes per node may be achieved +with the {\tt cpus-per-task} and {\tt nodes} options. +The default is one process per node unless {\tt cpus-per-task} +explicitly specifies otherwise. + +\end{itemize} + +\subsubsection{Constraint Specification} + +These options describe what configuration requirements of the nodes +which can be used. + +\begin{itemize} + +\item {\tt constraint=list}: +Specify a list of constraints. The list of constraints is +a comma separated list of features that have been assigned to the +nodes by the slurm administrator. If no nodes have the requested +feature, then the job will be rejected. + +\item {\tt contiguous=[yes|no]}: +demand a contiguous range of nodes. The default is "yes". + +\item {\tt mem=}: +Specify a minimum amount of real memory per node (in megabytes). + +\item {\tt mincpus=}: +Specify minimum number of cpus per node. + +\item {\tt partition=name}: +Specifies the partition to be used. +There will be a default partition specified in the SLURM configuration file. + +\item {\tt tmp=}: +Specify a minimum amount of temporary disk space per node (in megabytes). + +\item {\tt vmem=}: +Specify a minimum amount of virtual memory per node (in megabytes). + +\end{itemize} + +\subsubsection{Other Resource Specification} + +\begin{itemize} + +\item {\tt batch}: +Submit in "batch mode." +srun will make a copy of the executable file (a script) and submit therequest for execution when resouces are available. +srun will terminate after the request has been submitted. +The executable file will run on the first node allocated to the +job and must contain srun commands to initiate parallel tasks. + +\item {\tt exclude=[filename|node\_list]}: +Request that a specific list of hosts not be included in the resources +allocated to this job. The host list will be assumed to be a filename +if it contains a "/"character. If some nodes are suspect, this option +may be used to avoid using them. + +\item {\tt immediate}: +Exit if resources are not immediately available. +By default, the request will block until resources become available. + +\item {\tt nodelist=[filename|node\_list]}: +Request a specific list of hosts. The job will contain at least +these hosts. The list may be specified as a comma-separated list of +hosts, a range of hosts (host[1-5,7,...] for example), or a filename. +The host list will be assumed to be a filename if it contains a "/" +character. + +\item {\tt overcommit}: +Overcommit resources. +Normally the job will not be allocated more than one process per cpu. +By specifying this option, you are explicitly allowing more than one process +per cpu. + +\item {\tt share}: +The job can share nodes with other running jobs. This may result in faster job +initiation and higher system utilization, but lower application performance. + +\item {\tt time=}: +Establish a time limit to terminate the job after the specified number of +minutes. If the job's time limit exceed's the partition's time limit, the +job will be left in a PENDING state. The default value is the partition's +time limit. When the time limit is reached, the job's processes are sent +SIGXCPU followed by SIGKILL. The interval between signals is configurable. + +\end{itemize} + +All parameters may be specified using single letter abbreviations +("-n" instead of "--nprocs=4"). +Environment variable can also be used to specify many parameters. +Environment variable will be set to the actual number of nodes and +processors allocated +In the event that the node count specification is a range, the +application could inspect the environment variables to scale the +problem appropriately. +To request four processes with one cpu per task the command line would +look like this: {\em srun --nprocs=4 --cpus-per-task=1 hostname}. +Note that if multiple resource specifications are provided, resources +will be allocated so as to satisfy the all specifications. +For example a request with the specification {\tt nodelist=dev[0-1]} +and {\tt nodes=4} may be satisfied with nodes {\tt dev[0-3]}. + +\subsection{The Maui Scheduler and SLURM} + +{\em The integration of the Maui Scheduler with SLURM was +just beginning at the time this paper was written. Full +integration is anticipated by the time of the conference. +This section will be modified as needed based upon that +experience.} + +The Maui Scheduler is integrated with SLURM through the +previously described plugin mechanism. +The previously described SLURM commands are used for +all job submissions and interactions. +When a job is submitted to SLURM, a Maui Scheduler module +is called to establish its initial priority. +Another Maui Scheduler module is called at the beginning +of each SLURM scheduling cycle. +Maui can use this opportunity to change priorities of +pending jobs or take other actions. + +\subsection{DPCS and SLURM} + +DPCS is a meta-batch system designed for use within a single +administrative domain (all computers have a common user ID +space and exist behind a firewall). +DPCS presents users with a uniform set of commands for a wide +variety of computers and underlying resource managers (e.g. +LoadLeveler on IBM SP systems, SLURM on Linux clusters, NQS, +etc.). +It was developed in 1991 and has been in production use since +1992. +While Globus\cite{Globus2002} has the ability to span administrative +domains, both systems could interface with SLURM in a similar fashion. + +Users submit jobs directly to DPCS. +The job consists of a script and an assortment of constraints. +Unless specified by constraints, the script can execute on +a variety of different computers with various architectures +and resource managers. +DPCS monitors the state of these computers and performs backfill +scheduling across the computers with jobs under its management. +When DPCS decides that resources are available to immediately +initiate some job of its choice, it takes the following +actions: +\begin{itemize} +\item Transfers the job script and assorted state information to +the computer upon which the job is to execute. + +\item Allocates resources for the job. +The resource allocation is performed as user {\em root} and SLURM +is configured to restrict resource allocations in the relevent +partitions to user {\em root}. +This prevents user resource allocations to that partition +except through DPCS, which has complete control over job +scheduling there. +The allocation request specifies the target user ID, job ID +(to match DPCS' own numbering scheme) and specific nodes to use. + +\item Spawns the job script as the desired user. +This script may contain multiple instantiations of \srun\ +to initiate multiple job steps. + +\item Monitor the job's state and resource consumption. +This is performed using DPCS daemons on each compute node +recording CPU time, real memory and virtual memory consumed. + +\item Cancel the job as needed when it has reached its time limit. +The SLURM job is initiated with an infinite time limit. +DPCS mechanisms are used exclusively to manage job time limits. + +\end{itemize} + +Much of the SLURM functionality is left unused in the DPCS +controlled environment. +It should be noted that DPCS is typically configured to not +control all partitions. +A small (debug) partition is typically configured for smaller +jobs and users may directly use SLURM commands to access that +partition. diff --git a/executable_names/doc/jsspp/intro.tex b/executable_names/doc/jsspp/intro.tex new file mode 100644 index 0000000000000000000000000000000000000000..113f481b8e97c9e2e9132db67eda7e59c4ee46fd --- /dev/null +++ b/executable_names/doc/jsspp/intro.tex @@ -0,0 +1,108 @@ +\section{Introduction} +Linux clusters, often constructed by using commodity off-the-shelf (COTS) componnets, +have become increasingly populuar as a computing platform for parallel computation +in recent years, mainly due to their ability to deliver a high perfomance-cost ratio. +Researchers have built and used small to medium size clusters for various +applications~\cite{BeowulfWeb,LokiWeb}. +The continuous decrease in the price of the COTS parts in conjunction with +the good scalability of the cluster architecture has now made it feasible to economically +build large-scale clusters with thousands of processors~\cite{MCRWeb,PCRWeb}. + +An essential component that is needed to harness such a computer is a +resource management system. +A resource management system (or resource manager) performs such crucial tasks as +scheduling user jobs, monitoring machine and job status, launching user applications, and +managing machine configuration, +An ideal resource manager should be simple, efficient, scalable, fault-tolerant, +and portable. + +Unfortunately there are no open-source resource management systems currently available +which satisfy these requirements. +A survey~\cite{Jette02} has revealed that many existing resource managers have poor scalability and fault-tolerance rendering them unsuitable for large clusters having +thousands of processors~\cite{LoadLevelerWeb,LoadLevelerManual}. +While some proprietary cluster managers are suitable for large clusters, +they are typically designed for particular computer systems and/or +interconnects~\cite{RMS,LoadLevelerWeb,LoadLevelerManual}. +Proprietary systems can also be expensive and unavailable in source-code form. +Furthermore, proprietary cluster management functionality is usually provided as a +part of a specific job scheduling system package. +This mandates the use of the given scheduler just to manage a cluster, +even though the scheduler does not necessarily meet the need of organization that hosts the cluster. +Clear separation of the cluster management functionality from scheduling policy is desired. + +This observation led us to set out to design a simple, highly scalable, and +portable resource management system. +The result of this effort is Simple Linux Utility Resource Management +(SLURM\footnote{A tip of the hat to Matt Groening and creators of {\em Futurama}, +where Slurm is the most popular carbonated beverage in the universe.}). +SLURM was developed with the following design goals: + +\begin{itemize} +\item {\em Simplicity}: SLURM is simple enough to allow motivated end-users +to understand its source code and add functionality. The authors will +avoid the temptation to add features unless they are of general appeal. + +\item {\em Open Source}: SLURM is available to everyone and will remain free. +Its source code is distributed under the GNU General Public +License~\cite{GPLWeb}. + +\item {\em Portability}: SLURM is written in the C language, with a GNU +{\em autoconf} configuration engine. +While initially written for Linux, other UNIX-like operating systems +should be easy porting targets. +SLURM also supports a general purpose {\em plugin} mechanism, which +permits a variety of different infrastructures to be easily supported. +The SLURM configuration file specifies which set of plugin modules +should be used. + +\item {\em Interconnect independence}: SLURM supports UDP/IP based +communication as well as the Quadrics Elan3 and Myrinet interconnects. +Adding support for other interconnects is straightforward and utilizes +the plugin mechanism described above. + +\item {\em Scalability}: SLURM is designed for scalability to clusters of +thousands of nodes. +Jobs may specify their resource requirements in a variety of ways +including requirements options and ranges, potentially permitting +faster initiation than otherwise possible. + +\item {\em Robustness}: SLURM can handle a variety of failure modes +without terminating workloads, including crashes of the node running +the SLURM controller. +User jobs may be configured to continue execution despite the failure +of one or more nodes on which they are executing. +Nodes allocated to a job are available for reuse as soon as the job(s) +allocated to that node terminate. +If some nodes fail to complete job termination +in a timely fashion due to hardware of software problems, only the +scheduling of those tardy nodes will be effected. + +\item {\em Secure}: SLURM employs crypto technology to authenticate +users to services and services to each other with a variety of options +available through the plugin mechanism. +SLURM does not assume that its networks are physically secure, +but does assume that the entire cluster is within a single +administrative domain with a common user base across the +entire cluster. + +\item {\em System administrator friendly}: SLURM is configured a +simple configuration file and minimizes distributed state. +Its configuration may be changed at any time without impacting running jobs. +Heterogeneous nodes within a cluster may be easily managed. +SLURM interfaces are usable by scripts and its behavior is highly +deterministic. + +\end{itemize} + +The main contribution of our work is that we have provided a readily available +tool that anybody can use to efficiently manage clusters of different size and architecture. +SLURM is highly scalable\footnote{It was observed that it took less than five seconds for SLURM to launch a 1900-task job over 950 nodes on recently installed cluster at Lawrence Livermore National Laboratory.}. +The SLURM can be easily ported to any cluster system with minimal effort with its plugin +capability and can be used with any meta-batch scheduler or a Grid resource broker~\cite{Gridbook} +with its well-defined interfaces. + +The rest of the paper is organized as follows. +Section 2 describes the architecture of SLURM in detail. Section 3 discusses the services provided by SLURM followed by performance study of +SLURM in Section 4. Brief survey of existing cluster management systems is presented in Section 5. +%Section 6 describes how the SLURM can be used with more sphisticated external schedulers. +Concluding remarks and future development plan of SLURM is given in Section 6. diff --git a/executable_names/doc/jsspp/jsspp.tex b/executable_names/doc/jsspp/jsspp.tex new file mode 100644 index 0000000000000000000000000000000000000000..6c6fef824a450c7162de4fdf70c34a3c48a88e48 --- /dev/null +++ b/executable_names/doc/jsspp/jsspp.tex @@ -0,0 +1,74 @@ +\documentclass[11pt]{article} +\usepackage{graphics} +\usepackage{epsfig} +\usepackage{hhline} + +\setlength{\textheight}{8.5in} +\setlength{\textwidth}{6in} +\setlength{\oddsidemargin}{0.15in} +\setlength{\parindent}{1pc} +\setlength{\topmargin}{-0.0625in} + +% define some macros: +\newcommand{\munged}{{\tt munged}} +\newcommand{\srun}{{\tt srun}} +\newcommand{\scancel}{{\tt scancel}} +\newcommand{\squeue}{{\tt squeue}} +\newcommand{\scontrol}{{\tt scontrol}} +\newcommand{\sinfo}{{\tt sinfo}} +\newcommand{\slurmctld}{{\tt slurmctld}} +\newcommand{\slurmd}{{\tt slurmd}} + +\title{SLURM: Simple Linux Utility for Resource Management\thanks{ +This document was prepared as an account of work sponsored by an +agency of the United States Government. Neither the United States +Government nor the University of California nor any of their +employees, makes any warranty, express or implied, or assumes any +legal liability or responsibility for the accuracy, completeness, or +usefulness of any information, apparatus, product, or process +disclosed, or represents that its use would not infringe privately +owned rights. Reference herein to any specific commercial product, +process, or service by trade name, trademark, manufacturer, or +otherwise, does not necessarily constitute or imply its endorsement, +recommendation, or favoring by the United States Government or the +University of California. The views and opinions of authors expressed +herein do not necessarily state or reflect those of the United States +Government or the University of California, and shall not be used for +advertising or product endorsement purposes. +This work was performed under the auspices of the U. S. Department of +Energy by the University of California, Lawrence Livermore National +Laboratory under Contract No. W-7405-Eng-48. Document UCRL-JC-147996.}} + +\author{Morris A. Jette \and Andy B. Yoo \and Mark Grondona} + +% We cheat here to easily get the desired allignment +%\date{\{jette1,mgrondona\}@llnl.gov} +\date{Lawrence Livermore National Laboratory\\ +Livermore, CA 94551\\ +\{jette1 $\mid$ yoo2 $\mid$ mgrondona\}@llnl.gov} + +\begin{document} + +\maketitle + +\input{abstract} + +\input{intro} +\input{architecture} +\input{services} +\input{survey} +%\input{interaction} +\input{perf} +\input{conclusions} + +\section*{Acknowledgments} + +Additional programmers are responsible for the development of +SLURM include: Chris Dunlap, Joey Ekstrom, Jim Garlick, Kevin Tew +and Jay Windley. + +\newpage +\bibliographystyle{abbrv} +\bibliography{references} +/biblio +\end{document} diff --git a/executable_names/doc/jsspp/perf.tex b/executable_names/doc/jsspp/perf.tex new file mode 100644 index 0000000000000000000000000000000000000000..9a6596ef247ea9fabaaf63e990aa502768b55ae4 --- /dev/null +++ b/executable_names/doc/jsspp/perf.tex @@ -0,0 +1,16 @@ +\section{Performance Study} + +\begin{figure}[htb] +\centerline{\epsfig{file=../figures/times.eps}} +\caption{Time to execute /bin/hostname with various node counts} +\label{timing} +\end{figure} + +We were able to perform some SLURM tests on a 1000 node cluster at LLNL. +Some development was still underway at that time and +tuning had not been performed. The results for executing simple 'hostname' program +on two tasks per node and various node counts is show +in Figure~\ref{timing}. We found SLURM performance to be comparable +to the Quadrics Resource Management System (RMS)~\cite{RMS} +for all job sizes and about 80 times faster than IBM +LoadLeveler~\cite{LoadLevelerWeb,LoadLevelerManual} at tested job sizes. diff --git a/executable_names/doc/jsspp/references.bib b/executable_names/doc/jsspp/references.bib new file mode 100644 index 0000000000000000000000000000000000000000..6e4bcd9a11259ac346ba24670eddf343ec7c783d --- /dev/null +++ b/executable_names/doc/jsspp/references.bib @@ -0,0 +1,393 @@ +@string{micro = "{I}{E}{E}{E} {M}icro"} +@string{icdcs = "{I}nt'l {C}onf. on {D}istributed {C}omputing {S}ystems"} +@string{superapplication = "{I}nternational {J}ournal of {S}upercomputer {A}pplications"} +@article{Anderson95, + author = "Thomas E. Anderson and David E. Culler and David A. Patterson", + title = "{A} {C}ase for {N}{O}{W} ({N}etworks of {W}orkstations)", + journal = micro, + volume = "15(1)", + year = 1995, + month = feb, + pages = "54--64"} +@article{Bailey91, + author = "{D. H. Bailey et al.}", + title = "{T}he {N}{A}{S} {P}arallel {B}enchmarks", + journal = superapplication, + year = 1991, + volume = 5, + pages = "63--73"} +@techreport{Jette02, + author = "Moe Jette and Chris Dunlap and Jim Garlick and Mark Grondona", + title = "{Survey of Batch/Resource Management-Related System Software}", + institution = "{Lawrence Livermore National Laboratory}", + year = 2002, + number = "N/A"} +@techreport{Suzuoka95, + author = "T. Suzuoka and J. Subhlok and T. Gross", + title = "{E}valuating {J}ob {S}cheduling {T}echniques for {H}ighly {P}arallel {C}omputers", + institution = "{S}chool of {C}omputer {S}cience, {C}arbegie {M}ellon {U}niversity", + year = 1995, + number = "CMU-CS-95-149"} +@techreport{Bailey93, + author = "{D. H. Bailey et al.}", + title = "{T}he {N}{A}{S} {P}arallel {B}enchmarks", + institution = "{N}{A}{S}{A} {A}mes {R}esearch {C}enter", + year = 1993, + number = "NASA Technical Memorandom 103863"} +@techreport{Bailey95, + author = "{D. H. Bailey et al.}", + title = "{T}he {N}{A}{S} {P}arallel {B}enchmarks 2.0", + institution = "{N}{A}{S}{A} {A}mes {R}esearch {C}enter", + month = dec, + year = 1995, + number = "NAS-95-020"} +@techreport{Downey96, + author = "A. B. Downey", + title = "{A} {P}arallel {W}orkload {M}odel and {I}ts {I}mplications for {P}rocessor {A}llocation", + institution = "{C}omputer {S}cience {D}ivision, {U}niversity of {C}alifornia, {B}erkeley", + month = nov, + year = 1996, + number = "CSD-96-922"} +@misc{Bailey99, + author = "{D. H. Bailey et al.}", + title = "{V}aluation of {U}ltra-{S}cale {C}omputing {S}ystems: {A} {W}hite {P}aper", + institution = "{U}. {S}. {D}epartment of {E}nergy", + month = dec, + year = 1999} +@techreport{Saini96, + author = "S. Saini and D. H. Bailey", + title = "{N}{A}{S} {P}arallel {B}enchmark ({V}ersion 1.0) {R}esults 11-96", + institution = "{N}{A}{S}{A} {A}mes {R}esearch {C}enter", + month = nov, + year = 1996, + number = "NAS-96-18"} +@article{Boden95, + author = "{N. J. Boden et al.}", + title = "{M}yrinet: {A} {G}igabit-per-second {L}ocal {A}rea {N}etwork", + journal = micro, + year = 1995, + volume = "15(1)", + month = feb, + pages = "29--36"} +@conference{Arpaci95, + author = "R. H. Arpaci and A. C. Dusseau and A. Vahdat and L. T. Liu and T. E. Anderson and D. A. Patterson", + title = "{T}he {I}nteraction of {P}arallel and {S}equential {W}orkloads on a {N}etwork of {W}orkstations", + booktitle = "{P}roc. {A}{C}{M} {S}{I}{G}{M}{E}{T}{R}{I}{C}{S} 1995 {C}onf. on {M}easurement and {M}odeling of {C}omputer {S}systems", + month = may, + year = 1995, + pages = "267--278"} +@conference{Dusseau98, + author = "A. C. Arpaci-Dusseau and D. E. Culler and A. M. Mainwaring", + title = "{S}cheduling with {I}mplicit {I}nformation in {D}istributed {S}ystems", + booktitle = "{P}roc. {A}{C}{M} {S}{I}{G}{M}{E}{T}{R}{I}{C}{S} 1998 {C}onf. on {M}easurement and {M}odeling of {C}omputer {S}systems", + year = 1998} +@conference{Eicken92, + author = "{T. {von} Eicken and D. E. Culler and S. C. Goldsten and K. E. Schauser}", + title = "{A}ctive {M}essages: {A} {M}echanism for {I}ntegrated {C}ommunication and {C}omputation", + booktitle = "{P}roc. 19th {A}nnual {I}nt'l {S}ymp. on {C}omputer {A}rchitecture", + month = dec, + year = 1995} +@conference{Eicken95, + author = "{T. {von} Eicken and A. Basu and V. Buch and W. Vogels}", + title = "{U}-{N}net: {A} {U}ser-{L}evel {N}etwork {I}nterface for {P}arallel and {D}istributed {C}omputing", + booktitle = "{P}roc. 15th {A}{C}{M} {S}ymp. on {O}perating {S}ystem {P}rinciples", + month = dec, + year = 1995} +@conference{Haring95, + author = "G. Haring and G. Kotsis", + title = "{W}orkload {M}odeling for {P}arallel {P}rocessing {S}systems", + booktitle = "Proc. {I}nternational {S}ymposium on {M}odeling, {A}nalysis and {S}imulation of {C}omputer and {T}elecommunication {S}ystems ({M}{A}{S}{C}{O}{T}{S})", + year = 1995, + pages = "8--12"} +@conference{Subhlok96, + author = "J. Subhlok and T. Gross and T. Suzuoka", + title = "{I}mpact of {J}ob {M}ix {O}ptimizations for {S}pace {S}haring {S}cheduling", + booktitle = "Proc. {S}upercomputing 96", + year = 1996, + month = nov} +@conference{Feitelson96, + author = "D. Feitelson", + title = "{P}acking {S}cheme for {G}ang {S}cheduling", + booktitle = "Proc. {I}{P}{P}{S}'96 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing", + year = 1996, + month = apr, + pages = "89--110"} +@conference{Windisch96, + author = "K. Windisch and V. Lo and D. Feitelson and B. Nitzberg and R. Moore", + title = "{A} {C}omparison of {W}orkload {T}races from {T}wo {P}roduction {P}arallel {M}achines", + booktitle = "Proc. {S}ixth {S}ymposium on the {F}rontiers of {M}assively {P}arallel {C}omputing", + year = 1996, + month = oct, + pages = "319--326"} +@conference{Feitelson97_Memory, + author = "D. G. Feitelson", + title = "{M}emory {U}sage in the {L}{A}{N}{L} {C}{M}-5 {W}orkload", + booktitle = "Proc. {I}{P}{P}{S}'97 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing", + year = 1997, + pages = "78--94"} +@conference{Lo98, + author = "V. Lo and J. Mache and K. Windisch", + title = "{A} {C}omparative {S}tudy of {R}eal {W}orkload {T}races and {S}ynthetic {W}orkload {M}odels for {P}arallel {J}ob {S}cheduling", + booktitle = "Proc. {I}{P}{P}{S}'98 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing", + year = 1998, + month = mar, + pages = "1--16"} +@article{Downey99, + author = "A. B. Downey and D. G. Feitelson", + title = "{T}he {E}lusive {G}oal of {W}orkload {C}haracterization", + journal = "{P}erformance {E}valuation {R}eview", + year = 1999, + month = mar, + pages = "14--29"} +@article{Gropp96, + author = "W. Gropp and E. Lusk", + title = "{A} {H}igh-{P}erformance, {P}ortable {I}mplementation of the {M}{P}{I} {M}essage {P}assing {I}nterface {S}tandard", + journal = "{P}arallel {C}omputing", + volume = "22", + year = 1995, + month = feb, + pages = "54--64"} +@conference{Parsons95, + author = "E. W. Parsons and K. C. Sevcik", + title = "{M}ultiprocessor {S}cheduling for {H}igh-{V}ariability {S}ervice {T}ime {D}istributions", + booktitle = "Proc. {I}{P}{P}{S}'95 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing", + year = 1995, + month = apr, + pages = "76--88"} +@conference{Sobalvarro95, + author = "P. G. Sobalvarro and W. E. Weihl", + title = "{D}emand-based {C}oscheduling of {P}arallel {J}obs on {M}ultipr +ogrammed {M}ultiprocessors", + booktitle = "Proc. {I}{P}{P}{S}'95 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing", + year = 1995, + month = apr, + pages = "63--75"} +@phdthesis{Sobalvarro97, + author = "P. G. Sobalvarro", + title = "{D}emand-based {C}oscheduling of {P}arallel {J}obs on {M}ultiprogrammed {M}ultiprocessors", + school = "{D}ept. of {E}lectrical {E}ngineering and {C}ompuer {S}cience, {M}assachusetts {I}nstitutute of {T}echnology", + year = 1997} +@misc{GPLWeb, + author = "{GNU General Public License}", + note = "{\tt http://www.gnu.org/licenses/gpl.html}"} +@misc{PCRWeb, + author = "{Parallel Capacity Resource}", + note = "{\tt http://www.llnl.gov/linux/pcr}"} +@misc{MCRWeb, + author = "{Multiprogrammatic Capability Cluster}", + note = "{\tt http://www.llnl.gov/linux/mcr}"} +@misc{LokiWeb, + author = "{Loki -- Commodity Parallel Processing}", + note = "{\tt http://loki-www.lanl.org}"} +@misc{BeowulfWeb, + author = "{Beowulf Project}", + note = "{\tt http://www.beowulf.org}"} +@misc{LAM, + author = "{Local Area Multicomputer}", + note = "{\tt http://www.lam-mpi.org}"} +@misc{BProc, + author = "{Beowulf Distributed Process Space}", + note = "{\tt http://bproc.sourceforge.net}"} +@misc{PAGG, + author = "{Linux PAGG Process Aggregates}", + note = "{\tt oss.sgi.com/projects/pagg}"} +@misc{Maui, + author = "{Maui Scheduler}", + note = "{\tt http://supercluster.org/maui}"} +@misc{DPCS, + author = "{Distributed Production Control System}", + note = "{\tt http://www.llnl.gov/icc/lc/dpcs\_overview.html}"} +@misc{ASCIprojectatLLNL, + author = "{ASCI Project}", + note = "{\tt http://www.llnl.gov/asci}"} +@misc{ASCIprojectatLANL, + author = "{ASCI Project}", + note = "{\tt http://www.lanl.gov/asci}"} +@misc{ASCIprojectatSNL, + author = "{ASCI Project}", + note = "{\tt http://www.lanl.gov/ASCI/TFLOP/Home\_page.html}"} +@misc{ASCI_BlueMountain, + author = "{ASCI Blue Mountain}", + note = "{\tt http://www.lanl.gov/asci/bluemtn/bluemtn.html}"} +@misc{ASCI_BluePacific, + author = "{ASCI Blue Pacific}", + note = "{\tt http://www.llnl.gov/platforms/bluepac}"} +@misc{ASCI_Red, + author = "{ASCI Red}", + note = "{\tt http://www.sandia.gov/ASCI/Red}"} +@misc{ClassScheduler, + author = "{Class Scheduler}", + note = "{\tt http://www.unix.digital.com/faqs/publications/base\_doc}"} +%note = "{\tt http://www.unix.digital.com/faqs/publications/base\_doc/DOCUMENTATION/V50\_HTML/MAN/MAN4/0102\_\_\_\_.HTM}"} +@misc{PBS, + author = "{Portable Batch System}", + note = "{\tt http://www.openpbs.org}"} +@conference{Jann97, + author = "J. Jann and P. Pattnaik and H. Franke and F. Wang and J. Skovira and J. Riodan", + title = "{M}odeling of {W}orkload in {M}{P}{P}s", + booktitle = "{I}{P}{P}{S}'97 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing, {V}ol. 1291 of {L}ecture {N}otes in {C}omputer {S}cience", + year = 1997, + month = apr, + pages = "95--116", + publisher = "{S}pringer-{V}erlag"} +@conference{Feitelson97, + author = "D. J. Feitelson and M. Jette", + title = "{I}mproved {U}tilization and {R}esponsiveness with {G}ang {S}cheduling", + booktitle = "{I}{P}{P}{S}'97 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing, {V}ol. 1291 of {L}ecture {N}otes in {C}omputer {S}cience", + year = 1997, + month = apr, + pages = "238--261", + publisher = "{S}pringer-{V}erlag"} +@conference{Franke96, + author = "H. Franke and P. Pattnaik and L. Rudolph", + title = "{G}ang {S}cheduling for {H}ighly {E}fficient {M}ultiprocessors", + booktitle = "{P}roc. {S}ixth {S}ymp. on the {F}rontiers of {M}assively {P}arallel {P}rocessing", + year = 1996, + month = oct} +@conference{Hotovy96, + author = "S. Hotovy", + title = "{W}orkload {E}valuation on the {C}ornell {T}heory {C}enter {I}{B}{M} {S}{P}2", + booktitle = "{I}{P}{P}{S}'96 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing, {V}ol. 1162 of {L}ecture {N}otes in {C}omputer {S}cience", + year = 1996, + month = apr, + publisher = "{S}pringer-{V}erlag"} +@conference{Feitelson96_Job, + author = "D. G. Feitelson and B. Nitzberg", + title = "{J}ob {C}haracteristics of a {P}roduction {P}arallel {S}cientific {W}orkload on the {N}{A}{S}{A} {A}mes i{P}{S}{C}/860", + booktitle = "{I}{P}{P}{S}'96 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing, {V}ol. 1162 of {L}ecture {N}otes in {C}omputer {S}cience", + year = 1996, + month = apr, + pages = "337--360", + publisher = "{S}pringer-{V}erlag"} +@conference{EasyLL, + author = "J. Skovira and W. Chan and H. Zhou and D. Lifka", + title = "{T}he {E}asy-{L}oad{L}eveler {A}{P}{I} {P}roject", + booktitle = "{I}{P}{P}{S}'96 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing, {V}ol. 1162 of {L}ecture {N}otes in {C}omputer {S}cience", + year = 1996, + month = apr, + pages = "41--47", + publisher = "{S}pringer-{V}erlag"} +@conference{Jette96, + author = "M. Jette and D. Storch and E. Yim", + title = "{T}imesharing the {C}ray {T}3{D}", + booktitle = "{C}ray {U}ser {G}roup", + year = 1996, + pages = "247--252", + month = mar} +@conference{Jette97, + author = "M. Jette", + title = "{P}erformance {C}haracteristics of {G}ang {S}cheduling in {M}ultiprogrammed {E}nvironments", + booktitle = "{P}roc. {S}uper{C}omputing97", + year = 1997, + month = nov} +@conference{Jette98, + author = "M. Jette", + title = "{E}xpanding {S}ymmetric {M}ultiprocessor {C}apability {T}hrough {G}ang {S}cheduling", + booktitle = "{I}{P}{P}{S}'98 {W}orkshop on {J}ob {S}cheduling {S}trategies for {P}arallel {P}rocessing", + year = 1998, + month = mar} +@conference{Litzkow88, + author = "M. Litzknow and M. Livny and M. Mutka", + title = "Condor - A Hunter for Idle Workstations", + booktitle = "Proc. International Conference on Distributed Computing Systems", + year = 1988, + pasges = "104--111", + month = jun} +@misc{BGL, + author = "{Blue Gene/L}", + note = "{\tt http://cmg-rr.llnl.gov/asci/platforms/bluegenel}"} +@misc{RMS, + author = "{Quadircs Resource Management System}", + note = "{\tt http://www.quadrics.com/website/pdf/rms.pdf}"} +@misc{Condor, + author = "{Condor}", + note = "{\tt http://www.cs.wisc.edu/condor}"} +@misc{LSF, + author = "{Load Sharing Facility}", + note = "{\tt http://www.platform.com}"} +@misc{LoadLevelerWeb, + author = "{Load Leveler}", + note = "{\tt http://www-1.ibm.com/servers/eservers/pseries/library/sp\_books/loadleveler.html}"} +@manual{LoadLevelerManual, + title = "{L}oad{L}eveler's {U}ser {G}uide, {R}elease 2.1", + organization = "{I}{B}{M} {C}orporation"} +@misc{SupercomCenters, + author = "{Top 500 Supercomputer Sites}", + note = "{\tt http://www.netlib.org/benchmark/top500.html}"} +@misc{MPIForumWebpage, + author = "{The MPI Forum}", + year = 1995, + month = may, + note = "{\tt http://www.mcs.anl.gov/mpi/standard.html}"} +@article{Basney97, + author = "J. Basney and M. Livny and T. Tannenbaum", + title = "{High Throughput Computing with Condor}", + journal = "HPCU news", + month = jun, + year = 1997, + volume = "1(2)"} +@article{Calzarossa93, + author = "M. Calzarossa and G. Serazzi", + title = "{W}orkload {C}haracterization: {A} {S}urvey", + journal = "{P}roceedings of the {I}{E}{E}{E}", + month = aug, + year = 1993, + volume = "81(8)"} +@article{MPIForum, + author = "{Message Passing Interface Forum}", + title = "{M}{P}{I}: {A} {M}essage-{P}assing {I}nterface {S}tandard", + journal = superapplication, + year = 1994, + volume = "8(3/4)", + pages = "165--414"} +@conference{Moreira99, + author = "{J. E. Moreira et al.}", + title = "{A} {G}ang-{S}cheduling {S}ystem for {A}{S}{C}{I} {B}lue-{P}acific", + booktitle = "{P}roc. {D}istributed {C}omputing and {M}etacomputing ({D}{C}{M}) {W}orkshop, {H}igh-{P}erformance {C}omputing and {N}etworking '99", + year = 1999, + month = apr} +@conference{Nagar99, + author = "S. Nagar and A. Banerjee and A. Sivasubramaniam and C. R. Das", + title = "{A} {C}loser {L}ook {A}t {C}oscheduling {A}pproaches for a {N}etwork of {W}orkstations", + booktitle = "{P}roc. 11th {A}{C}{M} {S}ymp. of {P}arallel {A}lgorithms and {A}rchitectures", + month = jun, + year = 1999} +@conference{Ousterhaut82, + author = "J. K. Ousterhout", + title = "{S}cheduling {T}echnique for {C}oncurrent {S}ystems", + booktitle = icdcs, + year = 1982, + pages = "22--30"} +@conference{Pakin95, + author = "S. Pakin and M. Lauria and A. Chien", + title = "{H}igh {P}erformance {M}essaging on {W}orkstations: {I}llinois {F}ast {Me}essages ({F}{M})", + booktitle = "{P}roc. {S}upercomputing '95", + month = dec, + year = 1995} +@book{CAbook, + author = {J. Hennessy and D. Patterson}, + title = {Computer Architecture: A Quantitive Approach, Second Edition}, + publisher = {Morgan Kaufmann Publishers, Inc.}, + pages = "669", + year = 1996} +@book{Gridbook, + author = {I. Foster and C. Kesselman}, + title = {The GRID: Blueprint for a New Computing Onfrastructure}, + publisher = {Morgan Kaufmann Publishers, Inc.}, + year = 1999} +@conference{STORM01, + author = "Eitan Frachtenberg and Fabrizio Petrini and others", + title = "STORM: Lightning-Fast Resource Management", + booktitle = "Proceedings of SuperComputing", + year = 2002, +} +@misc{Authd02, + author = "Authd home page", + title = "http://www.theether.org/authd/", +} + +@misc{Quadrics02, + AUTHOR = "Quadrics Resource Management System", + TITLE = "http://www.quadrics.com/", +} + diff --git a/executable_names/doc/jsspp/services.tex b/executable_names/doc/jsspp/services.tex new file mode 100644 index 0000000000000000000000000000000000000000..0189f0acffb5ae2e09ad44f83c128f88a8412f9f --- /dev/null +++ b/executable_names/doc/jsspp/services.tex @@ -0,0 +1,322 @@ +\section{SLURM Operation and Services} +\subsection{Command Line Utilities} + +The command line utilities are the user interface to SLURM functionality. +They offer users access to remote execution and job control. They also +permit administrators to dynamically change the system configuration. +These commands all use SLURM APIs which are directly available for +more sophisticated applications. + +\begin{itemize} +\item {\tt scancel}: Cancel a running or a pending job or job step, +subject to authentication and authorization. This command can also +be used to send an arbitrary signal to all processes on all nodes +associated with a job or job step. + +\item {\tt scontrol}: Perform privileged administrative commands +such as draining a node or partition in preparation for maintenance. +Many \scontrol\ functions can only be executed by privileged users. + +\item {\tt sinfo}: Display a summary of partition and node information. +A assortment of filtering and output format options are available. + +\item {\tt squeue}: Display the queue of running and waiting jobs +and/or job steps. A wide assortment of filtering, sorting, and output +format options are available. + +\item {\tt srun}: Allocate resources, submit jobs to the SLURM queue, +and initiate parallel tasks (job steps). +Every set of executing parallel tasks has an associated \srun\ which +initiated it and, if the \srun\ persists, managing it. +Jobs may be submitted for batch execution, in which case +\srun\ terminates after job submission. +Jobs may also be submitted for interactive execution, where \srun\ keeps +running to shepherd the running job. In this case, +\srun\ negotiates connections with remote {\tt slurmd}'s +for job initiation and to +get stdout and stderr, forward stdin, and respond to signals from the user. +The \srun\ may also be instructed to allocate a set of resources and +spawn a shell with access to those resources. +\srun\ has a total of 13 parameters to control where and when the job +is initiated. + +\end{itemize} + +\subsection{Plugins} + +In order to make the use of different infrastructures possible, +SLURM uses a general purpose plugin mechanism. +A SLURM plugin is a dynamically linked code object which is +loaded explicitly at run time by the SLURM libraries. +A plugin provides a customized implemenation of a well-defined +API connected to tasks such as authentication, interconnect fabric, +task scheduling. +A common set of functions is defined for use by all of the different +infrastructures of a particular variety. +For example, the authentication plugin must define functions +such as: +{\tt slurm\_auth\_activate} to create a credential, +{\tt slurm\_auth\_verify} to verify a credential to +approve or deny authentication, +{\tt slurm\_auth\_get\_uid} to get the user ID associated with +a specific credential, etc. +It also must define the data structure used, a plugin type, +a plugin version number. +The available plugins are defined in the configuration file. +%When a slurm daemon is initiated, it reads the configuration +%file to determine which of the available plugins should be used. +%For example {\em AuthType=auth/authd} says to use the plugin for +%authd based authentication and {\em PluginDir=/usr/local/lib} +%identifies the directory in which to find the plugin. + +\subsection{Communications Layer} + +SLURM presently uses Berkeley sockets for communications. +However, we anticipate using the plugin mechanism to easily +permit use of other communications layers. +At LLNL we are using an Ethernet for SLURM communications and +the Quadrics Elan switch exclusively for user applications. +The SLURM configuration file permits the identification of each +node's hostname as well as its name to be used for communications. +%In the case of a control machine known as {\em mcri} to be +%communicated with using the name {\em emcri} (say to indicate +%an ethernet communications path), this is represented in the +%configuration file as {\em ControlMachine=mcri ControlAddr=emcri}. +%The name used for communication is the same as the hostname unless +%%otherwise specified. + +While SLURM is able to manage 1000 nodes without difficulty using +sockets and Ethernet, we are reviewing other communication +mechanisms which may offer improved scalability. +One possible alternative is STORM\cite{STORM01}. +STORM uses the cluster interconnect and Network Interface Cards to +provide high-speed communications including a broadcast capability. +STORM only supports the Quadrics Elan interconnnect at present, +but does offer the promise of improved performance and scalability. + +\subsection{Security} + +SLURM has a simple security model: +Any user of the cluster may submit parallel jobs to execute and cancel +his own jobs. Any user may view SLURM configuration and state +information. +Only privileged users may modify the SLURM configuration, +cancel any jobs, or perform other restricted activities. +Privileged users in SLURM include the users {\em root} +and {\tt SlurmUser} (as defined in the SLURM configuration file). +If permission to modify SLURM configuration is +required by others, set-uid programs may be used to grant specific +permissions to specific users. + +We presently support three authentication mechanisms via plugins: +{\tt authd}\cite{Authd02}, {\tt munged} and {\tt none}. +A plugin can easily be developed for Kerberos or authentication +mechanisms as desired. +The \munged\ implementation is described below. +A \munged\ daemon running as user {\em root} on each node confirms the +identify of the user making the request using the {\tt getpeername} +function and generates a credential. +The credential contains a user ID, +group ID, time-stamp, lifetime, some pseudo-random information, and +any user supplied information. The \munged\ uses a private key to +generate a Message Authentication Code (MAC) for the credential. +The \munged\ then uses a public key to symmetrically encrypt +the credential including the MAC. +SLURM daemons and programs transmit this encrypted +credential with communications. The SLURM daemon receiving the message +sends the credential to \munged\ on that node. +The \munged\ decrypts the credential using its private key, validates it +and returns the user ID and group ID of the user originating the +credential. +The \munged\ prevents replay of a credential on any single node +by recording credentials that have already been authenticated. +In SLURM's case, the user supplied information includes node +identification information to prevent a credential from being +used on nodes it is not destined for. + +When resources are allocated to a user by the controller, a +{\em job step credential} is generated by combining the user ID, job ID, +step ID, the list of resources allocated (nodes), and the credential +lifetime. This job step credential is encrypted with +a \slurmctld\ private key. This credential +is returned to the requesting agent ({\tt srun}) along with the +allocation response, and must be forwarded to the remote {\tt slurmd}'s +upon job step initiation. \slurmd\ decrypts this credential with the +\slurmctld 's public key to verify that the user may access +resources on the local node. \slurmd\ also uses this job step credential +to authenticate standard input, output, and error communication streams. + +%Access to partitions may be restricted via a {\em RootOnly} flag. +%If this flag is set, job submit or allocation requests to this +%partition are only accepted if the effective user ID originating +%the request is a privileged user. +%The request from such a user may submit a job as any other user. +%This may be used, for example, to provide specific external schedulers +%with exclusive access to partitions. Individual users will not be +%permitted to directly submit jobs to such a partition, which would +%prevent the external scheduler from effectively managing it. +%Access to partitions may also be restricted to users who are +%members of specific Unix groups using a {\em AllowGroups} specification. + +\subsection{Job Initiation} + +There are three modes in which jobs may be run by users under SLURM. The +first and most simple is {\em interactive} mode, in which stdout and +stderr are displayed on the user's terminal in real time, and stdin and +signals may be forwarded from the terminal transparently to the remote +tasks. The second is {\em batch} mode, in which the job is +queued until the request for resources can be satisfied, at which time the +job is run by SLURM as the submitting user. In {\em allocate} mode, +a job is allocated to the requesting user, under which the user may +manually run job steps via a script or in a sub-shell spawned by \srun . + +\begin{figure}[tb] +\centerline{\epsfig{file=../figures/connections.eps,scale=0.5}} +\caption{\small Job initiation connections overview. 1. The \srun\ connects to + \slurmctld\ requesting resources. 2. \slurmctld\ issues a response, + with list of nodes and job credential. 3. The \srun\ opens a listen + port for every task in the job step, then sends a run job step + request to \slurmd . 4. \slurmd 's initiate job step and connect + back to \srun\ for stdout/err. } +\label{connections} +\end{figure} + +Figure~\ref{connections} gives a high-level depiction of the connections +that occur between SLURM components during a general interactive job +startup. +The \srun\ requests a resource allocation and job step initiation from the {\tt slurmctld}, +which responds with the job ID, list of allocated nodes, job credential. +if the request is granted. +The \srun\ then initializes listen ports for each +task and sends a message to the {\tt slurmd}'s on the allocated nodes requesting +that the remote processes be initiated. The {\tt slurmd}'s begin execution of +the tasks and connect back to \srun\ for stdout and stderr. This process and +the other initiation modes are described in more detail below. + +\subsubsection{Interactive mode initiation} + +\begin{figure}[tb] +\centerline{\epsfig{file=../figures/interactive-job-init.eps,scale=0.5} } +\caption{\small Interactive job initiation. \srun\ simultaneously allocates +nodes + and a job step from \slurmctld\ then sends a run request to all + \slurmd 's in job. Dashed arrows indicate a periodic request that + may or may not occur during the lifetime of the job.} +\label{init-interactive} +\end{figure} + +Interactive job initiation is illustrated in Figure~\ref{init-interactive}. +The process begins with a user invoking \srun\ in interactive mode. +In Figure~\ref{init-interactive}, the user has requested an interactive +run of the executable ``{\tt cmd}'' in the default partition. + +After processing command line options, \srun\ sends a message to +\slurmctld\ requesting a resource allocation and a job step initiation. +This message simultaneously requests an allocation (or job) and a job step. +The \srun\ waits for a reply from {\tt slurmctld}, which may not come instantly +if the user has requested that \srun\ block until resources are available. +When resources are available +for the user's job, \slurmctld\ replies with a job step credential, list of +nodes that were allocated, cpus per node, and so on. The \srun\ then sends +a message each \slurmd\ on the allocated nodes requesting that a job +step be initiated. The \slurmd 's verify that the job is valid using +the forwarded job step credential and then respond to \srun . + +Each \slurmd\ invokes a job thread to handle the request, which in turn +invokes a task thread for each requested task. The task thread connects +back to a port opened by \srun\ for stdout and stderr. The host and +port for this connection is contained in the run request message sent +to this machine by \srun . Once stdout and stderr have successfully +been connected, the task thread takes the necessary steps to initiate +the user's executable on the node, initializing environment, current +working directory, and interconnect resources if needed. + +Once the user process exits, the task thread records the exit status and +sends a task exit message back to \srun . When all local processes +terminate, the job thread exits. The \srun\ process either waits +for all tasks to exit, or attempt to clean up the remaining processes +some time after the first task exits. +Regardless, once all +tasks are finished, \srun\ sends a message to the \slurmctld\ releasing +the allocated nodes, then exits with an appropriate exit status. + +When the \slurmctld\ receives notification that \srun\ no longer needs +the allocated nodes, it issues a request for the epilog to be run on each of +the \slurmd 's in the allocation. As \slurmd 's report that the epilog ran +successfully, the nodes are returned to the partition. + + +\subsubsection{Batch mode initiation} + +\begin{figure}[tb] +\centerline{\epsfig{file=../figures/queued-job-init.eps,scale=0.5} } +\caption{\small Queued job initiation. + \slurmctld\ initiates the user's job as a batch script on one node. + Batch script contains an srun call which initiates parallel tasks + after instantiating job step with controller. The shaded region is + a compressed representation and is illustrated in more detail in the + interactive diagram (Figure~\ref{init-interactive}).} +\label{init-batch} +\end{figure} + +Figure~\ref{init-batch} illustrates the initiation of a batch job in SLURM. +Once a batch job is submitted, \srun\ sends a batch job request +to \slurmctld\ that contains the input/output location for the job, current +working directory, environment, requested number of nodes. The +\slurmctld\ queues the request in its priority ordered queue. + +Once the resources are available and the job has a high enough priority, +\slurmctld\ allocates the resources to the job and contacts the first node +of the allocation requesting that the user job be started. In this case, +the job may either be another invocation of \srun\ or a {\em job script} which +may have multiple invocations of \srun\ within it. The \slurmd\ on the remote +node responds to the run request, initiating the job thread, task thread, +and user script. An \srun\ executed from within the script detects that it +has access to an allocation and initiates a job step on some or all of the +nodes within the job. + +Once the job step is complete, the \srun\ in the job script notifies the +\slurmctld\, and terminates. The job script continues executing and may +initiate further job steps. Once the job script completes, the task +thread running the job script collects the exit status and sends a task exit +message to the \slurmctld . The \slurmctld\ notes that the job is complete +and requests that the job epilog be run on all nodes that were allocated. +As the \slurmd 's respond with successful completion of the epilog, +the nodes are returned to the partition. + +\subsubsection{Allocate mode initiation} + +\begin{figure}[tb] +\centerline{\epsfig{file=../figures/allocate-init.eps,scale=0.5} } +\caption{\small Job initiation in allocate mode. Resources are allocated and + \srun\ spawns a shell with access to the resources. When user runs + an \srun\ from within the shell, the a job step is initiated under + the allocation.} +\label{init-allocate} +\end{figure} + +In allocate mode, the user wishes to allocate a job and interactively run +job steps under that allocation. The process of initiation in this mode +is illustrated in Figure~\ref{init-allocate}. The invoked \srun\ sends +an allocate request to \slurmctld , which, if resources are available, +responds with a list of nodes allocated, job id, etc. The \srun\ +process spawns a shell on the user's terminal with access to the +allocation, then waits for the shell to exit at which time the job +is considered complete. + +An \srun\ initiated within the allocate sub-shell recognizes that it +is running under an allocation and therefore already within a job. Provided +with no other arguments, \srun\ started in this manner initiates a job +step on all nodes within the current job. However, the user may select +a subset of these nodes implicitly. + +An \srun\ executed from the sub-shell reads the environment and +user options, then notify the controller that it is starting a job step +under the current job. The \slurmctld\ registers the job step and responds +with a job credential. The \srun\ then initiates the job step using the same +general method as described in the section on interactive job initiation. + +When the user exits the allocate sub-shell, the original \srun\ receives +exit status, notifies \slurmctld\ that the job is complete, and exits. +The controller runs the epilog on each of the allocated nodes, returning +nodes to the partition as they complete the epilog. diff --git a/executable_names/doc/jsspp/survey.tex b/executable_names/doc/jsspp/survey.tex new file mode 100644 index 0000000000000000000000000000000000000000..8d68fdda639935cad2d667d9eeed1c22ed3c9045 --- /dev/null +++ b/executable_names/doc/jsspp/survey.tex @@ -0,0 +1,316 @@ +\section{Related Work} +\subsection*{Portable Batch System (PBS)} + +The Portable Batch System (PBS)~\cite{PBS} +is a flexible batch queuing and +workload management system originally developed by Veridian Systems +for NASA. It operates on networked, multi-platform UNIX environments, +including heterogeneous clusters of workstations, supercomputers, and +massively parallel systems. PBS was developed as a replacement for +NQS (Network Queuing System) by many of the same people. + +PBS supports sophisticated scheduling logic (via the Maui +Scheduler). +PBS spawn's daemons on each +machine to shepherd the job's tasks. +It provides an interface for administrators to easily +interface their own scheduling modules. PBS can support +long delays in file staging with retry. Host +authentication is provided by checking port numbers (low ports numbers are only +accessible to user root). Credential service is used for user authentication. +It has the job prolog and epilog feature. +PBS Supports +high priority queue for smaller "interactive" jobs. Signal to daemons +causes current log file to be closed, renamed with +time-stamp, and a new log file created. + +Although the PBS is portable and has a broad user base, it has significant drawbacks. +PBS is single threaded and hence exhibits poor performance on large clusters. +This is particularly problematic when a compute node in the system fails: +PBS tries to contact down node while other activities must wait. +PBS also has a weak mechanism for starting and cleaning up parallel jobs. +%Specific complaints about PBS from members of the OSCAR group (Jeremy Enos, +%Jeff Squyres, Tim Mattson): +%\begin{itemize} +%\item Sensitivity to hostname configuration on the server; improper +% configuration results in hard to diagnose failure modes. Once +% configuration is correct, this issue disappears. +%\item When a compute node in the system dies, everything slows down. +% PBS is single-threaded and continues to try to contact down nodes, +% while other activities like scheduling jobs, answering qsub/qstat +% requests, etc., have to wait for a complete timeout cycle before being +% processed. +%\item Default scheduler is just FIFO, but Maui can be plugged in so this +% is not a big issue. +%\item Weak mechanism for starting/cleaning up parallel jobs (pbsdsh). +% When a job is killed, pbsdsh kills the processes it started, but +% if the process doesn't die on the first shot it may continue on. +%\item PBS server continues to mark specific nodes offline, even though they +% are healthy. Restarting the server fixes this. +%\item Lingering jobs. Jobs assigned to nodes, and then bounced back to the +% queue for any reason, maintain their assignment to those nodes, even +% if another job had already started on them. This is a poor clean up +% issue. +%\item When the PBS server process is restarted, it puts running jobs at risk. +%\item Poor diagnostic messages. This problem can be as serious as ANY other +% problem. This problem makes small, simple problems turn into huge +% turmoil occasionally. For example, the variety of symptoms that arise +% from improper hostname configuration. All the symptoms that result are +% very misleading to the real problem. +%\item Rumored to have problems when the number of jobs in the queues gets +% large. +%\item Scalability problems on large systems. +%\item Non-portable to Windows +%\item Source code is a mess and difficult for others (e.g. the open source +% community) to improve/expand. +%\item Licensing problems (see below). +%\end{itemize} +%The one strength mentioned is PBS's portability and broad user base. +% +%PBS is owned by Veridian and is released as three separate products with +%different licenses: {\em PBS Pro} is a commercial product sold by Veridian; +%{\em OpenPBS} is an pseudo open source version of PBS that requires +%registration; and +%{\em PBS} is a GPL-like, true open source version of PBS. +% +%Bug fixes go into PBS Pro. When a major revision of PBS Pro comes out, +%the previous version of PBS Pro becomes OpenPBS, and the previous version +%of OpenPBS becomes PBS. The delay getting bug fixes (some reported by the +%open source community) into the true open source version of PBS is the source +%of some frustration. + + +\subsection{Quadrics RMS} + +Quadrics RMS\cite{Quadrics02} +(Resource Management System) is for +Unix systems having Quadrics Elan interconnects. +RMS functionality and performance is excellent. +It major limitation is the requirement for a Quadrics interconnect. +The proprietary code and cost may also pose difficulties under some +circumstances. + + +\subsection*{Maui Scheduler} + +Maui Scheduler~\cite{Maui} is an advanced reservation HPC batch scheduler +for use with SP, O2K, and UNIX/Linux clusters. +It is widely used to extend the functionality of PBS and LoadLeveler, +which Maui requires to perform the parallel job initiation and management. + +\subsection*{Distributed Production Control System (DPCS)} + +The Distributed Production Control System (DPCS)~\cite{DPCS} +is a scheduler developed at Lawrence Livermore National Laboratory (LLNL). +The DPCS provides basic data collection and reporting +mechanisms for prject-level, near real-time accounting and resource allocation +to customers with established limits per customers' organization budgets, +In addition, the DPCS evenly distributes workload across available computers +and supports dynamic reconfiguration and graceful degradation of service to prevent +overuse of a computer where not authorized. +%DPCS is (or will soon be) open source, although its use is presently +%confined to LLNL. The development of DPCS began in 1990 and it has +%evolved into a highly scalable and fault-tolerant meta-scheduler +%operating on top of LoadLeveler, RMS, and NQS. DPCS provides: +%\begin{itemize} +%\item Basic data collection and reporting mechanisms for project-level, +% near real-time accounting. +%\item Resource allocation to customers with established limits per +% customers' organizational budgets. +%\item Proactive delivery of services to organizations that are relatively +% underserviced using a fair-share resource allocation scheme. +%\item Automated, highly flexible system with feedback for proactive delivery +% of resources. +%\item Even distribution of the workload across available computers. +%\item Flexible prioritization of production workload, including "run on demand." +%\item Dynamic reconfiguration and re-tuning. +%\item Graceful degradation in service to prevent overuse of a computer where +% not authorized. +%\end{itemize} + +DPCS supports only a +limited number of computer systems: IBM RS/6000 and SP, Linux, +Sun Solaris, and Compaq Alpha. +Like the Maui Scheduler, DPCS requires an underlying infrastructure for +parallel job initiation and management (LoadLeveler, NQS, RMS or SLURM). + +\subsection*{LoadLeveler} + +LoadLeveler~\cite{LoadLevelerManual,LoadLevelerWeb} +is a proprietary batch system and parallel job manager by +IBM. LoadLeveler supports few non-IBM systems. Very primitive +scheduling software exists and other software is required for reasonable +performance, such as Maui Scheduler or DPCS. +The LoadLeveler has a simple and very flexible queue and job class structure available +operating in "matrix" fashion. +The biggest problem of the LoadLeveler is its poor scalability. +It typically requires 20 minutes to execute even a trivial 500-node, 8000-task +on the IBM SP computers at LLNL. +%In addition, all jobs must be initiated through the LoadLeveler, and a special version of +%MPI is requested to run a parallel job. +%[So do RMS, SLURM, etc. for interconnect set-up - Moe]% +% +%Many configuration files exist with signals to +%daemons used to update configuration (like LSF, good). All jobs must +%be initiated through LoadLeveler (no real "interactive" jobs, just +%high priority queue for smaller jobs). Job accounting is only available +%on termination (very bad for long-running jobs). Good status +%information on nodes and LoadLeveler daemons is available. LoadLeveler +%allocates jobs either entire nodes or shared nodes ,depending upon configuration. +% +%A special version of MPI is required. LoadLeveler allocates +%interconnect resources, spawns the user's processes, and manages the +%job afterwards. Daemons also monitor the switch and node health using +%a "heart-beat monitor." One fundamental problem is that when the +%"Central Manager" restarts, it forgets about all nodes and jobs. They +%appear in the database only after checking in via the heartbeat. It +%needs to periodically write state to disk instead of doing +%"cold-starts" after the daemon fails, which is rare. It has the job +%prolog and epilog feature, which permits us to enable/disable logins +%and remove stray processes. +% +%LoadLeveler evolved from Condor, or what was Condor a decade ago. +%While I am less familiar with LSF and Condor than LoadLeveler, they +%all appear very similar with LSF having the far more sophisticated +%scheduler. We should carefully review their data structures and +%daemons before designing our own. +% +\subsection*{Load Sharing Facility (LSF)} + +LSF~\cite{LSF} +is a proprietary batch system and parallel job manager by +Platform Computing. Widely deployed on a wide variety of computer +architectures, it has sophisticated scheduling software including +fair-share, backfill, consumable resources, an job preemption and +very flexible queue structure. +It also provides good status information on nodes and LSF daemons. +While LSF is quite powerful, it is not open-source and can be costly on +larger clusters. +%The LSF share many of its shortcomings with the LoadLeveler: job initiation only +%through LSF, requirement of a spwcial MPI library, etc. +%Limits are available on both a per process bs per-job +%basis. Time limits include CPU time and wall-clock time. Many +%configuration files with signals to daemons used to update +%configuration (like LoadLeveler, good). All jobs must be initiated +%through LSF to be accounted for and managed by LSF ("interactive" +%jobs can be executed through a high priority queue for +%smaller jobs). Job accounting only available in near real-time (important +%for long-running jobs). Jobs initiated from same directory as +%submitted from (not good for computer centers with diverse systems +%under LSF control). Good status information on nodes and LSF daemons. +%Allocates jobs either entire nodes or shared nodes depending upon +%configuration. +% +%A special version of MPI is required. LSF allocates interconnect +%resources, spawns the user's processes, and manages the job +%afterwards. While I am less familiar with LSF than LoadLeveler, they +%appear very similar with LSF having the far more sophisticated +%scheduler. We should carefully review their data structures and +%daemons before designing our own. + + +\subsection*{Condor} + +Condor~\cite{Condor,Litzkow88,Basney97} +is a batch system and parallel job manager +developed by the University of Wisconsin. +Condor was the basis for IBM's LoadLeveler and both share very similar +underlying infrastructure. Condor has a very sophisticated checkpoint/restart +service that does not rely upon kernel changes, but a variety of +library changes (which prevent it from being completely general). The +Condor checkpoint/restart service has been integrated into LSF, +Codine, and DPCS. Condor is designed to operate across a +heterogeneous environment, mostly to harness the compute resources of +workstations and PCs. It has an interesting "advertising" service. +Servers advertise their available resources and consumers advertise +their requirements for a broker to perform matches. The checkpoint +mechanism is used to relocate work on demand (when the "owner" of a +desktop machine wants to resume work). + +% +%\subsection*{Linux PAGG Process Aggregates} +% +%PAGG~\cite{PAGG} +%consists of modifications to the linux kernel that allows +%developers to implement Process AGGregates as loadable kernel modules. +%A process aggregate is defined as a collection of processes that are +%all members of the same set. A set would be implemented as a container +%for the member processes. For instance, process sessions and groups +%could have been implemented as process aggregates. +% + +\subsection*{Beowulf Distributed Process Space (BPROC)} + +The Beowulf Distributed Process Space +(BPROC) +is set of kernel +modifications, utilities and libraries which allow a user to start +processes on other machines in a Beowulf-style cluster~\cite{BProc}. Remote +processes started with this mechanism appear in the process table +of the front end machine in a cluster. This allows remote process +management using the normal UNIX process control facilities. Signals +are transparently forwarded to remote processes and exit status is +received using the usual wait() mechanisms. This tight coupling of +a cluster's nodes is convenient, but high scalability can be difficult +to achieve. + +%\subsection{xcat} +% +%Presumably IBM's suite of cluster management software +%(xcat\footnote{http://publib-b.boulder.ibm.com/Redbooks.nsf/RedbookAbstracts/sg246041.html}) +%includes a batch system. Look into this. +% +%\subsection{CPLANT} +% +%CPLANT\footnote{http://www.cs.sandia.gov/cplant/} includes +%Parallel Job Launcher, Compute Node Daemon Process, +%Compute Node Allocator, Compute Node Status Tool. +% +%\subsection{NQS} +% +%NQS\footnote{http://umbc7.umbc.edu/nqs/nqsmain.html}, +%the Network Queueing System, is a serial batch system. +% +%\subsection*{LAM / MPI} +% +%Local Area Multicomputer (LAM)~\cite{LAM} +%is an MPI programming environment and development system for heterogeneous +%computers on a network. +%With LAM, a dedicated cluster or an existing network +%computing infrastructure can act as one parallel computer solving +%one problem. LAM features extensive debugging support in the +%application development cycle and peak performance for production +%applications. LAM features a full implementation of the MPI +%communication standard. +% +%\subsection{MPICH} +% +%MPICH\footnote{http://www-unix.mcs.anl.gov/mpi/mpich/} +%is a freely available, portable implementation of MPI, +%the Standard for message-passing libraries. +% +%\subsection{Sun Grid Engine} +% +%SGE\footnote{http://www.sun.com/gridware/} is now proprietary. +% +% +%\subsection{SCIDAC} +% +%The Scientific Discovery through Advanced Computing (SciDAC) +%project\footnote{http://www.scidac.org/ScalableSystems} +%has a Resource Management and Accounting working group +%and a white paper\cite{Res2000}. Deployment of a system with +%the required fault-tolerance and scalability is scheduled +%for June 2006. +% +%\subsection{GNU Queue} +% +%GNU Queue\footnote{http://www.gnuqueue.org/home.html}. +% +%\subsection{Clubmask} +%Clubmask\footnote{http://clubmask.sourceforge.net} is based on bproc. +%Separate queueing system? +% +%\subsection{SQMX} +%Part of the SCE Project\footnote{http://www.opensce.org/}, +%SQMX\footnote{http://www.beowulf.org/pipermail/beowulf-announce/2001-January/000086.html} is worth taking a look at. diff --git a/executable_names/doc/man/Makefile.am b/executable_names/doc/man/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..2e4cd9727264b1bac78aa7a429e3c29e75689dca --- /dev/null +++ b/executable_names/doc/man/Makefile.am @@ -0,0 +1,101 @@ + +EXTRA_DIST = man1 man3 man5 man8 + +man1_MANS = \ + man1/sacct.1 \ + man1/salloc.1 \ + man1/sattach.1 \ + man1/sbatch.1 \ + man1/sbcast.1 \ + man1/scancel.1 \ + man1/scontrol.1 \ + man1/sinfo.1 \ + man1/slaunch.1 \ + man1/slurm.1 \ + man1/smap.1 \ + man1/squeue.1 \ + man1/srun.1 \ + man1/sview.1 + +man3_MANS = man3/slurm_hostlist_create.3 \ + man3/slurm_hostlist_destroy.3 \ + man3/slurm_hostlist_shift.3 \ + man3/slurm_allocate_resources.3 \ + man3/slurm_allocation_lookup.3 \ + man3/slurm_api_version.3 \ + man3/slurm_checkpoint_able.3 \ + man3/slurm_checkpoint_complete.3 \ + man3/slurm_checkpoint_create.3 \ + man3/slurm_checkpoint_disable.3 \ + man3/slurm_checkpoint_enable.3 \ + man3/slurm_checkpoint_error.3 \ + man3/slurm_checkpoint_failed.3 \ + man3/slurm_checkpoint_restart.3 \ + man3/slurm_checkpoint_vacate.3 \ + man3/slurm_complete_job.3 \ + man3/slurm_complete_job_step.3 \ + man3/slurm_confirm_allocation.3 \ + man3/slurm_free_ctl_conf.3 \ + man3/slurm_free_job_info_msg.3 \ + man3/slurm_free_job_step_create_response_msg.3 \ + man3/slurm_free_job_step_info_response_msg.3 \ + man3/slurm_free_node_info.3 \ + man3/slurm_free_partition_info.3 \ + man3/slurm_free_resource_allocation_response_msg.3 \ + man3/slurm_free_submit_response_response_msg.3 \ + man3/slurm_get_end_time.3 \ + man3/slurm_get_errno.3 \ + man3/slurm_get_job_steps.3 \ + man3/slurm_get_rem_time.3 \ + man3/slurm_get_select_jobinfo.3 \ + man3/slurm_init_job_desc_msg.3 \ + man3/slurm_init_part_desc_msg.3 \ + man3/slurm_job_step_create.3 \ + man3/slurm_job_will_run.3 \ + man3/slurm_jobinfo_ctx_get.3 \ + man3/slurm_kill_job.3 \ + man3/slurm_kill_job_step.3 \ + man3/slurm_load_ctl_conf.3 \ + man3/slurm_load_jobs.3 \ + man3/slurm_load_node.3 \ + man3/slurm_load_partitions.3 \ + man3/slurm_perror.3 \ + man3/slurm_pid2jobid.3 \ + man3/slurm_print_ctl_conf.3 \ + man3/slurm_print_job_info.3 \ + man3/slurm_print_job_info_msg.3 \ + man3/slurm_print_job_step_info.3 \ + man3/slurm_print_job_step_info_msg.3 \ + man3/slurm_print_node_info_msg.3 \ + man3/slurm_print_node_table.3 \ + man3/slurm_print_partition_info.3 \ + man3/slurm_print_partition_info_msg.3 \ + man3/slurm_reconfigure.3 \ + man3/slurm_resume.3 \ + man3/slurm_requeue.3 \ + man3/slurm_shutdown.3 \ + man3/slurm_spawn.3 \ + man3/slurm_spawn_kill.3 \ + man3/slurm_step_ctx_create.3 \ + man3/slurm_step_ctx_destroy.3 \ + man3/slurm_step_ctx_get.3 \ + man3/slurm_step_ctx_set.3 \ + man3/slurm_strerror.3 \ + man3/slurm_submit_batch_job.3 \ + man3/slurm_suspend.3 \ + man3/slurm_update_job.3 \ + man3/slurm_update_node.3 \ + man3/slurm_update_partition.3 + +man5_MANS = man5/bluegene.conf.5 \ + man5/slurm.conf.5 \ + man5/wiki.conf.5 + +man8_MANS = man8/slurmctld.8 \ + man8/slurmd.8 \ + man8/spank.8 \ + man8/slurmstepd.8 + +dist-hook: + -rm -rf `find $(distdir) -name CVS` + diff --git a/executable_names/doc/man/Makefile.in b/executable_names/doc/man/Makefile.in new file mode 100644 index 0000000000000000000000000000000000000000..51e13e47fd1f2b2ad6737398a11b3de13571bb3f --- /dev/null +++ b/executable_names/doc/man/Makefile.in @@ -0,0 +1,706 @@ +# Makefile.in generated by automake 1.9 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = doc/man +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ + $(top_srcdir)/auxdir/slurm.m4 \ + $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ + $(top_srcdir)/auxdir/x_ac_affinity.m4 \ + $(top_srcdir)/auxdir/x_ac_aix.m4 \ + $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ + $(top_srcdir)/auxdir/x_ac_debug.m4 \ + $(top_srcdir)/auxdir/x_ac_elan.m4 \ + $(top_srcdir)/auxdir/x_ac_federation.m4 \ + $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ + $(top_srcdir)/auxdir/x_ac_gtk.m4 \ + $(top_srcdir)/auxdir/x_ac_munge.m4 \ + $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ + $(top_srcdir)/auxdir/x_ac_pam.m4 \ + $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ + $(top_srcdir)/auxdir/x_ac_readline.m4 \ + $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ + $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ + $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ + $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ + $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" \ + "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" +man3dir = $(mandir)/man3 +man5dir = $(mandir)/man5 +man8dir = $(mandir)/man8 +NROFF = nroff +MANS = $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTHD_CFLAGS = @AUTHD_CFLAGS@ +AUTHD_LIBS = @AUTHD_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BG_INCLUDES = @BG_INCLUDES@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CMD_LDFLAGS = @CMD_LDFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBUG_MODULES_FALSE = @DEBUG_MODULES_FALSE@ +DEBUG_MODULES_TRUE = @DEBUG_MODULES_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELAN_LIBS = @ELAN_LIBS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ +FFLAGS = @FFLAGS@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +HAVEPKGCONFIG = @HAVEPKGCONFIG@ +HAVE_AIX = @HAVE_AIX@ +HAVE_AIX_FALSE = @HAVE_AIX_FALSE@ +HAVE_AIX_PROCTRACK_FALSE = @HAVE_AIX_PROCTRACK_FALSE@ +HAVE_AIX_PROCTRACK_TRUE = @HAVE_AIX_PROCTRACK_TRUE@ +HAVE_AIX_TRUE = @HAVE_AIX_TRUE@ +HAVE_ELAN = @HAVE_ELAN@ +HAVE_ELAN_FALSE = @HAVE_ELAN_FALSE@ +HAVE_ELAN_TRUE = @HAVE_ELAN_TRUE@ +HAVE_FEDERATION = @HAVE_FEDERATION@ +HAVE_FEDERATION_FALSE = @HAVE_FEDERATION_FALSE@ +HAVE_FEDERATION_TRUE = @HAVE_FEDERATION_TRUE@ +HAVE_GTK_FALSE = @HAVE_GTK_FALSE@ +HAVE_GTK_TRUE = @HAVE_GTK_TRUE@ +HAVE_NUMA_FALSE = @HAVE_NUMA_FALSE@ +HAVE_NUMA_TRUE = @HAVE_NUMA_TRUE@ +HAVE_PAM_FALSE = @HAVE_PAM_FALSE@ +HAVE_PAM_TRUE = @HAVE_PAM_TRUE@ +HAVE_SCHED_SETAFFINITY_FALSE = @HAVE_SCHED_SETAFFINITY_FALSE@ +HAVE_SCHED_SETAFFINITY_TRUE = @HAVE_SCHED_SETAFFINITY_TRUE@ +HAVE_SGI_JOB_FALSE = @HAVE_SGI_JOB_FALSE@ +HAVE_SGI_JOB_TRUE = @HAVE_SGI_JOB_TRUE@ +HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ +HAVE_SOME_CURSES_FALSE = @HAVE_SOME_CURSES_FALSE@ +HAVE_SOME_CURSES_TRUE = @HAVE_SOME_CURSES_TRUE@ +HAVE_UNSETENV_FALSE = @HAVE_UNSETENV_FALSE@ +HAVE_UNSETENV_TRUE = @HAVE_UNSETENV_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_LDFLAGS = @LIB_LDFLAGS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ +MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ +MUNGE_LIBS = @MUNGE_LIBS@ +NCURSES = @NCURSES@ +NUMA_LIBS = @NUMA_LIBS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PAM_LIBS = @PAM_LIBS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROCTRACKDIR = @PROCTRACKDIR@ +PROJECT = @PROJECT@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE = @RELEASE@ +SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ +SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLURMCTLD_PORT = @SLURMCTLD_PORT@ +SLURMD_PORT = @SLURMD_PORT@ +SLURM_API_AGE = @SLURM_API_AGE@ +SLURM_API_CURRENT = @SLURM_API_CURRENT@ +SLURM_API_MAJOR = @SLURM_API_MAJOR@ +SLURM_API_REVISION = @SLURM_API_REVISION@ +SLURM_API_VERSION = @SLURM_API_VERSION@ +SLURM_MAJOR = @SLURM_MAJOR@ +SLURM_MICRO = @SLURM_MICRO@ +SLURM_MINOR = @SLURM_MINOR@ +SLURM_VERSION = @SLURM_VERSION@ +SO_LDFLAGS = @SO_LDFLAGS@ +SSL_CPPFLAGS = @SSL_CPPFLAGS@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WITH_AUTHD_FALSE = @WITH_AUTHD_FALSE@ +WITH_AUTHD_TRUE = @WITH_AUTHD_TRUE@ +WITH_GNU_LD_FALSE = @WITH_GNU_LD_FALSE@ +WITH_GNU_LD_TRUE = @WITH_GNU_LD_TRUE@ +WITH_MUNGE_FALSE = @WITH_MUNGE_FALSE@ +WITH_MUNGE_TRUE = @WITH_MUNGE_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +EXTRA_DIST = man1 man3 man5 man8 +man1_MANS = \ + man1/sacct.1 \ + man1/salloc.1 \ + man1/sattach.1 \ + man1/sbatch.1 \ + man1/sbcast.1 \ + man1/scancel.1 \ + man1/scontrol.1 \ + man1/sinfo.1 \ + man1/slaunch.1 \ + man1/slurm.1 \ + man1/smap.1 \ + man1/squeue.1 \ + man1/srun.1 \ + man1/sview.1 + +man3_MANS = man3/slurm_hostlist_create.3 \ + man3/slurm_hostlist_destroy.3 \ + man3/slurm_hostlist_shift.3 \ + man3/slurm_allocate_resources.3 \ + man3/slurm_allocation_lookup.3 \ + man3/slurm_api_version.3 \ + man3/slurm_checkpoint_able.3 \ + man3/slurm_checkpoint_complete.3 \ + man3/slurm_checkpoint_create.3 \ + man3/slurm_checkpoint_disable.3 \ + man3/slurm_checkpoint_enable.3 \ + man3/slurm_checkpoint_error.3 \ + man3/slurm_checkpoint_failed.3 \ + man3/slurm_checkpoint_restart.3 \ + man3/slurm_checkpoint_vacate.3 \ + man3/slurm_complete_job.3 \ + man3/slurm_complete_job_step.3 \ + man3/slurm_confirm_allocation.3 \ + man3/slurm_free_ctl_conf.3 \ + man3/slurm_free_job_info_msg.3 \ + man3/slurm_free_job_step_create_response_msg.3 \ + man3/slurm_free_job_step_info_response_msg.3 \ + man3/slurm_free_node_info.3 \ + man3/slurm_free_partition_info.3 \ + man3/slurm_free_resource_allocation_response_msg.3 \ + man3/slurm_free_submit_response_response_msg.3 \ + man3/slurm_get_end_time.3 \ + man3/slurm_get_errno.3 \ + man3/slurm_get_job_steps.3 \ + man3/slurm_get_rem_time.3 \ + man3/slurm_get_select_jobinfo.3 \ + man3/slurm_init_job_desc_msg.3 \ + man3/slurm_init_part_desc_msg.3 \ + man3/slurm_job_step_create.3 \ + man3/slurm_job_will_run.3 \ + man3/slurm_jobinfo_ctx_get.3 \ + man3/slurm_kill_job.3 \ + man3/slurm_kill_job_step.3 \ + man3/slurm_load_ctl_conf.3 \ + man3/slurm_load_jobs.3 \ + man3/slurm_load_node.3 \ + man3/slurm_load_partitions.3 \ + man3/slurm_perror.3 \ + man3/slurm_pid2jobid.3 \ + man3/slurm_print_ctl_conf.3 \ + man3/slurm_print_job_info.3 \ + man3/slurm_print_job_info_msg.3 \ + man3/slurm_print_job_step_info.3 \ + man3/slurm_print_job_step_info_msg.3 \ + man3/slurm_print_node_info_msg.3 \ + man3/slurm_print_node_table.3 \ + man3/slurm_print_partition_info.3 \ + man3/slurm_print_partition_info_msg.3 \ + man3/slurm_reconfigure.3 \ + man3/slurm_resume.3 \ + man3/slurm_requeue.3 \ + man3/slurm_shutdown.3 \ + man3/slurm_spawn.3 \ + man3/slurm_spawn_kill.3 \ + man3/slurm_step_ctx_create.3 \ + man3/slurm_step_ctx_destroy.3 \ + man3/slurm_step_ctx_get.3 \ + man3/slurm_step_ctx_set.3 \ + man3/slurm_strerror.3 \ + man3/slurm_submit_batch_job.3 \ + man3/slurm_suspend.3 \ + man3/slurm_update_job.3 \ + man3/slurm_update_node.3 \ + man3/slurm_update_partition.3 + +man5_MANS = man5/bluegene.conf.5 \ + man5/slurm.conf.5 \ + man5/wiki.conf.5 + +man8_MANS = man8/slurmctld.8 \ + man8/slurmd.8 \ + man8/spank.8 \ + man8/slurmstepd.8 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/man/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/man/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ + done +install-man3: $(man3_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man3dir)" || $(mkdir_p) "$(DESTDIR)$(man3dir)" + @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.3*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 3*) ;; \ + *) ext='3' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \ + done +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.3*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 3*) ;; \ + *) ext='3' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man3dir)/$$inst"; \ + done +install-man5: $(man5_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man5dir)" || $(mkdir_p) "$(DESTDIR)$(man5dir)" + @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.5*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 5*) ;; \ + *) ext='5' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst"; \ + done +uninstall-man5: + @$(NORMAL_UNINSTALL) + @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.5*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 5*) ;; \ + *) ext='5' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man5dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man5dir)/$$inst"; \ + done +install-man8: $(man8_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)" + @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.8*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 8*) ;; \ + *) ext='8' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ + done +uninstall-man8: + @$(NORMAL_UNINSTALL) + @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.8*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 8*) ;; \ + *) ext='8' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-man + +install-exec-am: + +install-info: install-info-am + +install-man: install-man1 install-man3 install-man5 install-man8 + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-man + +uninstall-man: uninstall-man1 uninstall-man3 uninstall-man5 \ + uninstall-man8 + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-man1 install-man3 install-man5 install-man8 \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-info-am uninstall-man \ + uninstall-man1 uninstall-man3 uninstall-man5 uninstall-man8 + + +dist-hook: + -rm -rf `find $(distdir) -name CVS` +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/executable_names/doc/man/man1/sacct.1 b/executable_names/doc/man/man1/sacct.1 new file mode 100644 index 0000000000000000000000000000000000000000..4c8813056c59689cf20f564be7da86852d61d5d3 --- /dev/null +++ b/executable_names/doc/man/man1/sacct.1 @@ -0,0 +1,1141 @@ +.\" $Header$ +.TA "s" +.TH sacct 1 +.ds )H "Hewlett\-Packard Company +.SH "NAME" +sacct +\- displays accounting data for all jobs and job steps in the SLURM job accounting log +.SH "SYNOPSIS" +.HP +.BR "sacct " +\f2\fP\f2options \fP +.SH "DESCRIPTION" +.PP +Accounting information for jobs invoked with SLURM are logged in the job +accounting log file. +.PP +The +.BR "sacct " +command displays job accounting data stored in the job accounting log +file in a variety of forms for your analysis. +The +.BR "sacct " +command displays information on jobs, job steps, status, and exitcodes by +default. +You can tailor the output with the use of the +\f3\-\-fields=\fP +option to specify the fields to be shown. +.PP +For the root user, the +.BR "sacct " +command displays job accounting data for all users, although there are +options to filter the output to report only the jobs from a specified +user or group. +.PP +For the non\-root user, the +.BR "sacct " +command limits the display of job accounting data to jobs that were +launched with their own user identifier (UID) by default. +Data for other users can be displayed with the +\f3\-\-all\fP, +\f3\-\-user\fP, +or +\f3\-\-uid\fP +options. +.TP "10" +\f3Note: \fP\c +Much of the data reported by \f3sacct\fP has been generated by +the \f2wait3()\fP and \f2getrusage()\fP system calls. Some systems +gather and report incomplete information for these calls; +\f3sacct\fP reports values of 0 for this missing data. See your systems +\f2getrusage(3)\fP man page for information about which data are +actually available on your system. +.SS "Options" +.TP "10" +\f3\-a \fP\f3,\fP \f3\-\-all\fP +Displays the job accounting data for all jobs in the job accounting log file. +.IP +This is the default behavior when the +.BR "sacct " +command is executed by the root user. +.TP +\f3\-b \fP\f3,\fP \f3\-\-brief\fP +Displays a brief listing, which includes the following data: +.RS +.TP "3" +\(bu +\f3jobid\fP +.TP "3" +\(bu +\f3status\fP +.TP "3" +\(bu +\f3exitcode\fP +.RE +.IP +This option has no effect when the +\f3\-\-\-dump\fP +option is also specified. +.TP +\f3\-d \fP\f3,\fP \f3\-\-dump\fP +Displays (dumps) the raw data records. +.IP +This option overrides the +\f3\-\-brief\fP +and +\f3\-\-fields=\fP +options. +.IP +The section titled "INTERPRETING THE \-\-dump OPTION OUTPUT" describes the +data output when this option is used. +.TP +\f3\-S \fP\f3,\fP \f3\-\-stat\fP +.IP +Queries the status of a job as the job is running displaying +the following data: +.RS +.TP "3" +\(bu +\f3jobid\fP +.TP "3" +\(bu +\f3vsize\fP +.TP "3" +\(bu +\f3rss\fP +.TP "3" +\(bu +\f3pages\fP +.TP "3" +\(bu +\f3cputime\fP +.TP "3" +\(bu +\f3ntasks\fP +.TP "3" +\(bu +\f3status\fP +.RE +.IP +You must also include the \-\-jobs=job(.step) option if no (.step) is +given you will recieve the job.0 step. + +.TP +\f3\-e \fP\f2time_spec\fP \f3,\fP \f3\-\-expire=\fP\f2time_spec\fP +.IP +Removes job data from SLURMs current accounting log file (or the file +specified with \f3\-\-file\fP) for jobs that completed more than +\f2time_spec\fP +ago and appends them to the expired log file. +.IP +If \f2time_spec\fP is an integer value only, it is interpreted as minutes. If +\f2time_spec\fP is an integer followed by "h", it is interpreted as +a number of hours. If \f2time_spec\fP is an integer followed by "d", +it is interpreted as number of days. For example, "\-\-expire=14d" +purges the job accounting log of all jobs that completed +more than 14 days ago. +.IP +The expired log file is a file with the same name as the accounting +log file, with ".expired" appended to the file name. For example, if +the accounting log file is /var/log/slurmacct.log, the expired log +file will be /var/log/slurmacct.log.expired. +.TP +\f3\-F \fP\f2field_list\fP \f3,\fP \f3\-\-fields\fP\f3=\fP\f2field_list\fP +Displays the job accounting data specified by the +\f2field_list\fP +operand, which is a comma\-separated list of fields. +Space characters are not allowed in the +\f2field_list\fP\c +\&. +.IP +See the +\f3\-\-help\-fields\fP +option for a list of the available fields. +See the section titled "Job Accounting Fields" for a description of +each field. +.IP +The job accounting data is displayed in the order specified by the +\f2field_list\fP +operand. +Thus, the following two commands display the same data but in different order: +.RS +.PP +.nf +.ft 3 +# sacct \-\-fields=jobid,status +Jobid Status +\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- +3 COMPLETED +3.0 COMPLETED + +.ft 1 +.fi +.RE +.RS +.PP +.nf +.ft 3 +# sacct \-\-fields=status,jobid +Status Jobid +\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- +COMPLETED 3 +COMPLETED 3.0 + +.ft 1 +.fi +.RE +.IP +The default value for the +\f2field_list\fP +operand is +\f3"jobid,partition,process,ncpus,status,exitcode"\fP\c +\&. +.IP +This option has no effect when the +\f3\-\-dump\fP +option is also specified. +.TP +\f3\-f \fP\f2file\fP\f3,\fP \f3\-\-file\fP\f3=\fP\f2file\fP +Causes the +.BR "sacct " +command to read job accounting data from the named +\f2file\fP +instead of the current SLURM job accounting log file. +.TP +\f3\-O \fP\f3,\fP \f3\-\-formatted_dump\fP +Dumps accounting records in an easy\-to\-read format. +.IP +This option is provided for debugging. +.TP +\f3\-g \fP\f2gid\fP\f3,\fP \f3\-\-gid\fP\f3=\fP\f2gid\fP +Displays the statistics only for the jobs started with GID +\f2gid\fP\c +\&. +.TP +\f3\-g \fP\f2group\fP\f3,\fP \f3\-\-group\fP\f3=\fP\f2group\fP +Displays the statistics only for the jobs started by users in the +group +\f2group\fP\c +\&. +.TP +\f3\-h \fP\f3,\fP \f3\-\-help\fP +Displays a general help message. +.TP +\f3\-\-help\-fields\fP +Displays a list of fields that can be specified with the +\f3\-\-fields\fP +option. +.RS +.PP +.nf +.ft 3 +Fields available: +account blockid cpu cputime +elapsed end exitcode gid +group idrss inblock isrss +ixrss job jobid jobname +majflt minflt msgrcv msgsnd +ncpus nivcsw nodes nprocs +nsignals nswap ntasks nvcsw +outblocks pages partition rss +start status submit systemcpu +uid user usercpu vsize + +.ft 1 +.fi +.RE +.IP +The section titled "Job Accounting Fields" describes these fields. +.TP +\f3\-j \fP\f2job(.step)\fP \f3,\fP \f3\-\-jobs\fP\f3=\fP\f2job(.step)\fP +Displays information about the specified job(.step) or list of job(.step)s. +.IP +The +\f2job(.step)\fP +parameter is a comma\-separated list of jobs. +Space characters are not permitted in this list. +.IP +The default is to display information on all jobs. +.TP +\f3\-l\fP\f3,\fP \f3\-\-long\fP +Displays a long listing, which includes the following data: +.RS +.TP "3" +\(bu +\f3jobid\fP +.TP "3" +\(bu +\f3jobname\fP +.TP "3" +\(bu +\f3partition\fP +.TP "3" +\(bu +\f3vsize\fP +.TP "3" +\(bu +\f3rss\fP +.TP "3" +\(bu +\f3pages\fP +.TP "3" +\(bu +\f3cputime\fP +.TP "3" +\(bu +\f3ntasks\fP +.TP "3" +\(bu +\f3ncpus\fP +.TP "3" +\(bu +\f3elapsed\fP +.TP "3" +\(bu +\f3status\fP +.TP "3" +\(bu +\f3exitcode\fP +.RE +.TP +\f3\-\-noheader\fP +Prevents the display of the heading over the output. +The default action is to display a header. +.IP +This option has no effect when used with the +\f3\-\-dump\fP +option. +.TP +\f3\-p \fP\f2partition_list\fP \f3,\fP \f3\-\-partition\fP\f3=\fP\f2partition_list\fP +Displays information about jobs and job steps specified by the +\f2partition_list\fP +operand, which is a comma\-separated list of partitions. +Space characters are not allowed in the +\f2partition_list\fP\c +\&. +.IP +The default is to display information on jobs and job steps on all partitions. +.TP +\f3\-s \fP\f2state_list\fP \f3,\fP \f3\-\-state\fP\f3=\fP\f2state_list\fP +Selects jobs based on their current state, which can be designated with +the following state designators: +.RS +.TP "10" +\f3r\fP +running +.TP +\f3s\fP +suspended +.TP +\f3ca\fP +cancelled +.TP +\f3cd\fP +completed +.TP +\f3pd\fP +pending +.TP +\f3f\fP +failed +.TP +\f3to\fP +timed out +.TP +\f3nf\fP +node_fail +.RE +.IP +The +\f2state_list\fP +operand is a comma\-separated list of these state designators. +Space characters are not allowed in the +\f2state_list\fP\c +\&. +.TP +\f3\-t \fP\f3,\fP \f3\-\-total\fP +Displays only the cumulative statistics for each job. +Intermediate steps are displayed by default. +.TP +\f3\-u \fP\f2uid\fP\f3,\fP \f3\-\-uid\fP\f3=\fP\f2uid\fP +Displays the statistics only for the jobs started by the user whose UID is +\f2uid\fP\c +\&. +.TP +\f3\-u \fP\f2user\fP\f3,\fP \f3\-\-user\fP\f3=\fP\f2user\fP +Displays the statistics only for the jobs started by user +\f2user\fP\c +\&. +.TP +\f3\-\-usage\fP +Displays a help message. +.TP +\f3\-v \fP\f3,\fP \f3\-\-verbose\fP +Reports the state of certain variables during processing. +This option is primarily used for debugging. +.SS "Job Accounting Fields" +The following describes each job accounting field: +.RS +.TP "10" +\f3account\fP +User supplied account number for the job + +.TP +\f3blockid\fP +Block ID, applicable to BlueGene computers only + +.TP +\f3cpu\fP +The sum of the system time (systemcpu) and user time (usercpu) in seconds + +.TP +\f3cputime\fP +Minimum CPU time of any process followed by its task id along with +the average of all processes running in the step. + +.TP +\f3elapsed\fP +The jobs elapsed time. +.IP +The format of this fields output is as follows: +.RS +.PD "0" +.HP +\f2[DD\-[hh:]]mm:ss\fP +.PD +.RE +.IP +as defined by the following: +.RS +.TP "10" +\f2DD\fP +days +.TP +\f2hh\fP +hours +.TP +\f2mm\fP +minutes +.TP +\f2ss\fP +seconds +.RE + +.TP +\f3end\fP +Termination time of the job. Format output is as follows: +.RS +.PD "0" +.HP +\f2MM/DD\-hh:mm:ss\fP +.PD +.RE +.IP +as defined by the following: +.RS +.TP "10" +\f2MM\fP +month +.TP +\f2DD\fP +day +.TP +\f2hh\fP +hours +.TP +\f2mm\fP +minutes +.TP +\f2ss\fP +seconds +.RE + +.TP +\f3exitcode\fP +The first non\-zero error code returned by any job step. + +.TP +\f3gid\fP +The group identifier of the user who ran the job. + +.TP +\f3group\fP +The group name of the user who ran the job. + +.TP +\f3idrss\fP +Maximum unshared data size (in KB) of any process. + +.TP +\f3inblocks\fP +Total block input operations for all processes. + +.TP +\f3isrss\fP +Maximum unshared stack space size (in KB) of any process. + +.TP +\f3ixrss\fP +Maximum shared memory (in KB) of any process. + +.TP +\f3job\fP +The SLURM job identifier of the job. + +.TP +\f3jobid\fP +The number of the job or job step. +It is in the form: +\f2job.jobstep\fP\c +\&. + +.TP +\f3jobname\fP +The name of the job or job step. + +.TP +\f3majflt\fP +Maximum number of major page faults for any process. + +.TP +\f3minflt\fP +Maximum number of minor page faults (page reclaims) for any process. + +.TP +\f3msgrcv\fP +Total number of messages received for all processes. + +.TP +\f3msgsnd\fP +Total number of messages sent for all processes. + +.TP +\f3ncpus\fP +Total number of CPUs allocated to the job. + +.TP +\f3nivcsw\fP +Total number of involuntary context switches for all processes. + +.TP +\f3nodes\fP +A list of nodes allocated to the job. + +.TP +\f3nprocs\fP +Total number of tasks in job. Identical to \f3ntasks\fP. + +.TP +\f3nsignals\fP +Total number of signals received for all processes. + +.TP +\f3nswap\fP +Maximum number of swap operations of any process. + +.TP +\f3ntasks\fP +Total number of tasks in job. + +.TP +\f3nvcsw\fP +Total number of voluntary context switches for all processes. + +.TP +\f3outblocks\fP +Total block output operations for all processes. + +.TP +\f3pages\fP +Maximum page faults of any process followed by its task id along with +the average of all processes running in the step. + +.TP +\f3partition\fP +Identifies the partition on which the job ran. + +.TP +\f3rss\fP +Maximum resident set size of any process followed by its task id along with +the average of all processes running in the step. + +.TP +\f3start\fP +Initiation time of the job in the same format as \f3end\fP. + +.TP +\f3status\fP +Displays the job status, or state. +.IP +Output can be +\f3RUNNING\fP\c +\&, +\f3SUSPENDED\fP\c +\&, +\f3COMPLETED\fP\c +\&, +\f3CANCELLED\fP\c +\&, +\f3FAILED\fP\c +\&, +\f3TIMEOUT\fP\c +\&, or +\f3NODE_FAIL\fP\c +\&. + +.TP +\f3submit\fP +The time and date stamp (in Universal Time Coordinated, UTC) the job was +submitted. +The format of the output is identical to that of the \f3end\fP field. + +.TP +\f3systemcpu\fP +The amount of system CPU time. +The format of the output is identical to that of the +\f3elapsed\fP +field. + +.TP +\f3uid\fP +The user identifier of the user who ran the job. + +.TP +\f3uid.gid\fP +The user and group identifiers of the user who ran the job. (This +field is used in record headers, and simply concatenates the +\f3uid\fP and \f3gid\fP fields.) + +.TP +\f3user\fP +The user name of the user who ran the job. + +.TP +\f3usercpu\fP +The amount of user CPU time. +The format of the output is identical to that of the +\f3elapsed\fP field. + +.TP +\f3vsize\fP +Maximum Virtual Memory size of any process followed by its task id along with +the average of all processes running in the step. + +.RE +.SH "INTERPRETING THE \-DUMP OPTION OUTPUT" +The +.BR "sacct " +commands +\f3\-\-dump\fP +option displays data in a horizontal list of fields depending on the +record type; +there are three record types: +\f3JOB_START\fP\c +\&, +\f3JOB_STEP\fP\c +\&, and +\f3JOB_TERMINATED\fP\c +\&. +There is a subsection that describes the output for each record type. +.PP +When the data output is a job accounting field, as described in the +section titled "Job Accounting Fields", only the name of the job +accounting field is listed. +Otherwise, additional information is provided. +.TP "10" +\f3Note: \fP\c +The output for the +\f3JOB_STEP\fP +and +\f3JOB_TERMINATED\fP +record types present a pair of fields for the following data: +Total CPU time, Total User CPU time, and Total System CPU time. +The first field of each pair is the time in seconds expressed as an +integer. +The second field of each pair is the fractional number of seconds +multiplied by one million. +Thus, a pair of fields output as "\c +\f31 024315\fP\c +" means that the time is 1.024315 seconds. +The least significant digits in the second field are truncated in +formatted displays. +.SS "Output for the JOB_START Record Type" +The following describes the horizontal fields output by the +.BR "sacct " +\f3\-\-dump\fP +option for the +\f3JOB_START\fP +record type. +.RS +.TP "10" +Field # +Field +.TP +1 +\f3job\fP +.TP +2 +\f3partition\fP +.TP +3 +\f3submitted\fP +.TP +4 +The jobs start time; +this value is the number of non\-leap seconds since the Epoch (00:00:00 +UTC, January 1, 1970) +.TP +5 +\f3uid.gid\fP +.TP +6 +(Reserved) +.TP +7 +\f3JOB_START\fP (literal string) +.TP +8 +Job Record Version (1) +.TP +9 +The number of fields in the record (16) +.TP +10 +\f3uid\fP +.TP +11 +\f3gid\fP +.TP +12 +The job name +.TP +13 +Batch Flag (0=no batch) +.TP +14 +Relative SLURM priority +.TP +15 +\f3ncpus\fP +.TP +16 +\f3nodes\fP +.RE +.SS "Output for the JOB_STEP Record Type" +The following describes the horizontal fields output by the +.BR "sacct " +\f3\-\-dump\fP +option for the +\f3JOB_STEP\fP +record type. +.RS +.TP "10" +Field # +Field +.TP +1 +\f3job\fP +.TP +2 +\f3partition\fP +.TP +3 +\f3submitted\fP +.TP +4 +The jobs start time; +this value is the number of non\-leap seconds since the Epoch (00:00:00 +UTC, January 1, 1970) +.TP +5 +\f3uid.gid\fP +.TP +6 +(Reserved) +.TP +7 +\f3JOB_STEP\fP (literal string) +.TP +8 +Job Record Version (1) +.TP +9 +The number of fields in the record (38) +.TP +10 +\f3jobid\fP +.TP +11 +\f3end\fP +.TP +12 +Completion Status; +the mnemonics, which may appear in uppercase or lowercase, are as follows: +.RS +.TP "10" +\f3CA\fP +Cancelled +.TP "10" +\f3CD\fP +Completed successfully +.TP +\f3F\fP +Failed +.TP +\f3NF\fP +Job terminated from node failure +.TP +\f3R\fP +Running +.TP +\f3S\fP +Suspended +.TP +\f3TO\fP +Timed out +.RE +.TP +13 +\f3exitcode\fP +.TP +14 +\f3ntasks\fP +.TP +15 +\f3ncpus\fP +.TP +16 +\f3elapsed\fP +time in seconds expressed as an integer +.TP +17 +Integer portion of the Total CPU time in seconds for all processes +.TP +18 +Fractional portion of the Total CPU time for all processes expressed in microseconds +.TP +19 +Integer portion of the Total User CPU time in seconds for all processes +.TP +20 +Fractional portion of the Total User CPU time for all processes +expressed in microseconds +.TP +21 +Integer portion of the Total System CPU time in seconds for all processes +.TP +22 +Fractional portion of the Total System CPU time for all processes +expressed in microseconds +.TP +23 +\f3rss\fP +.TP +24 +\f3ixrss\fP +.TP +25 +\f3idrss\fP +.TP +26 +\f3isrss\fP +.TP +27 +\f3minflt\fP +.TP +28 +\f3majflt\fP +.TP +29 +\f3nswap\fP +.TP +30 +\f3inblocks\fP +.TP +31 +\f3outblocks\fP +.TP +32 +\f3msgsnd\fP +.TP +33 +\f3msgrcv\fP +.TP +34 +\f3nsignals\fP +.TP +35 +\f3nvcsw\fP +.TP +36 +\f3nivcsw\fP +.TP +37 +\f3vsize\fP +.TP +.RE +.SS "Output for the JOB_TERMINATED Record Type" +The following describes the horizontal fields output by the +.BR "sacct " +\f3\-\-dump\fP +option for the +\f3JOB_TERMINATED\fP (literal string) +record type. +.RS +.TP "10" +Field # +Field +.TP +1 +\f3job\fP +.TP +2 +\f3partition\fP +.TP +3 +\f3submitted\fP +.TP +4 +The jobs start time; +this value is the number of non\-leap seconds since the Epoch (00:00:00 +UTC, January 1, 1970) +.TP +5 +\f3uid.gid\fP +.TP +6 +(Reserved) +.TP +7 +\f3JOB_TERMINATED\fP (literal string) +.TP +8 +Job Record Version (1) +.TP +9 +The number of fields in the record (38) +.IP +Although thirty\-eight fields are displayed by the +.BR "sacct " +command for the +\f3JOB_TERMINATED\fP +record, only fields 1 through 12 are recorded in the actual data file; +the +.BR "sacct " +command aggregates the remainder. +.TP +10 +The total elapsed time in seconds for the job. +.TP +11 +\f3end\fP +.TP +12 +Completion Status; +the mnemonics, which may appear in uppercase or lowercase, are as follows: +.RS +.TP "10" +\f3CA\fP +Cancelled +.TP +\f3CD\fP +Completed successfully +.TP +\f3F\fP +Failed +.TP +\f3NF\fP +Job terminated from node failure +.TP +\f3R\fP +Running +.TP +\f3TO\fP +Timed out +.RE +.TP +13 +\f3exitcode\fP +.TP +14 +\f3ntasks\fP +.TP +15 +\f3ncpus\fP +.TP +16 +\f3elapsed\fP +time in seconds expressed as an integer +.TP +17 +Integer portion of the Total CPU time in seconds for all processes +.TP +18 +Fractional portion of the Total CPU time for all processes expressed in microseconds +.TP +19 +Integer portion of the Total User CPU time in seconds for all processes +.TP +20 +Fractional portion of the Total User CPU time for all processes +expressed in microseconds +.TP +21 +Integer portion of the Total System CPU time in seconds for all processes +.TP +22 +Fractional portion of the Total System CPU time for all processes +expressed in microseconds +.TP +23 +\f3rss\fP +.TP +24 +\f3ixrss\fP +.TP +25 +\f3idrss\fP +.TP +26 +\f3isrss\fP +.TP +27 +\f3minflt\fP +.TP +28 +\f3majflt\fP +.TP +29 +\f3nswap\fP +.TP +30 +\f3inblocks\fP +.TP +31 +\f3outblocks\fP +.TP +32 +\f3msgsnd\fP +.TP +33 +\f3msgrcv\fP +.TP +34 +\f3nsignals\fP +.TP +35 +\f3nvcsw\fP +.TP +36 +\f3nivcsw\fP +.TP +37 +\f3vsize\fP +.TP +.RE +.SH "EXAMPLES" +This example illustrates the default invocation of the +.BR "sacct " +command: +.RS +.PP +.nf +.ft 3 +# sacct +Jobid Jobname Partition Ncpus Status Exitcode +\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\- +2 script01 srun 1 RUNNING 0 +3 script02 srun 1 RUNNING 0 +4 endscript srun 1 RUNNING 0 +4.0 srun 1 COMPLETED 0 + +.ft 1 +.fi +.RE +.PP +This example shows the same job accounting information with the +\f3brief\fP +option. +.RS +.PP +.nf +.ft 3 +# sacct \-\-brief +Jobid Status Exitcode +\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\- +2 RUNNING 0 +3 RUNNING 0 +4 RUNNING 0 +4.0 COMPLETED 0 +.ft 1 +.fi +.RE +.PP +.RS +.PP +.nf +.ft 3 +# sacct \-\-total +Jobid Jobname Partition Ncpus Status Exitcode +\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\- +3 sja_init andy 1 COMPLETED 0 +4 sjaload andy 2 COMPLETED 0 +5 sja_scr1 andy 1 COMPLETED 0 +6 sja_scr2 andy 18 COMPLETED 2 +7 sja_scr3 andy 18 COMPLETED 0 +8 sja_scr5 andy 2 COMPLETED 0 +9 sja_scr7 andy 90 COMPLETED 1 +10 endscript andy 186 COMPLETED 0 + +.ft 1 +.fi +.RE +.PP +This example demonstrates the ability to customize the output of the +.BR "sacct " +command. +The fields are displayed in the order designated on the command line. +.RS +.PP +.nf +.ft 3 +# sacct \-\-fields=jobid,ncpus,ntasks,nsignals,status +Jobid Ncpus Ntasks Nsignals Status +\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\- \-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\- +3 2 1 0 COMPLETED +3.0 2 1 0 COMPLETED +4 2 2 0 COMPLETED +4.0 2 2 0 COMPLETED +5 2 1 0 COMPLETED +5.0 2 1 0 COMPLETED + +.ft 1 +.fi +.RE +.SH "COPYING" + +Copyright (C) 2005 Copyright Hewlett\-Packard Development Company L.P. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. +.SH "FILES" +.TP "10" +\f3/etc/slurm.conf\fP +Entries to this file enable job accounting and +designate the job accounting log file that collects system job accounting. +.TP +\f3/var/log/slurm_accounting.log\fP +The default job accounting log file. +By default, this file is set to read and write permission for root only. +.SH "SEE ALSO" +ps(1), srun(1), squeue(1), getrusage(2), time(2) diff --git a/executable_names/doc/man/man1/salloc.1 b/executable_names/doc/man/man1/salloc.1 new file mode 100644 index 0000000000000000000000000000000000000000..838d0995929f386fe807a4dcebc029892002950b --- /dev/null +++ b/executable_names/doc/man/man1/salloc.1 @@ -0,0 +1,445 @@ +.TH "salloc" "1" "SLURM 1.2" "September 2006" "SLURM Commands" +.SH "NAME" +.LP +salloc \- Obtain a SLURM job allocation (a set of nodes), execute a command, and then release the allocation when the command is finished. +.SH "SYNOPSIS" +.LP +salloc [\fIoptions\fP] <\fIcommand\fP> [\fIcommand args\fR] +.SH "DESCRIPTION" +.LP +salloc is used to allocate a SLURM job allocation, which is a set of resources (nodes), possibly with some set of constraints (e.g. number of processors per node). When salloc successfully obtains the requested allocation, it then runs the command specified by the user. Finally, when the user specified command is complete, salloc relinquishes the job allocation. + +The command may be any program the user wishes. Some typical commands are xterm, a shell script containing slaunch commands, and slaunch (see the EXAMPLES section). +.SH "OPTIONS" +.LP + +.TP +\fB\-N\fR, \fB\-\-nodes\fR[=]<\fInumber|[min]\-[max]\fR> +Specify the number of nodes to be used by this job step. This option accepts +either a single number, or a range of possible node counts. If a single +number is used, such as "\-N 4", then the allocation is asking for four and +ONLY four nodes. If a range is specified, such as "\-N 2\-6", the SLURM +controller may grant salloc anywhere from 2 to 6 nodes. When using a range, +either of the min or max options may be omitted. For instance, "\-N 10\-" +means "no fewer than 10 nodes", and "\-N \-20" means "no more than 20 nodes". +The default value of this option is one node, but other options implicitly +increase the default node count. + +.TP +\fB\-n\fR, \fB\-\-tasks\fR[=]<\fInumber\fR> +salloc does not launch tasks, it requests an allocation of resources and submits +a batch script. However this \-\-tasks option advizes the SLURM controller +that job steps run within this allocation will launch a maximum of \fInumber\fR +tasks. This option, possibly with collaboration with the \-\-cpus\-per\-task +option, will directly impact the number of processors granted to the job +allocation. + +.TP +\fB\-d\fR, \fB\-\-dependency\fR[=]<\fIjobid\fR> +Defer the start of this job until the specified \fIjobid\fR has completed. +Many jobs can share the same dependency and these jobs may even belong to +different users. The value may be changed after job submission using the +scontrol command. + +.TP +\fB\-s\fR, \fB\-\-share\fR +The job allocation can share nodes with other running jobs. (The default +shared/exclusive behaviour depends on system configuration.) +This may result the allocation being granted sooner than if the \-\-shared +option was not set and allow higher system utilization, but application +performance will likely suffer due to competition for resources within a node. + +.TP +\fB\-\-exclusive\fR +The job allocation cannot share nodes with other running jobs. This is +the oposite of \-\-shared, whichever option is seen last on the command line +will win. (The default shared/exclusive behaviour depends on system +configuration.) + +.TP +\fB\-t\fR, \fB\-\-time\fR[=]<\fIminutes\fR> +Set a limit, in minites, on the total run time of the job allocation. +If the requested time limit exceeds the partition's time limit, the +job will be left in a PENDING state (possibly indefinitely). The default +time limit is the partition's time limit. When the time limit is reached, +the each task in each job step is sent SIGTERM followed by SIGKILL. The +interval between signals is specified by the SLURM configuration parameter +\fBKillWait\fR. A time limit of zero represents unlimited time. + +.TP +\fB\-I\fR,\fB\-\-immediate\fR +Grab the requested resources immediately, or abort if the resources are not +currently available. The \fIcommand\fR parameter will not be run if the resources +are not available. + +.TP +\fB\-J\fR, \fB\-\-job\-name\fR[=]<\fIjobname\fR> +Specify a name for the job allocation. The specified name will appear along with +the job id number when querying running jobs on the system. The default job +name is the name of the "command" specified on the command line. + +.TP +\fB\-W\fR, \fB\-\-wait\fR[=]<\fIseconds\fR> +If the resources needed to satisy a job allocation are not immediately +available, the job allocation is enqueued and is said to be PENDING. This +option tells salloc how long (in seconds) to wait for the allocation to be +granted before giving up. When the wait limit has been reached, salloc +will exit without running the \fIcommand\fR parameter. By default, salloc +will wait indefinitely. (The \-\-immediate option makes \-\-wait moot.) + +.TP +\fB\-p\fR, \fB\-\-partition\fR[=]<\fIpartition name\fR> +Request a specific partition for the resource allocation. If not specified, +the default behaviour is to allow the slurm controller to select the default +partition as designated by the system administrator. + +.TP +\fB\-\-contiguous\fR +Demand a contiguous range of nodes. The default is "yes". Specify +\-\-contiguous=no if a contiguous range of nodes is not required. + +.TP +\fB\-\-mail\-type\fR=\fItype\fR +Notify user by email when certain event types occur. +Valid \fItype\fR values are BEGIN, END, FAIL, ALL (any state change). +The user to be notified is indicated with \fB\-\-mail\-user\fR. + +.TP +\fB\-\-mail\-user\fR=\fIuser\fR +User to receive email notification of state changes as defined by +\fB\-\-mail\-type\fR. +The default value is the username of the submitting user. + +.TP +\fB\-\-uid\fR[=]<\fIuser\fR> +Attempt to submit and/or run a job as \fIuser\fR instead of the +invoking user id. The invoking user's credentials will be used +to check access permissions for the target partition. User root +may use this option to run jobs as a normal user in a RootOnly +partition for example. If run as root, \fBsalloc\fR will drop +its permissions to the uid specified after node allocation is +successful. \fIuser\fR may be the user name or numerical user ID. + +.TP +\fB\-\-gid\fR[=]<\fIgroup\fR> +If \fBsalloc\fR is run as root, and the \fB\-\-gid\fR option is used, +submit the job with \fIgroup\fR's group access permissions. \fIgroup\fR +may be the group name or the numerical group ID. + +.TP +\fB\-c\fR, \fB\-\-cpus\-per\-task\fR[=]<\fIncpus\fR> +Advise the SLURM controller that ensuing job steps will require \fIncpus\fR +number of processors per task. Without this option, the controller will +just try to allocate one processor per task. + +For instance, +consider an application that has 4 tasks, each requiring 3 processors. If our +cluster is comprised of quad\-processors nodes and we simply ask for +12 processors, the controller might give us only 3 nodes. However, by using +the \-\-cpus\-per\-task=3 options, the controller knows that each task requires +3 processors on the same node, and the controller will grant an allocation +of 4 nodes, one for each of the 4 tasks. + +.TP +\fB\-K\fR, \fB\-\-kill\-command\fR[=\fIsignal\fR] +salloc always runs a user\-specified command once the allocation is +granted. salloc will wait indefinitely for that command to exit. +If you specify the \-\-kill\-command option salloc will send a signal to +your command any time that the SLURM controller tells salloc that its job +allocation has been revoked. The job allocation can be revoked for a +couple of reasons: someone used \fBscancel\fR to revoke the allocation, +or the allocation reached its time limit. If you do not specify a signal +name or number, the default signal is SIGTERM. + +.TP +\fB\-\-bell\fR +Force salloc to ring the terminal bell when the job allocation is granted. +By default, salloc only rings the bell if the allocation is pending for more +than ten seconds. + +.TP +\fB\-\-no\-bell\fR +Silence salloc's use of the terminal bell. + +.TP +\fB\-\-mincpus\fR[=]<\fIn\fR> +Specify minimum number of cpus per node. + +.TP +\fB\-\-mem\fR[=]<\fIMB\fR> +Specify a minimum amount of real memory. + +.TP +\fB\-\-tmp\fR[=]<\fIMB\fR> +Specify a minimum amount of temporary disk space. + +.TP +\fB\-C\fR, \fB\-\-constraint\fR[=]<\fIlist\fR> +Specify a list of constraints. +The constraints are features that have been assigned to the nodes by +the slurm administrator. +The \fIlist\fR of constraints may include multiple features separated +by ampersand (AND) and/or vertical bar (OR) operators. +For example: \fB\-\-constraint="opteron&video"\fR or +\fB\-\-constraint="fast|faster"\fR. +If no nodes have the requested features, then the job will be rejected +by the slurm job manager. + +.TP +\fB\-w\fR, \fB\-\-nodelist\fR[=]<\fInode name list\fR> +Request a specific list of node names. The list may be specified as a +comma\-separated list of node names, or a range of node names +(e.g. mynode[1\-5,7,...]). Duplicate node names in the list will be ignored. +The order of the node names in the list is not important; the node names +will be sorted my SLURM. + +.TP +\fB\-F\fR, \fB\-\-nodefile\fR[=]<\fInode file\fR> +Much like \-\-nodelist, but the list is contained in a file of name +\fInode file\fR. The node names of the list may also span multiple lines +in the file. Duplicate node names in the file will be ignored. +The order of the node names in the list is not important; the node names +will be sorted my SLURM. + +.TP +\fB\-x\fR, \fB\-\-exclude\fR[=]<\fInode name list\fR> +Explicitly exclude certain nodes from the resources granted to the job. + +.TP +\fB\-D\fR, \fB\-\-workdir\fR[=]<\fIdirectory\fR> +Set the working directory of the batch script to \fIdirectory\fR before +it it executed. + +.TP +\fB\-k\fR, \fB\-\-no\-kill\fR +Do not automatically terminate a job of one of the nodes it has been +allocated fails. The user will assume the responsibilities for fault\-tolerance +should a node fail. When there is a node failure, any active job steps (usually +MPI jobs) on that node will almost certainly suffer a fatal error, but with +\-\-no\-kill, the job allocation will not be revoked so the user may launch +new job steps on the remaining nodes in their allocation. + +By default SLURM terminates the entire job allocation if any node fails in its +range of allocated nodes. + +.TP +\fB\-U\fR, \fB\-\-account\fR[=]<\fIaccount\fR> +Change resource use by this job to specified account. +The \fIaccount\fR is an arbitrary string. The account name may +be changed after job submission using the \fBscontrol\fR +command. + +.TP +\fB\-\-begin\fR[=]<\fItime\fR> +Submit the batch script to the SLURM controller immediately, like normal, but +tell the controller to defer the allocation of the job until the specified time. + +Time may be of the form \fIHH:MM:SS\fR to run a job at +a specific time of day (seconds are optional). +(If that time is already past, the next day is assumed.) +You may also specify \fImidnight\fR, \fInoon\fR, or +\fIteatime\fR (4pm) and you can have a time\-of\-day suffixed +with \fIAM\fR or \fIPM\fR for running in the morning or the evening. +You can also say what day the job will be run, by giving +a date in the form \fImonth\-name\fR day with an optional year, +or giving a date of the form \fIMMDDYY\fR or \fIMM/DD/YY\fR +or \fIDD.MM.YY\fR. You can also +give times like \fInow + count time\-units\fR, where the time\-units +can be \fIminutes\fR, \fIhours\fR, \fIdays\fR, or \fIweeks\fR +and you can tell SLURM to run the job today with the keyword +\fItoday\fR and to run the job tomorrow with the keyword +\fItomorrow\fR. +The value may be changed after job submission using the +\fBscontrol\fR command. + +.TP +\fB\-\-comment\fR +An arbitrary comment. + +.TP +\fB\-\-nice\fR[=]<\fIadjustment\fR> +Run the job with an adjusted scheduling priority. With no adjustment +value the scheduling priority is decreased by 100. The adjustment range +is from \-10000 (highest priority) to 10000 (lowest priority). Only +privileged users can specify a negative adjustment. NOTE: This option +is presently ignored if SchedulerType=sched/maui. + +.TP +\fB\-\-jobid\fR +Allocate resources as the specified job id. +NOTE: Only valid for user root. + +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Suppress informational messages from salloc. Errors will still be displayed. + +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Increase the verbosity of salloc's informational messages. Multiple \-v's +will further increase salloc's verbosity. + +.TP +\fB\-h\fR, \fB\-\-help\fR +Display help information and exit. + +.TP +\fB\-u\fR, \fB\-\-usage\fR +Display brief usage message and exit. + +.TP +\fB\-V\fR, \fB\-\-version\fR +Display version information and exit. + +.PP +The following options support Blue Gene systems, but may be +applicable to other systems as well. +.TP +\fB\-g\fR, \fB\-\-geometry\fR[=]<\fIXxYxZ\fR> +Specify the geometry requirements for the job. The three numbers +represent the required geometry giving dimensions in the X, Y and +Z directions. For example "\-\-geometry=2x3x4", specifies a block +of nodes having 2 x 3 x 4 = 24 nodes (actually base partions on +Blue Gene). + +.TP +\fB\-\-conn\-type\fR[=]<\fItype\fR> +Require the partition connection type to be of a certain type. +On Blue Gene the acceptable of \fItype\fR are MESH, TORUS and NAV. +If NAV, or if not set, then SLURM will try to fit a TORUS else MESH. +You should not normally set this option. +SLURM will normally allocate a TORUS if possible for a given geometry. + +.TP +\fB\-R\fR, \fB\-\-no\-rotate\fR +Disables rotation of the job's requested geometry in order to fit an +appropriate partition. +By default the specified geometry can rotate in three dimensions. + +Output version information and exit. + +.SH "INPUT ENVIRONMENT VARIABLES" +.PP +Upon startup, salloc will read and handle the options set in the following +environment variables. Note: Command line options always override environment +variables settings. + +.TP 22 +\fBSALLOC_ACCOUNT\fR +Same as \fB\-\-account\fR. +.TP +\fBSALLOC_BELL\fR +Same as \fB\-\-bell\fR. +.TP +\fBSALLOC_NO_BELL\fR +Same as \fB\-\-no\-bell\fR. +.TP +\fBSALLOC_CONN_TYPE\fR +Same as \fB\-\-conn\-type\fR. +.TP +\fBSALLOC_DEBUG\fR +Same as \fB\-v\fR or \fB\-\-verbose\fR. +.TP +\fBSALLOC_GEOMETRY\fR +Same as \fB\-g\fR or \fB\-\-geometry\fR. +.TP +\fBSALLOC_IMMEDIATE\fR +Same as \fB\-I\fR or \fB\-\-immediate\fR. +.TP +\fBSALLOC_JOBID\fR +Same as \fB\-\-jobid\fR. +.TP +\fBSALLOC_NO_ROTATE\fR +Same as \fB\-R\fR or \fB\-\-no\-rotate\fR. +.TP +\fBSALLOC_PARTITION\fR +Same as \fB\-p\fR or \fB\-\-partition\fR. +.TP +\fBSALLOC_TIMELIMIT\fR +Same as \fB\-t\fR or \fB\-\-time\fR. +.TP +\fBSALLOC_WAIT\fR +Same as \fB\-W\fR or \fB\-\-wait\fR. + +.SH "OUTPUT ENVIRONMENT VARIABLES" +.PP +salloc will set the following environment variables in the environment of +the executed program: + +.TP +\fBSLURM_JOB_ID\fR (and \fBSLURM_JOBID\fR for backwards compatibility) +The ID of the job allocation. +.TP +\fBSLURM_JOB_CPUS_PER_NODE\fR +Count of processors available to the job on this node. +Note the select/linear plugin allocates entire nodes to +jobs, so the value indicates the total count of CPUs on each node. +The select/cons_res plugin allocates individual processors +to jobs, so this number indicates the number of processors +on each node allocated to the job allocation. +.TP +\fBSLURM_JOB_NODELIST\fR (and \fBSLURM_NODELIST\fR for backwards compatibility) +List of nodes allocated to the job. +.TP +\fBSLURM_JOB_NUM_NODES\fR (and \fBSLURM_NNODES\fR for backwards compatibility) +Total number of nodes in the job allocation. +.TP +\fBSLURM_TASKS_PER_NODE\fR +Number of tasks to be initiated on each node. Values are +comma separated and in the same order as SLURM_NODELIST. +If two or more consecutive nodes are to have the same task +count, that count is followed by "(x#)" where "#" is the +repetition count. For example, "SLURM_TASKS_PER_NODE=2(x3),1" +indicates that the first three nodes will each execute three +tasks and the fourth node will execute one task. +.TP +\fBMPIRUN_PARTITION\fR +The block name on Blue Gene systems only. +.TP +\fBMPIRUN_NOALLOCATE\fR +Do not allocate a block on Blue Gene systems only. +.TP +\fBMPIRUN_NOFREE\fR +Do not free a block on Blue Gene systems only. + +.SH "SIGNALS" +.LP +While salloc is waiting for a PENDING job allocation, most signals will cause salloc to revoke the allocation request and exit. + +However, if the allocation has been granted and salloc has already started the command speficied in its command line parameters salloc will ignore most signals. salloc will not exit or release the allocation until the command exits. The noteable exception is SIGHUP; a HUP signal will cause salloc to release the allocation and exit without waiting for the command to finish. +.SH "EXAMPLES" +.LP +To get an allocation, and open a new xterm in which slaunch commands may be typed interactively: +.IP +$ salloc \-N16 xterm +.br +salloc: Granted job allocation 65537 +.br +(at this point the xterm appears, and salloc waits for xterm to exit) +.br +salloc: Relinquishing job allocation 65537 +.LP +To grab an allocation of nodes and launch a parallel application on one command line (See the \fBsalloc\fR man page for more examples): +.IP +salloc \-N5 slaunch \-n10 myprogram + +.SH "COPYING" +Copyright (C) 2006 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). +UCRL\-CODE\-217948. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. + +.SH "SEE ALSO" +.LP +sinfo(1), slaunch(1), sattach(1), sbatch(1), squeue(1), scancel(1), scontrol(1), slurm.conf(5), sched_setaffinity(2), numa(3) diff --git a/executable_names/doc/man/man1/sattach.1 b/executable_names/doc/man/man1/sattach.1 new file mode 100644 index 0000000000000000000000000000000000000000..b3a495aecb8dbd3fd6a47b47f28f93327ae91cc1 --- /dev/null +++ b/executable_names/doc/man/man1/sattach.1 @@ -0,0 +1,89 @@ +.TH "sattach" "1" "SLURM 1.2" "September 2006" "SLURM Commands" +.SH "NAME" +.LP +sattach \- Attach to a SLURM job step. +.SH "SYNOPSIS" +.LP +sattach [\fIoptions\fP] +.SH "DESCRIPTION" +.LP +sattach attaches to a running SLURM job step. By attaching, it makes available +the IO streams of all of the tasks of a running SLURM job step. It also +suitable for use with a parallel debugger like TotalView. + +.SH "OPTIONS" +.LP + +.TP +\fB\-\-input\-filter\fR[=]<\fItask number\fR> +.PD 0 +.TP +\fB\-\-output\-filter\fR[=]<\fItask number\fR> +.PD 0 +.TP +\fB\-\-error\-filter\fR[=]<\fItask number\fR> +.PD +Only transmit standard input to a single task, or print the standard output +or standard error from a single task. The filtering is performed locally in +sattach. + +.TP +\fB\-l\fR, \fB\-\-label\fR +Prepend each line of task standard output or standard error with the task +number of its origin. + +.TP +\fB\-\-layout\fR +Contacts the slurmctld to obtain the task layout information for the job step, +prints the task layout information, and then exits without attaching to the +job step. + +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Suppress informational messages from sattach. Errors will still be displayed. + +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Increase the verbosity of sattach's informational messages. Multiple \-v's +will further increase slaunch's verbosity. + +.TP +\fB\-h\fR, \fB\-\-help\fR +Display help information and exit. + +.TP +\fB\-u\fR, \fB\-\-usage\fR +Display brief usage message and exit. + +.TP +\fB\-V\fR, \fB\-\-version\fR +Display SLURM version number and exit. + + +.SH "EXAMPLES" +.LP +sattach 15.0 + +sattach \-\-output\-filter 5 65386.15 + +.SH "COPYING" +Copyright (C) 2006 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). +UCRL\-CODE\-217948. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. + +.SH "SEE ALSO" +.LP +sinfo(1), slaunch(1), salloc(1), sbatch(1), squeue(1), scancel(1), scontrol(1), slurm.conf(5), sched_setaffinity(2), numa(3) diff --git a/executable_names/doc/man/man1/sbatch.1 b/executable_names/doc/man/man1/sbatch.1 new file mode 100644 index 0000000000000000000000000000000000000000..00f7f6af7ea8c779de025e9b0a7c0bfe692a975a --- /dev/null +++ b/executable_names/doc/man/man1/sbatch.1 @@ -0,0 +1,488 @@ +.TH "sbatch" "1" "SLURM 1.2" "September 2006" "SLURM Commands" +.SH "NAME" +.LP +sbatch \- Submit a batch script to SLURM. +.SH "SYNOPSIS" +.LP +sbatch [\fIoptions\fP] [\fIscript\fP] +.SH "DESCRIPTION" +.LP +sbatch submits a batch script to SLURM. The batch script may be given to +sbatch through a file name on the command line, or if no file name is specified, +sbatch will read in a script from standard input. + +sbatch exits immediately after the script is successfully transferred to the +SLURM controller and assigned a SLURM job ID. The batch script is not +necessarily granted resources immediately, it may sit in the queue of pending +jobs for some time before its required resources become available. + +When the job allocation is finally granted for the batch script, SLURM +runs a single copy of the batch script on the first node in the set of +allocated nodes. +.SH "OPTIONS" +.LP + +.TP +\fB\-N\fR, \fB\-\-nodes\fR[=]<\fInumber|[min]\-[max]\fR> +Specify the number of nodes to be used by this job step. This option accepts +either a single number, or a range of possible node counts. If a single number +is used, such as "\-N 4", then the allocation is asking for four and ONLY four +nodes. If a range is specified, such as "\-N 2\-6", SLURM controller may +grant the batch job anywhere from 2 to 6 nodes. When using a range, either of +the min or max options may be omitted. For instance, "\-N 10\-" means +"no fewer than 10 nodes", and "\-N \-20" means "no more than 20 nodes". The +default value of this option is one node, but other command line options +may implicitly set the default node count to a higher value. + +.TP +\fB\-n\fR, \fB\-\-tasks\fR[=]<\fInumber\fR> +sbatch does not launch tasks, it requests an allocation of resources and submits +a batch script. However this \-\-tasks option advizes the SLURM controller +that job steps run within this allocation will launch a maximum of \fInumber\fR +tasks. This option, possibly with collaboration with the \-\-cpus\-per\-task +option, will directly impact the number of processors granted to the job +allocation. + +.TP +\fB\-d\fR, \fB\-\-dependency\fR[=]<\fIjobid\fR> +Defer the start of this job until the specified \fIjobid\fR has completed. +Many jobs can share the same dependency and these jobs may even belong to +different users. The value may be changed after job submission using the +scontrol command. + +.TP +\fB\-s\fR, \fB\-\-share\fR +The job allocation can share nodes with other running jobs. (The default +shared/exclusive behaviour depends on system configuration.) +This may result the allocation being granted sooner than if the \-\-shared +option was not set and allow higher system utilization, but application +performance will likely suffer due to competition for resources within a node. + +.TP +\fB\-\-exclusive\fR +The job allocation cannot share nodes with other running jobs. This is +the oposite of \-\-shared, whichever option is seen last on the command line +will win. (The default shared/exclusive behaviour depends on system +configuration.) + +.TP +\fB\-t\fR, \fB\-\-time\fR[=]<\fIminutes\fR> +Set a limit, in minites, on the total run time of the job allocation. +If the requested time limit exceeds the partition's time limit, the +job will be left in a PENDING state (possibly indefinitely). The default +time limit is the partition's time limit. When the time limit is reached, +the each task in each job step is sent SIGTERM followed by SIGKILL. The +interval between signals is specified by the SLURM configuration parameter +\fBKillWait\fR. A time limit of zero represents unlimited time. + +.TP +\fB\-I\fR,\fB\-\-immediate\fR +The batch script will only be submitted to the controller if the resources +necessary to grant its job allocation are immediately available. If the +job allocation will have to wait in a queue of pending jobs, the batch script +will not be submitted. + +.TP +\fB\-p\fR, \fB\-\-partition\fR[=]<\fIpartition name\fR> +Request a specific partition for the resource allocation. If not specified, the +default behaviour is to allow the slurm controller to select the default +partition as designated by the system administrator. + +.TP +\fB\-\-contiguous\fR +Demand a contiguous range of nodes. The default is "yes". Specify +\-\-contiguous=no if a contiguous range of nodes is not required. + +.TP +\fB\-\-mail\-type\fR=\fItype\fR +Notify user by email when certain event types occur. +Valid \fItype\fR values are BEGIN, END, FAIL, ALL (any state change). +The user to be notified is indicated with \fB\-\-mail\-user\fR. + +.TP +\fB\-\-mail\-user\fR=\fIuser\fR +User to receive email notification of state changes as defined by +\fB\-\-mail\-type\fR. +The default value is the username of the submitting user. + +.TP +\fB\-\-uid\fR[=]<\fIuser\fR> +Attempt to submit and/or run a job as \fIuser\fR instead of the +invoking user id. The invoking user's credentials will be used +to check access permissions for the target partition. User root +may use this option to run jobs as a normal user in a RootOnly +partition for example. If run as root, \fBsbatch\fR will drop +its permissions to the uid specified after node allocation is +successful. \fIuser\fR may be the user name or numerical user ID. + +.TP +\fB\-\-gid\fR[=]<\fIgroup\fR> +If \fBsbatch\fR is run as root, and the \fB\-\-gid\fR option is used, +submit the job with \fIgroup\fR's group access permissions. \fIgroup\fR +may be the group name or the numerical group ID. + +.TP +\fB\-J\fR, \fB\-\-job\-name\fR[=]<\fIjobname\fR> +Specify a name for the job allocation. The specified name will appear along with +the job id number when querying running jobs on the system. The default +is the name of the batch script, or just "sbatch" if the script is +read on sbatch's standard input. + +.TP +\fB\-c\fR, \fB\-\-cpus\-per\-task\fR[=]<\fIncpus\fR> +Advise the SLURM controller that ensuing job steps will require \fIncpus\fR +number of processors per task. Without this option, the controller will +just try to allocate one processor per task. + +For instance, +consider an application that has 4 tasks, each requiring 3 processors. If our +cluster is comprised of quad\-processors nodes and we simply ask for +12 processors, the controller might give us only 3 nodes. However, by using +the \-\-cpus\-per\-task=3 options, the controller knows that each task requires +3 processors on the same node, and the controller will grant an allocation +of 4 nodes, one for each of the 4 tasks. + +.TP +\fB\-\-mincpus\fR[=]<\fIn\fR> +Specify minimum number of cpus per node. + +.TP +\fB\-\-mem\fR[=]<\fIMB\fR> +Specify a minimum amount of real memory. + +.TP +\fB\-\-tmp\fR[=]<\fIMB\fR> +Specify a minimum amount of temporary disk space. + +.TP +\fB\-C\fR, \fB\-\-constraint\fR[=]<\fIlist\fR> +Specify a list of constraints. +The constraints are features that have been assigned to the nodes by +the slurm administrator. +The \fIlist\fR of constraints may include multiple features separated +by ampersand (AND) and/or vertical bar (OR) operators. +For example: \fB\-\-constraint="opteron&video"\fR or +\fB\-\-constraint="fast|faster"\fR. +If no nodes have the requested features, then the job will be rejected +by the slurm job manager. + +.TP +\fB\-w\fR, \fB\-\-nodelist\fR[=]<\fInode name list\fR> +Request a specific list of node names. The list may be specified as a +comma\-separated list of node names, or a range of node names +(e.g. mynode[1\-5,7,...]). Duplicate node names in the list will be ignored. +The order of the node names in the list is not important; the node names +will be sorted my SLURM. +.TP +\fB\-F\fR, \fB\-\-nodefile\fR[=]<\fInode file\fR> +Much like \-\-nodelist, but the list is contained in a file of name +\fInode file\fR. The node names of the list may also span multiple lines +in the file. Duplicate node names in the file will be ignored. +The order of the node names in the list is not important; the node names +will be sorted my SLURM. + +.TP +\fB\-x\fR, \fB\-\-exclude\fR[=]<\fInode name list\fR> +Explicitly exclude certain nodes from the resources granted to the job. + +.TP +\fB\-D\fR, \fB\-\-workdir\fR[=]<\fIdirectory\fR> +Set the working directory of the batch script to \fIdirectory\fR before +it it executed. + +.TP +\fB\-k\fR, \fB\-\-no\-kill\fR +Do not automatically terminate a job of one of the nodes it has been +allocated fails. The user will assume the responsibilities for fault\-tolerance +should a node fail. When there is a node failure, any active job steps (usually +MPI jobs) on that node will almost certainly suffer a fatal error, but with +\-\-no\-kill, the job allocation will not be revoked so the user may launch +new job steps on the remaining nodes in their allocation. + +By default SLURM terminates the entire job allocation if any node fails in its +range of allocated nodes. + +.TP +\fB\-I\fR, \fB\-\-input\fR[=]<\fIfilename pattern\fR> +.PD 0 +.TP +\fB\-O\fR, \fB\-\-output\fR[=]<\fIfilename pattern\fR> +.PD 0 +.TP +\fB\-E\fR, \fB\-\-error\fR[=]<\fIfilename pattern\fR> +.PD +Instruct SLURM to connect the batch script's standard input, standard output, +or standard error directly to the file name specified +in the "\fIfilename pattern\fR". + +By default, "/dev/null" is open on the batch script's standard input and both +standard output and standard error are directed to a file of the name +"slurm\-%j.out", where the "%j" is replaced with the job allocation number, as +described below. + +The filename pattern may contain one or more replacement symbols, which are +a percent sign "%" followed by a letter (e.g. %t). + +Supported replacement symbols are: +.PD 0 +.RS 10 +.TP +\fB%j\fR +Job allocation number. +.PD 0 +.TP +\fB%N\fR +Node name. (Will result in a separate file per node.) +.RS \-10 + +.TP +\fB\-U\fR, \fB\-\-account\fR[=]<\fIaccount\fR> +Change resource use by this job to specified account. +The \fIaccount\fR is an arbitrary string. The account name may +be changed after job submission using the \fBscontrol\fR +command. + +.TP +\fB\-\-begin\fR[=]<\fItime\fR> +Submit the batch script to the SLURM controller immediately, like normal, but +tell the controller to defer the allocation of the job until the specified time. + +Time may be of the form \fIHH:MM:SS\fR to run a job at +a specific time of day (seconds are optional). +(If that time is already past, the next day is assumed.) +You may also specify \fImidnight\fR, \fInoon\fR, or +\fIteatime\fR (4pm) and you can have a time\-of\-day suffixed +with \fIAM\fR or \fIPM\fR for running in the morning or the evening. +You can also say what day the job will be run, by giving +a date in the form \fImonth\-name\fR day with an optional year, +or giving a date of the form \fIMMDDYY\fR or \fIMM/DD/YY\fR +or \fIDD.MM.YY\fR. You can also +give times like \fInow + count time\-units\fR, where the time\-units +can be \fIminutes\fR, \fIhours\fR, \fIdays\fR, or \fIweeks\fR +and you can tell SLURM to run the job today with the keyword +\fItoday\fR and to run the job tomorrow with the keyword +\fItomorrow\fR. +The value may be changed after job submission using the +\fBscontrol\fR command. + +.TP +\fB\-\-comment\fR +An arbitrary comment. + +.TP +\fB\-\-nice\fR[=]<\fIadjustment\fR> +Run the job with an adjusted scheduling priority. With no adjustment +value the scheduling priority is decreased by 100. The adjustment range +is from \-10000 (highest priority) to 10000 (lowest priority). Only +privileged users can specify a negative adjustment. NOTE: This option +is presently ignored if SchedulerType=sched/maui. + +.TP +\fB\-\-no\-requeue\fR +Specifies that the batch job should not be requeued. +Setting this option will prevent system administrators from being able +to restart the job (for example, after a scheduled downtime). +When a job is requeued, the batch script is initiated from its beginning. + +.TP +\fB\-\-jobid\fR +Allocate resources as the specified job id. +NOTE: Only valid for user root. + +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Suppress informational messages from sbatch. Errors will still be displayed. + +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Increase the verbosity of sbatch's informational messages. Multiple \-v's +will further increase sbatch's verbosity. + +.TP +\fB\-h\fR, \fB\-\-help\fR +Display help information and exit. + +.TP +\fB\-u\fR, \fB\-\-usage\fR +Display brief usage message and exit. + +.TP +\fB\-V\fR, \fB\-\-version\fR +Display version information and exit. + +.PP +The following options support Blue Gene systems, but may be +applicable to other systems as well. +.TP +\fB\-g\fR, \fB\-\-geometry\fR[=]<\fIXxYxZ\fR> +Specify the geometry requirements for the job. The three numbers +represent the required geometry giving dimensions in the X, Y and +Z directions. For example "\-\-geometry=2x3x4", specifies a block +of nodes having 2 x 3 x 4 = 24 nodes (actually base partions on +Blue Gene). + +.TP +\fB\-\-conn\-type\fR[=]<\fItype\fR> +Require the partition connection type to be of a certain type. +On Blue Gene the acceptable of \fItype\fR are MESH, TORUS and NAV. +If NAV, or if not set, then SLURM will try to fit a TORUS else MESH. +You should not normally set this option. +SLURM will normally allocate a TORUS if possible for a given geometry. + +.TP +\fB\-R\fR, \fB\-\-no\-rotate\fR +Disables rotation of the job's requested geometry in order to fit an +appropriate partition. +By default the specified geometry can rotate in three dimensions. + + +.SH "INPUT ENVIRONMENT VARIABLES" +.PP +Upon startup, sbatch will read and handle the options set in the following +environment variables. Note that environment variables will override any +options set in a batch script, and command line options will override any +environment variables. + +.TP 22 +\fBSBATCH_ACCOUNT\fR +Same as \fB\-\-account\fR. +.TP +\fBSBATCH_CONN_TYPE\fR +Same as \fB\-\-conn\-type\fR. +.TP +\fBSBATCH_DEBUG\fR +Same as \fB\-v\fR or \fB\-\-verbose\fR. +.TP +\fBSBATCH_GEOMETRY\fR +Same as \fB\-g\fR or \fB\-\-geometry\fR. +.TP +\fBSBATCH_IMMEDIATE\fR +Same as \fB\-I\fR or \fB\-\-immediate\fR. +.TP +\fBSBATCH_JOBID\fR +Same as \fB\-\-jobid\fR. +.TP +\fBSBATCH_JOB_NAME\fR +Same as \fB\-J\fR or \fB\-\-job\-name\fR. +.TP +\fBSBATCH_NO_REQUEUE\fR +Same as \fB\-\-no\-requeue\fR. +.TP +\fBSBATCH_NO_ROTATE\fR +Same as \fB\-R\fR or \fB\-\-no\-rotate\fR. +.TP +\fBSBATCH_PARTITION\fR +Same as \fB\-p\fR or \fB\-\-partition\fR. +.TP +\fBSBATCH_TIMELIMIT\fR +Same as \fB\-t\fR or \fB\-\-time\fR. + +.SH "OUTPUT ENVIRONMENT VARIABLES" +.PP +The SLURM controller will set the following variables in the environment of +the batch script. + +.TP +\fBSLURM_JOB_ID\fR (and \fBSLURM_JOBID\fR for backwards compatibility) +The ID of the job allocation. +.TP +\fBSLURM_JOB_CPUS_PER_NODE\fR +Count of processors available to the job on this node. +Note the select/linear plugin allocates entire nodes to +jobs, so the value indicates the total count of CPUs on the node. +The select/cons_res plugin allocates individual processors +to jobs, so this number indicates the number of processors +on this node allocated to the job. +.TP +\fBSLURM_JOB_NODELIST\fR (and \fBSLURM_NODELIST\fR for backwards compatibility) +List of nodes allocated to the job. +.TP +\fBSLURM_JOB_NUM_NODES\fR (and \fBSLURM_NNODES\fR for backwards compatibility) +Total number of nodes in the job's resource allocation. +.TP +\fBSLURM_TASKS_PER_NODE\fR +Number of tasks to be initiated on each node. Values are +comma separated and in the same order as SLURM_NODELIST. +If two or more consecutive nodes are to have the same task +count, that count is followed by "(x#)" where "#" is the +repetition count. For example, "SLURM_TASKS_PER_NODE=2(x3),1" +indicates that the first three nodes will each execute three +tasks and the fourth node will execute one task. +.TP +\fBMPIRUN_PARTITION\fR +The block name on Blue Gene systems only. +.TP +\fBMPIRUN_NOALLOCATE\fR +Do not allocate a block on Blue Gene systems only. +.TP +\fBMPIRUN_NOFREE\fR +Do not free a block on Blue Gene systems only. + +.SH "EXAMPLES" +.LP +Specify a batch script by filename on the command line: +.IP +$ cat myscript +.br +#!/bin/sh +.br +slaunch hostname |sort +.br +$ sbatch \-N4 myscript +.br +salloc: Granted job allocation 65537 +.br +$ cat slurm\-65537.out +.br +host1 +.br +host2 +.br +host3 +.br +host4 + +.LP +Pass a batch script to sbatch on standard input: +.IP +morrone:~$ sbatch \-N4 < #!/bin/sh +.br +> slaunch hostname |sort +.br +> EOF +.br +sbatch: Submitted batch job 65541 +.br +$ cat slurm\-65541.out +.br +host1 +.br +host2 +.br +host3 +.br +host4 + +.SH "COPYING" +Copyright (C) 2006 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). +UCRL\-CODE\-217948. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. + +.SH "SEE ALSO" +.LP +sinfo(1), slaunch(1), sattach(1), salloc(1), squeue(1), scancel(1), scontrol(1), slurm.conf(5), sched_setaffinity(2), numa(3) diff --git a/executable_names/doc/man/man1/sbcast.1 b/executable_names/doc/man/man1/sbcast.1 new file mode 100644 index 0000000000000000000000000000000000000000..55926f0c9b0b7f21c83da556ff25648da5169602 --- /dev/null +++ b/executable_names/doc/man/man1/sbcast.1 @@ -0,0 +1,108 @@ +.TH SBCAST "1" "April 2006" "sbcast 1.1" "Slurm components" + +.SH "NAME" +sbcast \- transmit a file to the nodes allocated to a SLURM job. + +.SH "SYNOPSIS" +\fBsbcast\fR [\-CfpsvV] SOURCE DEST + +.SH "DESCRIPTION" +\fBsbcast\fR is used to transmit a file to all nodes allocated +to the currenly active SLURM job. +This command should only be executed from within a SLURM batch +job or within the shell spawned after a SLURM job\'s resource +allocation. +\fBSOURCE\fR is the name of a file on the current node. +\fBDEST\fR should be the fully qualified pathname for the +file copy to be created on each node. +\fBDEST\fR should be on a file system local to that node. +Note that parallel file systems may provide better performance +than \fBsbcast\fR can provide. + +.SH "OPTIONS" +.TP +\fB\-C\fR, \fB\-\-compress\fR +Compress the file being transmitted. +.TP +\fB\-f\fR, \fB\-\-force\fR +If the destination file already exists, replace it. +.TP +\fB\-F\fR \fInumber\fR, \fB\-\-fanout\fR=\fInumber\fR +Specify the fanout of messages used for file transfer. +Maximum value is currently eight. +.TP +\fB\-p\fR, \fB\-\-preserve\fR +Preserves modification times, access times, and modes from the +original file. +.TP +\fB\-s\fR \fIsize\fR, \fB\-\-size\fR=\fIsize\fR +Specify the block size used for file broadcast. +The size can have a suffix of \fIk\fR or \fIm\fR for kilobytes +or megabytes respecitively (defaults to bytes). +This size subject to rounding and range limits to maintain +good performance. This value may need to be set on systems +with very limited memory. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Provide detailed event logging through program execution. +.TP +\fB\-V\fR, \fB\-\-version\fR +Print version information and exit. + +.SH "ENVIRONMENT VARIABLES" +.PP +Some \fBsbcast\fR options may be set via environment variables. +These environment variables, along with their corresponding options, +are listed below. (Note: Command line options will always override +these settings.) +.TP 20 +\fBSBCAST_COMPRESS\fR +\fB\-C, \-\-compress\fR +.TP +\fBSBCAST_FANOUT\fR +\fB\-F\fB \fInumber\fR, fB\-\-fanout\fR=\fInumber\fR +.TP +\fBSBCAST_FORCE\fR +\fB\-f, \-\-force\fR +.TP +\fBSBCAST_PRESERVE\fR +\fB\-p, \-\-preserve\fR +.TP +\fBSBCAST_SIZE\fR +\fB\-s\fR \fIsize\fR, \fB\-\-size\fR=\fIsize\fR + +.SH "EXAMPLE" + +Using a batch script, transmit local file \fBmy.prog\fR to +\fB/tmp/my.proc\fR on the local nodes and then execute it. + +.nf +> cat my.job +#!/bin/bash +sbcast my.prog /tmp/my.prog +srun /tmp/my.prog + +> srun \-\-nodes=8 \-\-batch my.job +srun: jobid 12345 submitted +.fi + +.SH "COPYING" +Copyright (C) 2006 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). +UCRL\-CODE\-217948. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. + +.SH "SEE ALSO" +\fBsrun\fR(1) diff --git a/executable_names/doc/man/man1/scancel.1 b/executable_names/doc/man/man1/scancel.1 new file mode 100644 index 0000000000000000000000000000000000000000..046b3fc4dbd9592055e42a0664e5a021a2719f9d --- /dev/null +++ b/executable_names/doc/man/man1/scancel.1 @@ -0,0 +1,133 @@ +.TH SCANCEL "1" "December 2005" "scancel 1.0" "Slurm components" +.SH "NAME" +scancel \- Used to signal jobs or job steps that are under the control of Slurm. +.SH "SYNOPSIS" +\fBscancel\fR [\fIOPTIONS\fR...] [\fIjob_id\fR[.\fIstep_id\fR]] [\fIjob_id\fR[.\fIstep_id\fR]...] +.SH "DESCRIPTION" +\fBscancel\fR is used to signal or cancel jobs or job steps. An arbitrary number +of jobs or job steps may be signaled using job specification filters or a +space separated list of specific job and/or job step IDs. A job or job step +can only be signaled by the owner of that job or user root. If an attempt is +made by an unauthorized user to signal a job or job step, an error message will +be printed and the job will not be signaled. +.TP +OPTIONS +.TP +\fB\-\-help\fR +Print a help message describing all \fBscancel\fR options. +.TP +\fB\-\-usage\fR +Print a brief help message listing the \fBscancel\fR options. +.TP +\fB\-b\fR, \fB\-\-batch\fR +Signal only the batch job shell. +.TP +\fB\-i\fR, \fB\-\-interactive\fR +Interactive mode. Confirm each job_id.step_id before performing the cancel operation. +.TP +\fB\-n\fR, \fB\-\-name\fR=\fIjob_name\fR +The name of jobs to be signaled. +.TP +\fB\-p\fR, \fB\-\-partition\fR=\fIpartition_name\fR +The name of the partition from which jobs are to be signaled. +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Do not report an error if the specified job is already completed. +This option is incompatible with the \fB\-\-verbose\fR option. +.TP +\fB\-s\fR, \fB\-\-signal\fR=\fIsignal_name\fR +The name or number of the signal to be send. Default value is "KILL". +.TP +\fB\-t\fR, \fB\-\-state\fR=\fIjob_state_name\fR +The state of the jobs are to be signaled. \fIjob_state_name\fR may have a value of +either "PENDING", "RUNNING" or "SUSPENDED". +.TP +\fB\-u\fR, \fB\-\-user\fR=\fIuser_name\fR +The name of the user whose jobs are to be signaled. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Print additional logging. Multiple v's increase logging detail. +This option is incompatible with the \fB\-\-quiet\fR option. +.TP +\fB\-V\fR, \fB\-\-Version\fR +Print the version number of the scontrol command. +.TP +ARGUMENTS +.TP +\fIjob_id\fP +The Slurm job ID of the job to have one or more of its steps signaled. +.TP +\fIstep_id\fP +The step ID of the job step to be signaled. If none is provided and the +\fB\-\-batch\fR option is not used, then all jobs steps associated with +the provided job_id will be signaled. +.SH "ENVIRONMENT VARIABLES" +.PP +Some \fBscancel\fR options may be set via environment variables. These +environment variables, along with their corresponding options, are listed below. +(Note: commandline options will always override these settings) +.TP 20 +\fBSCANCEL_BATCH\fR +\fB\-b, \-\-batch\fR +.TP 20 +\fBSCANCEL_INTERACTIVE\fR +\fB\-i\fR, \fB\-\-interactive\fR +.TP 20 +\fBSCANCEL_NAME\fR +\fB\-n\fR, \fB\-\-name\fR=\fIjob_name\fR +.TP 20 +\fBSCANCEL_PARTITION\fR +\fB\-p\fR, \fB\-\-partition\fR=\fIpartition_name\fR +.TP 20 +\fBSCANCEL_STATE\fR +\fB\-t\fR, \fB\-\-state\fR=\fIjob_state_name\fR +.TP 20 +\fBSCANCEL_USER\fR +\fB\-u\fR, \fB\-\-user\fR=\fIuser_name\fR +.TP 20 +\fBSCANCEL_VERBOSE\fR +\fB\-v\fR, \fB\-\-verbose\fR +.TP 20 +\fBSLURM_CONF\fR +The location of the SLURM configuration file. + +.SH "NOTES" +.LP +If multiple filters are supplied (e.g. \fB\-\-partition\fR and \fB\-\-name\fR) only the +jobs satisfying all of the filtering options will be signaled. +.LP +If a signal value of "KILL" (the default value) is to be sent to an entire job, this will +result in the job's termination and its resource allocation being released. +.LP +Cancelling a job step will not result in a job being terminated. +The job must be cancelled to release a resource allocation. +.SH "EXAMPLES" +.TP +Send SIGTERM to steps 1 and 3 of job 1234: +scancel \-\-signal=TERM 1234.1 1234.3 +.TP +Cancel job 1234 along with all of its steps: +scancel 1234 +.TP +Cancel job all pending jobs belonging to user "bob" in partition "debug": +scancel \-\-state=PENDING \-\-user=bob \-\-partition=debug +.SH "COPYING" +Copyright (C) 2002 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). +UCRL\-CODE\-217948. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. + +.SH "SEE ALSO" +\fBslurm_kill_job\fR(3), \fBslurm_kill_job_step\fR(3) diff --git a/executable_names/doc/man/man1/scontrol.1 b/executable_names/doc/man/man1/scontrol.1 new file mode 100644 index 0000000000000000000000000000000000000000..129ad7c066654426252d980e1dc7b6bfbf482b7d --- /dev/null +++ b/executable_names/doc/man/man1/scontrol.1 @@ -0,0 +1,471 @@ +.TH SCONTROL "1" "October 2006" "scontrol 1.2" "Slurm components" + +.SH "NAME" +scontrol \- Used view and modify Slurm configuration and state. + +.SH "SYNOPSIS" +\fBscontrol\fR [\fIOPTIONS\fR...] [\fICOMMAND\fR...] +.SH "DESCRIPTION" +\fBscontrol\fR is used to view or modify Slurm configuration including: job, +job step, node, partition, and overall system configuration. Most of the +commands can only be executed by user root. If an attempt to view or modify +configuration information is made by an unauthorized user, an error message +will be printed and the requested action will not occur. If no command is +entered on the execute line, \fBscontrol\fR will operate in an interactive +mode and prompt for input. It will continue prompting for input and executing +commands until explicitly terminated. If a command is entered on the execute +line, \fBscontrol\fR will execute that command and terminate. All commands +and options are case\-insensitive, although node names and partition names +are case\-sensitive (node names "LX" and "lx" are distinct). Commands can +be abbreviated to the extent that the specification is unique. + +.TP +\fBOPTIONS\fR +.TP +\fB\-a\fR, \fB\-\-all\fR +When the \fIshow\fR command is used, then display all partitions, their jobs +and jobs steps. This causes information to be displayed about partitions +that are configured as hidden and partitions that are unavailable to user's +group. +.TP +\fB\-h\fR, \fB\-\-help\fR +Print a help message describing the usage of scontrol. +.TP +\fB\-\-hide\fR +Do not display information about hidden partitions, their jobs and job steps. +By default, neither partitions that are configured as hidden nor those partitions +unavailable to user's group will be displayed (i.e. this is the default behavior). +.TP +\fB\-o\fR, \fB\-\-oneliner\fR +Print information one line per record. +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Print no warning or informational messages, only fatal error messages. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Print detailed event logging. This includes time\-stamps on data structures, +record counts, etc. +.TP +\fB\-V\fR , \fB\-\-version\fR +Print version information and exit. +.TP +\fBCOMMANDS\fR +.TP +\fIall\fP +Show all partitiion, their jobs and jobs steps. This causes information to be +displayed about partitions that are configured as hidden and partitions that +are unavailable to user's group. +.TP +\fIabort\fP +Instruct the Slurm controller to terminate immediately and generate a core file. +.TP +\fIcheckpoint\fP \fICKPT_OP\fP \fIID\fP +Perform a checkpoint activity on the job step(s) with the specified identification. +\fICKPT_OP\fP may be +\fIdisable\fP (disable future checkpoints), +\fIenable\fP (enable future checkpoints),, +\fIable\fP (test if presently not disabled, report start time if checkpoint in progress), +\fIcreate\fP (create a checkpoint and continue the job step), +\fIvacate\fP (create a checkpoint and terminate the job step), +\fIerror\fP (report the result for the last checkpoint request, error code and message), or +\fIrestart\fP (restart execution of the previously checkpointed job steps). +\fIID\fP can be used to identify a specific job (e.g. "", +which applies to all of its existing steps) +or a specific job step (e.g. "."). +.TP +\fIcompleting\fP +Display all jobs in a COMPLETING state along with associated nodes in either a +COMPLETING or DOWN state. +.TP +\fIdelete\fP \fISPECIFICATION\fP +Delete the entry with the specified \fISPECIFICATION\fP. +The only supported \fISPECIFICATION\fP presently is of the form +\fIPartitionName=\fP. +.TP +\fIexit\fP +Terminate the execution of scontrol. +.TP +\fIhelp\fP +Display a description of scontrol options and commands. +.TP +\fIhide\fP +Do not display partitiion, job or jobs step information for partitions that are +configured as hidden or partitions that are unavailable to the user's group. +This is the default behavior. +.TP +\fIoneliner\fP +Print information one line per record. +.TP +\fIpidinfo\fP \fIPROC_ID\fP +Print the Slurm job id and scheduled termination time corresponding to the +supplied process id, \fIPROC_ID\fP, on the current node. This will only +work for processes which Slurm spawns and their descendants. +.TP +\fIping\fP +Ping the primary and secondary slurmctld daemon and report if +they are responding. +.TP +\fIquiet\fP +Print no warning or informational messages, only fatal error messages. +.TP +\fIquit\fP +Terminate the execution of scontrol. +.TP +\fIreconfigure\fP +Instruct all Slurm daemons to re\-read the configuration file. +This command does not restart the daemons. +This mechanism would be used to modify configuration parameters (Epilog, +Prolog, SlurmctldLogFile, SlurmdLogFile, etc.) register the physical +addition or removal of nodes from the cluster or recognize the change +of a node's configuration, such as the addition of memory or processors. +The Slurm controller (slurmctld) forwards the request all other daemons +(slurmd daemon on each compute node). Running jobs continue execution. +Most configuration parameters can be changed by just running this command, +however, SLURM daemons should be shutdown and restarted if any of these +parameters are to be changed: AuthType, BackupAddr, BackupController, +ControlAddr, ControlMach, PluginDir, StateSaveLocation, SlurmctldPort +or SlurmdPort. +.TP +\fIresume\fP \fIjob_id\fP +Resume a previously suspended job. +.TP +\fIrequeue\fP \fIjob_id\fP +Requeue a running or pending SLURM batch job. +.TP +\fIshow\fP \fIENTITY\fP \fIID\fP +Display the state of the specified entity with the specified identification. +\fIENTITY\fP may be \fIconfig\fP, \fIdaemons\fP, \fIjob\fP, \fInode\fP, +\fIpartition\fP or \fIstep\fP. +\fIID\fP can be used to identify a specific element of the identified +entity: the configuration parameter name, job ID, node name, partition name, +or job step ID for entities \fIconfig\fP, \fIjob\fP, \fInode\fP, \fIpartition\fP, +and \fIstep\fP respectively. +Multiple node names may be specified using simple node range expressions +(e.g. "lx[10\-20]"). All other \fIID\fP values must identify a single +element. The job step ID is of the form "job_id.step_id", (e.g. "1234.1"). +By default, all elements of the entity type specified are printed. +.TP +\fIshutdown\fP +Instruct all Slurm daemons to save current state and terminate. +The Slurm controller (slurmctld) forwards the request all other daemons +(slurmd daemon on each compute node). +.TP +\fIsuspend\fP \fIjob_id\fP +Suspend a running job. +Use the \fIresume\fP command to resume its execution. +User processes must stop on receipt of SIGSTOP signal and resume +upon receipt of SIGCONT for this operation to be effective. +Not all architectures and configurations support job suspension. +.TP +\fIupdate\fP \fISPECIFICATION\fP +Update job, node or partition configuration per the supplied specification. +\fISPECIFICATION\fP is in the same format as the Slurm configuration file +and the output of the \fIshow\fP command described above. It may be desirable +to execute the \fIshow\fP command (described above) on the specific entity +you which to update, then use cut\-and\-paste tools to enter updated configuration +values to the \fIupdate\fP. Note that while most configuration values can be +changed using this command, not all can be changed using this mechanism. In +particular, the hardware configuration of a node or the physical addition or +removal of nodes from the cluster may only be accomplished through editing +the Slurm configuration file and executing the \fIreconfigure\fP command +(described above). +.TP +\fIverbose\fP +Print detailed event logging. This includes time\-stamps on data structures, +record counts, etc. +.TP +\fIversion\fP +Display the version number of scontrol being executed. +.TP +\fI!!\fP +Repeat the last command executed. +.TP +\fBSPECIFICATIONS FOR SHOW AND UPDATE COMMANDS, JOBS\fR +.TP +\fIAccount\fP= +Account name to be changed for this job's resource use. +Value may be cleared with blank data value, "Account=". +.TP +\fIContiguous\fP= +Set the job's requirement for contiguous (consecutive) nodes to be allocated. +Possible values are"YES" and "NO". +.TP +\fIDependency\fP= +Defer job's initiation until specified job_id completes. +Cancel dependency with job_id value of "0", "Depedency=0". +.TP +\fIExitCode\fP=: +Exit status reported for the job by the wait() function. +The first number is the exit code, typically as set by the exit() function. +The second number of the signal that caused the process to terminate if +it was terminated by a signal. +.TP +\fIFeatures\fP= +Set the job's required features on nodes specified value. Multiple values +may be comma separated if all features are required (AND operation) or +separated by "|" if any of the specified features are required (OR operation). +Value may be cleared with blank data value, "Features=". +.TP +\fIJobId\fP= +Identify the job to be updated. This specification is required. +.TP +\fIMinMemory\fP= +Set the job's minimum real memory required per nodes to the specified value. +.TP +\fIMinProcs\fP= +Set the job's minimum number of processors per nodes to the specified value. +.TP +\fIMinSockets\fP= +Set the job's minimum number of sockets per node to the specified value. +.TP +\fIMinCores\fP= +Set the job's minimum number of cores per socket to the specified value. +.TP +\fIMinThreads\fP= +Set the job's minimum number of threads per core to the specified value. +.TP +\fIMinTmpDisk\fP= +Set the job's minimum temporary disk space required per nodes to the specified value. +.TP +\fIName\fP= +Set the job's name to the specified value. +.TP +\fIPartition\fP= +Set the job's partition to the specified value. +.TP +\fIPriority\fP= +Set the job's priority to the specified value. +Note that a job priority of zero prevents the job from ever being scheduled. +By setting a job's priority to zero it is held. +Set the priority to a non\-zero value to permit it to run. +.TP +\fINice\fP[=delta] +Adjust job's priority by the specified value. Default value is 100. +.TP +\fIReqProcs\fP= +Set the job's count of required processes to the specified value. +.TP +\fIReqNodeList\fP= +Set the job's list of required node. Multiple node names may be specified using +simple node range expressions (e.g. "lx[10\-20]"). +Value may be cleared with blank data value, "ReqNodeList=". +.TP +\fIReqNodes\fP= +Set the job's count of required nodes to the specified value. +.TP +\fIReqSockets\fP= +Set the job's count of required sockets to the specified value. +.TP +\fIReqCores\fP= +Set the job's count of required cores to the specified value. +.TP +\fIReqThreads\fP= +Set the job's count of required threads to the specified value. +.TP +\fIShared\fP= +Set the job's ability to share nodes with other jobs. Possible values are +"YES" and "NO". +.TP +\fIStartTime\fP= +Set the job's earliest initiation time. +It accepts times of the form \fIHH:MM:SS\fR to run a job at +a specific time of day (seconds are optional). +(If that time is already past, the next day is assumed.) +You may also specify \fImidnight\fR, \fInoon\fR, or +\fIteatime\fR (4pm) and you can have a time\-of\-day suffixed +with \fIAM\fR or \fIPM\fR for running in the morning or the evening. +You can also say what day the job will be run, by giving +a date in the form \fImonth\-name\fR day with an optional year, +or giving a date of the form \fIMMDDYY\fR or \fIMM/DD/YY\fR +or \fIDD.MM.YY\fR. You can also +give times like \fInow + count time\-units\fR, where the time\-units +can be \fIminutes\fR, \fIhours\fR, \fIdays\fR, or \fIweeks\fR +and you can tell SLURM to run the job today with the keyword +\fItoday\fR and to run the job tomorrow with the keyword +\fItomorrow\fR. +.TP +\fITimeLimit\fP= +Set the job's time limit to the specified value. +.TP +\fIConnection\fP= +Reset the node connection type. +Possible values on Blue Gene are "MESH", "TORUS" and "NAV" +(mesh else torus). +.TP +\fIGeometry\fP= +Reset the required job geometry. +On Blue Gene the value should be three digits separated by +"x" or ",". The digits represent the allocation size in +X, Y and Z dimentions (e.g. "2x3x4"). +.TP +\fIRotate\fP= +Permit the job's geometry to be rotated. +Possible values are "YES" and "NO". + +.TP +\fBSPECIFICATIONS FOR UPDATE COMMAND, NODES\fR +.TP +\fINodeName\fP= +Identify the node(s) to be updated. Multiple node names may be specified using +simple node range expressions (e.g. "lx[10\-20]"). This specification is required. +.TP +\fIReason\fP= +Identify the reason the node is in a "DOWN" or "DRAINED" or "DRAINING" state. +Use quotes to enclose a reason having more than one word. +.TP +\fIState\fP= +Identify the state to be assigned to the node. Possible values are "NoResp", +"DRAIN" "RESUME", "DOWN", "IDLE", "ALLOC", and "ALLOCATED". +"RESUME is not an actual node state, but will return a DRAINED, DRAINING, +or DOWN node to service, either IDLE or ALLOCATED state as appropriate. +Setting a node "DOWN" will cause all running and suspended jobs on that +node to be terminated. +If you want to remove a node from service, you typically want to set +it's state to "DRAIN". +The "NoResp" state will only set the "NoResp" flag for a node without +changing its underlying state. +.TP +\fBSPECIFICATIONS FOR UPDATE AND DELETE COMMANDS, PARTITIONS\fR +.TP +\fIAllowGroups\fP= +Identify the user groups which may use this partition. +Multiple groups may be specified in a comma separated list. +To permit all groups to use the partition specify "AllowGroups=ALL". +.TP +\fIDefault\fP= +Specify if this partition is to be used by jobs which do not explicitly +identify a partition to use. Possible values are"YES" and "NO". +.TP +\fIHidden\fP= +Specify if the partition and its jobs should be hidden from view. +Hidden partitions will by default not be reported by SLURM APIs +or commands. +Possible values are"YES" and "NO". +.TP +\fINodes\fP= +Identify the node(s) to be associated with this partition. Multiple node names +may be specified using simple node range expressions (e.g. "lx[10\-20]"). +Note that jobs may only be associated with one partition at any time. +Specify a blank data value to remove all nodes from a partition: "Nodes=". +.TP +\fIPartitionName\fP= +Identify the partition to be updated. This specification is required. +.TP +\fIRootOnly\fP= +Specify if only allocation requests initiated by user root will be satisfied. +This can be used to restrict control of the partition to some meta\-scheduler. +Possible values are"YES" and "NO". +.TP +\fIShared\fP= +Specify if nodes in this partition can be shared by multiple jobs. +Possible values are"YES", "NO" and "FORCE". +.TP +\fIState\fP= +Specify if jobs can be allocated nodes in this partition. +Possible values are"UP" and "DOWN". +If a partition allocated nodes to running jobs, those jobs will continue +execution even after the partition's state is set to "DOWN". The jobs +must be explicitly canceled to force their termination. +.TP +\fIMaxNodes\fP= +Set the maximum number of nodes which will be allocated to any single job +in the partition. Specify a number or "INFINITE". +.TP +\fIMinNodes\fP= +Set the minimum number of nodes which will be allocated to any single job +in the partition. +.TP +\fBSPECIFICATIONS FOR UPDATE, BLOCK \fR +.TP +Bluegene systems only! +.TP +\fIBlockName\fP= +Identify the bluegene block to be updated. This specification is required. +.TP +\fIState\fP= +This will update the state of a bluegene block to either FREE or ERROR. +(i.e. update BlockName=RMP0 STATE=ERROR) State error will not allow jobs +to run on the block. \fBWARNING!!!!\fR This will cancel any +running job on the block! +.TP +.SH "ENVIRONMENT VARIABLES" +.PP +Some \fBscontrol\fR options may +be set via environment variables. These environment variables, +along with their corresponding options, are listed below. (Note: +Commandline options will always override these settings.) +.TP 20 +\fBSCONTROL_ALL\fR +\fB\-a, \-\-all\fR +.TP +\fBSLURM_CONF\fR +The location of the SLURM configuration file. + +.SH "EXAMPLE" +.eo +.br +# scontrol +.br +scontrol: show part class +.br +PartitionName=class TotalNodes=10 TotalCPUs=20 RootOnly=NO +.br + Default=NO Shared=NO State=UP MaxTime=30 Hidden=NO +.br + MinNodes=1 MaxNodes=2 AllowGroups=students +.br + Nodes=lx[0031\-0040] NodeIndices=31,40,\-1 +.br +scontrol: update PartitionName=class MaxTime=99 MaxNodes=4 +.br +scontrol: show job 65539 +.br +JobId=65539 UserId=1500 JobState=PENDING TimeLimit=100 +.br + Priority=100 Partition=batch Name=job01 NodeList=(null) +.br + StartTime=0 EndTime=0 Shared=0 ReqProcs=1000 +.br + ReqNodes=400 Contiguous=1 MinProcs=4 MinMemory=1024 +.br + MinTmpDisk=2034ReqNodeList=lx[3000\-3003] +.br + Features=(null) JobScript=/bin/hostname +.br +scontrol: update JobId=65539 TimeLimit=200 Priority=500 +.br +scontrol: quit +.ec + +.SH "COPYING" +Copyright (C) 2002 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). +UCRL\-CODE\-217948. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. +.SH "FILES" +.LP +/etc/slurm.conf +.SH "SEE ALSO" +\fBscancel\fR(1), \fBsinfo\fR(1), \fBsqueue\fR(1), +\fBslurm_checkpoint\fR(3), +\fBslurm_delete_partition\fR(3), +\fBslurm_load_ctl_conf\fR(3), +\fBslurm_load_jobs\fR(3), \fBslurm_load_node\fR(3), +\fBslurm_load_partitions\fR(3), +\fBslurm_reconfigure\fR(3), \fBslurm_requeue\fR(3), \fBslurm_resume\fR(3), +\fBslurm_shutdown\fR(3), \fBslurm_suspend\fR(3), +\fBslurm_update_job\fR(3), \fBslurm_update_node\fR(3), +\fBslurm_update_partition\fR(3), +\fBslurm.conf\fR(5) diff --git a/executable_names/doc/man/man1/sinfo.1 b/executable_names/doc/man/man1/sinfo.1 new file mode 100644 index 0000000000000000000000000000000000000000..9e2964572803a49e1b7e8bb4ab85daef6fb4e134 --- /dev/null +++ b/executable_names/doc/man/man1/sinfo.1 @@ -0,0 +1,481 @@ +.TH SINFO "1" "October 2006" "sinfo 1.2" "Slurm components" + +.SH "NAME" +sinfo \- view information about SLURM nodes and partitions. + +.SH "SYNOPSIS" +\fBsinfo\fR [\fIOPTIONS\fR...] +.SH "DESCRIPTION" +\fBsinfo\fR is used to view partition and node information for a +system running SLURM. + +.SH "OPTIONS" +.TP +\fB\-a\fR, \fB\-\-all\fR +Display information about all partions. This causes information to be +displayed about partitions that are configured as hidden and partitions that +are unavailable to user's group. +.TP +\fB\-b\fR, \fB\-\-bgl\fR +Display information about bglblocks (on Blue Gene systems only). +.TP +\fB\-\-help\fR +Print a message describing all \fBsinfo\fR options. +.TP +\fB\-\-hide\fR +Do not display information about hidden partitions. By default, partitions +that are configured as hidden or are not available to the user's group +will not be displayed (i.e. this is the default behavior). +.TP +\fB\-\-usage\fR +Print a brief message listing the \fBsinfo\fR options. +.TP +\fB\-d\fR, \fB\-\-dead\fR +If set only report state information for non\-responding (dead) nodes. +.TP +\fB\-e\fR, \fB\-\-exact\fR +If set, do not group node information on multiple nodes unless +their configurations to be reported are identical. Otherwise +cpu count, memory size, and disk space for nodes will be listed +with the minimum value followed by a "+" for nodes with the +same partition and state (e.g., "250+"). +.TP +\fB\-h\fR, \fB\-\-noheader\fR +Do not print a header on the output. +.TP +\fB\-i \fR, \fB\-\-iterate=\fR +Print the state on a periodic basis. +Sleep for the indicated number of seconds between reports. +By default, prints a time stamp with the header. +.TP +\fB\-l\fR, \fB\-\-long\fR +Print more detailed information. +This is ignored if the \fB\-\-format\fR option is specified. +.TP +\fB\-n \fR, \fB\-\-nodes=\fR +Print information only about the specified node(s). +Multiple nodes may be comma separated or expressed using a +node range expression. For example "linux[00\-07]" would +indicate eight nodes, "linux00" through "linux07." +.TP +\fB\-N\fR, \fB\-\-Node\fR +Print information in a node\-oriented format. +The default is to print information in a partition\-oriented format. +This is ignored if the \fB\-\-format\fR option is specified. +.TP +\fB\-o \fR, \fB\-\-format=\fR +Specify the information to be displayed using an \fBsinfo\fR +format string. Format strings transparently used by \fBsinfo\fR +when running with various options are +.RS +.TP 15 +.I "default" +"%9P %5a %.10l %.5D %6t %N" +.TP +.I "\-\-summarize" +"%9P %5a %.10l %15F %N" +.TP +.I "\-\-long" +"%9P %5a %.10l %.8s %4r %5h %10g %.5D %11T %N" +.TP +.I "\-\-Node" +"%#N %.5D %9P %6t" +.TP +.I "\-\-long \-\-Node" +"%#N %.5D %9P %11T %.4c %.8z %.6m %.8d %.6w %8f %R" +.TP +.I "\-\-list\-reasons" +"%35R %N" +.TP +.I "\-\-long \-\-list\-reasons" +"%50R %6t %N" +.RE + +.IP +In the above format strings the use of "#" represents the +maximum length of an node list to be printed. +.IP +The field specifications available include: +.RS +.TP 4 +\fB%a\fR +State/availability of a partition +.TP +\fB%A\fR +Number of nodes by state in the format "allocated/idle". +Do not use this with a node state option ("%t" or "%T") or +the different node states will be placed on separate lines. +.TP +\fB%c\fR +Number of CPUs per node +.TP +\fB%d\fR +Size of temporary disk space per node in megabytes +.TP +\fB%D\fR +Number of nodes +.TP +\fB%f\fR +Features associated with the nodes +.TP +\fB%F\fR +Number of nodes by state in the format +"allocated/idle/other/total". Do not use this with a node +state option ("%t" or "%T") or the different node states will +be placed on separate lines. +.TP +\fB%g\fR +Groups which may use the nodes +.TP +\fB%h\fR +Jobs may share nodes, "yes", "no", or "force" +.TP +\fB%l\fR +Maximum time for any job in the format "days\-hours:minutes:seconds" +.TP +\fB%m\fR +Size of memory per node in megabytes +.TP +\fB%N\fR +List of node names +.TP +\fB%P\fR +Partition name +.TP +\fB%r\fR +Only user root may initiate jobs, "yes" or "no" +.TP +\fB%R\fR +The reason a node is unavailable (down, drained, or draining states) +.TP +\fB%s\fR +Maximum job size in nodes +.TP +\fB%t\fR +State of nodes, compact form +.TP +\fB%T\fR +State of nodes, extended form +.TP +\fB%w\fR +Scheduling weight of the nodes +.TP +\fB%X\fR +Number of sockets per node +.TP +\fB%Y\fR +Number of cores per socket +.TP +\fB%Z\fR +Number of threads per core +.TP +\fB%z\fR +Extended processor information: number of sockets, cores, threads (S:C:T) per node +.TP +\fB%.<*>\fR +right justification of the field +.TP +\fB%<*>\fR +size of field +.RE +.TP +\fB\-r\fR, \fB\-\-responding\fR +If set only report state information for responding nodes. +.TP +\fB\-R\fR, \fB\-\-list\-reasons\fR +List reasons nodes are down or drained. When nodes are in +these states SLURM supports optional inclusion of a "reason" +string by an administrator. This option will display the first +35 characters of the reason field and list of nodes with that +reason for all nodes that are, by default, down, drained, or +draining. This option may be used with other node filtering +options (e.g. \fB\-r\fR, \fB\-d\fR, \fB\-t\fR, \fB\-n\fR), +however, combinations of these options that result in a list of +nodes that are not down or drained will not produce any output. +When used with \fB\-l\fR the output additionally includes +the current node state. +.TP +\fB\-s\fR, \fB\-\-summarize\fR +List only a partition state summary with no node state details. +This is ignored if the \fB\-\-format\fR option is specified. +.TP +\fB\-S \fR, \fB\-\-sort=\fR +Specification of the order in which records should be reported. +This uses the same field specifciation as the . +Multiple sorts may be performed by listing multiple sort fields +separated by commas. The field specifications may be preceeded +by "+" or "\-" for assending (default) and desending order +respectively. The partition field specification, "P", may be +preceeded by a "#" to report partitions in the same order that +they appear in SLURM's configuration file, \fBslurm.conf\fR. +For example, a sort value of "+P,\-m" requests that records +be printed in order of increasing partition name and within a +partition by decreasing memory size. The default value of sort +is "#P,\-t" (partitions ordered as configured then decreasing +node state). If the \fB\-\-Node\fB option is selected, the +default sort value is "N" (increasing node name). +.TP +\fB\-t \fR , \fB\-\-states=\fR +List nodes only having the given state(s). Multiple states +may be comma separated and the comparison is case insensitive. +Possible values include (case insensitive): ALLOC, ALLOCATED, +COMP, COMPLETING, DOWN, DRAIN, DRAINED, DRNG, DRAINING, IDLE, +UNK, and UNKNOWN. By default nodes in the specified state are +reported whether they are responding or not. The \fB\-\-dead\fR +and \fB\-\-responding\fR options may be used to filtering nodes by +the responding flag. +.TP +\fB\-p \fR, \fB\-\-partition=\fR +Print information only about the specified partition. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Provide detailed event logging through program execution. +.TP +\fB\-V\fR, \fB\-\-version\fR +Print version information and exit. + +.SH "OUTPUT FIELD DESCRIPTIONS" +.TP +\fBAVAIL\fR +Partition state: \fBup\fR or \fBdown\fR. +.TP +\fBCPUS\fR +Count of CPUs (processors) on these nodes. +.TP +\fBS:C:T\fR +Count of sockets (S), cores (C), and threads (T) on these nodes. +.TP +\fBSOCKETS\fR +Count of sockets on these nodes. +.TP +\fBCORES\fR +Count of cores on these nodes. +.TP +\fBTHREADS\fR +Count of threads on these nodes. +.TP +\fBGROUPS\fR +Resource allocations in this partition are restricted to the +named groups. \fBall\fR indicates that all groups may use +this partition. +.TP +\fBJOB_SIZE\fR +Minimum and maximum node count that can be allocated to any +user job. A single number indicates the minimum and maximum +node count are the same. \fBinfinite\fR is used to identify +partitions without a maximum node count. +.TP +\fBTIMELIMIT\fR +Maximum time limit for any user job in +days\-hours:minutes:seconds. \fBinfinite\fR is used to identify +partitions without a job time limit. +.TP +\fBMEMORY\fR +Size of real memory in megabytes on these nodes. +.TP +\fBNODELIST\fR or \fBBP_LIST\fR (BlueGene systems only) +Names of nodes associated with this configuration/partition. +.TP +\fBNODES\fR +Count of nodes with this particular configuration. +.TP +\fBNODES(A/I)\fR +Count of nodes with this particular configuration by node +state in the form "available/idle". +.TP +\fBNODES(A/I/O/T)\fR +Count of nodes with this particular configuration by node +state in the form "available/idle/other/total". +.TP +\fBPARTITION\fR +Name of a partition. Note that the suffix "*" identifies the +default partition. +.TP +\fBROOT\fR +Is the ability to allocate resources in this partition +restricted to user root, \fByes\fR or \fBno\fR. +.TP +\fBSHARE\fR +Will jobs allocated resources in this partition share those +resources. \fBno\fR indicates resources are never shared. +\fBforce\fR indicates resources are always available to be +shared. \fByes\fR indicates resource may be shared or not +per job's resource allocation. +.TP +\fBSTATE\fR +State of the nodes. Possible states include: down, unknown, +idle, allocated, drained, draining, completing and their +abbreviated forms: down, unk, idle, alloc, drain, drng, and +comp respectively. Note that the suffix "*" identifies nodes +that are presently not responding. +.TP +\fBTMP_DISK\fR +Size of temporary disk space in megabytes on these nodes. + +.SH "NODE STATE CODES" +.PP +Node state codes are shortened as required for the field size. +If the node state code is followed by "*", this indicates the +node is presently not responding and will not be allocated +any new work. If the node remains non\-responsive, it will +be placed in the \fBDOWN\fR state (except in the case of +\fBDRAINED\fR, \fBDRAINING\fR, or \fBCOMPLETING\fR nodes). +.TP 12 +\fBALLOCATED\fR +The node has been allocated to one or more jobs. +.TP +\fBALLOCATED+\fR +The node is allocated to one or more active jobs plus +one or more jobs are in the process of COMPLETING. +.TP +\fBCOMPLETING\fR +All jobs associated with this node are in the process of +COMPLETING. This node state will be removed when +all of the job's processes have terminated and the SLURM +epilog program (if any) has terminated. See the \fBEpilog\fR +parameter description in the \fBslurm.conf\fR man page for +more information. +.TP +\fBDOWN\fR +The node is unavailable for use. SLURM can automatically +place nodes in this state if some failure occurs. System +administrators may also explicitly place nodes in this state. If +a node resumes normal operation, SLURM can automatically +return it to service. See the \fBReturnToService\fR +and \fBSlurmdTimeout\fR parameter descriptions in the +\fBslurm.conf\fR(5) man page for more information. +.TP +\fBDRAINED\fR +The node is unavailable for use per system administrator +request. See the \fBupdate node\fR command in the +\fBscontrol\fR(1) man page or the \fBslurm.conf\fR(5) man page +for more information. +.TP +\fBDRAINING\fR +The node is currently executing a job, but will not be allocated +to additional jobs. The node state will be changed to state +\fBDRAINED\fR when the last job on it completes. Nodes enter +this state per system administrator request. See the \fBupdate +node\fR command in the \fBscontrol\fR(1) man page or the +\fBslurm.conf\fR(5) man page for more information. +.TP +\fBIDLE\fR +The node is not allocated to any jobs and is available for use. +.TP +\fBUNKNOWN\fR +The SLURM controller has just started and the node's state +has not yet been determined. + +.SH "ENVIRONMENT VARIABLES" +.PP +Some \fBsinfo\fR options may +be set via environment variables. These environment variables, +along with their corresponding options, are listed below. (Note: +Commandline options will always override these settings.) +.TP 20 +\fBSINFO_ALL\fR +\fB\-a, \-\-all\fR +.TP +\fBSINFO_FORMAT\fR +\fB\-o , \-\-format=\fR +.TP +\fBSINFO_PARTITION\fR +\fB\-p , \-\-partition=\fR +.TP +\fBSINFO_SORT\fR +\fB\-S , \-\-sort=\fR +.TP +\fBSLURM_CONF\fR +The location of the SLURM configuration file. + +.SH "EXAMPLES" +.eo +Report basic node and partition configurations: + +.nf + +> sinfo +PARTITION AVAIL TIMELIMIT NODES STATE NODELIST +batch up infinite 2 alloc adev[8\-9] +batch up infinite 6 idle adev[10\-15] +debug* up 30:00 8 idle adev[0\-7] + +.fi + +Report partition summary information: +.nf + +> sinfo \-s +PARTITION AVAIL TIMELIMIT NODES(A/I/O/T) NODELIST +batch up infinite 2/6/0/8 adev[8\-15] +debug* up 30:00 0/8/0/8 adev[0\-7] + +.fi + +Report more complete information about the partition debug: +.nf + +> sinfo \-\-long \-\-partition=debug +PARTITION AVAIL TIMELIMIT JOB_SIZE ROOT SHARE GROUPS NODES STATE NODELIST +debug* up 30:00 8 no no all 8 idle dev[0\-7] +.fi + +Report only those nodes that are in state DRAINED: +.nf + +> sinfo \-\-states=drained +PARTITION AVAIL NODES TIMELIMIT STATE NODELIST +debug* up 2 30:00 drain adev[6\-7] + +.fi + +Report node\-oriented information with details and exact matches: +.nf + +> sinfo \-Nel +NODELIST NODES PARTITION STATE CPUS MEMORY TMP_DISK WEIGHT FEATURES REASON +adev[0\-1] 2 debug* idle 2 3448 38536 16 (null) (null) +adev[2,4\-7] 5 debug* idle 2 3384 38536 16 (null) (null) +adev3 1 debug* idle 2 3394 38536 16 (null) (null) +adev[8\-9] 2 batch allocated 2 246 82306 16 (null) (null) +adev[10\-15] 6 batch idle 2 246 82306 16 (null) (null) + +.fi + +Report only down, drained and draining nodes and their reason field: +.nf + +> sinfo \-R +REASON NODELIST +Memory errors dev[0,5] +Not Responding dev8 + +.fi +.ec + +.SH "COPYING" +Copyright (C) 2002\-2006 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). +UCRL\-CODE\-217948. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. + +.SH "SEE ALSO" +\fBscontrol\fR(1), \fBsmap\fR(1), \fBsqueue\fR(1), +\fBslurm_load_ctl_conf\fR(3), \fBslurm_load_jobs\fR(3), \fBslurm_load_node\fR(3), +\fBslurm_load_partitions\fR(3), +\fBslurm_reconfigure\fR(3), \fBslurm_shutdown\fR(3), +\fBslurm_update_job\fR(3), \fBslurm_update_node\fR(3), +\fBslurm_update_partition\fR(3), +\fBslurm.conf\fR(5) diff --git a/executable_names/doc/man/man1/slaunch.1 b/executable_names/doc/man/man1/slaunch.1 new file mode 100644 index 0000000000000000000000000000000000000000..1958c1233df7fe643976e4ed95195afa63f604d4 --- /dev/null +++ b/executable_names/doc/man/man1/slaunch.1 @@ -0,0 +1,676 @@ +.\" $Id$ +.TH "slaunch" "1" "SLURM 1.2" "October 2006" "SLURM Commands" +.SH "NAME" +.LP +slaunch \- Launch a parallel application under a SLURM job allocation. +.SH "SYNOPSIS" +.LP +slaunch [\fIoptions\fP] <\fIcommand\fP> [\fIcommand args\fR] +.SH "DESCRIPTION" +.LP +slaunch launches a parallel application (a \fBjob step\fR in SLURM parlance) +on the nodes, or subset of nodes, in a \fBjob allocation\fR. A valid job +allocation is a prerequisite of running slaunch. The ID of the job allocation +may be passed to slaunch through either the \fB\-\-jobid\fR command line +parameter or the \fBSLAUNCH_JOBID\fR environment variable. The \fBsalloc\fR +and \fBsbatch\fR commands may be used to request a job allocation, and each +of those commands automatically set the \fBSLURM_JOB_ID\fR environment variable, +which is also understood by slaunch. Users should not set SLURM_JOB_ID on their +own; use SLAUNCH_JOBID instead. +.SH "OPTIONS" +.LP +.TP +\fB\-\-jobid\fR <\fIJOBID\fP> +The job allocation under which the parallel application should be launched. If slaunch is running under salloc or a batch script, slaunch can automatically determint the jobid from the SLURM_JOB_ID environment variable. Otherwise, you will need to tell slaunch which job allocation to use. +.TP +\fB\-n\fR, \fB\-\-tasks\fR[=]<\fInumber\fR> +Specify the number of processes to launch. The default is one process per node. +.TP +\fB\-N\fR, \fB\-\-nodes\fR[=]<\fInumber\fR> +Specify the number of nodes to be used by this job step. By default, +slaunch will use all of the nodes in the specified job allocation. +.TP +\fB\-r\fR, \fB\-\-relative\fR[=]<\fInumber\fR> +Specify the first node in the allocation on which this job step will be launched. Counting starts at zero, thus the first node in the job allocation is node 0. The option to \-\-relative may also be a negative number. \-1 is the last node in the allocation, \-2 is the next to last node, etc. By default, the controller will select the starting node (assuming that there are no other nodelist or task layout options that specify specific nodes). + +.TP +\fB\-c\fR, \fB\-\-cpus\-per\-task\fR[=]<\fIncpus\fR> +Specify that each task requires \fIncpus\fR number of CPUs. Useful for applications in which each task will launch multiple threads and can therefore benefit from there being free processors on the node. + +.TP +\fB\-J\fR, \fB\-\-name\fR[=]<\fIname\fR> +Set the name of the job step. By default, the job step's name will be the +name of the executable which slaunch is launching. + +.TP +\fB\-K\fR, \fB\-\-kill\-on\-bad\-exit\fR +Terminate the job step if any task exits with a non\-zero exit code. By default +slaunch will not terminate a job step because of a task with a non\-zero exit +code. + +.TP +\fB\-l\fR, \fB\-\-label\fR +Prepend each line of task standard output or standard error with the task +number of its origin. + +.TP +\fB\-u\fR, \fB\-\-unbuffered\fR +Do not line buffer standard output or standard error from remote tasks. +This option cannot be used with \-\-label. + +.TP +\fB\-C\fR, \fB\-\-overcommit\fR +Permit the allocation of more tasks to a node than there are available processors. +Normally SLURM will only allow up to N tasks on a node with N processors, but +this option will allow more than N tasks to be assigned to a node. + +.TP +\fB\-q\fR, \fB\-\-quiet\fR +Suppress informational messages from slaunch. Errors will still be displayed. + +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Increase the verbosity of slaunch's informational messages. Multiple \-v's +will further increase slaunch's verbosity. + +.TP +\fB\-d\fR, \fB\-\-slurmd\-debug\fR[=]<\fIlevel\fR> +Specify a debug level for slurmd(8). \fIlevel\fR may be an integer value +between 0 [quiet, only errors are displayed] and 4 [verbose operation]. +The slurmd debug information is copied onto the stderr of +the job. By default only errors are displayed. + +.TP +\fB\-W\fR, \fB\-\-wait\fR[=]<\fIseconds\fR> +slaunch will wait the specified number of seconds after the first tasks exits +before killing all tasks in the job step. If the value is 0, slaunch will +wait indefinitely for all tasks to exit. The default value is give by the +WaitTime parameter in the slurm configuration file (see \fBslurm.conf(5)\fR). + +The \-\-wait option can be used to insure that a job step terminates in a timely +fashion in the event that one or more tasks terminate prematurely. + +.TP +\fB\-m\fR, \fB\-\-distribution\fR[=]<\fI(cyclic|block|arbitrary)\fR> +Select a task distribution pattern. (The default is cyclic.) +.RS +.TP +.B cyclic +The cyclic method distributes processes in a round\-robin fashion across +the allocated nodes. That is, task zero will be allocated to the first +node, task one to the second, and so on. +.TP +.B block +The block method of distribution will allocate tasks in\-order to +the cpus on a node. If the number of tasks exceeds the number of +cpus on all of the nodes in the allocation then all nodes will be +utilized. For example, consider an allocation of three nodes each with +two cpus. A four\-task block distribution request will distribute +those tasks to the nodes with tasks zero and one on the first +node, task two on the second node, and task three on the third node. +.TP +.B arbitrary +The arbitrary method of distribution allows the user to manually specify any +arbitrary layout of tasks on nodes. Normally the arbitrary task distribution +method will be invoked implicitly by using one of the options +\-\-task\-layout\-byid, \-\-task\-layout\-byname, or \-\-task\-layout\-file. +.RE + +.TP +\fB\-w\fR, \fB\-\-nodelist\-byname\fR[=]<\fInode name list\fR> +Request a specific list of node names. The list may be specified as a comma\-separated list of node names, or a range of node names (e.g. mynode[1\-5,7,...]). Duplicate node names are not permitted in the list. +The order of the node names in the list is not important; the node names +will be sorted my SLURM. +.TP +\fB\-L\fR, \fB\-\-nodelist\-byid\fR[=]<\fInode index list\fR> +Request a specific set of nodes in a job alloction on which to run the tasks of the job step. The list may be specified as a comma\-separated list relative node indices in the job allocation (e.g., "0,2\-5,\-2,8"). Duplicate indices are permitted, but are ignored. The order of the node indices in the list is not important; the node indices will be sorted my SLURM. + +.TP +\fB\-T\fR, \fB\-\-task\-layout\-byid\fR[=]<\fInode index list\fR> +Request a specific task layout using node indices within the job allocation. The node index list can contain duplicate indices, and the indices may appear in any order. The order of indices in the nodelist IS significant. Each node index in the list represents one task, with the Nth node index in the list designating on which node the Nth task should be launched. + +For example, given an allocation of nodes "linux[0\-15]" and a node index list "4,\-1,1\-3" task 0 will run on "linux4", task 1 will run on "linux15", task 2 on "linux1", task 3 on "linux2", and task 4 on "linux3". + +NOTE: This option implicitly sets the task distribution method to "arbitrary". Some network switch layers do not permit arbitrary task layout. + +.TP +\fB\-Y\fR, \fB\-\-task\-layout\-byname\fR[=]<\fInode name list\fR> +Request a specific task layout. The nodelist can contain duplicate node +names, and node names may appear in any order. The order of node names in +the nodelist IS significant. Each node name in the nodes list represents +one task, with the Nth node name in the nodelist designating on which node +the Nth task should be launched. For example, a nodelist of mynode[4,3,1\-2,4] +means that tasks 0 and 4 will run on mynode4, task 1 will run on mynode3, +task 2 will run on mynode1, and task 3 will run on mynode2. + +NOTE: This option implicitly sets the task distribution method to "arbitrary". +Some network switch layers do not permit arbitrary task layout. + +.TP +\fB\-F\fR, \fB\-\-task\-layout\-file\fR[=]<\fIfilename\fR> +Request a specific task layout. This option is much like the +\-\-task\-layout\-byname option, except that instead of a nodelist you +supply the name of a file. The file contains a nodelist that may span +multiple lines of the file. + +NOTE: This option implicitly sets the task distribution method to "arbitrary". +Some network switch layers do not permit arbitrary task layout. + +.TP +\fB\-i\fR, \fB\-\-slaunch\-input\fR[=]<\fIfilename pattern\fR> +.PD 0 +.TP +\fB\-o\fR, \fB\-\-slaunch\-output\fR[=]<\fIfilename pattern\fR> +.PD 0 +.TP +\fB\-e\fR, \fB\-\-slaunch\-error\fR[=]<\fIfilename pattern\fR> +.PD +Change slaunch's standard input, standard output, or standard error +to be a file of name "filename pattern". These options are similar to using +shell IO redirection capabilities, but with the additional ability to replace +certain symbols in the filename with useful SLURM information. Symbols are +listed below. + +By default, slaunch broadcasts its standard input over the network to the +standard input of all tasks. Likewise, standard output and standard error +from all tasks are collected over the network by slaunch and printed on +its standard output or standard error, respectively. If you want to see +traffic from fewer tasks, see the \-\-slaunch\-[input|output|error]\-filter +options. + +Supported replacement symbols are: +.PD 0 +.RS 10 +.TP +\fB%J\fR +Job allocation number and job step number in the form "jobid.stepid". For instance, "128.0". +.PD 0 +.TP +\fB%j\fR +Job allocation number. +.PD 0 +.TP +\fB%s\fR +Job step number. +.RE + +.TP +\fB\-\-slaunch\-input\-filter\fR[=]<\fItask number\fR> +.PD 0 +.TP +\fB\-\-slaunch\-output\-filter\fR[=]<\fItask number\fR> +.PD 0 +.TP +\fB\-\-slaunch\-error\-filter\fR[=]<\fItask number\fR> +.PD +Only transmit standard input to a single task, or print the standard output +or standard error from a single task. These options perform the filtering +locally in slaunch. All tasks are still capable of sending or receiving +standard IO over the network, so the "sattach" command can still access the +standard IO streams of the other tasks. (NOTE: for \-output and \-error, +the streams from all tasks WILL be transmitted to slaunch, but it will only +print the streams for the selected task. If your tasks print a great deal of +data to standard output or error, this can be performance limiting.) + +.TP +\fB\-I\fR, \fB\-\-task\-input\fR[=]<\fIfilename pattern\fR> +.PD 0 +.TP +\fB\-O\fR, \fB\-\-task\-output\fR[=]<\fIfilename pattern\fR> +.PD 0 +.TP +\fB\-E\fR, \fB\-\-task\-error\fR[=]<\fIfilename pattern\fR> +.PD +Instruct SLURM to connect each task's standard input, standard output, +or standard error directly to the file name specified +in the "\fIfilename pattern\fR". + +By default, the standard IO streams of all tasks are received and transmitted +over the network to commands like slaunch and sattach. These options disable +the networked standard IO streams and instead connect the standard IO streams +of the tasks directly to files on the local node of each task (although the file +may, of course, be located on a networked filesystem). + +Whether or not the tasks share a file depends on whether or not the file lives +on a local filesystem or a shared network filesytem, and on whether or not +the filename pattern expands to the same file name for each task. + +The filename pattern may +contain one or more replacement symbols, which are a percent sign "%" followed +by a letter (e.g. %t). + +Supported replacement symbols are: +.PD 0 +.RS 10 +.TP +\fB%J\fR +Job allocation number and job step number in the form "jobid.stepid". For instance, "128.0". +.PD 0 +.TP +\fB%j\fR +Job allocation number. +.PD 0 +.TP +\fB%s\fR +Job step number. +.PD 0 +.TP +\fB%N\fR +Node name. (Will result in a separate file per node.) +.PD 0 +.TP +\fB%n\fR +Relative node index number within the job step. All nodes used by the job step will be number sequentially starting at zero. (Will result in a separate file per node.) +.PD 0 +.TP +\fB%t\fR +Task rank number. (Will result in a separate file per task.) +.RE + +.TP +\fB\-D\fR, \fB\-\-workdir\fR[=]<\fIdirectory\fR> +Set the working directory of the tasks to \fIdirectory\fR before execution. +The default task working directory is slaunch's working directory. + +.TP +\fB\-\-mpi\fR[=]<\fImpi_type\fR> +Identify the type of MPI to be used. + +.TP +\fB\-\-uid\fR[=]<\fIuser\fR> +Attempt to submit and/or run a job as \fIuser\fR instead of the +invoking user id. The invoking user's credentials will be used +to check access permissions for the target partition. User root +may use this option to run jobs as a normal user in a RootOnly +partition for example. If run as root, \fBslaunch\fR will drop +its permissions to the uid specified after node allocation is +successful. \fIuser\fR may be the user name or numerical user ID. + +.TP +\fB\-\-gid\fR[=]<\fIgroup\fR> +If \fBslaunch\fR is run as root, and the \fB\-\-gid\fR option is used, +submit the job with \fIgroup\fR's group access permissions. \fIgroup\fR +may be the group name or the numerical group ID. + +.TP +\fB\-\-core\fR[=]<\fItype\fR> +Adjust corefile format for parallel job. If possible, slaunch will set +up the environment for the job such that a corefile format other than +full core dumps is enabled. If run with type = "list", slaunch will +print a list of supported corefile format types to stdout and exit. + +.TP +\fB\-\-propagate\fR[=\fIrlimits\fR] +Allows users to specify which of the modifiable (soft) resource limits +to propagate to the compute nodes and apply to their jobs. If +\fIrlimits\fR is not specified, then all resource limits will be +propagated. + +.TP +\fB\-\-prolog\fR[=]<\fIexecutable\fR> +\fBslaunch\fR will run \fIexecutable\fR just before launching the job step. +The command line arguments for \fIexecutable\fR will be the command +and arguments of the job step. If \fIexecutable\fR is "none", then +no prolog will be run. This parameter overrides the SrunProlog +parameter in slurm.conf. + +.TP +\fB\-\-epilog\fR[=]<\fIexecutable\fR> +\fBslaunch\fR will run \fIexecutable\fR just after the job step completes. +The command line arguments for \fIexecutable\fR will be the command +and arguments of the job step. If \fIexecutable\fR is "none", then +no epilog will be run. This parameter overrides the SrunEpilog +parameter in slurm.conf. + +.TP +\fB\-\-task\-prolog\fR[=]<\fIexecutable\fR> +The \fBslurmd\fR daemon will run \fIexecutable\fR just before launching +each task. This will be executed after any TaskProlog parameter +in slurm.conf is executed. +Besides the normal environment variables, this has SLURM_TASK_PID +available to identify the process ID of the task being started. +Standard output from this program of the form +"export NAME=value" will be used to set environment variables +for the task being spawned. + +.TP +\fB\-\-task\-epilog\fR[=]<\fIexecutable\fR> +The \fBslurmd\fR daemon will run \fIexecutable\fR just after each task +terminates. This will be before after any TaskEpilog parameter +in slurm.conf is executed. This is meant to be a very short\-lived +program. If it fails to terminate within a few seconds, it will +be killed along with any descendant processes. + +.TP +\fB\-\-comm\-hostname\fR[=]<\fIhostname|address\fR> +Specify the hostname or address to be used for PMI communications only +(MPCIH2 communication bootstrapping mechanism). +Defaults to short hostname of the node on which slaunch is running. + +.TP +\fB\-\-network\fR[=]<\fIoptions\fR> +(NOTE: this option is currently only of use on AIX systems.) +Specify the communication protocol to be used. +The interpretation of \fItype\fR is system dependent. +For AIX systems with an IBM Federation switch, the following +comma\-separated and case insensitive options are recongnized: +\fBIP\fR (the default is user\-space), \fBSN_ALL\fR, \fBSN_SINGLE\fR, +\fBBULK_XFER\fR and adapter names. For more information, on +IBM systems see \fIpoe\fR documenation on the environment variables +\fBMP_EUIDEVICE\fR and \fBMP_USE_BULK_XFER\fR. + +.TP +\fB\-\-multi\-prog\fR +This option allows one to launch tasks with different executables within +the same job step. When this option is present, slaunch no long accepts +the name of an executable "command" on the command line, instead it accepts +the name of a file. This file specifies which executables and command line +parameters should be used by each task in the job step. See the section +\fBMULTIPLE PROGRAMS FILE\fR below for an explanation of the multiple program +file syntax. + +.TP +\fB\-h\fR, \fB\-\-help\fR +Display help information and exit. + +.TP +\fB\-u\fR, \fB\-\-usage\fR +Display brief usage message and exit. + +.TP +\fB\-V\fR, \fB\-\-version\fR +Display version information and exit. + +.PP +Affinity/Multi\-core Options (when the task/affinity or task/numa +plugin is enabled): +.TP +\fB\-\-cpu_bind\fR=[{\fIquiet,verbose\fR},]\fItype\fR +Bind tasks to CPUs +.RS +.TP +.B q[uiet], +quietly bind before task runs (default) +.TP +.B v[erbose], +verbosely report binding before task runs +.TP +.B no[ne] +don't bind tasks to CPUs (default) +.TP +.B rank +bind by task rank +.TP +.B map_cpu: +bind by mapping CPU IDs to tasks as specified +where is ,,.... +CPU IDs are interpreted as decimal values unless they are preceded +with '0x' in which case they interpreted as hexadecimal values. +.TP +.B mask_cpu: +bind by setting CPU masks on tasks as specified +where is ,,.... +CPU masks are \fBalways\fR interpreted as hexadecimal values but can be +preceded with an optional '0x'. +.RE + +To have SLURM always report on the selected CPU binding for all srun commands +executed in a shell, you can also enable verbose mode separately from +the command line with: +.PP +.nf + setenv SLURM_CPU_BIND verbose +.fi +.PP +SLURM_CPU_BIND will not propagate into the tasks environment (binding +by default only affects the first srun). To propagate \-\-cpu_bind to +successive srun commands, first do the following in each task: +.PP +.nf + setenv SLURM_CPU_BIND \\ + ${SLURM_CPU_BIND_VERBOSE},${SLURM_CPU_BIND_TYPE}${SLURM_CPU_BIND_LIST} +.fi + +.PP +Affinity/Multi\-core Options (when the task/affinity plugin is enabled and +the NUMA memory functions are available): +.TP +\fB\-\-mem_bind\fR=[{\fIquiet,verbose\fR},]\fItype\fR +Bind tasks to memory. \fBNote that the resolution of CPU and memory binding +may differ on some architectures.\fR For example, CPU binding may be performed +at the level of the cores within a processor while memory binding will +be performed at the level of nodes, where the definition of "nodes" +may differ from system to system. \fBThe use of any type other than +"none" or "local" is not recommended.\fR +If you want greater control, try running a simple test code with the +options "\-\-cpu_bind=verbose,none \-\-mem_bind=verbose,none" to determine +the specific configuration. +.RS +.TP +.B q[uiet], +quietly bind before task runs (default) +.TP +.B v[erbose], +verbosely report binding before task runs +.TP +.B no[ne] +don't bind tasks to memory (default) +.TP +.B rank +bind by task rank (not recommended) +.TP +.B local +Use memory local to the processor in use +.TP +.B map_mem: +bind by mapping a node's memory to tasks as specified +where is ,,.... +CPU IDs are interpreted as decimal values unless they are preceded +with '0x' in which case they interpreted as hexadecimal values +(not recommended) +.TP +.B mask_mem: +bind by setting memory masks on tasks as specified +where is ,,.... +memory masks are \fBalways\fR interpreted as hexadecimal values but can be +preceded with an optional '0x' (not recommended) +.RE + +To have SLURM always report on the selected memory binding for all srun commands +executed in a shell, you can also enable verbose mode separately from +the command line with: +.PP +.PP +.nf + setenv SLURM_MEM_BIND verbose +.fi +.PP +SLURM_MEM_BIND will not propagate into the tasks environment (binding +by default only affects the first srun). To propagate \-\-mem_bind to +successive srun commands, first do the following in each task: +.PP +.nf + setenv SLURM_MEM_BIND \\ + ${SLURM_MEM_BIND_VERBOSE},${SLURM_MEM_BIND_TYPE}${SLURM_MEM_BIND_LIST} +.fi + +.SH "INPUT ENVIRONMENT VARIABLES" +.PP +Some slaunch options may be set via environment variables. +These environment variables, along with their corresponding options, +are listed below. +Note: Command line options will always override environment variables settings. +.TP 25 +\fBSLAUNCH_COMM_HOSTNAME\fR +Same as \fB\-\-comm\-hostname\fR. +.TP +\fBSLAUNCH_CORE_FORMAT\fR +Same as \fB\-\-core\fR. +.TP +\fBSLAUNCH_CPU_BIND\fR +Same as \fB\-\-cpu_bind\fR. +.TP +\fBSLAUNCH_DEBUG\fR +Same as \fB\-v\fR or \fB\-\-verbose\fR. +.TP +\fBSLAUNCH_DISTRIBUTION\fR +Same as \fB\-m\fR or \fB\-\-distribution\fR. +.TP +\fBSLAUNCH_JOBID\fR +Same as \fB\-\-jobid\fR. +.TP +\fBSLAUNCH_KILL_BAD_EXIT\fR +Same as \fB\-K\fR or \fB\-\-kill\-on\-bad\-exit\fR. +.TP +\fBSLAUNCH_LABELIO\fR +Same as \fB\-l\fR or \fB\-\-label\fR. +.TP +\fBSLAUNCH_MEM_BIND\fR +Same as \fB\-\-mem_bind\fR. +.TP +\fBSLAUNCH_MPI_TYPE\fR +Same as \fB\-\-mpi\fR. +.TP +\fBSLAUNCH_OVERCOMMIT\fR +Same as \fB\-C\fR or \fB\-\-overcomit\fR. +.TP +\fBSLAUNCH_WAIT\fR +Same as \fB\-W\fR or \fB\-\-wait\fR. +.TP +\fBSLURMD_DEBUG\fR +Same as \fB\-d\fR or \fB\-\-slurmd\-debug\fR + +.SH "OUTPUT ENVIRONMENT VARIABLES" +.PP +slaunch will set the following environment variables which will +appear in the environments of all tasks in the job step. Since slaunch +sets these variables itself, they will also be available to --prolog +and --epilog scripts. (Notice that the "backwards compatibility" environment +variables clobber some of the variables that were set by salloc or sbatch +at job allocation time. The newer SLURM_JOB_* and SLURM_STEP_* names do not +conflict, so any task in any job step can easily determine the parameters +of the job allocation.) +.TP +\fBSLURM_STEP_ID\fR (and \fBSLURM_STEPID\fR for backwards compatibility) +The ID of the job step within the job allocation. +.TP +\fBSLURM_STEP_NODELIST\fR +The list of nodes in the job step. +.TP +\fBSLURM_STEP_NUM_NODES\fR (and \fBSLURM_NNODES\fR for backwards compatibility) +The number of nodes used by the job step. +.TP +\fBSLURM_STEP_NUM_TASKS\fR (and \fBSLURM_NPROCS\fR for backwards compatibility) +The number of tasks in the job step. +.TP +\fBSLURM_STEP_TASKS_PER_NODE\fR (and \fBSLURM_TASKS_PER_NODE\fR for backwards compatibility) +The number of tasks on each node in the job step. +.TP +\fBSLURM_STEP_LAUNCHER_HOSTNAME\fR (and \fBSLURM_SRUN_COMM_HOST\fR for backwards compatibility) +.TP +\fBSLURM_STEP_LAUNCHER_PORT\fR (and \fBSLURM_SRUN_COMM_PORT\fR for backwards compatibility) + +.PP +Additionally, SLURM daemons will ensure that the the following variables are +set in the environments of all tasks in the job step. Many of the following +variables will have different values in each task's environment. (These +variables are not available to the slaunch --prolog and --epilog scripts.) + +.TP +\fBSLURM_NODEID\fR +Node ID relative to other nodes in the job step. Counting begins at zero. +.TP +\fBSLURM_PROCID\fR +Task ID relative to the other tasks in the job step. Counting begins at zero. +.TP +\fBSLURM_LOCALID\fR +Task ID relative to the other tasks on the same node which belong to the +same job step. Counting begins at zero. +.TP +\fBSLURMD_NODENAME\fR +The SLURM NodeName for the node on which the task is running. Depending +on how your system administrator has configured SLURM, the NodeName for a +node may not be the same as the node's hostname. When you use commands +such as \fBsinfo\fR and \fBsqueue\fR, or look at environment variables such +as SLURM_JOB_NODELIST and SLURM_STEP_NODELIST, you are seeing SLURM NodeNames. + +.SH "MULTIPLE PROGRAMS FILE" +Comments in the configuration file must have a "#" in collumn one. +The configuration file contains the following fields separated by white +space: +.TP +Task rank +One or more task ranks to use this configuration. +Multiple values may be comma separated. +Ranges may be indicated with two numbers separated with a '\-'. +To indicate all tasks, specify a rank of '*' (in which case you probably +should not be using this option). +.TP +Executable +The name of the program to execute. +May be fully qualified pathname if desired. +.TP +Arguments +Program arguments. +The expression "%t" will be replaced with the task's number. +The expression "%o" will be replaced with the task's offset within +this range (e.g. a configured task rank value of "1\-5" would +have offset values of "0\-4"). +Single quotes may be used to avoid having the enclosed values interpretted. +This field is optional. +.PP +For example: +.nf +################################################################### +# srun multiple program configuration file +# +# srun \-n8 \-l \-\-multi\-prog silly.conf +################################################################### +4\-6 hostname +1,7 echo task:%t +0,2\-3 echo offset:%o + +$ srun \-n8 \-l \-\-multi\-prog silly.conf +0: offset:0 +1: task:1 +2: offset:1 +3: offset:2 +4: linux15.llnl.gov +5: linux16.llnl.gov +6: linux17.llnl.gov +7: task:7 + +.fi + +.SH "EXAMPLES" +.LP +To launch a job step (parallel program) in an existing job allocation: +.IP +slaunch \-\-jobid 66777 \-N2 \-n8 myprogram + +.LP +To grab an allocation of nodes and launch a parallel application on one command line (See the \fBsalloc\fR man page for more examples): +.IP +salloc \-N5 slaunch \-n10 myprogram + +.SH "COPYING" +Copyright (C) 2006 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). +UCRL\-CODE\-217948. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. + +.SH "SEE ALSO" +.LP +sinfo(1), sattach(1), salloc(1), sbatch(1), squeue(1), scancel(1), scontrol(1), slurm.conf(5), sched_setaffinity(2), numa(3) diff --git a/executable_names/doc/man/man1/slurm.1 b/executable_names/doc/man/man1/slurm.1 new file mode 100644 index 0000000000000000000000000000000000000000..4e27f3f9a17bb9a1da8aad1ed19bf3bf46cbf866 --- /dev/null +++ b/executable_names/doc/man/man1/slurm.1 @@ -0,0 +1,60 @@ +.TH SLURM "1" "May 2005" "slurm 0.5" "Slurm system" + +.SH "NAME" +slurm \- SLURM system overview. + +.SH "DESCRIPTION" +The Simple Linux Utility for Resource Management (SLURM) is an open source, +fault\-tolerant, and highly scalable cluster management and job scheduling system +for large and small Linux clusters. SLURM requires no kernel modifications for +its operation and is relatively self\-contained. As a cluster resource manager, +SLURM has three key functions. First, it allocates exclusive and/or non\-exclusive +access to resources (compute nodes) to users for some duration of time so they +can perform work. Second, it provides a framework for starting, executing, and +monitoring work (normally a parallel job) on the set of allocated nodes. Finally, +it arbitrates conflicting requests for resources by managing a queue of pending +work. + +SLURM has a centralized manager, \fBslurmctld\fR, to monitor resources and +work. There may also be a backup manager to assume those responsibilities in the +event of failure. Each compute server (node) has a \fBslurmd\fR daemon, which +can be compared to a remote shell: it waits for work, executes that work, returns +status, and waits for more work. + +User tools include \fBsrun\fR to initiate jobs, +\fBscancel\fR to terminate queued or running jobs, \fBsinfo\fR to report system +status, and \fBsqueue\fR to report the status of jobs. There is also an administrative +tool \fBscontrol\fR available to monitor and/or modify configuration and state +information. APIs are available for all functions. + +SLURM configuration is maintained in the \fBslurm.conf\fR file. + +Man pages are available for all SLURM commands, daemons, APIs, plus the +\fBslurm.conf\fR file. +Extensive documenation is also available on the internet at +\fB\fR. + +.SH "COPYING" +Copyright (C) 2005 The Regents of the University of California. +Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). +UCRL\-CODE\-217948. +.LP +This file is part of SLURM, a resource management program. +For details, see . +.LP +SLURM 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. +.LP +SLURM 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. + +.SH "SEE ALSO" +\fBscancel\fR(1), \fBscontrol\fR(1), \fBsinfo\fR(1), \fBsmap\fR(1), +\fBsqueue\fR(1), \fBsrun\fR(1), +\fBslurm.conf\fR(5), +\fBslurmctld\fR(8), \fBslurmd\fR(8) + diff --git a/executable_names/doc/man/man1/smap.1 b/executable_names/doc/man/man1/smap.1 new file mode 100644 index 0000000000000000000000000000000000000000..d58131293f304d493b1006a16b57f3b0a6691ffd --- /dev/null +++ b/executable_names/doc/man/man1/smap.1 @@ -0,0 +1,437 @@ +.TH SMAP "1" "March 2006" "smap 1.1" "Slurm components" + +.SH "NAME" +smap \- graphically view information about SLURM jobs, partitions, and set +configurations parameters. + +.SH "SYNOPSIS" +\fBsmap\fR [\fIOPTIONS\fR...] +.SH "DESCRIPTION" +\fBsmap\fR is used to graphically view job, partition and node information +for a system running SLURM. +Note that information about nodes and partitions to which a user lacks +access will always be displayed to avoid obvious gaps in the output. +This is equivalent to the \fB\-\-all\fR option of the \fBsinfo\fR and +\fBsqueue\fR commands. + +.SH "OPTIONS" +.TP +\fB\-\-help\fR, +Print a message describing all \fBsmap\fR options. +.TP +\fB\-\-usage\fR +Print a brief message listing the \fBsmap\fR options. +.TP +\fB\-D